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

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

Ответ
 
DioD

offline
Опыт: 45,134
Активность:
Системы событий
Оригинальная идея из CS ,но переписывал код я с нуля.

Сделано так что нужна всего одна переменная - кеш.

Можно свободно прекращать действие всего механизма или его части, ну и запускать тоже.

Код:
SpellEventAction
Приводит в действие функцию что вы привязали к спеллу

Код:
SpellEventInit
Внутренняя функция, является ядром механизма

Код:
SpellEventUnRegisterAll
SpellEventUnRegister
Запрещяют запуск
всех спеллов
указаного спелла

Код:
SpellEventDrop
Полностью убивает весь механизм

Код:
SpellPreLoad
Подгружает указаный спелл, есть толк если вы запускаете подгрузку в начале игры, иначелаг будет всё равно.

Код:
SpellEventRegister
Связывает указаный спелл с указаной функцией


*X
Делаю точь в точь тоже самое что и оригиналы, но записывают инфу в кеше.

Код:
function SpellEventAction takes nothing returns nothing
    local string Table = I2S(GetSpellAbilityId())
    set Table = GetStoredString(EDS(),"SpellEvent:Spell",Table)
    if Table != "" and Table != null then
        call ExecuteFunc(Table)
    endif
endfunction
function SpellEventInit takes nothing returns nothing
    local trigger T = null
    local integer L = 15
    if GetEDS("SpellEvent","IsInit") != 0 then
        return
    endif
    set T = CreateTrigger()
    loop
        call TriggerRegisterPlayerUnitEvent(T, Player(L),EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
        set L = L - 1
        exitwhen L < 0
    endloop
    call TriggerAddActionX(T,function SpellEventAction)
    call SetEDS("SpellEvent","IsInit",1)
    call SetEDS("SpellEvent","Trigger",H2Ix(T))
    set T = null
endfunction

function SpellEventUnRegisterAll takes nothing returns nothing
    call DropEDS("SpellEvent:Spell")
endfunction

function SpellEventUnRegister takes integer Spell returns nothing
    call FlushStoredString(EDS(),"SpellEvent:Spell", I2S(Spell))
endfunction

function SpellEventDrop takes nothing returns nothing
    if GetEDS("SpellEvent","IsInit") == 0 then
        return
    endif
    call DestroyTriggerX(I2TRx(GetEDS("SpellEvent","Trigger")))
    call DropEDS("SpellEvents")
    call SpellEventUnRegisterAll()
endfunction

function SpellPreLoad takes integer Id returns nothing
    local unit Temp = CreateUnit(Player(15),'u000',0,0,0)
    call UnitAddAbility(Temp,Id)
    call UnitRemoveAbility(Temp,Id)
    call RemoveUnit(Temp)
    set Temp = null
endfunction

function SpellEventRegister takes integer Spell ,string Action returns nothing
    local string Table = I2S(Spell)
    if GetEDS("SpellEvent","IsInit") == 0 then
        call SpellEventInit()
    endif
    call StoreString(EDS(),"SpellEvent:Spell", Table, Action)
    if GetEDS("SpellEvent:PreLoad",Table) == 0 then
        call SpellPreLoad(Spell)
        call SetEDS("SpellEvent:PreLoad",Table,1)
    endif
endfunction
Старый 17.01.2007, 18:26
Toadcop

offline
Опыт: 54,313
Активность:
DioD и ? это слишком без функционально... это типо как кастомы у меня в ТРС короче надо знать где это примень + в данном виде слишко не универсально...
Старый 18.01.2007, 14:40
DioD

offline
Опыт: 45,134
Активность:
регестрируешь
call reg('A000',"Blabla")
и при касте абилы A000 запуститься функция Blabla
Старый 18.01.2007, 15:26
exAres
I love magic :)
offline
Опыт: 7,788
Активность:
DioD - мне кажется что тот кто умеет делать триггерные спеллы то он и умеет правильно их запускать. Намного лучше сделать триггер с реакцией на "каст" и в нём прописать действия нужных спеллов, тем более что в твоей системе при каждом "касте" нужно проверять запись в КЕШе даже если спелл не зареестрирован.
Старый 18.01.2007, 15:45
DioD

offline
Опыт: 45,134
Активность:
лучше чем иметь 999 триггеров что срабатывают одноврменно да еще и запускают проверки на айди спелла
Старый 18.01.2007, 15:54
exAres
I love magic :)
offline
Опыт: 7,788
Активность:
DioD -
Цитата:
лучше чем иметь 999 триггеров что срабатывают одноврменно да еще и запускают проверки на айди спелла
- конечно лучше, но кто тебе говорил что для каждого спелла отдельный триггер, и тем более проверки ставить с elseif'ами а не на каждую проверку if - endif (некоторые так делают :) ).
Старый 18.01.2007, 16:06
Toadcop

offline
Опыт: 54,313
Активность:
я первый это сделал =) у меня эта идея уже давно была для доказательства смотри моего Аркане Мага у него так и даже чуть компактней... но не система хотя и не надо как систему...
Старый 22.01.2007, 14:40
DioD

offline
Опыт: 45,134
Активность:
это в кастер системе с 13.1 версии...
просто я добавил убивалки для того что-бы можно было реаалок запускать на АОС картах.
Старый 22.01.2007, 14:55
Ответ

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

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

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

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



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