Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Удобство написания больших скриптов, фишки архитектуры, кто как реализует функции, рекурсии, хранение данны
Naivnyi
сообщение 2.5.2025, 13:22
Сообщение #1


*

Registred
Сообщений: 2
Регистрация: 2.5.2025
Группа: Пользователи
Наличность: 18
Пользователь №: 20.956



Добрый день.

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

Хотелось бы услышать от опытных программистов их "лайф хаки" при написании больших скриптов.
Сюда могут относится техники повторного использования кода, хранение глобальных переменных, не однозначное использование стандартных функций.

Пример из того, что меня сейчас смущает.

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

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

Как итог нашел этот замечательный форум. Узнал что в UO Pilot идет активная доработка с помощью подгружаемых модулей. Возможно кто то поделится опытом написания таковых? Пока этими (LuaJit, LuaPoSh) возможностями не пользовался, но все впереди. Еще думаю попробовать через загрузку скриптов, но пока не нашел подробного описания, как между ними передаются переменные, какое окружение они видят. Так же для меня не понятно что за файл процедур можно открыть, который добавляется 99ым листом (ощущение, что оно как раз должно использоваться для написания общих функций).

Если есть какие то темы, сайты, туториалы, видео именно с разбором особенностей архитектуры UO Pilot, буду рад ссылкам.

Пример кода:
скрипт
Код

--lua

********

-- Сохраняем данные в файл
local file = io.open("uo_data.txt", "w")
if file then
    for i = 1, #pers do
        if pers[i][4] then
            -- Сохраняем имя, хендл и hotkeys
            file:write(pers[i][1] .. "|" .. (pers[i][3] or "nil") .. "|")

            -- Сохраняем hotkeys в формате "Персонаж:Клавиша,Персонаж:Клавиша"
            local hotkeys = {}
            for name, key in pairs(pers[i][4]) do
                table.insert(hotkeys, name .. ":" .. key)
            end
            file:write(table.concat(hotkeys, ",") .. "\n")
        end
    end
    file:close()
    log("Данные сохранены в uo_data.txt")
else
    log("Ошибка: Не удалось создать файл")
end

********************

-- Загружаем данные из файла
local file = io.open("uo_data.txt", "r")
if file then
    for line in file:lines() do
        local name, handle, hotkeys_str = line:match("(.+)|(.+)|(.+)")

        -- Находим персонажа в массиве
        for i = 1, #pers do
            if pers[i][1] == name then
                -- Восстанавливаем хендл (если не "nil")
                if handle ~= "nil" then
                    pers[i][3] = tonumber(handle)
                end

                -- Восстанавливаем hotkeys
                if hotkeys_str ~= "" then
                    for pair in hotkeys_str:gmatch("([^,]+)") do
                        local char, key = pair:match("(.+):(.+)")
                        pers[i][4][char] = tonumber(key)
                    end
                end
                break
            end
        end
    end
    file:close()

else

--инициализируем структуру и сохраняем ее в файл
****************************************

end

*********************************

--пример общей функции для работы со структурой

-- Функция для получения горячей клавиши выбора target персонажа из current персонажа
local function getHotkeyForTarget(currentChar, targetChar)
    -- Находим запись current персонажа
    for i = 1, #pers do
        if pers[i][1] == currentChar then
            -- Проверяем, есть ли у него таблица горячих клавиш
            if pers[i][4] and type(pers[i][4]) == "table" then
                -- Ищем targetChar в его таблице горячих клавиш
                return pers[i][4][targetChar]
            end
            break
        end
    end
    return nil  -- Если не найдено
end

Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 2.5.2025, 16:21
Сообщение #2


***********

Модератор UOPilot
Сообщений: 9.722
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 29468
Пользователь №: 11.279



Цитата
-- Сохраняем данные в файл

Цитата
-- Загружаем данные из файла

используйте модуль persistance
оригинал чет не нашел, прилеплю чуть измененную версию. Прикрепленный файл  save.lua ( 5,61 килобайт ) Кол-во скачиваний: 9

использование
local save = require"save"
save.store(path, ...)
save.load(path)

по введению в работу можете заглянуть сюда:
https://uopilot.uokit.com/wiki/index.php?ti...D0%B8%D1%81_Lua
https://uopilot.uokit.com/wiki/index.php?ti...%B8%D0%B9_(Lua)
https://tylerneylon.com/a/learn-lua/

Цитата
LuaPoSh

ветка тупиковая. смотрите в сторону Luajit, модулей на него.

Сообщение отредактировал DarkMaster - 2.5.2025, 16:20


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Naivnyi
сообщение 2.5.2025, 17:00
Сообщение #3


*

Registred
Сообщений: 2
Регистрация: 2.5.2025
Группа: Пользователи
Наличность: 18
Пользователь №: 20.956



Большое спасибо, и за универсальный скрипт по сохранению\загрузке и за ссылки. Думаю require как раз то, что мне нужно. Жаль что на вики в Lua нет его описания (от туда и начал изучение), а вот вторая ссылка https://tylerneylon.com/a/learn-lua/ кратко и емко описывает. Пойду переписывать корректно, потом приведу примеры, вдруг кому то будет полезно)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 18.5.2025, 23:05
Designed by Nickostyle