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

_mudota_

Потрачен
208
27
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Lua:
        sampRegisterChatCommand('ch_delete', function()
            file = io.open('moonloader/Gold Tools/Чекер.txt', 'a+')
            local params = {...}, file

            for line in io.lines(params[1]) do
                  file = io.open(line, "w")
                  file:close()
            end
            os.remove(params[1])
        end)
        ------
        [10:40:30.744358] (error)    Gold Tools : D:\GTA\GTASHKA\moonloader\Gold Tools.lua:2019: bad argument #1 to 'gsub' (string expected, got nil)
stack traceback:
    [C]: in function 'gsub'
    D:\GTA\GTASHKA\moonloader\Gold Tools.lua:2019: in function <D:\GTA\GTASHKA\moonloader\Gold Tools.lua:2016>
[10:40:30.749242] (error)    Gold Tools : Script died due to an error. (0A9B185C)
[10:40:30.800017] (error)    imgui_notf [NEW].lua: cannot resume non-suspended coroutine
stack traceback:
    [C]: in function 'SetMouseCursor'
    D:\GTA\GTASHKA\moonloader\imgui_notf [NEW].lua:103: in function <D:\GTA\GTASHKA\moonloader\imgui_notf [NEW].lua:99>
[10:40:30.800017] (error)    imgui_notf [NEW].lua: Script died due to an error. (0A9BE724)
[10:40:58.202601] (script)    ML-AutoReboot: Loading "D:\GTA\GTASHKA\moonloader\Gold Tools.lua"...
[10:40:58.202601] (system)    Loading script 'D:\GTA\GTASHKA\moonloader\Gold Tools.lua'...
[10:40:58.202601] (debug)    New script: 0A9C6FEC
[10:40:58.206508] (error)    Gold Tools.lua: D:\GTA\GTASHKA\moonloader\Gold Tools.lua:2018: cannot use '...' outside a vararg function near '...'
[10:40:58.207495] (error)    Gold Tools.lua: Script died due to an error. (0A9C6FEC)
[10:40:58.206508] (error) Gold Tools.lua: D:\GTA\GTASHKA\moonloader\Gold Tools.lua:2018: cannot use '...' outside a vararg function near '...'
 

rayprod

Участник
96
1
Ребята, кто может помочь. Я хочу что-бы счётчик прибавлял когда в чат идёт сообщение "Администратор Nick(он берётся с ini файла для"
Проблема в том что, когда в чат оправляется данное сообщение, после ника идёт ID его. И из-за этого счётчик не работает.
Вот код:
Lua:
function samp.onServerMessage(color, text)
    if text:match('Администратор ' ..mainIni.config.nick.. '[(%d+)] для') then
        ans = ans + 2
        mainIni.config.ans = mainIni.config.ans + 2
        mainIni.config.alls = mainIni.config.alls + 2
        inicfg.save(mainIni, 'stats.ini')
    end
end

Вот строчка из чата, только ид меняется, и всё время писать в ini файле, такое себе.
1593245611104.png
 

rayprod

Участник
96
1
В чем суть должна заключаться, можно нормально объяснить ТЗ, чтобы тебе помогли, откуда ини, зачем ини
Ini файл уже есть. Суть в том что, как сделать что-бы счётчик прибавлял когда в чате появляется строчка "Администратор Nick(он берётся с ini файла) для"
Проблема в том что, после никак идёт ID и из-за этого счётчик не работает. Если без ID ник, всё норм работает.
Вопрос в том, как сделать что-бы счётчик работал с ID в чате.
Сам код
Lua:
function samp.onServerMessage(color, text)
    if text:find('Администратор ' ..mainIni.config.nick.. 'для') then
        ans = ans + 2
        mainIni.config.ans = mainIni.config.ans + 2
        mainIni.config.alls = mainIni.config.alls + 2
        inicfg.save(mainIni, 'stats.ini')
    end
end
Вот сам счётчик:
1593246437735.png

Вот строчка из чата(без id)
1593246454748.png

без id, при вводе текста, который выше, счётчик прибавляет+2.
1593246501460.png

А вот как сделать так что-бы он работал с id/
1593246558049.png
 

reseller

Потрачен
33
8
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Ini файл уже есть. Суть в том что, как сделать что-бы счётчик прибавлял когда в чате появляется строчка "Администратор Nick(он берётся с ini файла) для"
Проблема в том что, после никак идёт ID и из-за этого счётчик не работает. Если без ID ник, всё норм работает.
Вопрос в том, как сделать что-бы счётчик работал с ID в чате.
Сам код
Lua:
function samp.onServerMessage(color, text)
    if text:find('Администратор ' ..mainIni.config.nick.. 'для') then
        ans = ans + 2
        mainIni.config.ans = mainIni.config.ans + 2
        mainIni.config.alls = mainIni.config.alls + 2
        inicfg.save(mainIni, 'stats.ini')
    end
end
Lua:
local find_nick = 'Администратор '..mainIni.config.nick..'[(%d+)] для'
function samp.onServerMessage(color, text)
    print(mainIni.config.nick) -- проверяем, что у тебя вообще там
    if text:find(find_nick) then
        if find_nick == nil then
            print('Error. Проверь ошибку')
        else
            ans = ans + 2
            mainIni.config.ans = mainIni.config.ans + 2
            mainIni.config.alls = mainIni.config.alls + 2
            inicfg.save(mainIni, 'stats.ini')
        end
    end
end
 

rayprod

Участник
96
1
Lua:
local find_nick = 'Администратор '..mainIni.config.nick..'[(%d+)] для'
function samp.onServerMessage(color, text)
    print(mainIni.config.nick) -- проверяем, что у тебя вообще там
    if text:find(find_nick) then
        if find_nick == nil then
            print('Error. Проверь ошибку')
        else
            ans = ans + 2
            mainIni.config.ans = mainIni.config.ans + 2
            mainIni.config.alls = mainIni.config.alls + 2
            inicfg.save(mainIni, 'stats.ini')
        end
    end
end
Не работат(
 

CaJlaT

Овощ
Модератор
2,809
2,620
Как переключаться в открытом чате на F6?
[ /uninvite | ] - Как именно | передвигать?
тебе ответили выше, вот как можно использовать:
Lua:
function main()
    if not isSampLoaded() and not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do
        wait(0)
        if testCheat('GG') then
            sampSetChatInputEnabled(true)
            sampSetChatInputText("/uninvite  Выселен!")
            sampSetChatInputCursor(10)
        end
        if testCheat('HH') then
            sampSetChatInputEnabled(true)
            sampSetChatInputText("/uninvite  Выделить!")
            sampSetChatInputCursor(11, 20)
        end
    end
end
function sampSetChatInputCursor(start, finish)
    local finish = finish or start
    local start, finish = tonumber(start), tonumber(finish)
    local mem = require 'memory'
    local chatInfoPtr = sampGetInputInfoPtr()
    local chatBoxInfo = getStructElement(chatInfoPtr, 0x8, 4)
    mem.setint8(chatBoxInfo + 0x11E, start)
    mem.setint8(chatBoxInfo + 0x119, finish)
    return true
end
Курсор смещается от начала строки (слева направо!)
 
  • Нравится
  • Bug
Реакции: Мира и Fott

traceattack

Известный
218
119
Lua:
local bad_chars = { '[', ']', '{', '}' }
local checked_nick = '[nik] so skobkami'

for _,v in pairs(bad_chars) do
if checked_nick:find(v) then
  sampAddChatMessage('bad CHARS!!!')
  return true
end
end
return false

как заэкранировать квадратные скобки, чтобы скрипт их мог нормально прожевать и найти в строке? % и / не работают
Lua:
local data = "pososi []"
print (data:find("%["))
 

CaJlaT

Овощ
Модератор
2,809
2,620

DobrayaPchela

Участник
79
8
Как мне сделать выключение и обратное включение скрипта по кнопке допустим F12. Использую библиотеку vkeys, можно другую. Выходило что то..

Lua:
if isKeyJustPressed(VK_F12) then
 thisScript():unload()
 

Rei

Известный
Друг
1,598
1,634
Как мне сделать выключение и обратное включение скрипта по кнопке допустим F12. Использую библиотеку vkeys, можно другую. Выходило что то..

Lua:
if isKeyJustPressed(VK_F12) then
thisScript():unload()
if isKeyJustPressed(VK_F12) then
act = not act
end
 
  • Нравится
Реакции: DobrayaPchela