Информация Гайд [LUA] Запускаем скрипты на своем ПК.

Всем привет, возможно у Вас появлялись мысли о том, как можно запускать Lua скрипты не используя SA:MP и в частности Moonloader.
Так вот, эта статья именно для Вас.




Все ниже перечисленное я тестировал на Windows 10, поэтому я не гарантирую, что все ниже написанное будет работать на других ОС.

Первое, что нам нужно сделать, так это скачать LuaJIT компилятор.
1679845688600.png
Скачиваем архив, после чего достаем папку из архива и перекидываем в удобное место.
Теперь мы можем запускать файлы с помощью файла "путь-до-папки-которую-скачали\luajit-compiler\luajit.luajit.exe".
Теперь напишем небольшой скрипт, который будет например выводить сообщения в консоль.
Lua:
print("I'm gay (I write in LUA). Don't hit, a joke, like haha, rzhaka.")
Для того, чтобы запустить это чудо, нам необходимо открыть командную строку (WIN+R->cmd) и ввести в нее следующую команду:

Код:
путь-до-нашей-папки-с-LuaJIT\luajit\luajit.exe путь-до-нашего-скрипта\скрипт.lua"

(например: D:\DEV\lua\luajit-compiler\luajit\luajit.exe "D:\DEV\lua\scripts\script.lua")
1679843235598.png
Все хорошо, но что, если мы допустим захотим подключить какую-либо библиотеку? Для этого нам надо разобраться, откуда функция require() берет путь до файла, указанного в качестве параметра (то, что мы пишем в скобках функции).
Берет она его из таблиц package.path (если библиотека .lua) и package.cpath (если библиотека .dll), встроенных в LuaJIT.
По стандарту package.path равна
Lua:
;.\?.lua;\luajit-compiler\luajit\lua\?.lua;\luajit-compiler\luajit\lua\?\init.lua;;C:\Program Files (x86)\Lua\5.1\lua\?.luac
Т.е. все .lua файлы (или папки с файлами) мы должны кидать в \luajit-compiler\luajit\lua
А вот package.сpath равна
Lua:
.\?.dll;D:\luajit-compiler\luajit\?.dll;\luajit-compiler\luajit\loadall.dll
Это значит то, что она не ищет все в папке \luajit-compiler\luajit
Для того, чтобы добавить или изменить этот путь, нам необходимо перед подключением библиотек добавить вот такую строчку
Lua:
package.cpath = ("%s;D:/DEV/lua/luajit-compiler/luajit/lua/?.dll"):format(package.cpath) -- если хотим добавить к остальным путям еще один
package.cpath = "/DEV/lua/luajit-compiler/luajit/lua/?.dll" -- если хотим полностью переписать все пути на один единственный
Проверяем и создаем скрипт, который будет отправлять сообщение в телеграм при запуске скрипта:

Lua:
--========================================================LIBS========================================================

package.cpath = ("%s;D:/DEV/lua/luajit-compiler/luajit/lua/?.dll"):format(package.cpath)

local effil = require("effil")
local encoding = require("encoding")

--========================================================VARIABLES========================================================

encoding.default = "CP1251"
local u8 = encoding.UTF8

local telegram = {
    token = "хер вам, а не мой токен"
    chatId = "хер вам, а не мой chatID"
}

--========================================================TELEGRAM========================================================

function threadHandle(runner, url, args, resolve, reject)
    local t = runner(url, args)
    local r = t:get(0)
    while not r do
        r = t:get(0)
    end
    local status = t:status()
    if status == "completed" then
        local ok, result = r[1], r[2]
        if ok then resolve(result) else reject(result) end
    elseif err then
        reject(err)
    elseif status == "canceled" then
        reject(status)
    end
    t:cancel(0)
end

function requestRunner()
    return effil.thread(function(u, a)
        local https = require "ssl.https"
        local ok, result = pcall(https.request, u, a)
        return {ok, result}       
    end)
end

function async_http_request(url, args, resolve, reject)
    local runner = requestRunner()
    if not reject then reject = function() end end   
    threadHandle(runner, url, args, resolve, reject)   
end

function encodeUrl(str)
    str = str:gsub(" ", "%+")
    str = str:gsub("\n", "%%0A")
    return u8:encode(str, "CP1251")
end

--================================================================================================================

function telegram:sendMessage(msg)
    msg = tostring(msg)
    msg = msg:gsub("{......}", "")
    msg = encodeUrl(msg)
    
    async_http_request(("https://api.telegram.org/bot%s/sendMessage?chat_id=%s&text=%s"):format(telegram.token, telegram.chatId, msg), "", function(result) end)
end

telegram:sendMessage("Скрипт успешно запустился!")   
print("send!")
Для тех, кто еще не понял, запуская код вне SA:MP, мы не можем использовать функционал Moonloader и SAMPFUNCS и других библиотек и плагинов для SAMP. К этому списку также относятся такие штуки, как потоки и функция задержки wait(time)
Окей, мы разобрались, как можно запускать скрипты без Moonloader'а,
но что делать, если нам лень писать каждый раз команду в cmd, чтобы запустить код и мы счастливые (или нет) пользователи Visual Studio Code?
Для этого существует специальное расширение "Code Runner", который может за нас вписывать нужную команду.
Для его установки открываем Visual Studio Code, далее нажимаем комбинацию клавиш CTRL+SHIFT+X или же на панельке (по умолчанию слева) выбираем пункт "Расширения". В поиске находим расширение "Code Runner".
1679845186665.png
Теперь устанавливаем его и в списке расширений находим его и нажимаем на значок шестриренки. В появившемся окошке выбираем пункт "Параметры расширения".
Далее ставим галочки у "Clear Previous", "Run In Terminal", "Save File Before Run". Как мы видим, в верхней панельке, рядом с открытыми файлами появился значок запуска скрипта (скрипт можно также запустить комбинацией клавиш CTRL+ALT+N).
Думаю на этом можно заканчить...

 

CaJlaT

Овощ
Модератор
2,806
2,603
Зачем запускать обычный луа у себя на пк, если есть тонна сайтов-тестеров кода?
 

why ega

РП игрок
Автор темы
Модератор
2,539
2,227
Зачем запускать обычный луа у себя на пк, если есть тонна сайтов-тестеров кода?
Хз, мне было лень каждый раз переключаться на браузер (да и редакторы кода там не такие удобные), поэтому мне проще нажать одну комбинацию клавиш

А еще Code Runner в VS Code.
Я же про него тоже расписал, да и он не запустит скрипт, если у тебя нету луа на пк
 
Последнее редактирование: