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

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

Ответ
 
respect_gg

offline
Опыт: 3,950
Активность:
Таймеры
Вобщем такой вопрос -
Как то не приходилось иметь дело с таймерами для группы юнитов. Допустим у меня есть спелл, который наносит урон по области но так же еще наносит ежесекундный урон этим юнитам. Так вот я не очень хорошо представляю как мне запустить таймер для каждого пикнутого юнита, во время которого будет наносится этот ежесекундный урон.
Допустим -
loop
set first = FirstOfGroup(party)
exitwhen first == null
if IsUnitType(first, UNIT_TYPE_STRUCTURE) == false
call UnitDamageTarget......
call TimerStart (.....)
else
endif
endloop
Буду признателен если выложите пример, так будет легче разобраться (cJass НЕ приветствуется)
Старый 13.11.2011, 23:10
spellwerk

offline
Опыт: 4,869
Активность:
выбираешь нужных юнитов, заносишь в группу, наносишь им урон, привязываешь к таймеру группу, запускаешь таймер. при срабатывании таймера делаешь все ,что нужно
Старый 13.11.2011, 23:15
MpW

offline
Опыт: 49,900
Активность:
respect_gg,


Код:
1 способ с ForGroup
-----------------------------------------------------------------------------------------------------------------
function D takes nothing returns nothing
local unit u = LoadUnitHandle(udg_Hash, GetHandleId(GetTriggeringTrigger()), 1)
call UnitDamageTarget( )
call FlushChildHashtable(udg_Hash, GetHandleId(GetTriggeringTrigger()))
set u = null
endfunction

function C takes nothing returns boolean
    return ( IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) == false )
endfunction

function B takes nothing returns nothing
local timer t=GetExpiredTimer()
local unit u = LoadUnitHandle(udg_Hash, GetHandleId(t), 1)
local group g = CreateGroup()
далее твои координаты
local real x =
local real y =
call SaveUnitHandle(udg_Hash, GetHandleId(GetTriggeringTrigger()), 1, u)
//далее собираешь всех юнитов в группу, исключает только тех юнитов, которые прописаны в условии Condition(function C)
call GroupEnumUnitsInRange(g, x, y, радиус, Condition(function C))
call ForGroup( g, function D )
 call FlushChildHashtable(udg_Hash, GetHandleId(t))
 call DestroyGroup(g)
 call DestroyTimer(t)
set t=null
set u = null
set g = null
endfunction

2 способ - с циклом без вызова лишних функции
-----------------------------------------------------------------------------------------------

function C takes nothing returns boolean
    return ( IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) == false )
endfunction

function B takes nothing returns nothing
local timer t=GetExpiredTimer()
local unit u = LoadUnitHandle(udg_Hash, GetHandleId(t), 1)
local unit e
local group g = CreateGroup()
//далее твои координаты
local real x =
local real y =
call SaveUnitHandle(udg_Hash, GetHandleId(GetTriggeringTrigger()), 1, u)
//далее собираешь всех юнитов в группу, исключает только тех юнитов, которые прописаны в условии Condition(function C)
call GroupEnumUnitsInRange(g, x, y, радиус, Condition(function C))
loop  
     set e=FirstOfGroup(g)  
     exitwhen e==null 
     if IsUnitType(e, UNIT_TYPE_STRUCTURE) == false
         call UnitDamageTarget......
     endif
     call GroupRemoveUnit(g,e)
endloop
 call FlushChildHashtable(udg_Hash, GetHandleId(t))
 call DestroyGroup(g)
 call DestroyTimer(t)
set t=null
set u = null
set g = null
endfunction

------------------------------------------------------------------------------

function A takes nothing returns nothing
local timer t=CreateTimer()
local unit u = твой юнит
call SaveUnitHandle(udg_Hash, GetHandleId(t), 1, u)
call TimerStart(t, 2.5, false, function B)
//если это периодический, то меняешь на call TimerStart(t, 2.5, true, function B), и же в этой функции создаешь группу, запоминаешь ее в хэше и по вызову таймера в других функциях наносишь урон
set t=null
endfunction

Отредактировано Steal nerves, 14.11.2011 в 00:49.
Старый 14.11.2011, 00:23
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
function GroupEnumCallback takes nothing returns nothing
    // действия для каждого юнита в группе за тик таймера
endfunction

function GroupTimerCallback takes nothing returns nothing
    call ForGroup(LoadGroupHandle(<hashtable>, GetHandleId(GetExpiredTimer()), 0), function GroupEnumCallback)
endfunction

function GroupDmgFilter takes nothing returns boolean
    local boolean b = false
    if (not IsUnitType(GetFilterUnit() UNIT_TYPE_STRUCTURE)) then
        set b = true
        call UnitDamageTarget(...)
    endif
    return b
endfunction

local timer t = CreateTimer()
local group g = CreateGroup()
call SaveGroupHandle(<hashtable>, GetHandleId(t), 0, g)
call GroupEnumUitsInRange(g, <x>, <y>, <radius>, Filter(function GroupDmgFilter))
call TimerStart(t, <timeout>, true, function GroupTimerCallback)
FellGuard добавил:
зачем вы постите такие темы в Академии, когда есть Jass раздел?
Старый 14.11.2011, 00:26
Ответ

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

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

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

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



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