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

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

Закрытая тема
 
sonicscream

offline
Опыт: 773
Активность:
Обнуление события из триггера
Как удалить все события из триггера?
Подскажите плиз 8)
Раскажу зачем мне это нужно:
Есть некая пассивка-пустышка --> нужно отслеживать каждую атаку героя
Но на вооружении картостроителя, не обладающего силой в jass, есть только Юнит атакован и Юнит получает урон, причём во втором случае событие можно привязать только к определённому юниту (не переменной разумеется). Но к счастью есть действие: создать и запихать событие в другой триггер. И главный минус, нельзя просто запихать его а потом использовать командой run trigger, поэтому с каждой атакой событий в триггере становится всё больше, можно сказать што тригер умножается на число совершённых атак героя %) это ужасно...
Помогите!
Старый 15.03.2010, 13:17
JaBeN_Симфер

offline
Опыт: 20,050
Активность:
когда создаешь событие, то: событие, условие и действие надо заносить в массивы, а потом при удалении триггера удалять все из этих массивов и отчищать их, номера массивов бери из HandleId(trigger) - число, например 150000, чтобы у тебя не выходило за 8192
native TriggerRemoveAction  takes trigger whichTrigger, triggeraction whichAction returns nothing
native TriggerRemoveCondition takes trigger whichTrigger, triggercondition whichCondition returns nothing
Старый 15.03.2010, 13:32
Master_chan
Полуночный командир
offline
Опыт: 15,660
Активность:
Скажи что нужно сделать с юнитом которого атаковал герой. Вероятно можно будет обойтись без всякой хрени триггеров вообще.

Из описания вообще не понял что ты хочешь сделать...
Старый 15.03.2010, 13:32
Doc

offline
Опыт: 63,163
Активность:
Зачем каждый раз одного и того же героя добавлять? Заноси его в группу и проверяй наличие в группе при добавлении события
Старый 15.03.2010, 13:48
sonicscream

offline
Опыт: 773
Активность:
JaBeN_Симфер
а ну я ваще ничё не понял
Master_chan
Ну с самим юнитом посути ваще ничего не надо делать, надо убавить переменную integer на 1 единицу, дать предмет герою, но суть в том штобы всё это происходило в момент удара а не до него
DoctorGester
мм... куда я героя добавляю?

Вот так как щаз сделано выглядит так:
1.
Событие: Боевая единица - юнит атакован
Условие: Атакующий юнит равен "такой-та"
Действие: Триггер - добавить в "некий другой" event" атакованный юнит получает урон
2.
Событие: нет
Условие: юнит нанёсший урон равен "такой-та"
Действия: ...я рассказал
Дак вот нужно сделать так штобы каждый раз условия или весь тригер обнулялся или удалялся и создавался новый, точно такой-же, вновь без условий
Может ктонить выложить это полностью в jass, штобы мне осталось только вставить в нужное место действия?
Или всёже можно с помощью custom script удалять событие?
Вроде на UmsWE даже тригер есть такой
да только не запускается у меня он
Старый 15.03.2010, 14:14
Nekit1234007

offline
Опыт: 11,916
Активность:
Событие из триггера удалить невозможно.
Старый 15.03.2010, 14:24
Master_chan
Полуночный командир
offline
Опыт: 15,660
Активность:
Убить триггер и создать новый.
Старый 15.03.2010, 15:30
Helpmeplz

offline
Опыт: 11,738
Активность:
использовать событие юнит атакован при отлове урона - не очень умно.
чтобы юнит один раз заносился в триггер, достаточно отловить его событием "Юинт входит в игровую зону" или, если он изначально находится на карте, заносить его в триггер при инициализации.
ну и если тебе так хочется для отлова урона использовать событие "Юнит атаковат", то заноси его в группу.
Старый 15.03.2010, 16:14
sonicscream

offline
Опыт: 773
Активность:
Helpmeplz
А можешь написать пример?
Старый 15.03.2010, 17:27
JaBeN_Симфер

offline
Опыт: 20,050
Активность:
Вот пример.
Сделано на хеше, но если есть JNGP, то можно и на глобалках.
Старый 15.03.2010, 17:56
sonicscream

offline
Опыт: 773
Активность:
*JaBeN_Симфер*
спасибо, попытаюсь разобраться
Старый 15.03.2010, 18:09
JaBeN_Симфер

offline
Опыт: 20,050
Активность:
спрашивай что не понятно будет
Старый 15.03.2010, 18:13
sonicscream

offline
Опыт: 773
Активность:
Как мне задать условие на определённого юнита?
Старый 15.03.2010, 18:22
JaBeN_Симфер

offline
Опыт: 20,050
Активность:
в триггере event damaged написано, туда впиши то, что тебе надо
Старый 15.03.2010, 18:27
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
native  TriggerRegisterUnitEvent  takes trigger whichTrigger, unit whichUnit, unitevent whichEvent  returns event
FellGuard добавил:
unitevents
Старый 15.03.2010, 18:28
Master_chan
Полуночный командир
offline
Опыт: 15,660
Активность:
Любите вы лазить в память вара...

без расчлененки...
Старый 15.03.2010, 20:39
JaBeN_Симфер

offline
Опыт: 20,050
Активность:
Master_chan, ты считаешь, что ты сделал правильнее? или ты думаешь, что его действие не будет засорять память в твоем случае?
А если у юнита интервал между атаками будет 5 секунд например?
Там вообще многое не оптимизировано и не доделано.
Старый 15.03.2010, 21:57
sonicscream

offline
Опыт: 773
Активность:
Немогу разобраться в джазе и в код вставить действия которые мне нужны ТТ
Старый 15.03.2010, 22:07
JaBeN_Симфер

offline
Опыт: 20,050
Активность:
globals
    triggercondition array udg_Condition
    triggeraction array udg_Action
endglobals
Добавив в JNGP эти глобалки можно вообще сделать без хеша
constant function Index_Handle takes nothing returns integer
    return 1049500
endfunction

function Remove_Trigger takes integer h2i returns nothing
    if udg_Trigger[h2i] != null then
        call TriggerRemoveCondition(udg_Trigger[h2i], udg_Condition[h2i])
        call TriggerRemoveAction(udg_Trigger[h2i], udg_Action[h2i])
        call DestroyTrigger(udg_Trigger[h2i])
        set udg_Condition[h2i] = null
        set udg_Action[h2i] = null
        set udg_Trigger[h2i] = null
    endif
endfunction

function Add_Damage takes nothing returns nothing
    local integer h2i = GetHandleId(GetEventDamageSource()) - Index_Handle()
    local real damage = GetEventDamage()
    local unit u = GetEventDamageSource()
//------
    call Remove_Trigger(h2i)
endfunction

function Tr_Conditions takes nothing returns boolean
    return R2I(GetEventDamage()) > 0 and GetOwningPlayer(GetEventDamageSource()) != GetOwningPlayer(GetTriggerUnit())
endfunction

function Trig_event_damaged_Actions takes nothing returns nothing
    local trigger t = CreateTrigger()
    local integer h2i = GetHandleId(GetAttacker()) - Index_Handle()
    call Remove_Trigger(h2i)
    set udg_Trigger[h2i] = t
    call TriggerRegisterUnitEvent(t, GetTriggerUnit(), EVENT_UNIT_DAMAGED)
    set udg_Condition[h2i] = TriggerAddCondition(t, Condition(function Tr_Conditions))
    set udg_Action[h2i] = TriggerAddAction(t, function Add_Damage)
    set t = null
endfunction

//===========================================================================
function InitTrig_event_damaged takes nothing returns nothing
    local integer index = 0
    set gg_trg_event_damaged = CreateTrigger()
    loop
        call TriggerRegisterPlayerUnitEvent(gg_trg_event_damaged, Player(index), EVENT_PLAYER_UNIT_ATTACKED, null)
        set index = index + 1
        exitwhen index == 16
    endloop
    call TriggerAddAction(gg_trg_event_damaged, function Trig_event_damaged_Actions)
endfunction
Все проще некуда и работает правильно, т.к. я выдирал это со своей карты, где утечек нет.
Старый 15.03.2010, 22:08
JaBeN_Симфер

offline
Опыт: 20,050
Активность:
Немогу разобраться в джазе и в код вставить действия которые мне нужны ТТ
Создай триггер и внеси все нужные в него действия в гуи, а вотом вызывай действие триггера через вставку функции в этой строчке:
    local unit u = GetEventDamageSource()
//------
    call Remove_Trigger(h2i)
например так:
    local unit u = GetEventDamageSource()
    call Trig_*TvoiDeistviya*_Actions()
    call Remove_Trigger(h2i)

Отредактировано JaBeN_Симфер, 16.03.2010 в 17:28.
Старый 15.03.2010, 22:21
Закрытая тема

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

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

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

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



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