XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
Архимонд
Silenced by Q
offline
Опыт: 1,367
Активность:
Событие - к юниту подошли
Есть такое событие - Unit Withih Range, но оно не подходит, поскольку там нужно указать конкретного юнита, а у меня юниты создаются в процессе игры (в результате использования спелла). Какие есть способы создания аналогичного события? Или другие способы
В общем, вы меня поняли :)
Старый 05.08.2007, 19:03
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
В одном триггере создаёшь юнита-снаряд и юзаешь "Добавить событие" с юнитом Last Created Unit в другой триггер, где нужно это событие.
Старый 05.08.2007, 20:35
adic3x

offline
Опыт: 108,439
Активность:
т.е. каждому юниту по ходу игры добавляешь событие.
Старый 05.08.2007, 21:30
Nethrez1m
Dat av doe
offline
Опыт: 2,123
Активность:
не лучше ли создать новый, временный триггер, используя jass?
Старый 05.08.2007, 22:23
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
Nethrez1m
Я, практически, это же и сказал.
Старый 05.08.2007, 23:01
Архимонд
Silenced by Q
offline
Опыт: 1,367
Активность:
DFlyer, спс
Старый 06.08.2007, 11:33
Архимонд
Silenced by Q
offline
Опыт: 1,367
Активность:
Ну вот добавил я событие, а можно ли его убрать?
В триггерах такого нет
Старый 06.08.2007, 21:50
J
expert
offline
Опыт: 48,447
Активность:
Архимонд удалить событие нельзя
вот Nethrez1m правельно сказал, использовать один и тот же тригер для спела неуникально, и может вызывать баги (все зависит от спела), гораздо лучше было бы создавать новый тригер при касте спела, и уже навешать на него действия с события, а когда действие спела прекратитсо удалить тригер.
Можеш кстате через SCV навешать триггеру сылки на его действия и условия, и удалить вместе с ним.

Отредактировано Jon, 06.08.2007 в 23:19.
Старый 06.08.2007, 21:55
Архимонд
Silenced by Q
offline
Опыт: 1,367
Активность:
Цитата:
создавать новый тригер

Каким образом? я имею ввиду конкретный код и объяснение его действия
Старый 06.08.2007, 22:10
J
expert
offline
Опыт: 48,447
Активность:
Код:
local trigger trig = CreateTrigger() // создатьт триггер
call TriggerAddAction          (trig,           function YouAction    ) // Добовляет действие
call TriggerAddCondition       (trig, Condition(function YouCondition)) // Добовляет условие
call TriggerRegisterUnitInRange(trig, UNIT, 250, null                 ) // Добовляет событе подохода к юниту Unit на 250

Отредактировано Jon, 06.08.2007 в 22:24.
Старый 06.08.2007, 22:15
Архимонд
Silenced by Q
offline
Опыт: 1,367
Активность:
Ммм... получается, я избавился от одного триггера, в котором была одинокая строчка Custom script: call MyFunc( GetTriggerUnit() )
Оптимизация выходит...
Какая функция удаляет триггер?
Старый 06.08.2007, 22:19
J
expert
offline
Опыт: 48,447
Активность:
Архимонд оптимизаци != Маленький код
call DestroyTrigger(trig)

Jon добавил:
а хотя то что я сказал это всеже чуть чуть идет в ущерб оптимальности, но это более правелнее и уникальнее, т.е. поможет избежать от множества багов
Старый 06.08.2007, 22:21
TNT
О_о
offline
Опыт: 11,019
Активность:
Jon, ты мне тоже очень помог )
Старый 06.08.2007, 22:22
Архимонд
Silenced by Q
offline
Опыт: 1,367
Активность:
Jon
Цитата:
оптимизаци != Маленький код

Я имел ввиду то что там был триггер с одной функцией, а из-за этого триггера создавались всякие там InitTrig, и т.д. и т.п.

Вроде все работает, спасибо

Архимонд добавил:
А как удалить триггер? Ведь он создается в локальной переменной и ссылка на него пропадает.
Цитата:
call TriggerAddAction (trig, function YouAction )

Если я в функции YouAction вызову
Код:
call DestroyTrigger( GetTriggeringTrigger() )

это сработает?
Старый 06.08.2007, 22:39
J
expert
offline
Опыт: 48,447
Активность:
да
Старый 06.08.2007, 22:43
Архимонд
Silenced by Q
offline
Опыт: 1,367
Активность:
Цитата:
Вроде все работает

Зря я это сказал, даже не запустив карту...
Ничего не работает :)

Вот код:
Код:
С: Боевая еденица - Герой начинает направлять способность
У: (Ability being cast) равно Способность
Д: Custom script:   local trigger trig = CreateTrigger()
    Custom script:   call TriggerAddAction (trig, function MyTrigger )
    Боевая еденица - create бла бла бла лень писать в точке ability being cast бла бла
    Custom script:   call TriggerRegisterUnitInRange(trig, GetLastCreatedUnit(), 256, null )

Боевая еденица создается, но событие не срабатывает

Архимонд добавил:
Вот текст MyTrigger:
Код:
function MyTrigger takes nothing returns nothing
 call MyFunc ( GetTriggerUnit() )
 call DestroyTrigger( GetTriggeringTrigger() )
endfunction


Архимонд добавил:
Цитата:
событие не срабатывает

пардон, неправильная формулировка
Событие срабатывает, но не происходят действия в MyFunc

Архимонд добавил:
А действия в MyFunc не происходят, потому что не срабатывает GetTriggerUnit()

Архимонд добавил:
В функции, которая используется для созданного триггера, нельзя использовать GetTriggerUnit()?
Старый 06.08.2007, 23:09
J
expert
offline
Опыт: 48,447
Активность:
выложи функцию MyFunc
Старый 06.08.2007, 23:13
Архимонд
Silenced by Q
offline
Опыт: 1,367
Активность:
Короче, выкладываю весь код...

Триггер MineCreate:
Код:
Событие: Боевая еденица - Сапер 0024 <gen> Начинает направлять способность
Условие: (Ability being cast) равно Установка мины
Действие: Custom script:   local trigger trig = CreateTrigger()
               Custom script:   call TriggerAddAction (trig, function MineBoomTrigger )
               Боевая еденица - Create 1 Мина for Нейтрально - пассивный at (Target point of ability being cast) facing Стандартная ориентация зданий degrees
               Custom script:   call TriggerRegisterUnitInRange(trig, GetLastCreatedUnit(), 256, null )

Функции:
Код:
//Функции для спелла Установка мины

//Взорвать мину и нанести всем повреждение
function MineBoom takes unit mine returns nothing
 local group gr = CreateGroup()
 local unit u
   call GroupEnumUnitsInRange(gr, GetUnitX(mine), GetUnitY(mine), 250, null)
   loop
      set u = FirstOfGroup(gr)
      exitwhen u == null
      //
      if (u != mine) then
         call SetUnitState( GetEnumUnit(), UNIT_STATE_LIFE, GetUnitState(GetEnumUnit(), UNIT_STATE_LIFE) - 200.00)
      endif
      call GroupRemoveUnit (gr, u)
   endloop
   call DestroyGroup(gr)
   set gr = null
 call SetUnitAnimation( mine, "Death Spell" ) //Анимация смерти
endfunction

//Функция создает мину
function MineBoomTrigger takes nothing returns nothing
 call MineBoom ( GetTriggerUnit() )
 call DestroyTrigger( GetTriggeringTrigger() )
endfunction

Уфф... вроде все

Архимонд добавил:
Только забыл мину уничтожить... Но повреждение не наносится

Архимонд добавил:
Уничтожение мины лечится 2мя строчками в конце MineBoom:
Код:
call TriggerSleepAction( 2.33 )
 call RemoveUnit( mine )
Старый 06.08.2007, 23:24
J
expert
offline
Опыт: 48,447
Активность:
Код:
call SetUnitState( GetEnumUnit(), UNIT_STATE_LIFE, GetUnitState(GetEnumUnit(), UNIT_STATE_LIFE) - 200.00)

исправь на:
Код:
call SetUnitState( u, UNIT_STATE_LIFE, GetUnitState(u, UNIT_STATE_LIFE) - 200)

ты юзаеш луп, а не форгруп

Отредактировано Jon, 06.08.2007 в 23:39.
Старый 06.08.2007, 23:33
Архимонд
Silenced by Q
offline
Опыт: 1,367
Активность:
упс...
Цитата:
ты юзаеш луп, а не форгруп

мы это в другой теме обсуждали... я забыл исправить, просто вырезал из того триггера и вставил в луп
спс
Старый 06.08.2007, 23:39
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 22:52.