[TrilogyLoader] Полезные сниппеты и функции

stool

Известный
Автор темы
375
312
ШАБЛОН ПОСТОВ
Описание: *текст*
Пример использования:
Lua:
*code*

Код:
Lua:
*code*




ПАМЯТКИ
  • В отличии от MoonLoader, скрипты для TL не требуют бесконечного цикла, вместо этого есть onUpdate
Lua:
function onUpdate()
    -- ... любой код, который будет вызываться при каждом обновлении
end


ДЛЯ НЕВНИМАТЕЛЬНЫХ: ТЕМА СО СНИППЕТАМИ ДЛЯ MOONLOADER, ДВУХСТОРОННЕЙ СОВМЕСТИМОСТИ НЕТ
-> Скачать TrilogyLoader (основная тема)
-> Документация по TL
-> Пак библиотек для TrilogyLoader
-> Официальный канал в telegram, тема в luakids
-> Просить скрипты тут, либо искать тут


В будущем шапка еще претерпит изменения
p.s. я к разработке TL никакого отношения не имею, просто создал тему для сниппетов по подобию с MoonLoader. если тему снесут за ненужностью - претензий иметь не буду
 
Последнее редактирование:

constersuonsis

Активный
171
94
Описание: портирование setVirtualKeyDown из муна

Пример использования:
setVirtualKeyDown(vkey, down)

-- все как в moonloader, только теперь вне игры они не зажимаются.

Код:
local ffi = require("ffi")

ffi.cdef[[
    void keybd_event(unsigned char bVk, unsigned char bScan, unsigned long dwFlags, void* dwExtraInfo);
]]

function setVirtualKeyDown(vkey, down)
    ffi.C.keybd_event(vkey, 0, down and 0 or 0x0002, nil)
end
 
Последнее редактирование:
  • Нравится
Реакции: Cosmo, whyega52 и stool

chapo

чопа сребдс // @moujeek
Модератор
8,891
11,621
Описание: отображает вашу HTML страницу (после того как доделаю опубликую в виде библиотеки)
Lua:
local ui = LuaCEF:new(string id);
Создает экземпляр "класса"
Lua:
ui:createFromFile(string filePath);
Загружает HTML из файла (по пути Win64\TrilogyLoader\cef\) в iframe
Lua:
ui:setVisible(bool visible[, string displayMode]);
Меняет style.display вашего iframe. По умолчанию: visible false = 'none', true = 'block'
Lua:
ui:destroy();
Удаляет iframe
Lua:
ui:eval(string code[, string errorCode]);
Выполняет JS код. В качестве второго параметра принимает код, который будет выполнен при ошибке в code (try-catch)
Lua:
ui.visible
bool. Видно ли окно в данный момент
Пример использования:
Lua:
-- код
local ui = LuaCEF:new('testmenu');

-- Удаляем меню при выгрузке скрипта
function onExitScript()
    ui:destroy();
end

--[[
     Если вставить в main() или onScriptLoad(), то не будет создаваться при запуске игры.
     Для удобства во время разработки можете закомментировать и вызывать в мейне
]]
function onScriptLoad()
    sampRegisterChatCommand('togglemenu', function()
        ui:setVisible(not ui.visible);
        sampAddChatMessage('Меню ' .. (ui.visible and 'показано' or 'скрыто'), 0xFFffffff);
    end);
end

function onSendUIBrowserMessage(msg)
    if (msg == 'onSvelteAppInit') then
        ui:createFromFile('datetime_by_chapo.html');
    end
end
Код:
Lua:
local function debugMsg(...)
    print(('[LuaCEF] [DEBUG] %s'):format(table.concat({ ... }), '\t'));
end

local LuaCEF = {}
setmetatable(LuaCEF, {__call = function(t, ...)
    return t:new(...)
end})

function LuaCEF:eval(code, fallback)
    local fn = executeUIBrowserJSCode or function() end;
    return fn(([[
        try {
            eval(`%s`);
        } catch(e) {
            %s;
        }
    ]]):format(code, fallback or ''));
end

function LuaCEF:new(id)
    local instance = {
        id = id,
        visible = false
    };
    return setmetatable(instance, {__index = self})
end

function LuaCEF:destroy()
    LuaCEF:eval(([[
        const uiElement = document.querySelector('#%s');
        if (uiElement)
            uiElement.remove();
    ]]):format(self.id));
end

function LuaCEF:setVisible(isVisible, displayMode)
    debugMsg('Switching iframe visible to', tostring(isVisible));
    self.visible = isVisible;
    LuaCEF:eval(([[
        document.querySelector('#%s').style.display = '%s';
    ]]):format(self.id, isVisible and (displayMode or 'block') or 'none', self.id));
end

function LuaCEF:createFromFile(path)
    self.path = path;
    LuaCEF:eval(([[
        const b = document.querySelector('body');
        const f = document.createElement('iframe');
        f.id = '%s';
        f.src = '%s';
        f.style.width = '100vw';
        f.style.height = '100vh';
        f.style.display = 'none';
        f.style.backgroundColor = 'transparent';
        b.appendChild(f);
    ]]):format(self.id, 'clientfile://./../Game/Gameface/Binaries/Win64/TrilogyLoader/cef/' .. path));
    debugMsg('iframe created, id:', tostring(self.id), 'display changed to "none"');
end
 

Cosmo

Известный
Друг
653
2,730
Описание: Получение игрового времени и погоды
Lua:
local ffi = require "ffi"

ffi.cdef [[
    typedef unsigned __int64 uintptr_t;
    void* GetModuleHandleA(const char* lpModuleName);
]]

function getAddress(offset)
    local baseAddress = ffi.cast("uintptr_t", ffi.C.GetModuleHandleA(ffi.NULL))
    return baseAddress + offset
end

function getWorldTime()
    local address = getAddress(0x50029F5)
    local CClock_ms_nGameClockHours = ffi.cast("unsigned char*", address)
    return CClock_ms_nGameClockHours[0]
end

function getWorldWeather()
    local address = getAddress(0x51425F0)
    local CWeather_ForcedWeatherType = ffi.cast("short*", address)
    return CWeather_ForcedWeatherType[0]
end

Использование:
Lua:
print( getWorldWeather() ) -- Output: 0-45
print( getWorldTime() ) -- Output: 0-23
 

ARMOR

011110000111100101101001
Модератор
4,943
6,771
Описание: Меняет всем иконкам радара их размер. ( Можете и с прочими полями структуры играться, например сделать так чтобы все иконки пульсировали )

Код:
Lua:
local ffi = require("ffi")
ffi.cdef[[
    typedef struct FName FName;
    struct FName {
        int32_t ComparisonIndex;
        int32_t Number;
    };
    typedef struct FText FText;
    struct FText {
        char UnknownData[0x18];
    };
    typedef struct FVector4 FVector4;
    struct FVector4
    {
        float X;
        float Y;
        float Z;
        float W;
    };
    typedef struct FGTARadarSprite FGTARadarSprite;
    struct FGTARadarSprite {
        FName Name;
        FText LegendText;
        int LegendCategory;
        unsigned char UnknownData_VNAD[0x4];
        struct UTexture2D* Texture;
        FVector4 UVCoords;
        bool bIsFlat;    
        bool bIsDisplayedOnEdge; 
        bool bCameraAligned;     
        bool bPlayerAligned;     
        bool bNeverDistanceScale;
        unsigned char UnknownData_129Q[0x3];
        float Scale;              
        bool bShouldAnimateInMap;
        bool bShouldAnimateInRadar;
        uint8_t AnimationStyle;     
        unsigned char UnknownData_K0C6[0x1];
        float ZOrderOverride;     
        unsigned char UnknownData_F9PS[0xC];
    };
    typedef struct FGTARadarSpriteArray FGTARadarSpriteArray;
    struct FGTARadarSpriteArray {
        FGTARadarSprite* data;
        int32_t Count;
        int32_t Max;
    };
    typedef unsigned __int64 uintptr_t;
    uintptr_t GetModuleHandleA(const char* lpModuleName);
]]
function getAddress(offset)
    local baseAddress = ffi.cast("uintptr_t", ffi.C.GetModuleHandleA(ffi.NULL))
    return baseAddress + offset
end
function setRadarIconsScale(value)
    local pGameterface = ffi.cast("uintptr_t*", getAddress(0x556BB88))[0]
    local pAGTARadar = ffi.cast("uintptr_t*", pGameterface + 0x140)[0]
    local SpriteLibrary = ffi.cast("FGTARadarSpriteArray*", pAGTARadar + 0x2F0)[0];
    for i = 0, SpriteLibrary.Count do
        SpriteLibrary.data[i].Scale = value
    end
end

Способ применения:
Lua:
function main()
    setRadarIconsScale(0.3)
end

Скриншот:
1729816570823.png
1729816734086.png
 

Fellespe.

Участник
70
14
Описание: Порт функции для асинхронных запросов *исходник*, но вместо requests - socket. (вероятно говнокод получился, но работает)

Пример использования:
Lua:
-- С функциями обработки ответа и ошибок.
asyncHttpRequest("GET", "https://www.google.com/robots.txt", nil --[[ Аргументы запроса ]],
    function(response)
        --[[
            response:
            {status_code, text, headers}
        ]]
    end,
    function(err)
        --
    end
)

-- Без функций обработки ответа и ошибок.
asyncHttpRequest('GET', 'https://www.google.com/robots.txt', nil --[[ Аргументы запроса ]], nil --[[ Функция обработки ответа ]], nil --[[ Функция обработки ошибок ]])

Код:
Lua:
local lua_thread = require("lts")
local effil = require("effil")

function asyncHttpRequest(method, url, args, resolve, reject) --> За основу взят https://www.blast.hk/threads/20532/post-256096
    local request_thread = effil.thread(function (method, url, args)
        local socket = require("socket")
        local http = require("socket.http")
        local response_body = {}
        local headers = {}
        local data = ""
        if type(args) == 'userdata' then
            headers = args.headers and args.headers or {}
            data = args.data and args.data or ""
        end
        if method == "POST" then
            headers["Content-Type"] = "application/x-www-form-urlencoded"
            headers["Content-Length"] = string.len(data)
        end
        local success, _, status, response_headers, _ = pcall(function()
            return http.request {
                url = url,
                redirect = true,
                sink = ltn12.sink.table(response_body),
                method = method,
                headers = headers,
                source = ltn12.source.string(data)
            } --> t.me/ShaiTanShiNaa
        end)
        local response = {
            status_code = status,
            text = table.concat(response_body),
            headers = response_headers
        }
        if success then
            return true, response
        else
            return false, response
        end
    end)(method, url, args)
    if not resolve then resolve = function() end end
    if not reject then reject = function() end end
    lua_thread.create(function()
        local runner = request_thread
        while true do
            local status, err = runner:status()
            if not err then
                if status == 'completed' then
                    local result, response = runner:get()
                    if result then
                        resolve(response)
                    else
                        reject(response)
                    end
                    return
                elseif status == 'canceled' then
                    return reject(status)
                end
            else
                return reject(err)
            end
            wait(0)
        end
    end)
end






Описание: проверка заспавнился ли игрок

Пример использования:
Lua:
require("ArizonaAPI")
local lua_thread = require("lts")

function onScriptLoad()
    lua_thread.create(function ()
        repeat wait(0) until sampIsLocalPlayerConnected() and isLocalPlayerSpawned()
        sampAddChatMessage("spawned", 0xffffffff)
    end)
end

Код:
Lua:
local memory = require("memory")

function isLocalPlayerSpawned()
    return memory.getuint8(memory.getBaseAddress() + 0x4E75014) ~= 15 --> за адрес спасибо @ARMOR
end
 
Последнее редактирование:
  • Нравится
Реакции: 1NS, Cosmo и stool