24

» WarCraft 3 / Передача параметра в функции

TeX13, если делать на одном таймере - идея в том чтобы считать время от старта и запоминать его при килах, чтобы было с чем сравнить при следующем киле - если разница меньше чем предел времени между килами для серии, увеличиваем серию, если больше - начинаем новую серию. Все становится чуть сложнее если за успешную серию нужно выдавать какие-то бонусы в конце серии т.к. такой подход не подразумевает простого детекта того что кил был последним в серии, но если достаточно действий после каждого кила, то это один из оптимальных подходов, имхо.
Если же держать по таймеру на каждую начатую серию, то нужно решить несколько проблем
  • привязка номера игрока к таймеру, чтобы таймер знал на кого он работает. В жассе это только через хештаблицы по хендлу таймера делается. В Lua на 1.31 все проще и есть несколько способов это сделать.
  • Продление времени после кила. Если я правильно помню, то можно просто заново сделать TimerStart на том-же таймере, но могу ошибаться т.к. очень давно не делал ничего где мне нужно было бы менять таймер между итерациями
24

» WarCraft 3 / Передача параметра в функции

TeX13, еще раз повторюсь, таймеры-триггеры штука корявая, вместо этого нормальные люди пользуются CreateTimer и TimerStart.
24

» WarCraft 3 / Передача параметра в функции

Что касается задачи отлова килл-стриков - все можно реализовать на массивах, циклах и одном таймере с периодом в одну секунду и никто не заметит разницы. Ну и не через таймер-триггер, а через CreateTimer и TimerStart напрямую, раз уж на то пошло дело.
24

» WarCraft 3 / Передача параметра в функции

оххх, как трудно на это переходит после c#, ох какие вещи я бы здесь вытворял со списками xDDD
Ну так переходи на 1.31 и Lua, там можно много чего вытворять.
24

» WarCraft 3 / [Lua] Инжект функций

PT153, пропадающие комменты - беда редактирования, пока ресурс ждет публикации после редактирования - у него отдельные комменты, которые сливаются со старыми после публикации. Раньше была возможность переключать между последней опубликованной версией ресурса и ожидающей публикации, а сейчас куда-то пропала. Перечитай комменты еще раз - там и твой коммент есть и ответ на него.
24

» WarCraft 3 / [Lua] Инжект функций

Добавил инжект DestroyTimer.
Добавил ссылку на фикс утекающих точек в ГУИ, тоже работающий через инжект.
24

» WarCraft 3 / [Lua] Инжект функций

На самом деле вообще стоит писать полностью кастомную функцию main.
Иногда стоит, иногда и так сойдет. Имхо, это тема для отдельной статьи - оптимизация main и config.
24

» WarCraft 3 / [Lua] Инжект функций

Внес коррективы, чтобы не было путаницы с инжектами и хуками.
24

» WarCraft 3 / [Lua] Инжект функций

PT153, да, можно не вызывать оригинал, но есть два нюанса. Первый - старый main останется в коде карты мертвым грузом, он не будет вызываться, но в коде останется. Инжект должен быть после объявления оригинала, иначе оригинал перезапишет то что мы инжектим, а не наоборот - из WE инжектом до мейна не достать, только при использовании внешнего редактора.
24

» WarCraft 3 / [Lua] Инжект функций

Исправил часть ошибок в коде, добавил еще один пример инжекта.
24

» WarCraft 3 / Вопросы по Lua

Ответ выше - для стандартного редактора WE. Однако, рекомендуется использовать с Lua внешний редактор кода и внешний же сборщик карты. Это чревато маленьким неудобством в виде необходимости запускать карту на проверку только из внешней программы т.к. запуск из WE будет без значительной части кода в карте, но дает огромное преимущество в виде несравнимо более удобной работы с кодом.
К сожалению, пока слишком мало информации об этом на сайте.
Вариант NazarPunk, пока без сборки карты, код придется копировать в карту вручную.

Мой вариант, пока не рабочий т.к. перед релизом нужно исправить несколько багов, но включает в себя и работу с кодом и сборку карты, не нужно вручную копировать код в карту.
Даже здесь на сайте есть еще пара вариантов, но мне лень их искать
И немного саморекламы, как выглядели бы ответы на вопрос выше при использовании моего тулсета
  1. Использовать макрос RAW('A0E5'), который превратит равкод в число при сборке карты.
  2. Инжект в функцию main, с заменой оригинальной функции main на свою и вызовом оригинальной функции изнутри нашей.
  3. Аналогично ответу на этот вопрос для чистого WE, но без объявления переменных в WE т.к. то уже не так удобно становится когда код во внешнем редакторе.

Теперь о точках входа и инжекте.
Луа позволяет делать такой финт ушами
do
  local f = FunctionName -- записываем функцию в переменную
  function FunctionName() -- заменяем оригинальную функцию своей
   f() -- вызываем оригинальную функцию из переменной
   -- здесь могла быть ваша реклама или ваш код
  end
end
Это позволит нам сохранить оригинальную функцию в переменную, заменить оригинал своей функцией и вызвать оригинал из переменной. Применимо к любой функции, которая была объявлена раньше, не работает если функция объявлена после выполнения этого кода. Для создания точки входа отлично подходит InitGlobals, она всегда объявляется раньше кастомного кода в WE и вызывается из main.

У себя в коде я пользуюсь немного более сложным способом, этот код не будет работать в WE т.к. цепляет main, а не InitGlobals и не дает серьеных преимуществ перед описаным выше, привожу просто для расширения кругозора
local function InjectMain()
    local alpha_main = main
    return function()
        local alpha_init = RunInitializationTriggers
        RunInitializationTriggers = function() end
        alpha_main()
        InitLibraries() --моя функция, которая должна быть выполнена после всего, но до триггеров инициализации карты
        alpha_init()
    end
end
main = InjectMain()
24

» WarCraft 3 / Вопросы по Lua

Один вопрос - одна тема, но в виде исключения отвечу на все раз уж вопросы по Lua.
  1. В Луа нет формата числа 'A0E5', для Lua это просто строка, как и любой другой текст в одинарных или двойных кавычках. Для превращения строки в равкод используется функция FourCC('A0E5').
  2. Самая ранняя точка входа - начало кода карты, он весь выполняется последовательно, но слишком рано, вроде еще в лобби. Вторая точка входа - функция main, она вызывается при старте игры, пока идет загрузка у всех игроков, отсюда вызывается триггер инициализации и здесь уже безопасно что-то делать, но до main добараться из WE нельзя, только пользуясь внешними редакторами. Для WE остается третий вариант - перехват функции InitGlobals и вставка туда своего кода. Как делать хук на InitGlobals расскажу или кину ссылку чуть позже.
  3. Переменные в луа не имеют явного типа, тип имеют только записаные в переменную значения - можно сперва записать туда юнита, а потом, хотя это и плохая практика, записать что-то другое когда юнит уже не нужен, например строку, или игрока или число. Глобалкам бесполезно присваивать nil, это равносильно "удалению" для глобальной переменной. Но, также, глобалки можно объявлять в любом месте - любая переменная без модификатора local является глобальной, любое присвоение глобальной переменной равносильно её объявлению. При работе с WE глобальные переменные лучше объявлять в WE, для этого близы даже новый способ ввели, их можно отдельными строками в списке триггеров держать, а не в одном уродливом окошке. Обращение к таким переменным, как и раньше, по имени udg_ИмяПеременной.
24

» WarCraft 3 / Два мультиборда в игре

Можно только на патче 1.31.x+
На 1.31+ проще свой фрейм запилить идентичный мультиборду.
24

» Шатер GenElCon'a / Специфические люди

Все куда проще... Известность и успешность в жизни не гарантируют что этот человек не кусок говна, не мудак, не идиот, разбирается в чем-то кроме своей специализации, действительно разбирается в своей собственной специализации и так далее. Людям свойственно быть говном и с успешностью говнистость часто только усиливается.
24

» WarCraft 3 / Событие для боевой единицы "Спасен"

Видел в кампаниях юнитов, которые переходят за тебя когда к ним подходиш? Вот это оно.
24

» Эксперименты в Пустоте / Ломаем Warcraft3 1.31 полностью: Кастомный компилятор Lua

PT153, дело в том, что компилятор у меня это exe файл, запиленый на C++, а всякие параметры и настройки получает плагин к vscode - это мне нужно будет начинать передавать компилятору дополнительные параметры, чего я не очень хочу делать, отложил так уже несколько фич которые тоже требуют дополнительных флагов - вот когда будет билд-файл, то компилятор будет получать путь к нему и читать оттуда все дополнительные параметры, сколько бы их ни было.
24

» WarCraft 3 / Продажа юнитов

NazarPunk, я смутно помню скрытую способность "разобрать здание" у нежити или что-то типа того.
24

» WarCraft 3 / Продажа юнитов

после использование "Продажа" в здании, то сначала разберают здание некоторое время, а после дают дерево и деньги.
Такое вроде на способностях реализовать можно, если я правильно помню, без триггеров или почти без триггеров.
24

» Эксперименты в Пустоте / Ломаем Warcraft3 1.31 полностью: Кастомный компилятор Lua

PT153, я изначально хотел сохранить возможность расставлять юнитов и ректы в WE и писать гуи триггеры для настроек, поэтому вариант с полной заменой всего оригинального кода WE никогда не рассматривал. Если я когда-нибудь дойду до того чтобы запилить билдфайл по которому будет работать компилятор вместо автоматического режима - такая возможность появится, а раньше я врядли стану тратить на это время.
Автоматический режим сборки кода достаточно прост:
  • файл оригинального кода от WE компилируется, скомпилированная версия падает в папку .build, получает идентификатор MAP и добавляется в список на сборку
  • в указаной директории рекурсивно перебираются все LUA файлы, компилируются, складываются в .build, получают идентификаторы и требования из директив компилятора и добавляются в список на сборку
  • перед компиляцией каждого файла выполняется проверка на наличие его скомпилированной версии и сравнение дат, если компилировать файл заново не нужно, то просто читается его заголовок с директивами компилятора, а компиляция файла пропускается, файл сразу добавляется в список сборки
  • все файлы получают в требования MAP, чтобы оригинальный код от WE всегда шел первым в списке сборки
  • список сборки сортируется таким образом чтобы выполнялись все требования (если требования выполнить невозможно из-за рекурсии или несуществующих индикаторов файлов, то сборка кода фейлится, но пока это только в логе видно - код в любом случае собирается по списку сборки, просто не гарантируется выполнение всех требований )
  • все файлы из списка сборки мержатся в единое целое согласно списку и падают в фиксированное место одним файлом
  • при сборке карты в mpq сборщик подхватывает готовый код карты из известного места и копирует его в архив собираемой карты
Что касается магических файлов для main и config - я не очень хочу плодить магические файлы, работающие определенным образом только потому что они так названы без более явного действия со стороны пользователя.
Поэтому куда более вероятен вариант макроса --#REPLACE или INJECT, который заставит компилятор найти оригинал функции и стереть его, но пока парсер не готов к таким макросам т.к. индивидуально проходит все файлы по очереди, только один раз и в алфавитном порядке продиктованном системой.
24

» WarCraft 3 / Применение способности триггером

PT153, в списке того что хотели бы на хайве много чего интересного есть. А вот что из этого реально запилят близы - большой вопрос.
24

» WarCraft 3 / Применение способности триггером

там есть свой специальный триггерный дамми
Что-то не видел такого. Откуда дровишки?
24

» Эксперименты в Пустоте / Ломаем Warcraft3 1.31 полностью: Кастомный компилятор Lua

alexprey, это надо чтобы оптимизатор умел понимать что можно оптимизировать. Имхо, этот конкретный случай того не стоит. Банальная минификация сторонней либой и то больше профита даст при куда меньших затратах времени. Но как задача на когда совсем нечем будет заняться сойдет.