Исходник [TL] Teal-Language loader

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Автор темы
Друг
8,772
11,216

62526430 (1).png

Скрипт позволяет подгружать в игру скрипты, написанные на teal-language (типизированный луа)
Требования: SAMPFUNCS, MoonLoader, tl.exe
Установка:
  1. скачиваем tl.lua: https://github.com/teal-language/tl
  2. переносим файл "tl.lua" в папку moonloader\lib​
  3. переносим teal-language-loader.lua в папку moonloader​

Lua:
require('lib.moonloader')
local binds: {number:string} = {
    [VK_L] = '/lock',
    [VK_K] = '/key',
    [VK_H] = 'Вау, это что, биндер на teal-language?!'
}
global function main()
    while not isSampAvailable() do wait(0) end
    while true do
        wait(0)
        if not sampIsCursorActive() then
            for key, text in pairs(binds) do
                if wasKeyPressed(key) then
                    sampSendChat(text)
                end
            end
        end
    end
end
1674329188685.png


tl:
global function main()
    while not isSampAvailable() do wait(0) end
    sampAddChatMessage('Скрипт на Teal-Language загружен"', -1)
    sampRegisterChatCommand('tl.rev', function(text: string)
        sampAddChatMessage('Ввод: '..text, -1)
        sampAddChatMessage('Вывод: '..rev(text), -1)
    end)
    while true do
        wait(0)
    end
end

global function rev(text: string): string
    sampAddChatMessage('Ща переверну твой текст...', -1)
    return text:reverse()
end
1674328281890.png


tl:
local imgui = require('mimgui')
local windowSize = imgui.ImVec2(200, 100)
local text: string = 'hello from teal language!'

local newFrame: function = imgui.OnFrame(
    function(): bool return true end,
    function(self)
        if imgui.Begin('Main Window', nil) then
            imgui.Text(text)
            imgui.End()
        end
    end
)
1674328719940.png
Документация по teal-language
Опробовать teal-language
спасибо @neverlane за идею
22.01.23: добавлена автоматическая перезагрузка измененных .tl файлов
 

Вложения

  • teal-language-loader.lua
    5.7 KB · Просмотры: 4
Последнее редактирование:

AeSiK256

Участник
58
23
разве tl чем то лучше обычного луа по стабильности, многопоточности?
 

Musaigen

abobusnik
Проверенный
1,583
1,302
Хорошая вещь, надеюсь получит распространение.
Есть в vscode расширения для этого?
С кодом загрузчика намудрил как всегда.
 

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Автор темы
Друг
8,772
11,216
Хорошая вещь, надеюсь получит распространение.
Есть в vscode расширения для этого?
С кодом загрузчика намудрил как всегда.
расширение есть, ссылка есть у них на гитхабе. Завтра мб сделаю что бы и мои сниппеты работали с тл.
 

The Spark

Известный
653
671
Я так понимаю, что это нужно только для разрабов, на этапе разработки скрипта? (вопрос риторический)
Тогда как мне скрипт перезагружать? Каждый раз открывать консоль, прописывать название, разворачивать игру, т.к os.execute сворачивает игру, и видеть что мой скрипт не выгрузился, но загрузился поверх ещё один.
Может быть вы всё-таки решили скрипты в tl формате распространять. Идея изначально гиблая, сама по себе + os.execute.

Если двигаться в эту сторону, то только со сборщиком в своём проекте, с тем же cyan. Но вот беда, задекламируйте всё Moonloader API и встроенные библиотеки. Вариант с игнорированием не объявленных функций или any во всех аргументах мы отсекаем. У расширения та же беда.
 
  • Вау
  • Нравится
Реакции: Z3roKwq и why ega

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Автор темы
Друг
8,772
11,216
Тогда как мне скрипт перезагружать?
добавить авторебут для .tl дело 5 минут
т.к os.execute сворачивает игру
нет

единственная проблема которую я вижу - отсутствие ошибок в логе, но я просто не знаю как их вытянуть из консольки
1674376625923.png

1674376667363.png

Lua:
            local C = io.popen('tl.exe gen moonloader/'..file..'.tl')
            local text = C:read('*a')
            C:close()
            print('OUTPUT', text)
 

The Spark

Известный
653
671
добавить авторебут для .tl дело 5 минут

нет

единственная проблема которую я вижу - отсутствие ошибок в логе, но я просто не знаю как их вытянуть из консольки
Посмотреть вложение 186854
Посмотреть вложение 186855
Lua:
            local C = io.popen('tl.exe gen moonloader/'..file..'.tl')
            local text = C:read('*a')
            C:close()
            print('OUTPUT', text)
os.execute сворачивает полноэкранное приложение из-за открытия cmd.exe. Если приложение работает в окне без рамки - такого не произойдёт.
Чтобы выполнить команду в сайлент моде, можно использовать это:
Lua:
local ffi = require("ffi")
local shell32 = ffi.load("Shell32.dll")

ffi.cdef[[
    int ShellExecuteA(void* hwnd, const char* lpOperation, const char* lpFile, const char* lpParameters, const char* lpDirectory, int nShowCmd);
]]

print(shell32.ShellExecuteA(nil, 'open', "..\\tl.exe", "gen script.tl", "moonloader", 0))
Но это всё равно костыли для запуска экзешника. По хорошему, нужно его вызывать, но он Win64.
Как получить stdout, я не знаю. (пример с io.popen выведет stdout, если запускать скрипт напрямую в luajit, но не в сампе)
 
  • Нравится
Реакции: chapo

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Автор темы
Друг
8,772
11,216
os.execute сворачивает полноэкранное приложение из-за открытия cmd.exe. Если приложение работает в окне без рамки - такого не произойдёт.
Чтобы выполнить команду в сайлент моде, можно использовать это:
Lua:
local ffi = require("ffi")
local shell32 = ffi.load("Shell32.dll")

ffi.cdef[[
    int ShellExecuteA(void* hwnd, const char* lpOperation, const char* lpFile, const char* lpParameters, const char* lpDirectory, int nShowCmd);
]]

print(shell32.ShellExecuteA(nil, 'open', "..\\tl.exe", "gen script.tl", "moonloader", 0))
Но это всё равно костыли для запуска экзешника. По хорошему, нужно его вызывать, но он Win64.
Как получить stdout, я не знаю. (пример с io.popen выведет stdout, если запускать скрипт напрямую в luajit, но не в сампе)
мне уже подсказали как можно сделать нормальную загрузку без вызова команд, скоро обновлю файл
 
  • Нравится
Реакции: The Spark

ufdhbi

Известный
Проверенный
1,455
861
(пример с io.popen выведет stdout, если запускать скрипт напрямую в luajit, но не в сампе)
там через os.execute можно прочитать только поток stdout (io.stdout), а в tl.lua для ошибок оно пишет в поток io.stderr, как его читать не знаю
 

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Автор темы
Друг
8,772
11,216