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

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

А в чем проблема очистки точки командой
Очистка утечки - не проблема, но:
  • зачем создавать утечку и удалять её, если можно просто не создавать? ))
  • действия с координатами работают быстрее точек
  • нет лишних действий с перемещением точек
Допустим, есть два юнита - 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. В этом случае память очистится после смерти юнита автоматически.
Локальные реальныецелочисленные) переменные не требуют обнуления.
Нет необходимости создавать новый триггер, всё умещается в одном.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
24
5 лет назад
0
Vitalik8, зачем везде совать мемхак, даже там где он не нужен?
0
3
5 лет назад
0
prog:
Vitalik8, зачем везде совать мемхак, даже там где он не нужен?
Тогда как ты хочеш передавать аргументы в событиях?
0
24
5 лет назад
0
А зачем передавать агрумент в триггер экзекут? Я понимаю еще передачу в таймер или триггер эвалуейт для сложных систем, но в экзекут зачем? Тем более, что у автора вопроса триггер без событий и условий - по сути ему более чем достаточно обычной функции.
0
3
5 лет назад
Отредактирован Vitalik8
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
А триггер тот можеш удалить
0
18
5 лет назад
0
Лучше использовать координаты вместо точек, чтоб потом утечки не пришлось удалять. Да, так немного сложнее, но лучше. Есть формулы, заменяющие утечные функции (расстояние между точками, например). Их можно найти здесь, на XGM, или спросить в теме вопросов.
0
24
5 лет назад
0
Vitalik8, спешиш - для начала нужно понять зачем ему этот вызов триггера. Так то, если упрощать максимально, то лучше вобще так:
function Firelocini takes location poz returns nothing
	call AddSpecialEffectLocBJ( poz, "Doodads\\Cinematic\\FireRockSmall\\FireRockSmall.mdl" )
endfunction
А еще от BJ избавиться надо бы и удалением спецэффекта озаботиться.
И вобще, если присмотреться к коду, то там какая-то чуш творится с очисткой локального массива, в который никогда ничего не пишется.
0
8
5 лет назад
0
prog:
А зачем передавать агрумент в триггер экзекут? Я понимаю еще передачу в таймер или триггер эвалуейт для сложных систем, но в экзекут зачем? Тем более, что у автора вопроса триггер без событий и условий - по сути ему более чем достаточно обычной функции.
Ну мне нужновызвать огонь через функцию, что бы это был отдельный триггер, потому что я хочу сделать спелл типа сдувать эти огоньки по конусу( типа двигать). У меня идея была выбрать каждый эффект в зоне и через цикл двигать
0
24
5 лет назад
0
VVelikolepniy, и зачем тебе создание огня отдельным триггером? Что мешает сдувать огоньки созданные в обычной функции?
0
8
5 лет назад
0
prog:
Vitalik8, спешиш - для начала нужно понять зачем ему этот вызов триггера. Так то, если упрощать максимально, то лучше вобще так:
function Firelocini takes location poz returns nothing
	call AddSpecialEffectLocBJ( poz, "Doodads\\Cinematic\\FireRockSmall\\FireRockSmall.mdl" )
endfunction
А еще от BJ избавиться надо бы и удалением спецэффекта озаботиться.
И вобще, если присмотреться к коду, то там какая-то чуш творится с очисткой локального массива, в который никогда ничего не пишется.
Я просто не смог довести эти триггера до идеала в плане переменных и утечек, потому что у меня не работает нифига)
prog:
VVelikolepniy, и зачем тебе создание огня отдельным триггером? Что мешает сдувать огоньки созданные в обычной функции?
Потому что у меня будет 3 разных спелла которые будут по разному вызывать огоньки, мне кажется было бы оптимальнее сделать функцию и просто во всех моих заклинаниях вызывать ее и спокойно работать дальше
0
24
5 лет назад
0
Потому что у меня будет 3 разных спелла которые будут по разному вызывать огоньки, мне кажется было бы оптимальнее сделать функцию и просто во всех моих заклинаниях вызывать ее и спокойно работать дальше
Замечательно, три спела создающих огоньки, но зачем триггер при этом? Что не так с вызовом функции которая просто создает огоньки без вызова триггера?
0
8
5 лет назад
Отредактирован VVelikolepniy
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 разных спелла которые будут по разному вызывать огоньки, мне кажется было бы оптимальнее сделать функцию и просто во всех моих заклинаниях вызывать ее и спокойно работать дальше
Замечательно, три спела создающих огоньки, но зачем триггер при этом? Что не так с вызовом функции которая просто создает огоньки без вызова триггера?
А если мне делать через массив мне все равно нужно делать периодическое событие на проверку есть ли юниты в зоне огня или нет
Я просто не понимаю почему я в функцию не могу взять ПЕРЕМЕННУЮ, как мне создать триггер, использующий локальную переменную из другого триггера? засовывать в глобальную переменную массив это костыли, наверняка есть способ это сделать
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.