Здравствуйте! Пытаюсь создать наработку для лёгкого вызова нужных мне триггеров по следующей схеме:
  1. Юнит применяет способность;
  2. Имя способности заносится в переменную udg_Spell_name;
  3. Имени способности соответствует один триггер с аналогичным названием;
  4. Производится вызов триггера через переменную, хранящую в себе имя триггера (так как оно аналогично имени способности).
Звучит просто, но почему-то не выходит. Собственно, вот ключевая строка с ошибкой неверного типа передаваемого функции аргумента:
call TriggerExecute(udg_Spell_name)
Конвертации строки (или чего бы то ни был ещё) в триггер я не нашёл.
Есть ли способ осуществить задуманное? А то согласитесь, не очень-то удобно вставлять миллион проверок используемых способностей (ещё и в каждую из них!) для того, чтобы запустить соответствующий каждой из них триггер.

Принятый ответ

Потому что у триггеров нет имен.
Создаем массив строк name_array;
Создаем массив триггеров trigger_array;
Создаем инт name_array_index;
Создаем функцию
register_trigger(Trigger trigger, string name) {
    name_array[name_array_index] = name;
    trigger_array[name_array_index] = trigger;
    name_array_index = name_array_index + 1;
}
Создаем функцию
name_to_trigger(string name) {
    for (integer index = 0; index < name_array_index; index++) {
        if name_array[index] == name {
            return trigger_array[index];
        }
    }
}
Затем регистрируем все триггеры через register_trigger.
А после этого думаем, реально ли у нас столько абилок, что простая последовательность if name == "my_ability" then RunTrigger(my_ability) хуже этого решения
0
16
6 лет назад
Отредактирован avuremybe
0
Потому что у этой ф-ции аргументами являются триггер и булин. Никакой строки там нет.
function TriggerExecuteBJ(trigger trig, boolean checkConditions)
0
6
6 лет назад
0
Вот я и спрашиваю, можно ли вызывать как-то триггер по имени или нет. Или через индекс, или ещё через что-то, не напрямую, короче.
0
16
6 лет назад
0
Gerhop, по имени ты можешь только ф-цию вызвать.
Триггер только через переменную.
5
29
6 лет назад
Отредактирован Doc
5
Потому что у триггеров нет имен.
Создаем массив строк name_array;
Создаем массив триггеров trigger_array;
Создаем инт name_array_index;
Создаем функцию
register_trigger(Trigger trigger, string name) {
    name_array[name_array_index] = name;
    trigger_array[name_array_index] = trigger;
    name_array_index = name_array_index + 1;
}
Создаем функцию
name_to_trigger(string name) {
    for (integer index = 0; index < name_array_index; index++) {
        if name_array[index] == name {
            return trigger_array[index];
        }
    }
}
Затем регистрируем все триггеры через register_trigger.
А после этого думаем, реально ли у нас столько абилок, что простая последовательность if name == "my_ability" then RunTrigger(my_ability) хуже этого решения
Принятый ответ
1
32
6 лет назад
1
Doc, уж проще сделать на хт, побыстрее перебора будет.
Потом - есть такая прекрасная штука как ExecuteFunc("Имя функции"), т.к все параметры потока из которой был сделан экзекут наследуются, т.е в вызванной функции будут исправно работать GetTriggerUnit(), GetExpiredTimer() - разумеется если поток запустили соотвествующие события, для юнита какое то событие связанное с юнитом, например применил способность ну с таймером таймер истек, ну и так далее.
1
21
6 лет назад
1
0
6
6 лет назад
0
Спасибо большое всем отписавшимся, самый простой и быстрый для исполнения вариант предложил Doc, и ему за это благодарность в квадрате. =)
0
16
6 лет назад
0
самый простой и быстрый для исполнения вариант предложил Doc
Вообще-то нет.
0
29
6 лет назад
Отредактирован Doc
0
Doc, уж проще сделать на хт, побыстрее перебора будет.
В хештаблице ключи - интежеры, ты как собрался по строке-имени без перебора доставать их хештаблицы триггер? Можно организовать благодаря вторичному ключу и хешированию строки "массив" и получить реальную хештаблицу строка - триггер, но это уже никак не подходит под "проще".
0
32
6 лет назад
0
Doc, По Ид спелла... Насчет скорости одно обращение к хт = 2 обращения к массиву.
0
29
6 лет назад
0
Про айди то речи не было изначально, с айдишниками можно и обычные ивенты использовать.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.