Как передавать локальную переменную между функциями внутри триггера без использования глобальной переменной?
В общих чертах понимаю что через 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-типов, всегда по значению для остальных
изменить это невозможно
никак, использовать глобалку, куда сохранять локалку перед нулением
нет, нету
ну или аналоги всего этого есть в продвинутых редакторах, не знаю, пусть те, кто ими пользуются, скажут

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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
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: Пожалуйста используйте форматирование.
32
Frzctions, какая то глупость, полно утечек, нахрена спецэффект и юнита создавать, кастера мало? че собрался сделать?
21
Frzctions, вижу. Но опять же, я уверен что ты пытаешься решить проблему способом который тебе кажется подходящим, но в действительности может не являться оптимальным решением. Рекомендую описать что ты хочешь сделать.
Что касается перенесения (записи) чего-либо в локальную переменную - тебе нужно объявить переменную в начале функции и записать в нее ссылку объект-участник события. Если тебе необходимо спустя какое-то время* выполнить какие-то действия над объектом, который ты записал в переменную, необходимо воспользоватся связкой (таймер + хеш-таблица).

Лучше не кидай конвертированные триггеры, так как это нечитаемо. Из-за длинных, замусоренных, названий приходится долго разбирать что что запускает. Куда дольше чем я (как и многие другие) могут себе позволить.
2
quq_CCCP, боже, пожалуйста, я просто хочу узнать как перенести локальную переменную из одной функции в другую, не используя глобальную, зачем ты меня пытаешься добить дополнительными вопросами? Я еще не дошел до утечек. А юнита создаю, для того, что бы он наносил урон, а не кастер, так как если ставить урон от кастера, сбивается приказ.
Raised:
Что касается перенесения (записи) чего-либо в локальную переменную - тебе нужно объявить переменную в начале функции и записать в нее ссылку объект-участник события. Если тебе необходимо выполнить какие-то действия над объектом, который ты записал в переменную, необходимо воспользоватся связкой (таймер + хеш-таблица).
А можно простой пример? (хоть скриншотом, хоть кодом, как удобно)
32
Frzctions, ерунда, причем тут урон от кастера? Нанесение урона не может сбивать приказы, да и у тебя вовсе всем наносит урон, включая кастера.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.