Модернизация триггеров из 5 урока по джазу
Хочу научиться джазу, читаю уроки, но возник вопрос:
Не получается вызвать функцию, вызывающую триггер с переменной типа location
вот код:
function Firelocini takes location poz returns nothing
    call TriggerExecute( gg_trg_Fireloc )
endfunction


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


function Trig_By_the_fire_way_Actions takes nothing returns nothing
    local unit u
    local real ang
    local location poz
    local integer i = 0
    local effect array s
    set u = GetSpellTargetUnit()
    set ang = AngleBetweenPoints ( GetUnitLoc(udg_Fireman), GetUnitLoc(u))
    set poz = GetUnitLoc(udg_Fireman)
    call MoveLocation(poz, GetLocationX(poz) + 50 * CosBJ(ang), GetLocationY(poz) + 50 * SinBJ(ang))
loop
 exitwhen i>12      
    set i=i+1
    call MoveLocation(poz, GetLocationX(poz) + 50 * CosBJ(ang), GetLocationY(poz) + 50 * SinBJ(ang))
    call Firelocini (location poz)
endloop 

    call PolledWait( 0.3 )
    
set i=0
loop
 exitwhen i>12
set i=i+1
    call DestroyEffectBJ( s[i] )
set s[i]=null
endloop

    set u=null
    set ang=0
    set i=0
    set poz=null
       
endfunction


//===========================================================================
function InitTrig_By_the_fire_way takes nothing returns nothing
    set gg_trg_By_the_fire_way = CreateTrigger(  )
    call TriggerRegisterUnitEvent( gg_trg_By_the_fire_way, gg_unit_O002_0009, EVENT_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_By_the_fire_way, Condition( function Trig_By_the_fire_way_Conditions ) )
    call TriggerAddAction( gg_trg_By_the_fire_way, function Trig_By_the_fire_way_Actions )
endfunction
А вот триггер который я хочу вызвать
  function Trig_Fireloc_Actions takes location poz returns nothing
  
  call AddSpecialEffectLocBJ( poz, "Doodads\\Cinematic\\FireRockSmall\\FireRockSmall.mdl" )
  
  endfunction

//===========================================================================
function InitTrig_Fireloc takes nothing returns nothing
    set gg_trg_Fireloc = CreateTrigger(  )
    call TriggerAddAction( gg_trg_Fireloc, function Trig_Fireloc_Actions )
endfunction
Мне выдает ошибку на этом моменте
call TriggerExecute( gg_trg_Fireloc )
и на этом
call Firelocini (location poz)
А как мне вызвать функцию с этой переменной тогда? я не понимаю

Без ответа.


Просмотров: 134

» Лучшие комментарии


PT153 #1 - 2 недели назад (отредактировано ) 0
Нельзя создать условие или действие, что требует аргументов.

call Firelocini (location poz)
local l = Location(0., 0.)
call Firelocini (l)
VVelikolepniy #2 - 1 неделю назад (отредактировано ) 0
PT153:
Нельзя создать условие или действие, что требует аргументов.

call Firelocini (location poz)
local l = Location(0., 0.)
call Firelocini (l)
Тогда я могу написать просто
call Firelocini (poz)
но это тоже не работает
Vitalik8 #3 - 1 неделю назад (отредактировано ) 0
function Trig_Fireloc_Actions takes location poz returns nothing
call AddSpecialEffectLocBJ( poz, "Doodads\\Cinematic\\FireRockSmall\\FireRockSmall.mdl" )
endfunction
так как без мемхака нельзя такое сделать, тут либо создай глобальную переменую либо мемхак, попробуй это
globals
location loc
endglobals
function Firelocini takes location poz returns nothing
set loc = poz
call TriggerExecute( gg_trg_Fireloc )
endfunction
function Trig_Fireloc_Actions takes nothing returns nothing
call AddSpecialEffectLocBJ( loc, "Doodads\\Cinematic\\FireRockSmall\\FireRockSmall.mdl" )
endfunction
PT153 #4 - 1 неделю назад 0
но это тоже не работает
Это работает, но не так как ты хочешь. То что ты хочешь сделать, так работать не будет, я уже объяснил почему.
Решение Vitalik8 тебе подойдёт.
VVelikolepniy #5 - 1 неделю назад 0
Vitalik8:
function Trig_Fireloc_Actions takes location poz returns nothing
call AddSpecialEffectLocBJ( poz, "Doodads\\Cinematic\\FireRockSmall\\FireRockSmall.mdl" )
endfunction
так как без мемхака нельзя такое сделать, тут либо создай глобальную переменую либо мемхак, попробуй это
globals
location loc
endglobals
function Firelocini takes location poz returns nothing
set loc = poz
call TriggerExecute( gg_trg_Fireloc )
endfunction
function Trig_Fireloc_Actions takes nothing returns nothing
call AddSpecialEffectLocBJ( loc, "Doodads\\Cinematic\\FireRockSmall\\FireRockSmall.mdl" )
endfunction
а без чего именно нельзя такое сделать? что это за утилита?
prog #6 - 1 неделю назад 2
А зачем вам вобще триггер, если вы вызываете через функцию, а не событиями этого самого триггера?
Vitalik8 #7 - 1 неделю назад 0
prog #8 - 1 неделю назад 0
Vitalik8, зачем везде совать мемхак, даже там где он не нужен?
Vitalik8 #9 - 1 неделю назад 0
prog:
Vitalik8, зачем везде совать мемхак, даже там где он не нужен?
Тогда как ты хочеш передавать аргументы в событиях?
prog #10 - 1 неделю назад 0
А зачем передавать агрумент в триггер экзекут? Я понимаю еще передачу в таймер или триггер эвалуейт для сложных систем, но в экзекут зачем? Тем более, что у автора вопроса триггер без событий и условий - по сути ему более чем достаточно обычной функции.
Vitalik8 #11 - 1 неделю назад (отредактировано ) 0
prog:
А зачем передавать агрумент в триггер экзекут? Я понимаю еще передачу в таймер или триггер эвалуейт для сложных систем, но в экзекут зачем? Тем более, что у автора вопроса триггер без событий и условий - по сути ему более чем достаточно обычной функции.
Увидел уже, не заметил как он вызывал функцию
VVelikolepniy:
function Trig_Fireloc_Func takes location poz returns nothing
call AddSpecialEffectLocBJ( poz, "Doodads\\Cinematic\\FireRockSmall\\FireRockSmall.mdl" )
endfunction
function Firelocini takes location poz returns nothing
call Trig_Fireloc_Func(poz)
endfunction
А триггер тот можеш удалить
Maniac_91 #12 - 1 неделю назад 0
Лучше использовать координаты вместо точек, чтоб потом утечки не пришлось удалять. Да, так немного сложнее, но лучше. Есть формулы, заменяющие утечные функции (расстояние между точками, например). Их можно найти здесь, на XGM, или спросить в теме вопросов.
prog #13 - 1 неделю назад 0
Vitalik8, спешиш - для начала нужно понять зачем ему этот вызов триггера. Так то, если упрощать максимально, то лучше вобще так:
function Firelocini takes location poz returns nothing
	call AddSpecialEffectLocBJ( poz, "Doodads\\Cinematic\\FireRockSmall\\FireRockSmall.mdl" )
endfunction
А еще от BJ избавиться надо бы и удалением спецэффекта озаботиться.
И вобще, если присмотреться к коду, то там какая-то чуш творится с очисткой локального массива, в который никогда ничего не пишется.
VVelikolepniy #14 - 1 неделю назад 0
prog:
А зачем передавать агрумент в триггер экзекут? Я понимаю еще передачу в таймер или триггер эвалуейт для сложных систем, но в экзекут зачем? Тем более, что у автора вопроса триггер без событий и условий - по сути ему более чем достаточно обычной функции.
Ну мне нужновызвать огонь через функцию, что бы это был отдельный триггер, потому что я хочу сделать спелл типа сдувать эти огоньки по конусу( типа двигать). У меня идея была выбрать каждый эффект в зоне и через цикл двигать
prog #15 - 1 неделю назад 0
VVelikolepniy, и зачем тебе создание огня отдельным триггером? Что мешает сдувать огоньки созданные в обычной функции?
VVelikolepniy #16 - 1 неделю назад 0
prog:
Vitalik8, спешиш - для начала нужно понять зачем ему этот вызов триггера. Так то, если упрощать максимально, то лучше вобще так:
function Firelocini takes location poz returns nothing
	call AddSpecialEffectLocBJ( poz, "Doodads\\Cinematic\\FireRockSmall\\FireRockSmall.mdl" )
endfunction
А еще от BJ избавиться надо бы и удалением спецэффекта озаботиться.
И вобще, если присмотреться к коду, то там какая-то чуш творится с очисткой локального массива, в который никогда ничего не пишется.
Я просто не смог довести эти триггера до идеала в плане переменных и утечек, потому что у меня не работает нифига)
prog:
VVelikolepniy, и зачем тебе создание огня отдельным триггером? Что мешает сдувать огоньки созданные в обычной функции?
Потому что у меня будет 3 разных спелла которые будут по разному вызывать огоньки, мне кажется было бы оптимальнее сделать функцию и просто во всех моих заклинаниях вызывать ее и спокойно работать дальше
prog #17 - 1 неделю назад 0
Потому что у меня будет 3 разных спелла которые будут по разному вызывать огоньки, мне кажется было бы оптимальнее сделать функцию и просто во всех моих заклинаниях вызывать ее и спокойно работать дальше
Замечательно, три спела создающих огоньки, но зачем триггер при этом? Что не так с вызовом функции которая просто создает огоньки без вызова триггера?
VVelikolepniy #18 - 1 неделю назад (отредактировано ) 0
VVelikolepniy:
prog:
Vitalik8, спешиш - для начала нужно понять зачем ему этот вызов триггера. Так то, если упрощать максимально, то лучше вобще так:
function Firelocini takes location poz returns nothing
	call AddSpecialEffectLocBJ( poz, "Doodads\\Cinematic\\FireRockSmall\\FireRockSmall.mdl" )
endfunction
А еще от BJ избавиться надо бы и удалением спецэффекта озаботиться.
И вобще, если присмотреться к коду, то там какая-то чуш творится с очисткой локального массива, в который никогда ничего не пишется.
Я просто не смог довести эти триггера до идеала в плане переменных и утечек, потому что у меня не работает нифига)
prog:
VVelikolepniy, и зачем тебе создание огня отдельным триггером? Что мешает сдувать огоньки созданные в обычной функции?
Потому что у меня будет 3 разных спелла которые будут по разному вызывать огоньки, мне кажется было бы оптимальнее сделать функцию и просто во всех моих заклинаниях вызывать ее и спокойно работать дальше
А и я еще не сказал я хотел периодическое событие добавить в каждый созданный триггер и если в в какой то радиусе юнит от огня, то на него вешается дебафф, а на дебафф ЕЩЕ отдельный триггер, потому что каждый тик дебафа увеличивает урон. и в теории когда юнит уже горит и заходит в зону огня, у него обнуляется таймер (становится максимальным, скажем 5 секунд) окончания горения и урон продолжает возрастать
prog:
Потому что у меня будет 3 разных спелла которые будут по разному вызывать огоньки, мне кажется было бы оптимальнее сделать функцию и просто во всех моих заклинаниях вызывать ее и спокойно работать дальше
Замечательно, три спела создающих огоньки, но зачем триггер при этом? Что не так с вызовом функции которая просто создает огоньки без вызова триггера?
А если мне делать через массив мне все равно нужно делать периодическое событие на проверку есть ли юниты в зоне огня или нет
Я просто не понимаю почему я в функцию не могу взять ПЕРЕМЕННУЮ, как мне создать триггер, использующий локальную переменную из другого триггера? засовывать в глобальную переменную массив это костыли, наверняка есть способ это сделать
prog #19 - 1 неделю назад (отредактировано ) 2
ИМХО, слишком сложный спелл для человека который только учится пользоваться jass.
Я просто не понимаю почему я в функцию не могу взять ПЕРЕМЕННУЮ, как мне создать триггер, использующий локальную переменную из другого триггера? засовывать в глобальную переменную массив это костыли, наверняка есть способ это сделать
Начнем с простого - что такое переменная? Что такое глобальная переменная? Что такое локальная переменная? Что такое триггер? Что такое функция? Без понимания этого тебе не продвинуться дальше.
VVelikolepniy #20 - 1 неделю назад (отредактировано ) 0
prog:
ИМХО, слишком сложный спелл для человека который только учится пользоваться jass.
Но у меня в голове есть алгоритм действий, а реализовать кодом у меня не получается пока.
prog:
ИМХО, слишком сложный спелл для человека который только учится пользоваться jass.
Я просто не понимаю почему я в функцию не могу взять ПЕРЕМЕННУЮ, как мне создать триггер, использующий локальную переменную из другого триггера? засовывать в глобальную переменную массив это костыли, наверняка есть способ это сделать
Начнем с простого - что такое переменная? Что такое глобальная переменная? Что такое локальная переменная? Что такое триггер? Что такое функция? Без понимания этого тебе не продвинуться дальше.
С чего вы решили, что я не понимаю? Мне нудо локальную переменную координаты переместить в функцию, которая использует эту координату для дальнейших действий. И у меня 9999 вызовов такойфункции с разными координатами сделать
Maniac_91:
Лучше использовать координаты вместо точек, чтоб потом утечки не пришлось удалять. Да, так немного сложнее, но лучше. Есть формулы, заменяющие утечные функции (расстояние между точками, например). Их можно найти здесь, на XGM, или спросить в теме вопросов.
А в чем проблема очистки точки командой
set poz=null
Чего не хватает?
prog #21 - 1 неделю назад 0
VVelikolepniy, просто сформулируй ответы на эти вопросы - я не смогу помочь не разобравшись в том, что именно ты пропустил из основ. А попытки получить доступ к локальной переменной - явно говорят о том что что-то пропущено.
VVelikolepniy #22 - 1 неделю назад (отредактировано ) 0
prog:
VVelikolepniy, просто сформулируй ответы на эти вопросы - я не смогу помочь не разобравшись в том, что именно ты пропустил из основ. А попытки получить доступ к локальной переменной - явно говорят о том что что-то пропущено.
Переменная - занимаемая ячейка памяти с записанными значениями
Глобальная переменная используется в любом количестве триггеров
Локальная - для конкретного триггера
триггер - реакция на событие
функция - алгоритм берущий один результат и выдающий другой
prog #23 - 1 неделю назад 0
VVelikolepniy,
глобальная переменная - доступна в любом месте
локальная - доступна только в той ФУНКЦИИ в которой объявлена
функция - в рамках jass это самодостаточный фрагмент кода, могущий принимать параметры, содержать локальные переменные и возвращать значение
триггер - конструкция, которая при срабатывании события проверяет условия и вызывает действие если условие выполнено, условия и действия триггера выполнены в виде функций
VVelikolepniy #24 - 1 неделю назад 0
prog:
VVelikolepniy,
глобальная переменная - доступна в любом месте
локальная - доступна только в той ФУНКЦИИ в которой объявлена
функция - в рамках jass это самодостаточный фрагмент кода, могущий принимать параметры, содержать локальные переменные и возвращать значение
триггер - конструкция, которая при срабатывании события проверяет условия и вызывает действие если условие выполнено, условия и действия триггера выполнены в виде функций
Я понимаю, то есть мне не получится добавить локальную переменную в триггер из другого триггера, тк локальная переменная типа не может передаваться... Но как мне обойти тогда это? У меня есть мысль что надо вынуть из локальной переменной значение координаты и вписать ее в аргумент функции
prog #25 - 1 неделю назад 3
Триггеры рассчитаны на вызов при срабатывании событий и, соответственно, не принимают параметров, поскольку события не передают параметров.
Кроме того, значение локальной переменной, как и параметров, хранится только в пределах текущего вызова функции - даже если поставить мемхак и вызывать триггер с параметром, триггер никаким магическим образом не запомнит значение параметра для следующих вызовов.
Я бы на твоем месте начал с более простого спела - реализовал бы огоньки юнитами со способностью 'Aloc' (тогда их нельзя будет выделить и атаковать) и с пассивным адским пламенем или пламенем феникса, без дополнительного урона от длительности горения, но зато и без необходимости самостоятельно реализовывать поиск целей и нанесение урона.
Ну и да, локальные переменные типа точки мало обнулять, их перед этим нужно еще удалять соответствующей функцией.
Maniac_91 #26 - 1 неделю назад 3
А в чем проблема очистки точки командой
Очистка утечки - не проблема, но:
  • зачем создавать утечку и удалять её, если можно просто не создавать? ))
  • действия с координатами работают быстрее точек
  • нет лишних действий с перемещением точек
Допустим, есть два юнита - u1 и u2. Их координаты:
local real x1 = GetUnitX(u1)
local real y1 = GetUnitY(u1)
local real x2 = GetUnitX(u2)
local real y2 = GetUnitY(u2)
Угол a между ними:
local real a = Atan2(y2-y1, x2-x1)
Точка с координатами (x3;y3), расположенная под углом a на расстоянии 50 от юнита с координатами (x2;y2):
local real x3 = x2+50*Cos(a)
local real y3 = y2+50*Sin(a)
Чтобы создать эффект по координатам:
call AddSpecialEffect("Путь к модели", x3, y3)
Все переменные - локальные.
Необходимо удалить эффект после использования. Или использовать юнитов с ограниченным временем жизни, как пишет prog. В этом случае память очистится после смерти юнита автоматически.
Локальные реальныецелочисленные) переменные не требуют обнуления.
Нет необходимости создавать новый триггер, всё умещается в одном.
PT153 #27 - 1 неделю назад 0
Локальные реальные (и целочисленные) переменные не требуют обнуления.
Требуют обнуления только те переменные, у которых тип наследуются от handle.