Наверное самая быстрая функция по касту "тригерных" магий

Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
Jass
Тип:
Алгоритм
Ловите, наверное самая быстрая функция по касту "тригерных" магий =)
(По скорости быстрее чем 20 обычных проверок GetSpellAbilityId()=='SPELL ID')
СабСтринг для того чтобы не "тригерные" магии не отлавливал (для нешаряших или недопонявщих.)

function SpellCast takes nothing returns boolean
local string s=GetObjectName(GetSpellAbilityId())
if SubString(s,StringLength(s)-4,StringLength(s))=="Exec" then
 call ExecuteFunc(s)
endif
return false
endfunction

function InitTrig_Spell_Cast takes nothing returns nothing
local trigger t=CreateTrigger()
call TriggerAddCondition(t,Condition(function SpellCast))
call TriggerRegisterPlayerUnitEvent(t,Player(0x00),EVENT_PLAYER_UNIT_SPELL_CAST,null)
call TriggerRegisterPlayerUnitEvent(t,Player(0x01),EVENT_PLAYER_UNIT_SPELL_CAST,null)
call TriggerRegisterPlayerUnitEvent(t,Player(0x02),EVENT_PLAYER_UNIT_SPELL_CAST,null)
call TriggerRegisterPlayerUnitEvent(t,Player(0x03),EVENT_PLAYER_UNIT_SPELL_CAST,null)
call TriggerRegisterPlayerUnitEvent(t,Player(0x04),EVENT_PLAYER_UNIT_SPELL_CAST,null)
call TriggerRegisterPlayerUnitEvent(t,Player(0x05),EVENT_PLAYER_UNIT_SPELL_CAST,null)
call TriggerRegisterPlayerUnitEvent(t,Player(0x06),EVENT_PLAYER_UNIT_SPELL_CAST,null)
call TriggerRegisterPlayerUnitEvent(t,Player(0x07),EVENT_PLAYER_UNIT_SPELL_CAST,null)
call TriggerRegisterPlayerUnitEvent(t,Player(0x08),EVENT_PLAYER_UNIT_SPELL_CAST,null)
call TriggerRegisterPlayerUnitEvent(t,Player(0x09),EVENT_PLAYER_UNIT_SPELL_CAST,null)
call TriggerRegisterPlayerUnitEvent(t,Player(0x0A),EVENT_PLAYER_UNIT_SPELL_CAST,null)
call TriggerRegisterPlayerUnitEvent(t,Player(0x0B),EVENT_PLAYER_UNIT_SPELL_CAST,null)
call TriggerRegisterPlayerUnitEvent(t,Player(0x0C),EVENT_PLAYER_UNIT_SPELL_CAST,null)
call TriggerRegisterPlayerUnitEvent(t,Player(0x0D),EVENT_PLAYER_UNIT_SPELL_CAST,null)
call TriggerRegisterPlayerUnitEvent(t,Player(0x0E),EVENT_PLAYER_UNIT_SPELL_CAST,null)
call TriggerRegisterPlayerUnitEvent(t,Player(0x0F),EVENT_PLAYER_UNIT_SPELL_CAST,null)
set t=null
endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
2
19
12 лет назад
2
Кстати да действительно мощная функция. Пригодиться тем, кто делает карты с кучей способностей.
При каждой способности - запускаются порядка 100 триггеров = 100 триггерных способностей.
А тут запускается один триггер, и обрабатывает все касты.
Тут нет 100 проверок на каждый спелл. Тут всё просто. Если имя спелла начинается на Exec -> спелл триггерный. В общем удобно.
Единственное что-бы добавил.
globals
trigger tgm=null
string sgm=""
endglobals
И заменил бы локальные вот этими переменными.
0
27
12 лет назад
0
почему? в чем разница между call и ExecuteFunc.
меня смутило что не триггерные, ведь по большому счету триггерные от стандартов ничем не отличаются. Просто он ловит каст.
0
19
12 лет назад
0
Execute - запускает функцию, в любом месте.
call только если функция стоит перед.
Да, система просто отлавливает касты. После отлавливания каста, она проверяет тригерный ли это скилл. Ну и только потом запускает привязанный триггер.
2
18
12 лет назад
2
было бы неплохо пример с пару кастами сделать
0
15
12 лет назад
Отредактирован DaeDR
0
Отличная идея, всегда хотел как-то систематизировать касты спеллов И вот "наткнулся"
Действительно, все гениальное - просто
Немного удивила вот эта строчка:
if SubString(s,StringLength(s)-4,StringLength(s))=="Exec" then
Может, она должна выглядеть так:
if SubString(s, 0, 4) == "Exec" then
При первом варианте будут "выделены" последние 4 символа, а нам необходимо первые четыре Хотя это дело каждого
Если использовать второй вариант, то название спелла должно выглядеть так: ExecName, иначе NameExec
было бы неплохо пример с пару кастами сделать
Вот карта-пример
Загруженные файлы
5
24
12 лет назад
Отредактирован Faion
5
Единственное что-бы добавил.
globals
trigger tgm=null
string sgm=""
endglobals
И заменил бы локальные вот этими переменными.
Нафига? Ты собрался ингейм отключать этот триггер? Или может обращаться? К эвент строке? Если нет, то правильнее юзать локалки в обоих случаях, т.к. строка в вц3 != объект, по этому темповую глобалку можно не создавать.
0
14
12 лет назад
0
что вы понимаете под не "триггерные"?
нестандартные чтоле?
0
15
12 лет назад
0
что вы понимаете под не "триггерные"?
Те заклинания, для которых не созданы функции/триггеры.
0
14
12 лет назад
0
зачем отсеивать эти заклинания, если эта функция предполагает создание общей библиотеки для них всех?
0
15
12 лет назад
0
Temak1, Мда.
Допустим, у тебя есть 10 спеллов. 7 из них сделаны через триггеры, а 3 полностью стандартные. Чтобы не вызывались те спеллы которых нет и нужен фильтр.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.