Вопросы по Lua скриптингу

Общая тема для вопросов по разработке скриптов на языке программирования Lua, в частности под MoonLoader.
  • Задавая вопрос, убедитесь, что его нет в списке частых вопросов и что на него ещё не отвечали (воспользуйтесь поиском).
  • Поищите ответ в теме посвященной разработке Lua скриптов в MoonLoader
  • Отвечая, убедитесь, что ваш ответ корректен.
  • Старайтесь как можно точнее выразить мысль, а если проблема связана с кодом, то обязательно прикрепите его к сообщению, используя блок [code=lua]здесь мог бы быть ваш код[/code].
  • Если вопрос связан с MoonLoader-ом первым делом желательно поискать решение на wiki.

Частые вопросы

Как научиться писать скрипты? С чего начать?
Информация - Гайд - Всё о Lua скриптинге для MoonLoader(https://blast.hk/threads/22707/)
Как вывести текст на русском? Вместо русского текста у меня какие-то каракули.
Изменить кодировку файла скрипта на Windows-1251. В Atom: комбинация клавиш Ctrl+Shift+U, в Notepad++: меню Кодировки -> Кодировки -> Кириллица -> Windows-1251.
Как получить транспорт, в котором сидит игрок?
Lua:
local veh = storeCarCharIsInNoSave(PLAYER_PED)
Как получить свой id или id другого игрока?
Lua:
local _, id = sampGetPlayerIdByCharHandle(PLAYER_PED) -- получить свой ид
local _, id = sampGetPlayerIdByCharHandle(ped) -- получить ид другого игрока. ped - это хендл персонажа
Как проверить, что строка содержит какой-то текст?
Lua:
if string.find(str, 'текст', 1, true) then
-- строка str содержит "текст"
end
Как эмулировать нажатие игровой клавиши?
Lua:
local game_keys = require 'game.keys' -- где-нибудь в начале скрипта вне функции main

setGameKeyState(game_keys.player.FIREWEAPON, -1) -- будет сэмулировано нажатие клавиши атаки
Все иды клавиш находятся в файле moonloader/lib/game/keys.lua.
Подробнее о функции setGameKeyState здесь: lua - setgamekeystate | BlastHack — DEV_WIKI(https://www.blast.hk/wiki/lua:setgamekeystate)
Как получить id другого игрока, в которого целюсь я?
Lua:
local valid, ped = getCharPlayerIsTargeting(PLAYER_HANDLE) -- получить хендл персонажа, в которого целится игрок
if valid and doesCharExist(ped) then -- если цель есть и персонаж существует
  local result, id = sampGetPlayerIdByCharHandle(ped) -- получить samp-ид игрока по хендлу персонажа
  if result then -- проверить, прошло ли получение ида успешно
    -- здесь любые действия с полученным идом игрока
  end
end
Как зарегистрировать команду чата SAMP?
Lua:
-- До бесконечного цикла/задержки
sampRegisterChatCommand("mycommand", function (param)
     -- param будет содержать весь текст введенный после команды, чтобы разделить его на аргументы используйте string.match()
    sampAddChatMessage("MyCMD", -1)
end)
Крашит игру при вызове sampSendChat. Как это исправить?
Это происходит из-за бага в SAMPFUNCS, когда производится попытка отправки пакета определенными функциями изнутри события исходящих RPC и пакетов. Исправления для этого бага нет, но есть способ не провоцировать его. Вызов sampSendChat изнутри обработчика исходящих RPC/пакетов нужно обернуть в скриптовый поток с нулевой задержкой:
Lua:
function onSendRpc(id)
  -- крашит:
  -- sampSendChat('Send RPC: ' .. id)

  -- норм:
  lua_thread.create(function()
    wait(0)
    sampSendChat('Send RPC: ' .. id)
  end)
end
 
Последнее редактирование:

arrhange1

Новичок
3
0
Привет всем, помогите, пожалуйста. Дело в том, что :find не распознает русский текст при поиске подстроки. Пробовал меня на string.find - ничего не поменялось. Как можно решать данную проблему? Спасибо!

Lua:
[/B][/B]
function sampev.onServerMessage(color,text)
  
    if text:find("что то на русском") then
[B][B]
 

kizn

\ 0 _ 0 /
Всефорумный модератор
2,408
2,090
Привет всем, помогите, пожалуйста. Дело в том, что :find не распознает русский текст при поиске подстроки. Пробовал меня на string.find - ничего не поменялось. Как можно решать данную проблему? Спасибо!

Lua:
[/B][/B]
function sampev.onServerMessage(color,text)
  
    if text:find("что то на русском") then
[B][B]
кодировка файла 1251?
 

AngelWeezy

Участник
74
4
Всем привет, мне нужно что бы в каждый пункт по команде /resp повторяло одно и тоже действие, и спавнило машины где "-"
1600360101344.png

Lua:
[/B]
require "lib.moonloader"
local sampev = require "lib.samp.events"
local active = false
function main()
    repeat wait(0) until isSampAvailable()
    wait(1300)
    sampRegisterChatCommand("resp", resp)
    wait(-1)
end
    
    
function resp()
    active = not active
    if active then
        sampSendChat("/parking")
    end
    printStringNow(active and "PARKING ACT" or "PARKING DEACT", 2000)
end
function sampev.onShowDialog(dialogid, style, title, button1, button2, text)
    if active then
        if string.match(title, "Компании") then
            sampSendDialogResponse(dialogid, 1, 0, -1)
        end
        
        if string.match(title, "Управление стоянкой") then
            sampSendDialogResponse(dialogid, 1, 1, -1)
        end
        if string.match(title, "Стоянка") then
            local n = -1
            for line in string.gmatch(text, "[^\r\n]+") do
                if line:find('') and line:find('-') then
                    sampSendDialogResponse(dialogid, 1, 1, -1)
                end
            end
        end
    
        if string.match(title, "Стоянка") then
            sampSendDialogResponse(dialogid, 1, 0, -1)
        end
    end
end

[B]
.
 

GAuditore

Активный
131
29
Lua:
local imgui = require 'imgui'

local rkeys = require "rkeys"

imgui.HotKey = require('imgui_addons').HotKey

local main_window_state = imgui.ImBool(false)

local inicfg = require 'inicfg'

local mainIni = inicfg.load({

    hotkey = {

    key = '[18,81]'

    }

    }, 'ptest.ini')

if not doesFileExist('moonloader/config/ptest.ini') then

inicfg.save(mainIni, 'ptest.ini')

end

inicfg.load(mainIni,'ptest.ini')



local tLastKeys = {}

popen = {

    v = decodeJson(mainIni.hotkey.key)

}

key = rkeys.registerHotKey(popen.v, true, function() Toggle() end)



function main()

if not isSampLoaded() then return end

while not isSampAvailable() do wait(1000) end

sampRegisterChatCommand('ptest', function() main_window_state.v = not main_window_state.v end)

while true do wait(0) imgui.Process = main_window_state.v end

end

function imgui.OnDrawFrame()

if main_window_state.v then

local sw, sh = getScreenResolution()

imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))

imgui.SetNextWindowSize(imgui.ImVec2(550, 350), imgui.Cond.FirstUseEver)

imgui.Begin('Test script', main_window_state, imgui.WindowFlags.NoResize)

if imgui.HotKey("##1", popen, tLastKeys, 100) then

    rkeys.changeHotKey(key, popen.v)

    mainIni.hotkey.key = encodeJson(popen.v)

    inicfg.save(mainIni, 'ptest.ini')

    end

imgui.End()

end

end

function Toggle()

    sampAddChatMessage('qq',-1)

end
Код:
[ML] (error) testHotkey.lua: json parse: Invalid value. (at 1)
stack traceback:
    [C]: in function 'decodeJson'
    D:\GTA 4\moonloader\testHotkey.lua:18: in main chunk
Код:
[hotkey]
key = [
  18,
  82
]
Почему сохраняет без пробелов?
 
Последнее редактирование:

S-Sirius

Известный
351
21
Как прикрепить объект/маркер над головой игрока? attachObjectToChar(19605, target, 0.000000,1.000000,0.000000, 1.000000,1.000000,1.000000) чёт не работает
 

ribalko

Участник
172
13
У меня зашифророван скрипт,как можно его расшивровать,и поменять код
 

neverlane

t.me/neverlane00
Друг
1,010
1,163
Lua:
local imgui = require 'imgui'

local rkeys = require "rkeys"

imgui.HotKey = require('imgui_addons').HotKey

local main_window_state = imgui.ImBool(false)

local inicfg = require 'inicfg'

local mainIni = inicfg.load({

    hotkey = {

    key = '[18,81]'

    }

    }, 'ptest.ini')

if not doesFileExist('moonloader/config/ptest.ini') then

inicfg.save(mainIni, 'ptest.ini')

end

inicfg.load(mainIni,'ptest.ini')



local tLastKeys = {}

popen = {

    v = decodeJson(mainIni.hotkey.key)

}

key = rkeys.registerHotKey(popen.v, true, function() Toggle() end)



function main()

if not isSampLoaded() then return end

while not isSampAvailable() do wait(1000) end

sampRegisterChatCommand('ptest', function() main_window_state.v = not main_window_state.v end)

while true do wait(0) imgui.Process = main_window_state.v end

end

function imgui.OnDrawFrame()

if main_window_state.v then

local sw, sh = getScreenResolution()

imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))

imgui.SetNextWindowSize(imgui.ImVec2(550, 350), imgui.Cond.FirstUseEver)

imgui.Begin('Test script', main_window_state, imgui.WindowFlags.NoResize)

if imgui.HotKey("##1", popen, tLastKeys, 100) then

    rkeys.changeHotKey(key, popen.v)

    mainIni.hotkey.key = encodeJson(popen.v)

    inicfg.save(mainIni, 'ptest.ini')

    end

imgui.End()

end

end

function Toggle()

    sampAddChatMessage('qq',-1)

end
Код:
[ML] (error) testHotkey.lua: json parse: Invalid value. (at 1)
stack traceback:
    [C]: in function 'decodeJson'
    D:\GTA 4\moonloader\testHotkey.lua:18: in main chunk
Код:
[hotkey]
key = [
  18,
  82
]
Почему сохраняет без пробелов?
moonloader 0.27?
Используй encodeJson(таблица,true)
Без true json будет форматироваться
 
  • Нравится
Реакции: GAuditore
D

deleted-user-210352

Гость
[23:42:39.676829] (system) Installing pre-game hooks...
[23:42:39.680829] (system) Hooks installed.
[23:42:43.441620] (debug) Initializing opcode handler table
[23:42:43.441620] (debug) package.path = D:\Gta for Alvin\moonloader\lib\?.lua;D:\Gta for Alvin\moonloader\lib\?\init.lua;D:\Gta for Alvin\moonloader\?.lua;D:\Gta for Alvin\moonloader\?\init.lua;.\?.lua;D:\Gta for Alvin\moonloader\lib\?.luac;D:\Gta for Alvin\moonloader\lib\?\init.luac;D:\Gta for Alvin\moonloader\?.luac;D:\Gta for Alvin\moonloader\?\init.luac;.\?.luac
[23:42:43.441620] (debug) package.cpath = D:\Gta for Alvin\moonloader\lib\?.dll;
[23:42:43.455612] (system) Loading script 'D:\Gta for Alvin\moonloader\refreal.lua'...
[23:42:43.455612] (debug) New script: 0BA5B4BC
[23:42:43.467604] (system) Check Refreals: Loaded successfully.
[23:42:43.467604] (system) Loading script 'D:\Gta for Alvin\moonloader\reload_all.lua'...
[23:42:43.467604] (debug) New script: 0BA5B644
[23:42:43.468604] (system) ML-ReloadAll: Loaded successfully.
[23:42:43.468604] (system) Loading script 'D:\Gta for Alvin\moonloader\SF Integration.lua'...
[23:42:43.468604] (debug) New script: 0BB65A24
[23:42:43.472602] (system) SF Integration: Loaded successfully.
[23:42:43.472602] (system) Loading script 'D:\Gta for Alvin\moonloader\lovec3000.lua'...
[23:42:43.472602] (debug) New script: 0BB65BAC
[23:42:43.482593] (error) Lovec3000: D:\Gta for Alvin\moonloader\lovec3000.lua:76: attempt to index global 'mainIni' (a nil value)
stack traceback:
D:\Gta for Alvin\moonloader\lovec3000.lua:76: in main chunk
[23:42:43.482593] (error) Lovec3000: Script died due to an error. (0BB65BAC)
[23:42:43.482593] (system) Loading script 'D:\Gta for Alvin\moonloader\Helper.lua'...
[23:42:43.482593] (debug) New script: 0BB65BAC
[23:42:43.505585] (system) Helper.lua: Loaded successfully.
[23:42:43.506586] (system) Loading script 'D:\Gta for Alvin\moonloader\Central Cleaner(FINAL).lua'...
[23:42:43.506586] (debug) New script: 0BC03884
[23:42:43.523575] (system) Central Cleaner(FINAL): Loaded successfully.
[23:42:43.523575] (system) Loading script 'D:\Gta for Alvin\moonloader\Fast_Buy_KARLEONE.lua'...
[23:42:43.523575] (debug) New script: 0BA8CAA4
[23:42:43.532569] (system) Autoupdate script: Loaded successfully.
[23:42:43.533568] (system) Loading script 'D:\Gta for Alvin\moonloader\Buy.luac'...
[23:42:43.533568] (debug) New script: 0BA8CC2C
[23:42:43.549559] (system) Buy.luac: Loaded successfully.
[23:42:57.015497] (system) Installing post-load hooks...
[23:42:57.015497] (system) Hooks installed.
[23:43:01.130046] (error) Helper.lua: D:\Gta for Alvin\moonloader\Helper.lua:207: attempt to call field 'addNotification' (a nil value)
stack traceback:
D:\Gta for Alvin\moonloader\Helper.lua: in function <D:\Gta for Alvin\moonloader\Helper.lua:206>
stack traceback:
[C]: in function 'create'
D:\Gta for Alvin\moonloader\Helper.lua:206: in function <D:\Gta for Alvin\moonloader\Helper.lua:204>
[23:43:01.130046] (error) Helper.lua: Script died due to an error. (0BB65BAC)
[23:43:25.073378] (system) Unloading...
[23:43:25.073378] (system) Check Refreals: Script terminated. (0BA5B4BC)
[23:43:25.074377] (system) ML-ReloadAll: Script terminated. (0BA5B644)
[23:43:25.075376] (system) SF Integration: Script terminated. (0BB65A24)
[23:43:25.075376] (system) Central Cleaner(FINAL): Script terminated. (0BC03884)
[23:43:25.078375] (system) Autoupdate script: Script terminated. (0BA8CAA4)
[23:43:25.079374] (system) Buy.luac: Script terminated. (0BA8CC2C)
[23:43:25.153328] (system) Session terminated.
можете помочь, когда двигаю окно imgui то игра крашится
скрипт buy
пофиксил, неактуальный вопрос
 
Последнее редактирование модератором:

MrBidloKoder

Известный
423
249
Хочу спросить у знающих. Вот допустим я сделал запрос на свой сервер и мне кидает (echo "no";). Как сделать так, чтобы скрипт сделал запрос, прочитал ответ no и если там нету этого ответа или есть ответ "no" или вообще скрипт не смог соединиться с сервером, то выполнить какой-то код. Киньте пожалуйста пример если у вас валяется такой код. Заранее спасибо.

p.s не кидайте ссылку на тему Фипа. Я там разобрался с запросами, но не разобрался с ответами.
up в последний раз. Надеюсь помогут /:
 

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,744
4,808
up в последний раз. Надеюсь помогут /:
Оно?
Lua:
response = requests.get('сайт.ру/auth.php?code='..getserial())
        if not response.text:match("<body>(.*)</body>"):find("-1") then -- Если ключ есть в бд
            if not response.text:match("<body>(.*)</body>"):find("The duration of the key has expired.") then -- Если сервер не ответил что ключ истек.
                sampAddChatMessage("До окончания лицензии осталось:"..response.text:match("<body>(.*)</body>"), -1) --  Выводим кол-во дней до конца лицензии
            else
                sampAddChatMessage(response.text:match("Срок действия лицензии истек."), -1)
            end
        else
            sampAddChatMessage("Ключ не активирован.", -1)
        end
 
  • Влюблен
  • Нравится
Реакции: DedPoet и MrBidloKoder

yummyme

Участник
36
1
Как прикрепить к персонажу какой-то объект?
В Вики МЛ нашел подобную функцию, но она давно не обновлялась и не подстраиваться под анимацию(не крепится к костям грубо говоря), и из-за этого выглядит не очень