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

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

Закрытая тема
 
Зевс
Адская Зверюга
offline
Опыт: 152,154
Активность:
Каст спелла выкидывает в винду
Вылетает через секунду после каста. Я так понял это происходит как заканчивается таймер. Хз...
Код:
function WF_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'A036' ) ) then
        return false
    endif
    return true
endfunction

function WF_Base takes unit wf_tu, location wf_tup_1, timer wf_timer, trigger wf_trigger returns nothing
    
    local location wf_tup_2                     

    if ((IsUnitAliveBJ(wf_tu) == true) and (UnitHasBuffBJ(wf_tu, 'B008') == true) and (wf_tu != udg_PvP_Participant[1]) and (wf_tu != udg_PvP_Participant[2])) then

    set wf_tup_2 = PolarProjectionBJ(wf_tup_1, GetRandomReal(0, 150.00), GetRandomReal(0.00, 360.00))
    call SetUnitPositionLoc(wf_tu, wf_tup_2)
    call RemoveLocation(wf_tup_2)

    else

    set wf_tu = null
    call RemoveLocation(wf_tup_1)
    call RemoveLocation(wf_tup_2)
    call DestroyTrigger(wf_trigger)
    call DestroyTimer(wf_timer)
    
    endif

endfunction

function WF_Initialize takes nothing returns nothing

    local unit wf_tu = GetSpellTargetUnit()    
    local location wf_tup_1 = GetUnitLoc(wf_tu) 
    local timer wf_timer = CreateTimer()        
    local trigger wf_trigger = CreateTrigger()  

    call StartTimerBJ(wf_timer, true, 1.00)
    call TriggerRegisterTimerExpireEventBJ(wf_trigger, wf_timer)
    call TriggerAddAction(wf_trigger, function WF_Base)

    
endfunction

//===========================================================================
function InitTrig_WF takes nothing returns nothing
    set gg_trg_WF = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_WF, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_WF, Condition( function WF_Conditions ) )
    call TriggerAddAction( gg_trg_WF, function WF_Initialize )
endfunction
Старый 09.08.2008, 17:15
ScorpioT1000
Работаем
offline
Опыт: отключен
Цитата:
takes unit wf_tu, location wf_tup_1, timer wf_timer, trigger wf_trigger returns nothing

угу при том что
Цитата:
TriggerAddAction(wf_trigger, function WF_Base)
Старый 09.08.2008, 17:24
Зевс
Адская Зверюга
offline
Опыт: 152,154
Активность:
Я вроде через call WF_Base(бла бла бла) пробовал... не помогло
Старый 09.08.2008, 17:28
J
expert
offline
Опыт: 48,447
Активность:
Зевс так нельзя делать (а именно вешать на таймер функцию принимающие какиенибудь пораметры, и на триггеры тоже), это из раздела "элементарные базовые сведенья о джазе"
тебе нужно почитать статьи об RB и SCV

Jon добавил:
кстате, какоето страное спаривание триггера и таймера, ща сделаю как больее мение как надо, сек
Старый 09.08.2008, 17:39
Зевс
Адская Зверюга
offline
Опыт: 152,154
Активность:
Я как пример брал наработку Сергея - Magic Shield... он там через триггер создавал триггеры в массиве... правда триггеры и кастер присваивались не локальным переменным а udg_...
Старый 09.08.2008, 17:45
J
expert
offline
Опыт: 48,447
Активность:
но перед этим при инициализации обязательно должен быть инициализирован кеш cache
Код:
function WF_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A036'
endfunction

function WF_Base takes nothing returns nothing
    local unit tu = I2U(GetStoredInteger(udg_cache, I2S(H2I(GetExpiredTimer())), "tu"))
    local real len
    local real ang    
    if (GetUnitState(tu, UNIT_STATE_LIFE) > 0) and (GetUnitAbilityLevel(tu, 'B008') > 0) and (tu != udg_PvP_Participant[1]) and (tu != udg_PvP_Participant[2])) then
        set len = GetRandomReal(0, 150)
        set ang = GetRandomReal(0, 360) * bj_DEGTORAD
        call SetUnitPosition(tu, GetUnitX(tu)+len*Cos(ang), GetUnitY(tu)+len*Sin(ang))
    else
        call FlushStoredMission(udg_cache, I2S(H2I(GetExpiredTimer())))
        call DestroyTimer(GetExpiredTimer())
    endif
    set tu = null
endfunction

function WF_Initialize takes nothing returns nothing
    local timer t = CreateTimer()                            
    call StoreInteger(udg_cache, I2S(H2I(t)), "tu", H2I(GetSpellTargetUnit()))
    call TimerStart(t, 1, true, function WF_Base)
    set t = null                            
endfunction

function InitTrig_WF takes nothing returns nothing
    set gg_trg_WF = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(gg_trg_WF, EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(gg_trg_WF, Condition( function WF_Conditions))
    call TriggerAddAction(gg_trg_WF, function WF_Initialize)
endfunction

функцие H2I() и I2U() надеюсь знаеш, если нет то они прямо в открытую написаны например... сдесь

Отредактировано Jon, 09.08.2008 в 17:58.
Старый 09.08.2008, 18:02
Sebra

offline
Опыт: 5,603
Активность:
function WF_Base takes nothing returns nothing
для того, чтобы
Цитата:
call TriggerAddAction(wf_trigger, function WF_Base)


да и в триггере, запускаемом периодическим таймером удалять и триггер и таймер...
Флаг тебе в руки и бегом статьи читать!

Опоздал, конечно, но Jon, ты то почему таймер даже не остановил, вылетит же.
Старый 09.08.2008, 18:08
J
expert
offline
Опыт: 48,447
Активность:
всмысле не остановил? а это?
call DestroyTimer(GetExpiredTimer())
Старый 09.08.2008, 18:15
Sebra

offline
Опыт: 5,603
Активность:
Мне казалось, что таймер перед удалением обязательно надо паузить.
А то может глюкнуть.
Разве нет.
Старый 10.08.2008, 10:28
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Sebra, не обязательно... Обычно паузят глобальные таймеры, чтобы лишний раз не создавать их.
Jon, небольшие замечания:
- Мне не совсем нравится то, что ты не аллокейтишь таймер.
- Юнит жив, когда у него больше 0.405 здоровья.
- Имхо, угол проще вычислять как GetRandomReal(0, 2*bj_PI).
- SetUnitPosition сбивает анимацию юнита, нужно юзать SetUnitX/SetUnitY.
Старый 10.08.2008, 12:30
J
expert
offline
Опыт: 48,447
Активность:
ShadoW DaemoN млин, шо за бред
Цитата:
- Юнит жив, когда у него больше 0.405 здоровья.
эх... я вот думаю матерится ли не мватерится, вообщем в какойто теме в джазе это обсуждалось почитай ("жизни юнита" вроде называлось)
Цитата:
- Мне не совсем нравится то, что ты не аллокейтишь таймер.
я не сую в переменую обьекты получаемые подобными функциями если они юзаются <= 2-ух раз
Цитата:
- Имхо, угол проще вычислять как GetRandomReal(0, 2*bj_PI).
невижу разницы, количество действий не уменьшилось
Цитата:
- SetUnitPosition сбивает анимацию юнита, нужно юзать SetUnitX/SetUnitY.
это не прожектилы, я не знаю что это и не стал рисковать, потому сделал так чтобы паччинк учитывался
Старый 10.08.2008, 15:32
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Jon, ...
Насчет жизней - можно еще сделать проверку by Toadcop:
Код:
function IsUnitDead takes unit u returns boolean
  return GetUnitTypeId(u)<1 or IsUnitType(u, UNIT_TYPE_DEAD)
endfunction

В общем, я с тобой спорить не буду, ибо ты в любом случае будешь считать свой вариант наиболее верным.
И я не буду навязывать именно тебе свои варианты, ибо без толку.


Зевс, проблема решена?
Старый 10.08.2008, 16:31
J
expert
offline
Опыт: 48,447
Активность:
еще так скзаал какбудто он неверный =)
тогда уж лучше так:
Код:
function IsUnitDead takes unit u returns boolean
    return IsUnitType(u, UNIT_TYPE_DEAD) or GetUnitTypeId(u)<1
endfunction

т.к. явно первое услови будет чаще выполнятся, да и насчет нужности второво неуверен, но я не часто так делаю потому поверим тоадкопику
Старый 10.08.2008, 17:03
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
(tu != udg_PvP_Participant[1]) and (tu != udg_PvP_Participant[2])

wtf? вы присваиваете изначально этим глобавлкам что то корявое через рб?!
Цитата:
жизни юнита" вроде называлось

.405 имхо круче ;) ну а вообще хз, оно их вроде обнуляет...
Цитата:
set ang = GetRandomReal(0, 360) * bj_DEGTORAD

сабж, GetRandomReal(0., 3.1415) бла бла бла сами понимаете почему)
Цитата:
GetUnitTypeId(u)<1

провекра на то, что юнит был удален, верьте Тс)

хм, а вообще по хорошему нестоит аттачить к таймеру хендл юнита
т.к. если после старта таймера юнит будет удален, ссылок на него не останеться, ТО! может быть создан новый юнит с таким же хенлом, и он и будет вдруг нистого нессего перемещен... что явно является багом

все это прикрасно решаеться заменой кеша на структуры в вЖасс т.к. там хранение информации идет в массивах, что блокирует возможность выделения аналагичных хендлов
Старый 11.08.2008, 10:09
Закрытая тема

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

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

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

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



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