|
|
|
Вопрос по массивам и окнам |
|
|
DarkMaster |
23.12.2018, 5:36
|
Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27724
Пользователь №: 11.279
|
tableToFile.lua
Код 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
Код --lua -- ПУТЬ ПОПРАВЬТЕ -- ПУТЬ ПОПРАВЬТЕ -- ПУТЬ ПОПРАВЬТЕ local tableToFile = require[[luaPlugins\tableToFile]] local a = {123, "HRt", 67} local b = {"BRS", "AR", "nnfw"} local c = {Raad=35, ar=89} tableToFile.save ("saved.txt", a,b,c) local d, e, f = tableToFile.load ("saved.txt") Сохраняет в виде валидного lua кода (функции). Что позволяет по сути использовать стандартный: local d, e, f = loadfile ("saved.txt")() Обратите внимание на вторую пару скобок. loadfile загружает функцию, а не значения, мы ставим вторую пару скобок и эта функция выполняется и возвращает уже непосредственно значения. мля. спать надо. пост выше не по теме) ну пусть висить - вообще полезный))
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
sel |
29.12.2018, 0:48
|
Neophyte
Сообщений: 32
Регистрация: 4.7.2018 Группа: Пользователи Наличность: 0
Пользователь №: 18.986
Возраст: 27
|
Ииии, мне снова нужна ваша помощь друзья:) Проблема: иногда пилот НЕНАХОДИТ окна, вот мой скрипт: Код init_arr %list (1 1) Персонаж1 Персонаж2 Персонаж3 Персонаж4 ... Персонаж(х) set #listsize size(%list) while (1 = 1) for #j 1 #listsize set %handle FindWindow ("_ИГРА") set #handlesize size(%handle) set #result indexOf (%handle noabs (%list[#j 1]) ) if #result = -1 and #handlesize < #listsize log Вылетел: %list [#j 1] stop_script gosub %list [#j 1] // перенаправление в подпрограмму для завода окна set #result 0 end_if end_for for #i 1 #handlesize ..... код ..... end_for end_while
:Персонаж1 ... код ... return
:Персонаж(х) ... код ... return
Вот что пишут логи: 23:57:45 : while (1 = 1) 23:57:45 : for #j(18) 1 #listsize(18) 23:57:45 : set %handle FindWindow ("_ИГРА") 23:57:45 : %("_ИГРА") [ 19 1 ] = 23:57:45 : set #handlesize(18) size(%handle) 23:57:45 : #handlesize = 18 23:57:45 : set #result(1) indexOf (%handle noabs (%list[#j(1) 1]) ) 23:57:45 : #result = 6 23:57:45 : if #result(6) = -1 and #handlesize(18) < #listsize(18) 23:57:45 : end_for 23:57:46 : set %handle FindWindow ("_ИГРА") 23:57:46 : %("_ИГРА") [ 19 1 ] = 23:57:46 : set #handlesize(18) size(%handle) 23:57:46 : #handlesize = 18 23:57:46 : set #result(6) indexOf (%handle noabs (%list[#j(2) 1]) ) 23:57:46 : #result = 1 23:57:46 : if #result(1) = -1 and #handlesize(18) < #listsize(18) 23:57:46 : end_for 23:57:46 : set %handle FindWindow ("_ИГРА") 23:57:46 : %("_ИГРА") [ 19 1 ] = 23:57:46 : set #handlesize(18) size(%handle) 23:57:46 : #handlesize = 18 23:57:46 : set #result(1) indexOf (%handle noabs (%list[#j(3) 1]) ) 23:57:46 : #result = 2 23:57:47 : if #result(2) = -1 and #handlesize(18) < #listsize(18) 23:57:47 : end_for 23:57:47 : set %handle FindWindow ("_ИГРА") 23:57:47 : %("_ИГРА") [ 0 0 ] = handle 23:57:47 : set #handlesize(18) size(%handle) 23:57:47 : #handlesize = 0 23:57:47 : set #result(2) indexOf (%handle noabs (%list[#j(4) 1]) ) 23:57:47 : #result = -1 23:57:47 : if #result(-1) = -1 and #handlesize(0) < #listsize(18) 23:57:47 : Вылетел: Персонаж(х) 23:57:50 : stop_script Подскажите, в каком направлении хоть копать, не понимаю из за чего это может происходить, если в отдельную вкладку вывожу указанный скрипт, он безошибочно находит все запущенные окна, если в общем скрипте так делаю, рано или поздно он не находит ни одного окна игры и решает, что они вылетели. В переменную %handle ничего кроме хендлов и имён окон не записываю. Раньше было всё нормально, после каких то изменений в скрипте, перестал находить окна, уже ума не приложу в чём может быть дело.
|
|
|
|
cirus |
29.12.2018, 1:22
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26744
Пользователь №: 16.971
Возраст: 29
|
Цитата после каких то изменений в скрипте, перестал находить окна В папке с пилотом Scripts\Backup. Ищите работающий вариант. Цитата если в общем скрипте так делаю Значит где-то в скрипте что-то не так. Из мелочей: Цитата while (1 = 1) Скобки не нужны. Цитата for #j 1 #listsize set %handle FindWindow ("_ИГРА") Зачем искать на каждой итерации. Поменяйте местами. Цитата end_while Если linedelay 0, то добавьте wait 1. Чтобы проц не грузить. Код
|
|
|
|
sel |
28.2.2019, 0:26
|
Neophyte
Сообщений: 32
Регистрация: 4.7.2018 Группа: Пользователи Наличность: 0
Пользователь №: 18.986
Возраст: 27
|
По прежнему сталкиваюсь всё с той же проблемой, если включать в скрипт кусок по поиску вылетевших окон, то спустя какое то время проходя через этот кусок, FindWindow не находит ни одного запущенного окна, в связи с этим вопрос, может быть происходит утечка памяти? Т.к. все данные этой переменной хранятся в оперативной памяти и постоянно перезаписываются, может в этом проблема? скрипт
Код set %handle FindWindow ("PW") init_arr %list (1 1) перс1 перс2 перс3 set #listsizecheck size(%list) while (1 = 1) //пока не прекратим for #i 1 size(%handle) // цикл////////проверялка окон set #handlesize size(%handle) set #listsize size(%list) for #j 1 #listsize set #result1 indexOf (%handle noabs (%list[#j 1]) ) if #result1 = -1 and #handlesize <= #listsizecheck set $log Вылетел: %list [#j 1] Log $log gosub %list [#j 1] // перенаправление в подпрограмму для завода окна set #result1 0 end_if end_for wait 100 set %handle findwindow ("PW") ... скрипт гуляющий по окнам через for ... end_while .... тут скрипт для завода окна в игру, к нему переход осуществляется при помощи gosub ....
|
|
|
|
sutra |
28.2.2019, 1:55
|
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007
|
Цитата Возможно в этом проблема Тоже хотел сказать про это, но и это не главное. Идёт нагромождение операторов, а логика решения задачи туманная. Всё в одну кучу свалено. Ну надо искать окна, так давайте их сначала найдём. Так и не понял где проблема. Вылетело окно, ну что мешает определить это? Поиск окон (в моей практике) работает как часы, там нет никаких нюансов. Есть массив запущенных окон. Нашли массив действующих. Что мешает сравнить? В чём проблема? Сравнить старый и новый, возможно сформировать ещё один массив окон, определяющий которые окна вылетели и которые требуют повторной инициализации и дальше всё по плану. Нормально использовать подпрограммы, только это не вызов подпрограммы - это всего лишь мысль, как это делать. Вот и вызывайте подпрограмму (по метке подпрограммы) и там анализируйте и обрабатывайте массив. Цитата Переход из циклов исправлялся когда-то Не сталкивался с такими проблемами, из любого места подпрограммы отрабатывают без проблем. Десятки вызовов из разных ИФ-ов и разных циклов работают без проблем. Я вроде даже где-то 100% рабочий пример давал с "Блокнотами". Что там не устраивало?? Что не работало? Что работало не так??
|
|
|
|
sutra |
28.2.2019, 2:27
|
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007
|
Подпрограмма в Пилоте - это собственно goto на метку. Используется, если в коде нужно много (несколько) раз выполнять одно и то же (однотипный кусок кода). В этом куске доступны все переменные основного тела скрипта. Разница лишь в том, что после её отработки Вас возвращают в то же место, откуда был вызов подпрограммы, с возможно уже модифицированными переменными (массивами) или уже с выполненными действиями. Тем не менее из подпрограммы возможен и переход goto, тогда Вы не возвратитесь в место вызова, а начнёте действие с того места, куда будет указывать переход goto. Да, с точки зрения "нормального" кода это не приветствуется, но в Пилоте это всё реализовано как надо. Я не видел проблем.
Разница между функцией и подпрограммой даже не знаю, есть ли она сейчас. В классических языках программирования есть конкретная интерпретация и разница между ними. Современные синтаксисы всё свалили в одну кучу. Раньше всё было просто, функция возвращает РЕЗУЛЬТАТ, подпрограмма просто выполняет кусок кода. Раньше конкретно различали параметр и переменную, сейчас, дабы не напрягать и без того ослабший мозг юзеров, всё свалили в одну кучу. Юзер чувствует себя прекрасно, а вот спецу найти косяки в чужом коде стало очень сложно. Поэтому никто не ищет - пишет свои косяки.
|
|
|
|
sel |
28.2.2019, 2:58
|
Neophyte
Сообщений: 32
Регистрация: 4.7.2018 Группа: Пользователи Наличность: 0
Пользователь №: 18.986
Возраст: 27
|
Цитата(sutra @ 28.2.2019, 3:55) Я вроде даже где-то 100% рабочий пример давал с "Блокнотами". Что там не устраивало?? Что не работало? Что работало не так??
Давали, это видоизменённая версия, окна переименовываются по имени персонажа при заходе в игру, список имён описан в списке %list, как бы я не пробовал экспериментировать, после 8-10 часов работы скрипта, FindWindow не находит ни одного окна и начинает заводить все окна по новой в итоге я прихожу домой, и вижу 35-40 копий игры(комп может выдержать не более 20). Сравнение массивов хорошая штука, но произойдёт то же самое, был массив с 10 окнами, FindWindow не найдёт ни одного окна и скрипт решит что все окна закрылись(хоть это и не так) и в результате сравнения массивов скрипт начнёт заводить новые окна. У меня был вопрос, может есть предел буфера памяти пилота? и при его достижении он забывает всё что в него записывалось?
|
|
|
|
sutra |
28.2.2019, 3:32
|
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007
|
Цитата 2гб и вылет. Ну хоть что-то, я тоже думал на эту тему. Всё-таки 32-х разрядное приложение. По логике 32 разряда + отрицательные значения, так и получается 2 ГБ. Цитата и вижу 35-40 копий игры Вот просто на 100% уверен, что-то у Вас неправильно анализируется. Сегодня голова уже не варит. Если не сможете решить вопрос сами и Гуру не помогут, давайте свой код, убью час времени - решу вопрос. Давать своё, как-то вроде не в тему, дайте кусок своего кода, только не придуманный, а рабочий, так будет быстрее. Дадите придуманный, ну посмотрим и придуманный. Только я не сижу на форуме сутками, можем долго решать проблему. Просто я пересел на lua и реально забыл Пилотовский язык. Сходу не получается, надо вникать ... Просто на виртуальных примерах, мы даём "общее" решение проблемы, но возможно частное решение окажется более простым и эффективным. Ну вот Вы пытаетесь что-то сделать с якобы существующим окном. Так ведь можно именно это окно проверить, существует ли оно и если оно вылетело ... СРАЗУ решить проблему, а не лопатить все окна. Ну думаю Вы поняли мою мысль. Перед тем как что-то делать в окне (ведь его хендл у нас уже есть) можно проверить существование в реальности этого окна. Ну просто масса частных вариантов решения проблемы. Надо сделать просто, понятно, надёжно - и это 100% возможно.
|
|
|
|
sutra |
28.2.2019, 3:42
|
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007
|
Цитата У меня был вопрос, может есть предел буфера памяти пилота? и при его достижении он забывает всё что в него записывалось? Голову на отсечение конечно давать не буду. Но искать окна Пилот умеет. Надо смотреть ваш конкретный вариант. Могу сказать только одно, у меня скрипт на языке Пилота (со множеством недоделок, теперь уж сразу всё на lua переведу) работает СУТКАМИ. Я спокойно уезжаю на дачу, а он 3-е суток лопатит, с перезагрузками браузера (а он его тоже ищет), со сворачиванием разворачванием окон, с активизацией микшера и прочих прибамбасов, с сохранением статистики в Эксель ... всё работает как часы. Надо искать ошибки, а их я за свою жизнь наделал немало. И бывало матерился ... ну как же так, но потом всё выяснялось и оказывалось, что я сам накуралесил.
|
|
|
|
sutra |
28.2.2019, 3:55
|
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007
|
Вот без всякого хвастовства говорю (хотя гордость внутри себя присутствует), не раз, как у Вас бывало, прихожу домой, смотрю, а игруха затупила. Почти год боролся с разными глюками и игры и Пилота. И всё-таки решил все вопросы. А игруха непростая, бездумные клики не всегда прокатывают, то сработало раньше, то сработало позже, то сработало, когда уже нужно делать совершенно другое. ВСЕ вопросы решил, не хватало только в определённых ситуациях скорости, вот и перешёл на lua. ВСЁ можно сделать - это 100%.
Ну и результат конечно есть - конкуренты в глубочайшем ауте. Там есть конечно боты, только им до меня, как до Парижу.
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|