UoKit.com Форумы > Кликер > UO Pilot
Naivnyi
Добрый день.

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

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

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

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

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

Как итог нашел этот замечательный форум. Узнал что в 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


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

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

используйте модуль persistance
оригинал чет не нашел, прилеплю чуть измененную версию. Нажмите для просмотра прикрепленного файла
использование
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, модулей на него.
Вверх
Naivnyi
Большое спасибо, и за универсальный скрипт по сохранению\загрузке и за ссылки. Думаю require как раз то, что мне нужно. Жаль что на вики в Lua нет его описания (от туда и начал изучение), а вот вторая ссылка https://tylerneylon.com/a/learn-lua/ кратко и емко описывает. Пойду переписывать корректно, потом приведу примеры, вдруг кому то будет полезно)
Вверх
Invision Power Board © 2001-2025 Invision Power Services, Inc.
Version for Pocket PC © 2006-2025, IPBest Studio.