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

Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
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
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
15
12 лет назад
0
что вы понимаете под не "триггерные"?
Те заклинания, для которых не созданы функции/триггеры.
0
14
12 лет назад
0
зачем отсеивать эти заклинания, если эта функция предполагает создание общей библиотеки для них всех?
0
15
12 лет назад
0
Temak1, Мда.
Допустим, у тебя есть 10 спеллов. 7 из них сделаны через триггеры, а 3 полностью стандартные. Чтобы не вызывались те спеллы которых нет и нужен фильтр.
9
27
11 лет назад
9
операции со строками нифига не быстрые, ложь и провокация, самый быстрый метод работает на кондишинах и хеш таблице.
0
24
11 лет назад
0
DioD, прав.
0
5
8 лет назад
0
DioD, Т.е. вместо строк использовать хеш таблицу в кондишине?
0
22
4 года назад
0
Эмм, всё что написано в этом топике, я так понимаю, чушь собачья? =\
Во-первых, если мы делаем способность "триггерной", то мы уже в любом случае создаём отдельную способность с новым ID пусть там будет хоть 'A000' хоть 'A0V4' и т.д., так нахрена нам в названии дописывать ещё какой-то EXEC чтобы потом типа понять что способность для триггера? )
А во вторых, неужели, сравнить два integer медленнее, чем высчитывать через substring чё-то там в названии способности
По скорости быстрее чем 20 обычных проверок GetSpellAbilityId()=='SPELL ID'
а ну да, получается, за то время как успеет сделаться эта проверка на EXEC, уже успеют сделаться 20 проверок по Spell ID
Тогда вопрос, на кой вообще надо всё то, что тут описано? ) угар
Увидев данную тему очень стало интересно, шо ж там такое, а когда увидел, мне это показалось диким бредом. Мб я в чём-то не прав?
0
32
4 года назад
0
Proshel_Doty, кэп курит в сторонке.
Если интересно как в 1 триггере сделать все спеллы - могу показать как.
0
32
4 года назад
0
Всякий раз когда говорят слово быстрее, я хочу знать на сколько, если на такая функция быстрее даже на 0.1 на 10 тысячах вызовов это не быстрее, и грош ему цена, можно просто назвать другой способ, и все претензий нет, тогда все классно

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

Что это вообще значит "быстрее", карта с 1000 отдельных триггеров на каст, будет мгновенно кастовать способности, точно так же мгновенно 1000 ифов в одном триггере, мгновенно бд и мгновенно этот способ. И карт свыше этого значения по пальцам пересчитать
2
22
4 года назад
Отредактирован PROSHELDOTU
2
quq_CCCP:
Proshel_Doty, кэп курит в сторонке.
а теперь представь, если эту статью прочитает новичок какой-нибудь и подумает, ууу круто, и будет так делать, думая, что так он себе якобы "жизнь упрощает"
Bergi_Bear, та тут дело просто в бесполезности этого метода
0
32
4 года назад
0
В целом занятно:
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", и если есть, то добавляет событие и делает отслеживаемой, только я так и не понял как он определяет, где какая способность, но круто, мне раньше это нигде не попадалось
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.