Хочу научиться джазу, читаю уроки, но возник вопрос:
Не получается вызвать функцию, вызывающую триггер с переменной типа 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
28
5 лет назад
0
но это тоже не работает
Это работает, но не так как ты хочешь. То что ты хочешь сделать, так работать не будет, я уже объяснил почему.
Решение Vitalik8 тебе подойдёт.
0
8
5 лет назад
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
а без чего именно нельзя такое сделать? что это за утилита?
2
24
5 лет назад
2
А зачем вам вобще триггер, если вы вызываете через функцию, а не событиями этого самого триггера?
0
3
5 лет назад
0
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:
А зачем передавать агрумент в триггер экзекут? Я понимаю еще передачу в таймер или триггер эвалуейт для сложных систем, но в экзекут зачем? Тем более, что у автора вопроса триггер без событий и условий - по сути ему более чем достаточно обычной функции.
Ну мне нужновызвать огонь через функцию, что бы это был отдельный триггер, потому что я хочу сделать спелл типа сдувать эти огоньки по конусу( типа двигать). У меня идея была выбрать каждый эффект в зоне и через цикл двигать
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.