|
Помогите освоить LUA |
|
|
|
  |
Ответов
DarkMaster |
25.10.2018, 8:43
|
          
Модератор UOPilot
Сообщений: 9.740
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 29642
Пользователь №: 11.279

|
Поскольку lua весь на деревьях и размеры массивов могут быть различными даже в части вложенности элементов (они не прямоугольные в lua), то лучше использовать что-то более серьезное, хотя в базовом виде работать бесспроно будет. Например есть вот такое творение: http://lua-users.org/wiki/TablePersistenceоригинал
Код local write, writeIndent, writers, refCount;
persistence = { store = function (path, ...) local file, e = io.open(path, "w"); if not file then return error(e); end local n = select("#", ...); -- Count references local objRefCount = {}; -- Stores reference that will be exported for i = 1, n do refCount(objRefCount, (select(i,...))); end; -- Export Objects with more than one ref and assign name -- First, create empty tables for each local objRefNames = {}; local objRefIdx = 0; file:write("-- Persistent Data\n"); file:write("local multiRefObjects = {\n"); for obj, count in pairs(objRefCount) do if count > 1 then objRefIdx = objRefIdx + 1; objRefNames[obj] = objRefIdx; file:write("{};"); -- table objRefIdx end; end; file:write("\n} -- multiRefObjects\n"); -- Then fill them (this requires all empty multiRefObjects to exist) for obj, idx in pairs(objRefNames) do for k, v in pairs(obj) do file:write("multiRefObjects["..idx.."]["); write(file, k, 0, objRefNames); file:write("] = "); write(file, v, 0, objRefNames); file:write(";\n"); end; end; -- Create the remaining objects for i = 1, n do file:write("local ".."obj"..i.." = "); write(file, (select(i,...)), 0, objRefNames); file:write("\n"); end -- Return them if n > 0 then file:write("return obj1"); for i = 2, n do file:write(" ,obj"..i); end; file:write("\n"); else file:write("return\n"); end; if type(path) == "string" then file:close(); end; end;
load = function (path) local f, e; if type(path) == "string" then f, e = loadfile(path); else f, e = path:read('*a') end if f then return f(); else return nil, e; end; end; }
-- Private methods
-- write thing (dispatcher) write = function (file, item, level, objRefNames) writers[type(item)](file, item, level, objRefNames); end;
-- write indent writeIndent = function (file, level) for i = 1, level do file:write("\t"); end; end;
-- recursively count references refCount = function (objRefCount, item) -- only count reference types (tables) if type(item) == "table" then -- Increase ref count if objRefCount[item] then objRefCount[item] = objRefCount[item] + 1; else objRefCount[item] = 1; -- If first encounter, traverse for k, v in pairs(item) do refCount(objRefCount, k); refCount(objRefCount, v); end; end; end; end;
-- Format items for the purpose of restoring writers = { ["nil"] = function (file, item) file:write("nil"); end; ["number"] = function (file, item) file:write(tostring(item)); end; ["string"] = function (file, item) file:write(string.format("%q", item)); end; ["boolean"] = function (file, item) if item then file:write("true"); else file:write("false"); end end; ["table"] = function (file, item, level, objRefNames) local refIdx = objRefNames[item]; if refIdx then -- Table with multiple references file:write("multiRefObjects["..refIdx.."]"); else -- Single use table file:write("{\n"); for k, v in pairs(item) do writeIndent(file, level+1); file:write("["); write(file, k, level+1, objRefNames); file:write("] = "); write(file, v, level+1, objRefNames); file:write(";\n"); end writeIndent(file, level); file:write("}"); end; end; ["function"] = function (file, item) -- Does only work for "normal" functions, not those -- with upvalues or c functions local dInfo = debug.getinfo(item, "uS"); if dInfo.nups > 0 then file:write("nil --[[functions with upvalue not supported]]"); elseif dInfo.what ~= "Lua" then file:write("nil --[[non-lua function not supported]]"); else local r, s = pcall(string.dump,item); if r then file:write(string.format("loadstring(%q)", s)); else file:write("nil --[[function could not be dumped]]"); end end end; ["thread"] = function (file, item) file:write("nil --[[thread]]\n"); end; ["userdata"] = function (file, item) file:write("nil --[[userdata]]\n"); end; } Пример использования: Код t_original = {1, 2, ["a"] = "string", b = "test", {"subtable", [4] = 2}}; persistence.store("storage.lua", t_original); t_restored = persistence.load("storage.lua"); Это позволит сохранят таблицы с любой структурой при этом сохраненный файл является полностью валидным lua кодом и может быть загружен через loadstring (что на самом деле и делает функция persistence.load). Вид при этом читабельный, никаких дурных проблем с зарезервированными символами и т.д. Почему для себя я бы не стал это использовать... Сделано оно так, что должно находиться в коде скрита, а не подгружаться из отдельного файла. Это просто не удобно. К тому же мы получаем километровое название функции которое еще и правильно нужно написать. Поэтому для себя я сделал небольшие модификации. Допиленный вариант
Код local write, writeIndent, writers, refCount;
local persistence = { save = function (path, ...) local file, e = io.open(path, "w"); if not file then return error(e); end local n = select("#", ...); -- Count references local objRefCount = {}; -- Stores reference that will be exported for i = 1, n do refCount(objRefCount, (select(i,...))); end; -- Export Objects with more than one ref and assign name -- First, create empty tables for each local objRefNames = {}; local objRefIdx = 0; file:write("-- Persistent Data\n"); file:write("local multiRefObjects = {\n"); for obj, count in pairs(objRefCount) do if count > 1 then objRefIdx = objRefIdx + 1; objRefNames[obj] = objRefIdx; file:write("{};"); -- table objRefIdx end; end; file:write("\n} -- multiRefObjects\n"); -- Then fill them (this requires all empty multiRefObjects to exist) for obj, idx in pairs(objRefNames) do for k, v in pairs(obj) do file:write("multiRefObjects["..idx.."]["); write(file, k, 0, objRefNames); file:write("] = "); write(file, v, 0, objRefNames); file:write(";\n"); end; end; -- Create the remaining objects for i = 1, n do file:write("local ".."obj"..i.." = "); write(file, (select(i,...)), 0, objRefNames); file:write("\n"); end -- Return them if n > 0 then file:write("return obj1"); for i = 2, n do file:write(" ,obj"..i); end; file:write("\n"); else file:write("return\n"); end; if type(path) == "string" then file:close(); end; end;
load = function (path) local f, e; if type(path) == "string" then f, e = loadfile(path); else f, e = path:read('*a') end if f then return f(); else return nil, e; end; end; }
-- Private methods
-- write thing (dispatcher) write = function (file, item, level, objRefNames) writers[type(item)](file, item, level, objRefNames); end;
-- write indent writeIndent = function (file, level) for i = 1, level do file:write("\t"); end; end;
-- recursively count references refCount = function (objRefCount, item) -- only count reference types (tables) if type(item) == "table" then -- Increase ref count if objRefCount[item] then objRefCount[item] = objRefCount[item] + 1; else objRefCount[item] = 1; -- If first encounter, traverse for k, v in pairs(item) do refCount(objRefCount, k); refCount(objRefCount, v); end; end; end; end;
-- Format items for the purpose of restoring writers = { ["nil"] = function (file, item) file:write("nil"); end; ["number"] = function (file, item) file:write(tostring(item)); end; ["string"] = function (file, item) file:write(string.format("%q", item)); end; ["boolean"] = function (file, item) if item then file:write("true"); else file:write("false"); end end; ["table"] = function (file, item, level, objRefNames) local refIdx = objRefNames[item]; if refIdx then -- Table with multiple references file:write("multiRefObjects["..refIdx.."]"); else -- Single use table file:write("{\n"); for k, v in pairs(item) do writeIndent(file, level+1); file:write("["); write(file, k, level+1, objRefNames); file:write("] = "); write(file, v, level+1, objRefNames); file:write(";\n"); end writeIndent(file, level); file:write("}"); end; end; ["function"] = function (file, item) -- Does only work for "normal" functions, not those -- with upvalues or c functions local dInfo = debug.getinfo(item, "uS"); if dInfo.nups > 0 then file:write("nil --[[functions with upvalue not supported]]"); elseif dInfo.what ~= "Lua" then file:write("nil --[[non-lua function not supported]]"); else local r, s = pcall(string.dump,item); if r then file:write(string.format("loadstring(%q)", s)); else file:write("nil --[[function could not be dumped]]"); end end end; ["thread"] = function (file, item) file:write("nil --[[thread]]\n"); end; ["userdata"] = function (file, item) file:write("nil --[[userdata]]\n"); end; }
return persistence
Пример использования: Код local tableToFile = require[[luaPlugins\tableToFile]] -- объявляется один раз в начале скрипта. -- Объявляем массив local arr = {10,9,8,7,6,5,4,3,{21,22,23,"'}\"\t\'",{}},1,0} -- Сохраняем массив tableToFile.save("1.txt",arr) -- Закгружаем массив arr2=tableToFile.load("1.txt")
Изменения оригинального кода - минимальные. Просто теперь можно спокойно подгрузить одной строкой, а не таскать весь код каждый раз за собой. Ну и store нам save поменял.
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
Сообщений в этой теме
sutra Помогите освоить LUA 24.10.2018, 18:09 cirus --lua
log "clear" log "mode compact... 25.10.2018, 1:58 DarkMaster Предчувствуя следующий вопрос:
local function lg... 25.10.2018, 8:54 sutra Спасибо большое парни! Оба здорово помогли мне... 25.10.2018, 23:06 DarkMaster
Смысл в том, что это делать уже не надо - оно уже... 26.10.2018, 0:36 sutra Дарк, а есть такая возможность получить некий резу... 26.10.2018, 12:28 DarkMaster
Нет. И подозреваю, что даже между запущенными на ... 26.10.2018, 14:25 WKnight
Теоретически есть. А смысл? 26.10.2018, 14:35 sutra Смысла нет, просто скрипт огромный, хотел частями ... 26.10.2018, 15:53 sutra В башке "месиво" сплошное от всех этих я... 26.10.2018, 16:49 olduo.com
В башке "месиво" сплошное от всех этих ... 27.10.2018, 0:51 DarkMaster
И да и нет. Пока не лезешь в классы и метатаблицы... 27.10.2018, 1:59 Cockney
Да вот только сам по себе луа пустой. Его сфера ... 27.10.2018, 12:44 DarkMaster
Классы этого никак не меняют.
И справляется на с... 27.10.2018, 14:00 Cockney
Классы этого никак не меняют.
И справляется на с... 27.10.2018, 14:48  olduo.com
Ради интереса зашел на одну из вакансий по луа:
... 27.10.2018, 18:17 sutra Во какую тему замутил. А я вот со своим дилетантск... 27.10.2018, 16:09 DarkMaster
Насколько я понял там вообще пофигу ибо линкуется... 27.10.2018, 17:08 Cockney
Начали мы как раз с того, что луа живет за счет ... 10.11.2018, 0:05 sutra Я попробовал и даже простейшую функцию не смог сде... 27.10.2018, 18:24 cirus
Выкладывайте код, поправим.
Для примера:
--lua
--... 27.10.2018, 18:31 sutra Не смог реализовать goto как только не пробовал, д... 27.10.2018, 19:53 cirus
Лучше сразу забудьте про него.
--lua
function pro... 27.10.2018, 19:53 sutra Спасибо. То есть goto не работает?? 27.10.2018, 20:01 cirus
Нет. Он и не нужен.
В луа его вообще нет. Вроде к... 27.10.2018, 20:04 sutra Меня конечно учили в своё время, что goto использо... 27.10.2018, 20:16 DarkMaster
Как правило подобные проблемы говорят о том, что ... 28.10.2018, 2:11 sutra А оператор continue в цикле while есть? 29.10.2018, 0:00 cirus В луа нет continue. 29.10.2018, 0:18 sutra Это очень нехорошо. Если честно, то я не понимаю. ... 29.10.2018, 1:28 DarkMaster while var > 1 do
local result = check_some_pa... 29.10.2018, 4:29 sutra Спасибо Дарк. Но у меня так не получится. Допустим... 29.10.2018, 12:55 sutra Слишком сложный код. никакого линейного выполнения... 29.10.2018, 13:15 sutra Грубо говоря есть определённое количество событий,... 29.10.2018, 13:25 sutra local n = "123.txt"
local f = io.open(... 29.10.2018, 14:41 DarkMaster
А лежит он где? Рядом с ехе пилота? Пилот перезап... 29.10.2018, 14:44 sutra Обычным текстом открывает [[123.txt]]
Минутку, те... 29.10.2018, 15:04 cirus
Скорее всего были какие-то ошибки.
--lua
local n ... 29.10.2018, 15:09 sutra Перегрузил Пилот через прибивалку, всё заработало,... 29.10.2018, 15:17 sutra Понял причину, забыл поставить двойной слеш при ук... 29.10.2018, 15:40 DarkMaster
Не редактируйте код перед тем, как выложить. Ну л... 29.10.2018, 18:00 sutra Я не редактировал. Просто сначала использовал полн... 29.10.2018, 18:21 DarkMaster
это фиксанули буквально пару дней назад 30.10.2018, 5:31 sutra Добрался до файндов. и как и думал ничего у меня н... 31.10.2018, 13:03 sutra И конечно примеры на lua "надёжно" зарыт... 31.10.2018, 13:14 cirus
--lua
local a, c = findimage(0, 0, 1920, 1080... 31.10.2018, 13:29 sutra Спасибо.
Так я и говорю надёжно спрятано. Я случа... 31.10.2018, 13:35 cirus
Когда выйдет полноценная версия пилота на луа, то... 31.10.2018, 13:50 sutra --lua
log "clear" log "mode compact... 31.10.2018, 14:01 cirus Да, в findimage есть баг, если искать на скрине от... 31.10.2018, 14:10 sutra --lua
log "clear" log "mode compact... 31.10.2018, 14:17 cirus --lua
log "clear" log "mode compact... 31.10.2018, 14:23 sutra Спасибо разобрался. Ну в общем тот баг и в lua про... 31.10.2018, 14:43 cirus
--lua
log "clear" log "mode compact... 31.10.2018, 14:57 sutra Спасибо. 31.10.2018, 15:12 DarkMaster
Суть в том, что само тело пилотовских функций оди... 31.10.2018, 19:04 sutra
А получить массив найденных пикселей, где хранятс... 1.11.2018, 12:54 cirus --lua
local a = findcolor("0, 0, 1920, 108... 1.11.2018, 13:09 sutra Спасибо.
А какой самый простой способ в lua убить... 1.11.2018, 13:26 DarkMaster
arr = nil
вы не убили массив. Вы создали новый п... 1.11.2018, 13:44 WKnight Плин, вот так скажешь ваське ченить полезное, и по... 1.11.2018, 13:51 sutra Спасибо. Вывод... лучше спросить, коли с мозгами т... 1.11.2018, 14:20 sutra Всем огромное спасибо, кто потратил своё время на ... 4.11.2018, 18:46 sutra --lua
check=5
checkint=0
for i=1, 10 do
for j=... 8.11.2018, 12:01 cirus
Нет. 8.11.2018, 12:36 DarkMaster Не забывайте области видимости - пишите local при ... 8.11.2018, 17:34 sutra
Спасибо, я не забываю. На примерах просто лень, у... 9.11.2018, 1:59 WKnight А напомните, что именно имеется ввиду. Я как раз р... 9.11.2018, 2:07 sutra Так Cirus показывал на примере моей картинки в тем... 9.11.2018, 2:12 cirus
https://forum.uokit.com/index.php?s=&sh...st... 9.11.2018, 2:19 DarkMaster
1) Глобальные переменные медленные.
2) В луа огра... 9.11.2018, 10:07 WKnight А, я думал может еще чего интересного нашли :) 9.11.2018, 12:48 DarkMaster Я тебе могу предложить убрать костыль по координат... 9.11.2018, 13:02 sutra
Кнайт, мне нравится подход, ЕЩЁ ... Я считаю, что... 9.11.2018, 16:59 WKnight Чет не помню такого. 9.11.2018, 18:28 DarkMaster В приват ща опишу. А то "секретные технологии... 9.11.2018, 18:36 sutra Блин, секретные технологии. Ну у меня тоже есть та... 10.11.2018, 1:16 sutra Фишка в том, что анализируются не изображения, а ф... 10.11.2018, 1:39 sutra Думаю всё это легко можно сделать в lua , но мне п... 10.11.2018, 2:13 cirus
--lua
log "clear" log "mode compact... 10.11.2018, 2:29 DarkMaster В данном случае я бы рекомендовал для начала забыт... 10.11.2018, 13:07 sutra
Ну этот метод я знаю, в принципе неплохой вариант... 10.11.2018, 14:51 sutra
Сорри, не доглядел, действительно, я не знал синт... 10.11.2018, 15:08 DarkMaster Очень неплохо поднимается производительность, если... 10.11.2018, 15:29 sutra Так в том то и фишка, что колор в памяти только-то... 10.11.2018, 15:44 cirus --lua
-- сделать привязку Ctrl+A
local h = workwin... 10.11.2018, 16:25 sutra
Спасибо большое. Век живи и век учись. Я просто п... 10.11.2018, 16:52 cirus
Color, findimage, findcolor, getimage, move, left... 10.11.2018, 17:07 sutra ОК. 10.11.2018, 17:30 sutra Теперь про борьбу с рендерингом. Может кому пригод... 12.11.2018, 16:22 sutra Конечно если картинки очень сложные, то спасёт тол... 12.11.2018, 18:38 sutra function FindRGB(addr,len,scrX1,scrY1,fx1,fy1,... 12.11.2018, 23:31 sutra Круто, я так не умею, не знаю как. 13.11.2018, 0:00 sutra Эх, если бы за один присест получить доступ к памя... 13.11.2018, 0:16 DarkMaster
Может быть рассчитан на основе кооридант. Т.е. ег... 13.11.2018, 0:21 sutra Спасибо Дарк. Я не знал про переменные. В Паскале ... 13.11.2018, 0:39 DarkMaster
Это регэкспы. Можно почтиать в regex, но в луа он... 13.11.2018, 0:46 sutra Спасибо на добром слове Дарк. Примерно я понимаю. ... 13.11.2018, 1:01 sutra
А вот это не факт. Каркать не стану, но сдаётся м... 13.11.2018, 1:32
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|