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

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

Ответ
 
Arti

offline
Опыт: 11,196
Активность:
Реализация спела наподобие пасивы Кунки из Доты
Вообщем после того как юнит нанес урон, стартует таймер и через n сек герою дается абилка. Но проблема в том что если один раз таймер стартонул, то надо что бы это действие не выполнялось, до тех пор пока он не закончится. Но как это сделать муи, без тыщи глобалок не вдупляю. Аля 2 спелл кунки.
[+] замечание от Nerevar: Неинформативное название темы
Старый 03.10.2012, 21:36
Cosonic5
Моймозггоритогнем
offline
Опыт: 13,584
Активность:
проверять на баф..
Аля 2 спелл кунки.
да хватит уже копипастить пора что то новое придумывать!
Старый 03.10.2012, 21:42
Arti

offline
Опыт: 11,196
Активность:
А, забыл сказать, после атаки, спелл сбивается и соответственно баф тоже, по этому так никак не проверишь !
Спелы с хайва тоже баговые к сожалению
Старый 03.10.2012, 21:46
Sladkoegka
Забыл что хотел...
offline
Опыт: 7,437
Активность:
Arti, привязываешь через хэш таблицу на своего юниту логическую Udar=изначально нет. Когда юнит ударяет ставишь Udar = да и там где запускаешь таймер выставляешь проверку:
FuncTimer
и уже после оттиквания таймера ставишь логическую
local boolean udar = true
call SaveBoolean(udg_hash,GetHandleId(attacker),1,udar)
добавляешь абилку

Func
тут действия триггера где юниту нанесли урон
local boolean udar = LoadBoolean(udg_hash,GetHandleId(attacker),1)
if udar = true then
set udar = false
call SaveBoolean(udg_hash,GetHandleId(attacker),1,udar)
call TimerStart(.......
endif
Извини что криво объяснил,но делается это примерно так.
Старый 03.10.2012, 21:50
DimanTOoBS

offline
Опыт: 5,791
Активность:
Arti, там при получении урона проверяется наличие абилки, если абилка есть запускаешь таймер, удаляешь абилку и когда таймер истекает даёшь обратно, в чём тут проблема может быть???
Старый 03.10.2012, 22:06
Arti

offline
Опыт: 11,196
Активность:
DimanTOoBS, смотри, юнит ударил, юниту дался скил, таймер запустился. Пока идёт таймер скил нельзя давать юниту. Но тут он бьет ещё раз его способность убирается и получается проверять не на чём. И таймер запускается ещё раз. И так очень много раз. И получается абилки даются и убираются мгновенно почти
Sladkoegka То что ты дал это 1 герой для 1 игрока, а мне надо муи !
Старый 03.10.2012, 22:41
DimanTOoBS

offline
Опыт: 5,791
Активность:
Arti, значит, объясняю))
1 триггер Событие: юнит приобрёл способность
Условие: способность такая-то
Действия: дать спелбук с +атакой и сплешем
2 триггер Событие: юнит атакован/получил урон (как тебе нравится)
Условие: ур. спелбука >= 1
Действия: удалить спелбук, запустить таймер/или юзнуть вейт, вернуть спелбук
P.S. только не надо говорить что вейт это гавно и тд, в этой ситуации его можно юзать ибо погрешность его << чем время кд...
Старый 03.10.2012, 22:48
Arti

offline
Опыт: 11,196
Активность:
Ну 1 триггер у меня такой: Герой только выучил способность дать ему спел бук
2 триггер такой, только не принимайте близко к сердцу, я над ним експерементировал и возможно что то не вернул назад:
((код jass
unction Trig_RegisterDamage_Conditions takes nothing returns boolean
return GetEventDamage() > 0.00
endfunction
function SeaSword_Effect takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer h = GetHandleId(t)
local unit caster = LoadUnitHandle(udg_Hashtable,h,1)
local integer level = LoadInteger(udg_Hashtable,h,2)
if (UnitHasBuffBJ(caster, 'B00A') == false ) then
call UnitAddAbility( caster,'A016')
call SetUnitAbilityLevel(caster,'A017', level )
call SetUnitAbilityLevel(caster,'A019', level )
call SetUnitAbilityLevel(caster,'A018', level )
endif
call DestroyTimer(t)
call FlushChildHashtable(udg_Hashtable,h)
set caster = null
set t = null
endfunction
function Trig_RegisterDamage_Actions takes nothing returns nothing
local unit damaged = GetTriggerUnit()
local unit damager = GetEventDamageSource()
local integer level = GetUnitAbilityLevel(damager, 'A015')
local timer t = CreateTimer()
local integer h = GetHandleId(t)
if(level > 0) then
call DisplayTextToForce(GetPlayersAll(),GetUnitName(damager))
call UnitRemoveAbility( damager,'A016')
call UnitRemoveBuffBJ('B00A',damager)
call SaveUnitHandle(udg_Hashtable,h,1,damager)
call SaveInteger(udg_Hashtable,h,2, level )
call SaveInteger(udg_Hashtable,h,2, level )
call TimerStart(t,4,true,function SeaSword_Effect)
set t=null
endif
set damaged = null
set damager = null
endfunction
===========================================================================
function InitTrig_RegisterDamage takes nothing returns nothing
set gg_trg_RegisterDamage = CreateTrigger( )
call TriggerAddCondition( gg_trg_RegisterDamage, Condition( function Trig_RegisterDamage_Conditions ) )
call TriggerAddAction( gg_trg_RegisterDamage, function Trig_RegisterDamage_Actions )
endfunction
))
Старый 03.10.2012, 22:53
Ethernet
Я Impereon
offline
Опыт: 8,529
Активность:
Блин
Код:
Триггер изучения
Юнит изучил способность
///счетчик игроков увеличиваем на +1
Count=Count+1;
///Потом записываем в массив под номером счетчика Героя
UnitSpeller[Count]=Изучающий юнит.
///Создаем Таймер, который запускаем.В зависимости от уровня.
Timer[Count]=15.
///Создаем булевую переменную которая будет отвечать за "атаковал ли юнит"
UnitAttack[Count]=false;
Запускаем триггер Таймер
Timer
Every 1 sec.
///Проходим циклом по списку таймеров
от 1 до Count
Если UnitAttack[A]=false;
То
Timer[A]=Timer[A]-1;
    Если Timer[A]==0
    То UnitAttack[A]=true;
    Иначе Ничего не делаем.
--------
///Создаем триггер который отслеживает атаку
Событие
Юнит атакует
///Проходим опять по списку юнитов через цикл
От 1 до Count
Если UnitSpeller[A]==Атакующий юнит
И если UnitAttack[A]==true;

То UnitAttack[A]=false;///Урон больше не наносит
Timer[A]=15;///Запускаем таймер после которого он сможет нанести урон.
И наносим урон
Старый 03.10.2012, 23:07
Arti

offline
Опыт: 11,196
Активность:
Я хочу отучится от такого способа делать спеллы :( Где циклом надо пробегать всех юнитов, что бы найти подходящего.
Старый 03.10.2012, 23:33
Ethernet
Я Impereon
offline
Опыт: 8,529
Активность:
Arti, а что в этом способе плохого?
Старый 04.10.2012, 00:03
DimanTOoBS

offline
Опыт: 5,791
Активность:
Arti, нашёл через поиск сделанный мной пример TideBringera и переделал в хэш на ГУИ (МУИ)
вот разбирайся
Прикрепленные файлы
Тип файла: w3x TideBringer.w3x (11.5 Кбайт, 3 просмотров )
Старый 04.10.2012, 00:14
asesmo
Я I Jag Ich Jeg Ja Minä!
offline
Опыт: 8,073
Активность:
Arti:
юнит ударил, юниту дался скил, таймер запустился
если хотите как в доте, то не ударил, а именно нанёс урон с руки (ядом отследить)
Arti:
Sladkoegka То что ты дал это 1 герой для 1 игрока, а мне надо муи !
неа, именно он основу верную дал - так и сделан тайдбрингер
Старый 04.10.2012, 05:50
Sladkoegka
Забыл что хотел...
offline
Опыт: 7,437
Активность:
Arti, Блин да все правильно в моем примере,просто ты подставь в свой к код:
В первом триггере где даешь спеллбук вставь это
call SaveBoolean(udg_hash,GetHandleId(на юнита со спеллбуком),1,false)
во втором триггере
function Trig_RegisterDamage_Conditions takes nothing returns boolean
    return GetEventDamage() > 0.00
endfunction

function SeaSword_Effect takes nothing returns nothing
local timer t = GetExpiredTimer()                  
local integer h = GetHandleId(t)                   
local unit caster = LoadUnitHandle(udg_Hashtable,h,1)
local boolean udar = true
call SaveBoolean(udg_hash,GetHandleId(caster),1,udar)
call UnitAddAbility( caster,'A016')
call SetUnitAbilityLevel(caster,'A017', level )
call SetUnitAbilityLevel(caster,'A019', level )
call SetUnitAbilityLevel(caster,'A018', level )
endif

call DestroyTimer(t)
call FlushChildHashtable(udg_Hashtable,h)

set caster = null
set t = null
endfunction

function Trig_RegisterDamage_Actions takes nothing returns nothing
local unit damaged = GetTriggerUnit()
local unit damager = GetEventDamageSource()
local integer level = GetUnitAbilityLevel(damager, 'A015')
local timer t = CreateTimer()
local integer h = GetHandleId(t)
local boolean udar = LoadBoolean(udg_hash,GetHandleId(damager),1)
if udar = true then
set udar = false
call SaveBoolean(udg_hash,GetHandleId(attacker),1,udar)
call UnitRemoveAbility( damager,'A016')
call UnitRemoveBuffBJ('B00A',damager)
call SaveUnitHandle(udg_Hashtable,h,1,damager)
call SaveInteger(udg_Hashtable,h,2, level )
call TimerStart(t,4,true,function SeaSword_Effect)
endif
set damaged = null
set t=null
set damager = null
endfunction

//===========================================================================
function InitTrig_RegisterDamage takes nothing returns nothing
    set gg_trg_RegisterDamage = CreateTrigger(  )
    call TriggerAddCondition( gg_trg_RegisterDamage, Condition( function Trig_RegisterDamage_Conditions ) )
    call TriggerAddAction( gg_trg_RegisterDamage, function Trig_RegisterDamage_Actions )
endfunction
Теперь можешь проверить-должно работать
Arti,
То что ты дал это 1 герой для 1 игрока, а мне надо муи !
ЭЭЭЭ...На каждого юнита записывается уникальный GetHandleId()Юнитов может быть хоть 100500+столько же будет логических.
Старый 04.10.2012, 06:23
asesmo
Я I Jag Ich Jeg Ja Minä!
offline
Опыт: 8,073
Активность:
Sladkoegka, можно не проверять булеан, просто проверять лвл скрытого спеллбука.
asesmo добавил:
Sladkoegka:
То что ты дал это 1 герой для 1 игрока, а мне надо муи !
ЭЭЭЭ...На каждого юнита записывается уникальный GetHandleId()Юнитов может быть хоть 100500+столько же будет логических.
я согласен, т.к. как бы хеш и был создан для этого в 1.24
Старый 04.10.2012, 12:39
Sladkoegka
Забыл что хотел...
offline
Опыт: 7,437
Активность:
asesmo,
можно не проверять булеан, просто проверять лвл скрытого спеллбука.
А если юнит ударит несколько раз за 4 секунды???
Старый 04.10.2012, 13:17
Ответ

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

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

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

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



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