система каста заклинаний через Execute
для добавления заклинания необходимо вызвать при инициализации карты функцию addSpell
	/**
	 * привязывает функцию с именем func к спеллу с равкодом rawcode
	 * @param rawcode равкод спела
	 * @param func имя функции которая вызывается при касте спела
	 */
	 void addSpell(int rawcode,string func)
код
library spellcast initializer init{
    private hashtable hash;
    
    private void act(){
        ExecuteFunc(LoadStr(hash, GetSpellAbilityId(), 0));
    }

    void addSpell(int a,string b){
        SaveStr(hash, a, 0, b);
    }

    private void init(){
        trigger a=CreateTrigger();
        TriggerRegisterAnyUnitEventBJ(a,EVENT_PLAYER_UNIT_SPELL_EFFECT);
        TriggerAddAction(a, function act);
        hash=InitHashtable();
    }

}
`
ОЖИДАНИЕ РЕКЛАМЫ...
1
28
11 лет назад
1
бамп
7 часов 4 просмотра(
хотяб отписывайтесь кто посмотрел
1
32
11 лет назад
1
Как я понял.
1 общее событие при касте заклинаний у которых равкод выше или равен A000? функции void skill1,2, собственно и функции наших триггерных способностей.
Снова экономим 3 байта делая систему нихрена не понятной и нечетаемой (я с трудом понимаю), наверное очень актуально когда на карте 100+ триггерных спелов?
1
28
11 лет назад
1
Bergi_Bear, даже при 10 скилах триггерных довольно полезно
1
21
8 лет назад
1
Изобретательно. Но чего такого особенного в "ExecuteFunc", что ты решил сделать систему?
1
28
8 лет назад
Отредактирован nvc123
1
GF RaiseD, система старая и баганая
надо новую версию бы залить
особенность ExecuteFunc в том что он копирует параметры предыдущего потока (GetTriggerUnit() и прочее)
таким образом мы экономим память, процессорное время и уменьшаем объём кода
так как нам не надо создавать кучу триггеров с одинаковым событием
и не нужны условия вида GetSpellAbilityId()=='A000'
залил новую версию вроде
0
21
8 лет назад
Отредактирован Raised
0
В статьи это можно бы.
особенность ExecuteFunc в том что он копирует параметры предыдущего потока (GetTriggerUnit() и прочее)
Вот это интересней всего.
1
28
7 лет назад
1
добавил в виде подключаемой библиотеки
Загруженные файлы
1
21
7 лет назад
Отредактирован scopterectus
1
А зачем нужна функция cond(), если она нигде не используется?
И правильно ли я понял, что если спелл не тригерный, то ExecuteFunc запустится с переданной строкой "null"?
1
32
7 лет назад
1
Не запустится, для этого и есть условия. С проверкой на null по этому адресу, так же стоит в события добавить буллекспры для отслеживания даммиков и прочих юнитов, у которых нет и небудет триггерных способностей.
Это грубый пример, если вам дать все как надо, вы не разберетесь что к чему, а тут все просто и понятно.
1
20
7 лет назад
1
Имхо сомнительная полезность. Экзекутфанк работает тем быстрее, чем короче имя функции. Также, ячейки хештейбла создаются, ятп, большими пачками, что никак не экономит память. Жду аргументов против.
1
28
7 лет назад
Отредактирован nvc123
1
Diaboliko, создай карту с 100 триггерными спеллами и протести оба варианта для наглядности
или ты считаешь что хэш + экзекут функц тратят больше ресурсов чем 100 триггеров с условиями?
ScopteRectuS:
А зачем нужна функция cond(), если она нигде не используется?
забыл удалить условие)
1
21
7 лет назад
1
Если использовать одну Хеш-таблицу на всю карту, могут ли данные в "SaveStr(hash, a, 0, b)" перезаписаться?
1
32
7 лет назад
1
ScopteRectuS, Нет, если ты сам их не перезапишешь.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.