EugeAl, если не нужно хранить коллекцию юнитов, можно вообще их даже в саму группу не добавлять. Просто в Enum передавать фильтр с нужными дейтсвиями, а самом фильтре либо возвращать false, либо ничего. Я такой способ уже давно практикую.
SсRealm, первый вариант есть, надо включить Colorizer. Но в моих настройках он офается, были с ним какие-то проблемы + я описания держал в таблице и раскрашивал скриптом по ключевым словам.
Что касается остального - моя сборка носит чисто косметический характер: дополнить Rebuild недостающими файлами и обновлениями. Есть, например, сборка от moyack, там куча дополнительных утилит. Или вот от Enobraed.
Пример квадратичной Безье. xgm.guru/files/100/319649/comments/525358/Bezier_example_2.w3m
Тут рабочий движется к пехотинцу по воздуху. Из опорных точек можно установить только ту, что в воздухе, указав её высоту и расположение на линии между пехотинцем и рабочим.
Давай так попробуем.
В Warcraft III\_retail_\fonts расположи файл. Папку fonts нужно будет создать.
Далее нужно будет активировать этот .reg файл (включает локальные файлы для игры).
без нового потока смысл был бы нулевой в этой функции.
Абсолютно нет, это всё ещё вызов условий триггера и всё ещё вызов функции из любого места кода (о чём и говорится в цитате из этой статьи).
Я всегда считал, что TriggerEvaluate не создаёт свой поток, поэтому эта функция и быстрее TriggerExecute. И поэтому для создания потоков я использовал .execute(). А оно вон как на самом деле: TriggerExecute медленный из-за поддержки вейтов.
Функция, как объект, имеет некоторые преимущества - метод evaluate позволяет совершать вызов функции из любого участка кода, даже если место вызова находится выше места объявления функции. Метод execute делает то же самое, но при этом порождает новый поток, однако, выполняется быстрее старого доброго ExecuteFunc.
И может так и было, когда JassHelper только создавался, но я сейчас сам протестировал на 1.26, TriggerEvaluate действительно создаёт свой поток. Тогда в execute() нет смысла кроме вейтов.
Забавный факт: execute() не возвращает значение, даже если оригинальная функция это делает. Почему? Vexorian решил, что это не нужно. 🤣
Не удивлюсь, если TriggerExecute на самом деле нифига не быстрее ExecuteFunc.
"поиск" присутствует только в контексте обычных структур, но это даже не поиск, потому что vJass прекрасно знает, какой индекс свободен во время аллокации новой структуры указанного типа. Выходить за лимит в 8к не рекомендуется, иначе во время каждого обращения к атрибуту или перезаписываемому методу будет происходить резолв массива по индексу структуры.
ScorpioT1000, так а причём тут структуры, если речь про функции и их "интерфейсы"? Структуры другой разговор.
ScorpioT1000, никакого поиска и заполнения дырок нет. Если у тебя в коде 1000 функции типа takes integer returns nothing, а в качестве переменных юзается 5, будет создан массив триггеров и 5 триггеров только для этих 5 функций.
О каком вообще замедлении идёт речь в контексте WC3, где главным источником лагов являются утечки и и кол-во активных объектов (типа юнитов). Тот же триггер по сути пустышка. Вон старый-добрый костыльный метод создания события по получению урона плодит ТОННУ событий, а единственный способ их все вайпнуть - вайпнуть сам триггер. Но и без вайпа через 2 часа игры это лагов не вызовет, просто потому что импакт минимальный.
И правда, какая разница, в насколько слоупочный код оно под капотом развернётся? Ведь главное это удобство. Даже если оно в 1фпс исполняться будет.
В ни насколько не слоупочный код. По результату тоже самое, что и сохранение имени функции в хеш и её последующий вызов через ExecuteFunc. Только в случае vJass юзается массив (быстрее хеша) и TriggerExecute (быстрее ExecuteFunc). Так что юзаем vJass на зло всем чистожассерам, которые вместо глобалок хеш юзают (а такие есть). 🤣
Правда, не нравится мне, что эта фича плодит триггеры. Возможно, надёжнее будет всё тоже самое делать через глобальные поля и boolexpr. Хоть и выглядит уродливо.
» WarCraft 3 / Чем можно заменить "TriggerRegisterTimerEventSingle"?
» WarCraft 3 / Чем можно заменить "TriggerRegisterTimerEventSingle"?
Ред. PT153
» WarCraft 3 / Утечки группы.
Ред. PT153
» WarCraft 3 / Чем можно заменить "TriggerRegisterTimerEventSingle"?
Ред. PT153
» WarCraft 3 / Чем можно заменить "TriggerRegisterTimerEventSingle"?
» WarCraft 3 / JNGP: ReBuild by Enobraed
» WarCraft 3 / JNGP: Rebuild от PT153
» WarCraft 3 / Кривая Безье
Пример кубической Безье. xgm.guru/files/100/319649/comments/525358/Bezier_example_1.w3m
Тут рабочий просто "бежит" по кривой построенной на основе 4-х точек.
Тут рабочий движется к пехотинцу по воздуху. Из опорных точек можно установить только ту, что в воздухе, указав её высоту и расположение на линии между пехотинцем и рабочим.
Ред. PT153
» Администрация XGM / Плитки навигации
Ред. PT153
» WarCraft 3 / Не отображается текст в WarCraft reforged
Ред. PT153
» WarCraft 3 / Не отображается текст в WarCraft reforged
В Warcraft III\_retail_\fonts расположи файл. Папку fonts нужно будет создать.
Далее нужно будет активировать этот .reg файл (включает локальные файлы для игры).
Ред. PT153
» Wisp TD / Скачать карту
» Администрация XGM / Иконки
» Администрация XGM / Плитки навигации
» Администрация XGM / Плитки навигации
» WarCraft 3 / Не отображается текст в WarCraft reforged
» WarCraft 3 / Не отображается текст в WarCraft reforged
Ред. PT153
» WarCraft 3 / 16. Функция как объект
Я всегда считал, что TriggerEvaluate не создаёт свой поток, поэтому эта функция и быстрее TriggerExecute. И поэтому для создания потоков я использовал .execute(). А оно вон как на самом деле: TriggerExecute медленный из-за поддержки вейтов.
Ред. PT153
» WarCraft 3 / 16. Функция как объект
» WarCraft 3 / Полярное смещение (скорость тригонометрических операций)
» WarCraft 3 / 16. Функция как объект
Ред. PT153
» WarCraft 3 / 16. Функция как объект
» WarCraft 3 / 16. Функция как объект
Ред. PT153
» WarCraft 3 / 16. Функция как объект