Вопросы по 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
 
Последнее редактирование:

MrBidloKoder

Известный
423
249
Lua:
local word = 'Слово'
local ev = require'lib.samp.events'

function ev.onServerMessage(_, text)
  if text:find(word) then take_screen() end
end

function take_screen()
  callFunction(sampGetBase() + 0x70FC0, 0, 0)
end
Здесь метод take_screen() делает обычный самповский скриншот когда находит нужное слово.
Безусловно кинуть файл в отдельную папку можно файловыми методами Lua, но для этого тебе нужно понять какой именно из всех сохраененных скриншотов - нужный (можно понять по дате изменения файла).
Считаю, что строить костыли можно бесконечно, а если ты не архимаг в луа, то тебе стоит ограничится описанным выше, или попробовать использовать другие технологии, например c++.
Т.к описанное тобой гораздо проще будет сделать с использованием win-api.
Ну щас попытаюсь найти сортировщик скринов и изучить код. Я до этого момента дошёл, но дальше хз типо.




и ещё вопрос, забыл где искать что-то вроде этого [.%]. Я типо знаю что это, но не знаю как это называется и где это искать. Скажите пожалуйста.
 

Demmy

Участник
121
22
Как разбить ник на имя фамилия, если ник имеет формат Name_Surname? Т.е мне нужно вырезать отдельно все до и после "_"
 

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,744
4,809
Как разбить ник на имя фамилия, если ник имеет формат Name_Surname? Т.е мне нужно вырезать отдельно все до и после "_"
Lua:
local Nick = "Alex_Borsov"
local name, surname = Nick:match("(%a+) (%a+)")
--name == Alex
--surname == Borsov
--Reads only english(wont work with Вася_Borsov1488)
 

MrBidloKoder

Известный
423
249
Помогите пожалуйста. В чём разница между %d и %d+. Насчёт этих плюсов, минусов, умножений и т.д не понял. Объясните пожалуйста нормально и развёрнуто. Нигде нормально не смог найти про это что-то.
 

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,744
4,809
Помогите пожалуйста. В чём разница между %d и %d+. Насчёт этих плюсов, минусов, умножений и т.д не понял. Объясните пожалуйста нормально и развёрнуто. Нигде нормально не смог найти про это что-то.
Гугли регулярные выражения. + это «модификатор» для символа. Т.е. %d+ Ищет цифру, в количестве от 1 до бесконечности. %d* ищет цифру в количестве от 0 до беск. %d{n,m} ищет цифру в количестве от n до m %d{,m} ищет цифру в кол-ве от 0 до m, %d{n,} ищет цифру в кол-ве от n до бесконечности
 

MrBidloKoder

Известный
423
249
Гугли регулярные выражения. + это «модификатор» для символа. Т.е. %d+ Ищет цифру, в количестве от 1 до бесконечности. %d* ищет цифру в количестве от 0 до беск. %d{n,m} ищет цифру в количестве от n до m %d{,m} ищет цифру в кол-ве от 0 до m, %d{n,} ищет цифру в кол-ве от n до бесконечности
а что делает . ?
 

Dmitriy Makarov

25.05.2021
Проверенный
2,500
1,131
а что делает . ?
. --- представляет все символы.
%a --- представляет все буквы.
%c --- представляет все управляющие символы.
%d --- представляет все цифры.
%l --- представляет все строчные буквы.
%p --- представляет все знаки препинания.
%s --- представляет все пробелы.
%u --- представляет все заглавными буквами.
%w --- представляет все алфавитно-цифровых символов.
%x --- представляет все шестнадцатеричные цифры.
%z --- символ с представлением 0.
 
  • Влюблен
Реакции: MrBidloKoder

MrBidloKoder

Известный
423
249
Ещё один вопрос для знатоков. Как сделать запрос на веб сервер (допустим скрипт отправит серверу аргумент xash) и ждать от сервера ответ по типу true or false. Допустим если будет true то что-то будет, если будет false то скрипт отключится.

p.s меня в основном интересует момент с запросом. Вроде php может обрабатывать такие запросы. Если есть прям охуительный гайд, то скиньте пожалуйста, если нету, то объясните лучше сами.
 

enyag

Известный
345
12
Как сделать, что бы imgui.Text(InputTextBuffer.v) сохранялся в массив и не менялся, как меняется в imgui.InputText?
 

Biuti

Участник
165
8
что не так?
Lua:
local sampev = require "lib.samp.events"

require "lib.moonloader"
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('cnnh', qq)
end

function qq(arg)
end
 

Double Tap Inside

Известный
Проверенный
1,916
1,256
что не так?
Lua:
local sampev = require "lib.samp.events"

require "lib.moonloader"
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('cnnh', qq)
end

function qq(arg)
end
Lua:
local sampev = require "lib.samp.events"

require "lib.moonloader"
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('cnnh', qq)
    wait(-1) -- или while true do wait(0) end
end

function qq(arg)
end

Если другие ошибки в коде, то смотри уже лог и номер строки.
Как сделать, что бы imgui.Text(InputTextBuffer.v) сохранялся в массив и не менялся, как меняется в imgui.InputText?
InputTextBuffer.v - это строка, этот обьект не изменяемый на сколько я знаю. Его можно скопировать просто в переменную:
str = InputTextBuffer.v -- теперь в переменной str будет то значение, которое ты один раз взял из InputTextBuffer.v

Массив... ну, под массивом я представляю себе Список из объектов list = {str1, str2, str3}, доставать эти значения можно по индексам
Код:
str1 = list[1]
str2 = list[2]
list[2] = "Какая то строчка"

table.insert(list, "добавляем эту строчку в конце массива")
В любом случае, я не совсем понял что ты имел ввиду говоря "массив".

ах да imgui.Text(InputTextBuffer.v) быть не может, по идее надо передавать объект "ImBuffer" а не строку imgui.Text(InputTextBuffer)
 
Последнее редактирование:
  • Нравится
Реакции: Biuti

shizzard

Участник
150
7
1597649824577.png
мунлоадер совсем головой ударился? говорит вы не объявили mainIni
18: attempt to index local 'mainIni' (a nil value)
stack traceback:
 

enyag

Известный
345
12
что не так в коде? Почему не работает?
Lua:
-- начало
local inputBufferText2 = imgui.ImBuffer(256)
local zametka = inputBufferText2
-- ondraweframe
    imgui.InputText('', inputBufferText2)
    imgui.SameLine()
    if imgui.Button(u8'Добавить заметку', imgui.ImVec2(60, 25)) then
        zametkatime = os.date("%d.%m.%y")
    end
    if zametkatime then
        imgui.Text(u8"Дата поставленной заметки: "..zametkatime)
        imgui.Text("Заметка: "..zametka)
    end
 

Angr

Известный
291
99
что не так в коде? Почему не работает?
Lua:
-- начало
local inputBufferText2 = imgui.ImBuffer(256)
local zametka = inputBufferText2
-- ondraweframe
    imgui.InputText('', inputBufferText2)
    imgui.SameLine()
    if imgui.Button(u8'Добавить заметку', imgui.ImVec2(60, 25)) then
        zametkatime = os.date("%d.%m.%y")
    end
    if zametkatime then
        imgui.Text(u8"Дата поставленной заметки: "..zametkatime)
        imgui.Text("Заметка: "..zametka)
    end
Ошибку мы сами должны угадать?) напиши какая ошибка вылазит или подробнее о проблеме
 
  • Нравится
Реакции: Double Tap Inside

enyag

Известный
345
12
Ошибку мы сами должны угадать?) напиши какая ошибка вылазит или подробнее о проблеме
[ML] (error) Global Mode Pears Project: ...t Auto San Andreas\moonloader\pearsprojectglobalmode.lua:269: attempt to concatenate upvalue 'zametka' (a nil value)
stack traceback:
...t Auto San Andreas\moonloader\pearsprojectglobalmode.lua:269: in function 'OnDrawFrame'
...ON\Grand Theft Auto San Andreas\moonloader\lib\imgui.lua:1378: in function <...ON\Grand Theft Auto San Andreas\moonloader\lib\imgui.lua:1367>
[ML] (error) Global Mode Pears Project: Script died due to an error. (12146FB4)
[ML] (error) imgui_notf.lua: cannot resume non-suspended coroutine
stack traceback:
[C]: in function 'SetMouseCursor'
...N\Grand Theft Auto San Andreas\moonloader\imgui_notf.lua:103: in function <...N\Grand Theft Auto San Andreas\moonloader\imgui_notf.lua:99>
[ML] (error) imgui_notf.lua: Script died due to an error. (12147D7C)