Как сделать луа на легендвар

Обновлено: 05.07.2024

Итак, у меня есть аддон Wow, который состоит из многих, многих тысяч строк. Иногда Blizzard удаляет функции Lua из игры, и я не всегда уверен, действительны ли функции, которые я вызвал в аддоне.

Есть ли способ просканировать весь файл Lua на предмет функций, которые больше не существуют?

Я знаю, что могу сделать что-то вроде этого:

Но это требует, чтобы я проверял каждое имя функции по одному, так что это нереально (их сотни).

Я хотел бы иметь возможность сканировать весь файл Lua и предупреждать меня, если какие-либо имена функций, которые я вызвал, больше не присутствуют в World of Warcraft API.

Решение может быть написано на любом языке (не обязательно должен быть скрипт Lua, хотя это было бы предпочтительнее).

3 ответа

Вы можете найти журнал изменений здесь

Проект GitHub показывает, как эти функции сканируются, по сути, он просто сканирует _G [] и код FrameXML от Blizzard.

Вы также можете загрузить zip-архив на Globe, который сообщит вам обо всех удаленных API, например

Сканировать, если имя функции равно нулю

Он также работает с любым интерпретатором lua не только в аддоне World of Warcraft. Lua вызовет attempt to call nil value или аналогичный Итак, перед запуском мы проверяем, является ли это nil или функция

load("return "..functionName) вернет содержимое переменной functionName, даже если оно равно nil, тогда мы проверяем его с помощью type , если это существующая функция, она возвращает "function"

type(func()) == "function" эта строка проверяет

Хороший API перечислит имена удаленных функций в их журнале изменений. Просто найдите в своем скрипте эти имена.

Вы можете использовать линтер, например luacheck, для поиска неопределенных вещей в вашем скрипте. Это потребует от вас вести список существующих имен функций. Это также работает для других глобалов.

Или вы ищите в своем скрипте вызовы функций и ищите это имя в списке существующих имен функций. Или вы проверяете, равно ли это имя нулю в вашей среде. Вызов функции - это любое имя, за которым следует необязательный пробел и одно из следующих значений: ( , " или < . Для функций это тривиально, для других переменных это становится немного сложнее, и вы в конечном итоге напишете свой собственный линтер, чтобы вы могли просто использовать существующий.

Таблицы в целом — самый важный тип данны в Lua.

Первое, что рассмотрим, — массивы. Массивы — это таблицы с числовой индексацией. Массив начинается с его названия, потом ставится равно и в фигурных скобках значения.
Каждый элемент массива пишется в кавычках и разделяется запятой.

Самый простой массив выглядит так:

После последнего элемента запятая не обязательна.

Индексация массивов — это следующий параграф.

§14.1.1. Индексация массивов.

Индексация массивов в Lua начинается не с нуля, как в некоторых других языках (в том же C), а с единицы.

Полностью эквивалентна этой:

Подобная индексация нежелательна:

Почему? Это следующий параграф.

Но если надо, можно так:

§14.1.2. Определение длины массива.

Вот простой пример:

Чтобы не было проблем с версиями Lua, дальше уже будет писаться только table.getn().

Здесь напечатается 3, поскольку в массиве три элемента.

А что напечатается здесь?:

А напечатается здесь 1, поскольку индекс два равен nil.

А тут вовсе напечатается 0:

Поскольку индекс один равен nil.

Потому что тут вообще ошибка вылезет.

В общем, чтобы оператор длины работал корректно, нужно указывать все индексы правильно, или не указывать вообще, — Lua это сам сделает.

§14.1.3. Обращение к элементам массива.

Обращение к элементам массива происходит так:

if m[1] then
print(m[1]); -- "one"
end
if m[2] then
print(m[2]); -- "two"
end
if m[3] then
print(m[3]); -- "three"
end

Пишется название массива, затем в квадратных скобках указывается его индекс.

§14.1.4. Цикл обхода всех элементов массива.

Вот, собственно, один из двух циклов, упомянутый в §10.5.

Для обхода всех элементов массива используется расширенный арифметический цикл for вместе с переменной ipairs.

То, что перед запятой, — индекс массива, а после — его значение (для примера ниже значение первого индекса — "one").

Как и в случае с арифметическим циклом, две эти переменные являются локальными и могут принимать любые другие значения:

Иногда в получении индекса либо значения нет необходимости, в таком случае, переменная заменяется на подчёркивание:

§14.1.4.1. Обход элементов массива иными способами.

Для обхода все элементов можно и не пользоваться ipairs и for .. in, а просто воспользоваться арифметическим for и оператором длины:

В качестве индекса используется, как понятно, переменная i.

Только стоит учесть, что при использовании этого варианта получение значения массива будет недоступным.

А вот может случиться такая ситуация, что нескольким (но не всем) элементам массива необходимо будет присвоить одно и то же значение. Можно, конечно, воспользоваться примитивными методами, типа:

И так далее. Но намного быстрее воспользоваться арифметическим for:

Для всех элементов можно по стандарту:

for i,_ in ipairs(m) do
m[i] = nil;
end

Тут уже кому как.

§14.1.5. Массивы внутри массивов.

Если есть необходимость в этом, внутри пары фигурных скобок создаётся ещё одна пара (просто фигурные скобки, без названия), и туда как обычно записываются элементы нового массива.

Обращение к элементам массива, который внутри другого массива, происходит так: сначала в квадратных скобках пишется индекс внешнего массива, в котором расположен внутренний, затем уже так же индекс элемента внутреннего массива:

Обход такого массива выглядит так:

Так можно создавать огромное количество массивов, каждый из которых будет внутри предыдущего:

В отличии от массивов элементы таблицы таблицы индексируются переменными. А значением может быть абсолютно любой тип данных Lua, да и вообще всё что угодно:

Как уже было сказано выше, значением таблиц могут быть и числа, и булевые значения (true, false), и функции, и строки, и таблицы, и массивы, и даже nil.
Для отделения типов данных друг от друга будет удобно использовать точку с запятой вместо обычной запятой:

t = <
number1 = 1,
number2 = 2;
str = "string";
t2 = <
n = 4;
n1 = true;
>;
m = ;
jj = false,
gg = true;
wtf = nil;
>;

§14.2.1. Обращение к элементам таблицы.

Почти всегда обращение выглядит так:

Когда в таблице таблица, обращение происходит так:

Когда в таблице массив, обращаться можно так:

Ну и понятно, что если в таблице есть массив, внутри которого массив, обращаться можно так:

§14.2.2. Цикл обхода элементов таблицы.

Что это — обьяснять не надо. Для обхода элементов таблицы используется pairs, вместо ipairs. И обычно вместо переменной i (index) используется k (key) (но можно, естественно, писать свои названия).

Есть таблица со списком оружия и его уроном в процентах. Надо присвоить всему оружия нулевой урон:

Weapons = <
Knife = 20,
Pistol = 40,
ShotGun = 80,
AssaultRifle = 85,
SniperRifle = 95,
MiniGun = 100,
RocketLauncher = 110,
>;

for k,_ in pairs(Weapons) do
local w = Weapons;
w[k] = 0;
end

§14.2.3. Функции в таблицах.

Сразу создать функцию в таблице, похоже нельзя. Но если такое необходимо, это можно сделать следующим образом:

function tab:func(a,b)
print(a+b);
end

§14.3. Функции для работы с таблицами.

table.concat(table [, sep [, i [, j]]]):

Задан массив, в котором все элементы — строки или числа, возвращает table[i]..sep..table[i+1] ··· sep..table[j]. Значение по умолчанию для sep — пустая строка, значение по умолчанию для i — 1, а для j — длина таблицы.
Если i больше j, функция возвращает пустую строку.

Ссылка на сканирование : virustotal

Файл безопасен.

Если произошла ошибка:
  • Попробуйте запустить от администратора
  • Или переустановить
  • Так же антивирус может блокировать запуск
  • Напишите комментарий и вам могут помочь

Подпишись на нас в Telegram и скачивай приватные читы бесплатно !

Бот для скачивания читов@filecheatbot


Итак, у меня есть аддон Wow, который состоит из многих, многих тысяч строк. Иногда Blizzard удаляет функции Lua из игры, и я не всегда уверен, действительны ли функции, которые я вызвал в аддоне.

Есть ли способ просканировать весь файл Lua на предмет функций, которые больше не существуют?

Я знаю, что могу сделать что-то вроде этого:

Но это требует, чтобы я проверял каждое имя функции по одному, так что это нереально (их сотни).

Я хотел бы иметь возможность сканировать весь файл Lua и предупреждать меня, если какие-либо имена функций, которые я вызвал, больше не присутствуют в World of Warcraft API.

Решение может быть написано на любом языке (не обязательно должен быть скрипт Lua, хотя это было бы предпочтительнее).

3 ответа

Вы можете найти журнал изменений здесь

Проект GitHub показывает, как эти функции сканируются, по сути, он просто сканирует _G [] и код FrameXML от Blizzard.

Вы также можете загрузить zip-архив на Globe, который сообщит вам обо всех удаленных API, например

Сканировать, если имя функции равно нулю

Он также работает с любым интерпретатором lua не только в аддоне World of Warcraft. Lua вызовет attempt to call nil value или аналогичный Итак, перед запуском мы проверяем, является ли это nil или функция

load("return "..functionName) вернет содержимое переменной functionName, даже если оно равно nil, тогда мы проверяем его с помощью type , если это существующая функция, она возвращает "function"

type(func()) == "function" эта строка проверяет

Хороший API перечислит имена удаленных функций в их журнале изменений. Просто найдите в своем скрипте эти имена.

Вы можете использовать линтер, например luacheck, для поиска неопределенных вещей в вашем скрипте. Это потребует от вас вести список существующих имен функций. Это также работает для других глобалов.

Или вы ищите в своем скрипте вызовы функций и ищите это имя в списке существующих имен функций. Или вы проверяете, равно ли это имя нулю в вашей среде. Вызов функции - это любое имя, за которым следует необязательный пробел и одно из следующих значений: ( , " или < . Для функций это тривиально, для других переменных это становится немного сложнее, и вы в конечном итоге напишете свой собственный линтер, чтобы вы могли просто использовать существующий.

Читайте также: