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

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

Ответ
 
JET_LI

offline
Опыт: 1,724
Активность:
Создание триггера и добавление в него действия
Я покажу пример, что я хочу сделать:
у мну есть триггер, в котором событие "Юнит умирает", далее идёт действие, если умер "медведь", то создать предмет, а именно ид его: 'I01P' и потом в локальную переменную присуждается значение, например, переменная "itm" и её значение = GetLastCreatedItem(). Потом должен создаться триггер, в начале перед всеми действиями идёт локальная переменная "trg", тип её "trigger" а начальное значение "CreateTrigger()". Вот когда создался предмет 'I01P', должно в триггер "trg" добавится действие, а именно: "RemoveItem(itm)". Скажите как это сделать, вот у мну есть заготовка, но дальше не могу чё-то! Плиз если так нельзя, то сделайте по другому, но чтобы было всё рационально! Заранее спасибо!!!
Вот заготовка:
Код:
function trg_DeadSet takes nothing returns nothing
   local item itm
   local trigger trg=CreateTrigger()
        // Dead_Hostile_BearAndCreateItem
        if GetUnitTypeId(GetDyingUnit()) =='n011' then
            call CreateItemLoc('I01P', GetUnitLoc(GetDyingUnit()))
            set itm=GetLastCreatedItem()
            call SetItemCharges(itm,GetRandomInt(6, 24))
            // Продолжте плиз, то что я написал выше!
        endif
endfunction
function InitTrig_DeadSettings takes nothing returns nothing
    set gg_trg_DeadSettings=CreateTrigger( )
    call TriggerRegisterAnyUnitEventBJ(gg_trg_DeadSettings,EVENT_PLAYER_UNIT_DEATH)
    call TriggerAddAction(gg_trg_DeadSettings,function trg_DeadSet)
endfunction
Старый 16.03.2009, 12:55
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Код:
globals
    item itm
endglobals

function trg_DeadSetRemove takes nothing returns nothing
    call RemoveItem(itm)
endfunction

function trg_DeadSet takes nothing returns nothing
    local trigger trg=CreateTrigger()
    if GetUnitTypeId(GetDyingUnit()) =='n011' then
        set itm=CreateItemLoc('I01P', GetUnitLoc(GetDyingUnit()))
        call SetItemCharges(itm,GetRandomInt(6, 24))
        call TriggerAddAction(trg,function trg_DeadSetRemove)
    endif
endfunction

function InitTrig_DeadSettings takes nothing returns nothing
    set gg_trg_DeadSettings=CreateTrigger( )
    call TriggerRegisterAnyUnitEventBJ(gg_trg_DeadSettings,EVENT_PLAYER_UNIT_DEATH)
    call TriggerAddAction(gg_trg_DeadSettings,function trg_DeadSet)
endfunction

Как-то так.
Старый 16.03.2009, 13:29
JET_LI

offline
Опыт: 1,724
Активность:
Ой!! Я забыл самое важное сказать Hellfim ты уже знаешь к чему эта вся ведётся целЬ)))).
Помнишь ты мне тригер помог написать на сложение зарядов предмета I01P и ограничение.
Ну вот а я юнит который в этом триггере умирает в условие - это медведь, типо после него остаётся мясо и т п...
Должен создоватсья предмет I01P то есть та самая пища и к ней сделать случайнные заряды от 6 до 24.
Но если так будет продолжаться без удаление предмета, то карта будет вся в этих предметах, что очень не удобно!!! Вот я и хотел сделать чтобы через 15 сек предмет удалялся, но не хочу использовать глобалки. У мну есть идея, я смотрел подобные задачи как написали в доте, они там использовали локальный буффер!!!
Может быть ты мне вместо глобалок сделаешь локальный буффер, плииз. Ты же сам понимаешь, если с глобалками, то это получается неверно, вот например один юнит убил медведя и тут же другой убивает медведя и что у нас получается?? У нас получается что один предмет останется а другой исчезнет!
Можно впринципе использовать массив, но это уже громоздко. Плииз придумай!

JET_LI добавил:
Аааааааа, погодь вот в блоке globals, это что ли своеобразный блок для создания переменных, доступные во всём, именно в этом триггере??

JET_LI добавил:
То есть,я так понял что при работы этого триггера каждый раз создаются новый ряд этих переменных, то есть как и локальные и потом они так же удаляются когда триггер заканчивает свою работу, так?

JET_LI добавил:
значит у мну ошибки не будет? если один юнит убил медведь и потом тут же второй. Все предметы в свое нужное время удалятся да?
Старый 16.03.2009, 13:43
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
JET_LI, что такое локальный буфер яхз =) Блок
Код:
globals
endglobals

Доступен только в JNPG. Я бы сделал так:
Код:
globals
    item array itmDS
    timer array timDS
endglobals

function trg_DeadSetRemove takes nothing returns nothing
    local integer i=0
    local timer tim=GetExpiriedTimer()
    loop
        exitwhen i>8191
        if timDS[i]==tim then
            call RemoveItem(itm[i])
            call DestroyTimer(tim)
            call DestroyTimer(timDS[i])
            set tim=null
            set timDS[i]=null
            return
        endif
        set i=i+1
    endloop
    call DestroyTimer(tim)
    set tim=null
endfunction

function trg_DeadSet takes nothing returns nothing
    local integer i=0
    if GetUnitTypeId(GetDyingUnit()) =='n011' then
        set itm=CreateItem('I01P', GetUnitX(GetDyingUnit()),GetUnitY(GetDyingUnit()))
        call SetItemCharges(itm,GetRandomInt(6, 24))
        loop
            exitwhen i>8191
            if timDS[i]==null then
                set timDS[i]=CreateTimer()
                call TimerStart(timDS[i],15.00,false,function trg_DeadSetRemove)
            endif
            set i=i+1
    endif
endfunction

function InitTrig_DeadSettings takes nothing returns nothing
    set gg_trg_DeadSettings=CreateTrigger( )
    call TriggerRegisterAnyUnitEventBJ(gg_trg_DeadSettings,EVENT_PLAYER_UNIT_DEATH)
    call TriggerAddAction(gg_trg_DeadSettings,function trg_DeadSet)
endfunction
Старый 16.03.2009, 13:56
JET_LI

offline
Опыт: 1,724
Активность:
Слушай ты думаешь это правильно запускать цикл на 8191!
Комп случайно не сойдёт с ума))))????

JET_LI добавил:
А что такое DS??
ты в название переменной использовал зачем это?? объясни плиииз

JET_LI добавил:
или просто такое название переменной?? и не чё больше?

JET_LI добавил:
и кст для чего цикл на 8191???

JET_LI добавил:
и ещё вопрос правдо не по теме но ответь плиз:
есть такая штука GetHandleTimer()
и как с ней работать я забыл покажи просто пример
например создать юнита и по таймеру его перемещать.
Старый 16.03.2009, 14:04
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
JET_LI, сойдет... Из-за моей криворукости я сделал кривой код. Вот держи нормальный.
» CODE

Код:
globals
    item array itmDS
    timer array timDS
endglobals

function trg_DeadSetRemove takes nothing returns nothing
    local integer i=0
    local timer tim=GetExpiriedTimer()
    loop
        exitwhen i>8191
        if timDS[i]==tim then
            call RemoveItem(itm[i])
            call DestroyTimer(tim)
            call DestroyTimer(timDS[i])
            set tim=null
            set timDS[i]=null
            return
        endif
        set i=i+1
    endloop
    call DestroyTimer(tim)
    set tim=null
endfunction

function trg_DeadSet takes nothing returns nothing
    local integer i=0
    if GetUnitTypeId(GetDyingUnit()) =='n011' then
        set itm=CreateItem('I01P', GetUnitX(GetDyingUnit()),GetUnitY(GetDyingUnit()))
        call SetItemCharges(itm,GetRandomInt(6, 24))
        loop
            exitwhen i>8191
            if timDS[i]==null then
                set timDS[i]=CreateTimer()
                call TimerStart(timDS[i],15.00,false,function trg_DeadSetRemove)
            endif
            set i=i+1
    endif
endfunction

function InitTrig_DeadSettings takes nothing returns nothing
    set gg_trg_DeadSettings=CreateTrigger( )
    call TriggerRegisterAnyUnitEventBJ(gg_trg_DeadSettings,EVENT_PLAYER_UNIT_DEATH)
    call TriggerAddAction(gg_trg_DeadSettings,function trg_DeadSet)
endfunction



DS это сокращение от DeadSet можно назвать как угодно, но так 100% имя не повторится.

Цикл до 8191 т.к. это последний элемент цикла.

Про GetHandleTimer() забудь. Это scv, оно очень медленно, но если хочешь, то можешь почитать статью сергей про Jass. Там глава называется RB+Cache.
Старый 16.03.2009, 16:00
JET_LI

offline
Опыт: 1,724
Активность:
Смотри я сделал проще!
Код:
function CreateItemsFood takes nothing returns nothing
    local item itm
    call CreateItemLoc('I01P', GetUnitLoc(GetDyingUnit()))
    set itm=GetLastCreatedItem()
    call SetItemCharges(itm,GetRandomInt(6,24))
    call TriggerSleepAction(15.00)
    if IsItemOwned(itm)==false then
        call RemoveItem(itm)
    endif
    set itm=null
endfunction

function Trig_DeadSettings_Actions takes nothing returns nothing 
    local trigger trg=CreateTrigger()       
    if GetUnitTypeId(GetDyingUnit())=='n011' then
    call TriggerAddAction(trg, function CreateItemsFood)
    call ConditionalTriggerExecute(trg)
    endif
    set trg=null
endfunction

function InitTrig_DeadSettings takes nothing returns nothing
    set gg_trg_DeadSettings = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_DeadSettings, EVENT_PLAYER_UNIT_DEATH )
    call TriggerAddCondition( gg_trg_DeadSettings, Condition( function Trig_DeadSettings_Conditions ) )
    call TriggerAddAction( gg_trg_DeadSettings, function Trig_DeadSettings_Actions )
endfunction

Ну как?))
Не надо не чё мудрить)Ыть
Старый 16.03.2009, 16:23
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
JET_LI, после убийства медведя игра ставится на паузу и по истечении 15 секунд(во время паузы) мясо пропадает, но впринципе неплохо =)
Старый 16.03.2009, 16:33
Ответ

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

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

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

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



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