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

Добавлен , опубликован
Ловите, наверное самая быстрая функция по касту "тригерных" магий =)
(По скорости быстрее чем 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
`
ОЖИДАНИЕ РЕКЛАМЫ...
19
Кстати да действительно мощная функция. Пригодиться тем, кто делает карты с кучей способностей.
При каждой способности - запускаются порядка 100 триггеров = 100 триггерных способностей.
А тут запускается один триггер, и обрабатывает все касты.
Тут нет 100 проверок на каждый спелл. Тут всё просто. Если имя спелла начинается на Exec -> спелл триггерный. В общем удобно.
Единственное что-бы добавил.
globals
trigger tgm=null
string sgm=""
endglobals
И заменил бы локальные вот этими переменными.
27
почему? в чем разница между call и ExecuteFunc.
меня смутило что не триггерные, ведь по большому счету триггерные от стандартов ничем не отличаются. Просто он ловит каст.
19
Execute - запускает функцию, в любом месте.
call только если функция стоит перед.
Да, система просто отлавливает касты. После отлавливания каста, она проверяет тригерный ли это скилл. Ну и только потом запускает привязанный триггер.
18
было бы неплохо пример с пару кастами сделать
15
Отличная идея, всегда хотел как-то систематизировать касты спеллов И вот "наткнулся"
Действительно, все гениальное - просто
Немного удивила вот эта строчка:
if SubString(s,StringLength(s)-4,StringLength(s))=="Exec" then
Может, она должна выглядеть так:
if SubString(s, 0, 4) == "Exec" then
При первом варианте будут "выделены" последние 4 символа, а нам необходимо первые четыре Хотя это дело каждого
Если использовать второй вариант, то название спелла должно выглядеть так: ExecName, иначе NameExec
было бы неплохо пример с пару кастами сделать
Вот карта-пример
Загруженные файлы
24
Единственное что-бы добавил.
globals
trigger tgm=null
string sgm=""
endglobals
И заменил бы локальные вот этими переменными.
Нафига? Ты собрался ингейм отключать этот триггер? Или может обращаться? К эвент строке? Если нет, то правильнее юзать локалки в обоих случаях, т.к. строка в вц3 != объект, по этому темповую глобалку можно не создавать.
14
что вы понимаете под не "триггерные"?
нестандартные чтоле?
15
что вы понимаете под не "триггерные"?
Те заклинания, для которых не созданы функции/триггеры.
14
зачем отсеивать эти заклинания, если эта функция предполагает создание общей библиотеки для них всех?
15
Temak1, Мда.
Допустим, у тебя есть 10 спеллов. 7 из них сделаны через триггеры, а 3 полностью стандартные. Чтобы не вызывались те спеллы которых нет и нужен фильтр.
27
операции со строками нифига не быстрые, ложь и провокация, самый быстрый метод работает на кондишинах и хеш таблице.
5
DioD, Т.е. вместо строк использовать хеш таблицу в кондишине?
21
Эмм, всё что написано в этом топике, я так понимаю, чушь собачья? =\
Во-первых, если мы делаем способность "триггерной", то мы уже в любом случае создаём отдельную способность с новым ID пусть там будет хоть 'A000' хоть 'A0V4' и т.д., так нахрена нам в названии дописывать ещё какой-то EXEC чтобы потом типа понять что способность для триггера? )
А во вторых, неужели, сравнить два integer медленнее, чем высчитывать через substring чё-то там в названии способности
По скорости быстрее чем 20 обычных проверок GetSpellAbilityId()=='SPELL ID'
а ну да, получается, за то время как успеет сделаться эта проверка на EXEC, уже успеют сделаться 20 проверок по Spell ID
Тогда вопрос, на кой вообще надо всё то, что тут описано? ) угар
Увидев данную тему очень стало интересно, шо ж там такое, а когда увидел, мне это показалось диким бредом. Мб я в чём-то не прав?
32
Proshel_Doty, кэп курит в сторонке.
Если интересно как в 1 триггере сделать все спеллы - могу показать как.
33
Всякий раз когда говорят слово быстрее, я хочу знать на сколько, если на такая функция быстрее даже на 0.1 на 10 тысячах вызовов это не быстрее, и грош ему цена, можно просто назвать другой способ, и все претензий нет, тогда все классно

После этого топика была попытка показать какая функция быстрее, но разницы были просто смешными

Что это вообще значит "быстрее", карта с 1000 отдельных триггеров на каст, будет мгновенно кастовать способности, точно так же мгновенно 1000 ифов в одном триггере, мгновенно бд и мгновенно этот способ. И карт свыше этого значения по пальцам пересчитать
21
quq_CCCP:
Proshel_Doty, кэп курит в сторонке.
а теперь представь, если эту статью прочитает новичок какой-нибудь и подумает, ууу круто, и будет так делать, думая, что так он себе якобы "жизнь упрощает"
Bergi_Bear, та тут дело просто в бесполезности этого метода
33
В целом занятно:
function Trig_SpellCasts_Conditions takes nothing returns boolean
    local string s = GetObjectName(GetSpellAbilityId())
    if SubString(s, 0, 4) == "Exec" then
        call ExecuteFunc(s)
    endif
    return false
endfunction

//===========================================================================
function InitTrig_SpellCasts takes nothing returns nothing
    local integer i = 0
    set gg_trg_SpellCasts = CreateTrigger(  )
    loop 
    exitwhen i > 15
        call TriggerRegisterPlayerUnitEvent(gg_trg_SpellCasts, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
    set i = i + 1
    endloop
    call TriggerAddCondition( gg_trg_SpellCasts, Condition( function Trig_SpellCasts_Conditions ) )
endfunction
и
function ExecThunderClap takes nothing returns nothing
    call ClearTextMessages()
    call BJDebugMsg("Кастер: " + GetUnitName(GetTriggerUnit()))
    call BJDebugMsg("Уровень применяемой способности: " + I2S(GetUnitAbilityLevel(GetTriggerUnit(), GetSpellAbilityId())))
endfunction

function ExecHammerOfStorms takes nothing returns nothing
    call ClearTextMessages()
    call BJDebugMsg("Цель: " + GetUnitName(GetSpellTargetUnit()))
    call BJDebugMsg("Уровень применяемой способности: " + I2S(GetUnitAbilityLevel(GetTriggerUnit(), GetSpellAbilityId())))
endfunction

function ExecPowerOfMountains takes nothing returns nothing
    call ClearTextMessages()
    call BJDebugMsg("Кастер: " + GetUnitName(GetTriggerUnit()))
    call BJDebugMsg("Уровень применяемой способности: " + I2S(GetUnitAbilityLevel(GetTriggerUnit(), GetSpellAbilityId())))
endfunction
Способ ищет в названии кастом функции "Exec", и если есть, то добавляет событие и делает отслеживаемой, только я так и не понял как он определяет, где какая способность, но круто, мне раньше это нигде не попадалось
32
Proshel_Doty:
quq_CCCP:
Proshel_Doty, кэп курит в сторонке.
а теперь представь, если эту статью прочитает новичок какой-нибудь и подумает, ууу круто, и будет так делать, думая, что так он себе якобы "жизнь упрощает"
Bergi_Bear, та тут дело просто в бесполезности этого метода
Ну тут много подобной фигни, вроде timer exploit - который хрень, и ничуть не быстрее хештаблицы и классики жанра.
24
Интересно, что вернет GetObjectName в рефорже в луа и на разных локалях...
А способ, конечно, мало того что говно, так еще и выложен не меньше восьми лет назад же.
32
prog, ну сранно что вы забыли разбор полетов по этой теме и норм вариант с хештаблицей и екзекутом
22
prog, Интересно, что вернет GetObjectName в рефорже в луа и на разных локалях...
Ну вернет по локализации да. Если нестандартный то надо добавлять строку для локализации

посколько у дефолотные все переведены локали а нестандартные нет
16
Bergi_Bear:
Всякий раз когда говорят слово быстрее, я хочу знать на сколько, если на такая функция быстрее даже на 0.1 на 10 тысячах вызовов это не быстрее, и грош ему цена, можно просто назвать другой способ, и все претензий нет, тогда все классно
так нужно сперва иметь что-то для подсчета времени, а этого у простых крестьян нет ни в каком виде)
32
DracoL1ch, недавно простенький вариант в мемхак завезли, позволяет померится попугаями, на тему какая функция выполняется дольше.
33
DracoL1ch, в качестве бенчмарка можно просто использовать игру в которой так сделано, и в которой ничего не тормозит, я думаю этого достаточно, у вас на мемхаке есть тесты у нас "были" на луа, доказано что отличия есть, но слишком мизерные
Чтобы оставить комментарий, пожалуйста, войдите на сайт.