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

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

Ответ
 
Xipxop
Круче варика, только c++!
offline
Опыт: 7,646
Активность:
Способность не работает
» раскрыть
Код:
function Trig_Spell1_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'AEbl' ) ) then
        return false
    endif
    return true
endfunction

function Trig_Spell1_Actions takes nothing returns nothing
    local unit un
    local effect ef
    local effect ef2
    local real xstart
    local real ystart
    local player pl
    set pl=Player(0)
    set xstart=GetUnitX(un)
    set ystart=GetUnitY(un)
    set un=GetSpellAbilityUnit()
    call AddSpecialEffectTargetUnitBJ( "overhead", un, "Abilities\\Spells\\Human\\MassTeleport\\MassTeleportCaster.mdl")
    set ef=GetLastCreatedEffectBJ()
    call DisplayTextToPlayer(pl,100,100,"Сработало ждем")
    call PolledWait(2)
    call SetUnitX(un, xstart)
    call SetUnitY(un, ystart)
    call AddSpecialEffectTargetUnitBJ( "head", un, "buildings\\other\\CityBuildingLarge_135\\CityBuildingLarge_135.mdl")
    set ef2=GetLastCreatedEffectBJ()
    
    set un=null
    set ef=null
    set ef2=null
    set xstart=0
    set ystart=0
endfunction

//===========================================================================
function InitTrig_Spell1 takes nothing returns nothing
    set gg_trg_Spell1 = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Spell1, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( gg_trg_Spell1, Condition( function Trig_Spell1_Conditions ) )
    call TriggerAddAction( gg_trg_Spell1, function Trig_Spell1_Actions )
endfunction


Способность скачок, стандарта! В ней ничего не изменено.
Герой, также стандартный, и имеет эту способность. (короче все кроме этого триггера, стандартно)
Но ничего не происходит, тоесть не работает, почему?
Старый 29.06.2012, 15:47
Lipen

offline
Опыт: 1,550
Активность:
Где дебаг?
    local unit un
    //...
    set xstart=GetUnitX(un)
    set ystart=GetUnitY(un)
Обращение к не присвоенной переменной - убивается поток.
Почему бы не присвоить переменные сразу?
    local unit un = GetTriggerUnit()
    local real xstart = GetUnitX(un)
    local real ystart = GetUnitY(un)
    set xstart=0
    set ystart=0
Реальные переменные не нуждаются в обнулении.
Заместо Polled Wait используем таймеры.
При создание эффекта используем такую конструкцию:
    local effect ef
    //...
    set ef = AddSpecialEffectTarget("model name", unit, "overhead")
Или же сразу удаляем эффект (Для некоторых не работает):
    call DestroyEffect(AddSpecialEffectTarget(...))
Старый 29.06.2012, 16:26
Xipxop
Круче варика, только c++!
offline
Опыт: 7,646
Активность:
Как тогда сделать эффект держащийся например 5 секунд?
Для таймеров придется делать второй триггер, а можно без второго?
Старый 29.06.2012, 16:51
Lipen

offline
Опыт: 1,550
Активность:
Хотя бы заменить PolledWait на TriggerSleepAction.
Для таймеров придется делать второй триггер, а можно без второго?
Таймер не требует второго триггера, всего лишь 1 функция. И ещё 1 свободная ячейка в хэше.
Могу даже пример сделать, если надо
Старый 29.06.2012, 17:08
Xipxop
Круче варика, только c++!
offline
Опыт: 7,646
Активность:
Давайте! Просто я Jass освоил только вчера вечером, так что я в Jass путешественник

Буду очень благодарен!

Отредактировано Xipxop, 29.06.2012 в 17:23.
Старый 29.06.2012, 17:10
Lipen

offline
Опыт: 1,550
Активность:
Эффект телепорта не держится 5 секунд. Для примера сделал эффект замедления:
» Тык
globals
    hashtable Hash = InitHashtable()
endglobals

function Trig_Spell1_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'AEbl'
endfunction

function Spell1_Timer takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer h = GetHandleId(t)
    local effect ef = LoadEffectHandle(Hash, h, 1)

    call DestroyEffect(ef)
    call DestroyTimer(t)

    set ef = null
    set t = null
endfunction

function Trig_Spell1_Actions takes nothing returns nothing
    local unit un = GetTriggerUnit()
    local effect ef
    local timer t = CreateTimer()
    local integer h = GetHandleId(t)

    set ef = AddSpecialEffectTarget("Abilities\\Spells\\Human\\slow\\slowtarget.mdl", un, "chest")
    call SaveEffectHandle(Hash, h, 1, ef)
    call TimerStart(t, 5., false, function Spell1_Timer)

    set un=null
    set ef=null
endfunction

//===========================================================================
function InitTrig_Spell1 takes nothing returns nothing
    local trigger trg = CreateTrigger()
    local integer i = 0

    loop
        call TriggerRegisterPlayerUnitEvent( trg, Player(i), EVENT_PLAYER_UNIT_SPELL_CAST, null)
        exitwhen i>=11
        set i = i + 1
    endloop
    call TriggerAddCondition( trg, Condition( function Trig_Spell1_Conditions ) )
    call TriggerAddAction( trg, function Trig_Spell1_Actions )

    set trg = null
endfunction
Старый 29.06.2012, 17:29
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
Lipen:
function InitTrig_Spell1 takes nothing returns nothing
local trigger trg = CreateTrigger()
не делай так никогда в обычных триггерах - у тебя создается 1 лишний триггер
Xipxop:
Просто я Jass освоил только вчера вечером, так что я в Jass путешественник
тогда советую совершить путешествие в раздел статей и изучить их внимательно
там например есть статья от Ханабиши про хеш и таймер в 1 триггер,моя статья,куча их
Старый 29.06.2012, 17:38
Lipen

offline
Опыт: 1,550
Активность:
» Offtop
Nerevar:
Lipen:
function InitTrig_Spell1 takes nothing returns nothing
local trigger trg = CreateTrigger()
не делай так никогда в обычных триггерах - у тебя создается 1 лишний триггер
А в необычных можно? Таких:
scope test initializer Test_Init {
    void Test_Init() {
        trigger trg = CreateTrigger()
        //...
    }
}
Старый 29.06.2012, 17:50
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
» Offtop
Ну если ты в обычном триггере делаешь как ты выше делал - то у тебя будет глобальный триггер gg_trg_Spell1 и локальный триггер который ты создаешь - получаешь лишний объект+ты не сможешь этот триггер отключить\включить если не сохранишь где-то
А вот как оно в вжассе преобразуется я честно хз - если ты это вставишь в кастом код то в принципе норм - будет локальный триггер который опять же не сможешь вкл\выкл не сохранив,однако создано глобалки уже не будет,если скоп поместишь в отдельный триггер а не в кастом код то глобалка будет уже создана
Ну это так - размышления
А вообще можно без триггеров глобальных вообще обойтись - запустить все из кастом кода,предварительно сохранив их для последующего обращения(если надо)

Отредактировано Nerevar, 29.06.2012 в 18:21.
Старый 29.06.2012, 18:14
Xipxop
Круче варика, только c++!
offline
Опыт: 7,646
Активность:
Извините, конечно но тема не для оффтопа. И не думал, что вы Nerevar, пойдете на оффтоп

Lipen, Спасибо вам!
Nerevar, хоть я и посещал, статьи по jass, но все таки вам надо учится, понимать новичков, просто на примере,легче освоить сперва, а потом статью в 2 раза легче освоить.
Старый 29.06.2012, 19:11
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
Ну объяснить человеку что-либо не так уж и плохо
В статьях хорошие примеры идут кстате
+можешь поглядеть примеры из джассовых спелов Заклинаний на заказ в Барахолке
Старый 29.06.2012, 19:14
adic3x

offline
Опыт: 108,439
Активность:
Хотя бы заменить PolledWait на TriggerSleepAction.
Не делайте так.
Старый 29.06.2012, 19:35
Ответ

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

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

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

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



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