Делаю следующее заклинание:
В области создаётся буря которая наносит урн/сек и замедляет противников в течение 5 сек, и если он в течении трёх секунд не выйдет из этой бури то он заледенеет.
Вобщем я сделал канал после которого создаётся дамми с жаром прейсподней ( эффект который не меняется на дамми почему то), но как сделать замедление в течение этого 5 секунд.
Заклинание делаю на GUI!!!
С жаром прейсподней просто эффект не меняется на дамми почему то на герое меняется, а на нём нет, объясните этот момент тоже

На гуи такие сложные спеллы лучше не делать, обычно используется 2 группы чтобы определять сколько юнит пробыл в области и покинул ли он еще или снова вошел, ну и естественно события с малым периодом. Я бы взял за основу буран или огненный дождь, ну а замедление - вручание ауры торнадо, ну и естественно с начала каста отсчитываем время и ищем юнита и отсчитываем сколько они пробыли в области.
`
ОЖИДАНИЕ РЕКЛАМЫ...
23
Похожие вопросы:

ответ
Impertus:
quq_CCCP:
Без локейшенов, набери
	GetRandomReal( GetRectMinX( bj_mapInitialPlayableArea ), GetRectMaxX( bj_mapInitialPlayableArea )  )
Для Y думаю догадаешся как найти...
Размер карты-то изначально известен, можно обойтись и рандомом между статичными цифирями. Думал над этим вариантом тоже, значит будем пользовать его.
nvc123:
к слову этот вообще не рабочий ибо количество итераций циклов может превысить лимит потока и тогда триггер просто обрубится
Ставить таймеры по 0.5 сек? Такого вида?
loop
        exitwhen  IsUnitDeadBJ(BET) or BECo > 20
        if (TimerGetRemaining(t) <= 0) then
            call MoveLocation( p, GetRandomReal ( X1, X2), GetRandomReal (Y1, Y2))
            call SetUnitMoveSpeed( BET, 500.00 )
            call IssuePointOrderLocBJ( BET, "move", p )
            set BECo = BECo + 0.5
            call TimerStart(t, 0.5, false, null)
        endif     
endloop
Таймер не вейт, он запустить новый Поток когда истечет, в функции старта таймера 4 параметра, таймер, время, периодичный буль и ссылка на код .
вместо null нужно вписать function Имя функции
functiom Timer_UnitMove_Expires takes nothing returns nothing
    // эта функция будет вызыватся каждые 0.50 сек. пока не остановить таймер
endfunction


function A takes nothing returns nothing
local timer t = CreateTimer( )

call TimerStart( t, 0.50, true, function Timer_UnitMove_Expires )

set t = null
endfunction
Чтобы передавать информацию между функциями нужны так называемые Аттачи, нужно прикрепить данные к триггеру или таймеру, потому что мы можем получить ссылку на них в запущенных ими потоками.
Про хештаблицу куча данных на сайте, SaveUnitHandle( хештаблица, ключ 1, ключ 2, сам юнит )
ответ
Поскольку его не пугает наличие большого влияния промахов на геймплей - скорее всего он делает рпг. Имхо в рпг всегда клево смотрятся тексттаги полученного урона, для создания которых необходимы триггеры на отлов получения урона. А отлавливаемый урон - можно и прохилить.
Для прохила(и вообще всех манипуляций с задержкой в 0.00 сек) лично я юзаю такие костыли:
Либа здесь только для доп табуляции. Я за чистый жасс + дефайны.
library ZeroTimeEvent

    globals
        constant integer ZTEArraySize = 64//Even 32 is alot, 64 is too much! Exactly what I need!
        timer Zero//Used for 0. sec uses
        integer ZTECurrent = 0
        unit array ZTEUnits[ZTEArraySize]
        integer array ZTEIntegers[ZTEArraySize]
        real array ZTEReals[ZTEArraySize]
        trigger array ZTETriggers[ZTEArraySize]
    endglobals
    
    function ZeroTimeEvent takes nothing returns nothing
            loop
                set  ZTECurrent = ZTECurrent - 1
                call TriggerExecute( ZTETriggers[ZTECurrent] )
                exitwhen ZTECurrent < 1
            endloop
    endfunction
    
    #define ZTEAddUnit(u) = {
        set  ZTEUnits[ZTECurrent] = u
    }
    
    #define ZTEAddInteger(i) = {
        set  ZTEIntegers[ZTECurrent] = i
    }
    
    #define ZTEAddReal(r) = {
        set  ZTEReals[ZTECurrent] = r
    }
    
    #define ConfirmZTE(trig) = {
        set  ZTETriggers[ZTECurrent] = trig
        set  ZTECurrent = ZTECurrent + 1
        call TimerStart( Zero, ZeroTime, false, function ZeroTimeEvent )
    }
    
    
    
endlibrary
Пример использования
#define UnitRemoveForceAttack(u) = {
    call UnitAddAbility( u, 'Abun' )
    call UnitRemoveAbility( u, 'Abun' )
         ZTEAddUnit(u)
         ConfirmZTE(CheckIfUnitHasA002)
}
Минус такой системы в необходимости создавать триггер для каждого блока кода, т.к. массивы блоков кода запрещены
ответ
Так и понятно. На одних картах работает, на других - нет.

32
На гуи такие сложные спеллы лучше не делать, обычно используется 2 группы чтобы определять сколько юнит пробыл в области и покинул ли он еще или снова вошел, ну и естественно события с малым периодом. Я бы взял за основу буран или огненный дождь, ну а замедление - вручание ауры торнадо, ну и естественно с начала каста отсчитываем время и ищем юнита и отсчитываем сколько они пробыли в области.
Принятый ответ
2
На гуи такие сложные спеллы лучше не делать, обычно используется 2 группы чтобы определять сколько юнит пробыл в области и покинул ли он еще или снова вошел, ну и естественно события с малым периодом. Я бы взял за основу буран или огненный дождь, ну а замедление - вручание ауры торнадо, ну и естественно с начала каста отсчитываем время и ищем юнита и отсчитываем сколько они пробыли в области.
Щас попробую

На гуи такие сложные спеллы лучше не делать, обычно используется 2 группы чтобы определять сколько юнит пробыл в области и покинул ли он еще или снова вошел, ну и естественно события с малым периодом. Я бы взял за основу буран или огненный дождь, ну а замедление - вручание ауры торнадо, ну и естественно с начала каста отсчитываем время и ищем юнита и отсчитываем сколько они пробыли в области.
Посмотри если не трудно вот что вышло
Загруженные файлы
Чтобы оставить комментарий, пожалуйста, войдите на сайт.