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

CaJlaT

Овощ
Модератор
2,806
2,614
Как сделать проверку на то сидит ли игрок на пасажирке?
Проверяй все места через

Lua:
for i=0, getMaximumNumberOfPassengers(Vehicle) do
    if not isCarPassengerSeatFree(Vehicle, i) then
        local ped = getCharInCarPassengerSeat(Vehicle, i)
        local _, id = sampGetPlayerIdByCharHandle(ped)
        local nick = sampGetPlayerNickname(id)
        sampAddChatMessage('Место: '..i..', пассажир: '..nick..'['..id..'].',-1)
    end
end
 
  • Нравится
Реакции: Fott

Peresvet

Известный
375
126
Какая переменная отвечает за считывание текстдрава для дальнейшего кода с текстом в этом текстдраве?
 

SanyaGames227

Известный
32
31
Здравствуйте, а как можно сделать чтобы сделать выделение курсором? Типо чтобы от точки X, Y следовало до точки Курсора X, Y? Типо как на скрине
13wgWDg_mbA (1).jpg
 
Последнее редактирование:

Callow

Известный
62
62
В сампе кроме пакетов и RPC, есть ещё какая либо связь с сервером? Просто сервер оффает двигатель авто, но не каких пакетов и RPC не приходит. (onSetVehicleParamsEx, приходит только при посадке в авто, больше он не появляется, хотя и двигатель выключается; в пакетах синхронизации вообще не нашёл параметр отвечающий за состояние двигателя)

P.S. Это не совсем относиться к Lua, но я не нашёл куда ещё задать его.
 

Peresvet

Известный
375
126
Как можно реализовать?
Нужно считывать текстдрав по его ID и далее брать из него фразу по определённому формату ну или хотя бы по порядковому номеру
 

G W

Участник
141
5
Как сделать чтобы скрипт мог находить сообщения не только с обычного чата, но и с вин чата например. На данный момент она работает так: Игрок пишет запрещенное слово в чат (обычный, без /rn, r. , а скрипт предлагает его замутить. А мне нужно, что бы она могла мутить и в других чата как /vip text, /r text, /rn. Мне нужно, чтобы она обрабатывала все сообщения отправленный сервером, или игроком. Как это сделать ? Покажите pls.

Lua:
local samp = require 'samp.events'
local key = require 'vkeys'

local mute_id, mute_msg = nil, nil
local mat = {
    "бля",
    "еба",
}

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    
    while true do
        wait(0)


        if isKeyJustPressed(key.VK_F2) and mute_id and mute_msg then
              makeScreenshot()
            sampSendChat('/mute '..mute_id..' 30 ')
        end
        
    end
end


function samp.onServerMessage(color, text)
    local id, msg = text:match('.+%[(%d+)]: (.+)')
    if id and msg then
        for k, v in pairs(mat) do
            if msg:find(v) then
                sampAddChatMessage('{ff0000}Игрок {ffffff}с ID {ffffff}'..id..' {ba05fc} написал: {ff0000}'..msg, 0xff0000)
                sampAddChatMessage('{ffffff}Чтобы выдать мут на {1cf7ff}30  {ffffff}минут нажмите на клавишу {00fc2e}F2', 0xff0000)
                mute_id, mute_msg = id, msg
                break
            end
        end
    end
end

function makeScreenshot()
    require('memory').setuint8(sampGetBase() + 0x119CBC, 1)
end
 

Fott

Простреленный
3,443
2,300
Как сделать чтобы скрипт мог находить сообщения не только с обычного чата, но и с вин чата например. На данный момент она работает так: Игрок пишет запрещенное слово в чат (обычный, без /rn, r. , а скрипт предлагает его замутить. А мне нужно, что бы она могла мутить и в других чата как /vip text, /r text, /rn. Мне нужно, чтобы она обрабатывала все сообщения отправленный сервером, или игроком. Как это сделать ? Покажите pls.

Lua:
local samp = require 'samp.events'
local key = require 'vkeys'

local mute_id, mute_msg = nil, nil
local mat = {
    "бля",
    "еба",
}

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
   
    while true do
        wait(0)


        if isKeyJustPressed(key.VK_F2) and mute_id and mute_msg then
              makeScreenshot()
            sampSendChat('/mute '..mute_id..' 30 ')
        end
       
    end
end


function samp.onServerMessage(color, text)
    local id, msg = text:match('.+%[(%d+)]: (.+)')
    if id and msg then
        for k, v in pairs(mat) do
            if msg:find(v) then
                sampAddChatMessage('{ff0000}Игрок {ffffff}с ID {ffffff}'..id..' {ba05fc} написал: {ff0000}'..msg, 0xff0000)
                sampAddChatMessage('{ffffff}Чтобы выдать мут на {1cf7ff}30  {ffffff}минут нажмите на клавишу {00fc2e}F2', 0xff0000)
                mute_id, mute_msg = id, msg
                break
            end
        end
    end
end

function makeScreenshot()
    require('memory').setuint8(sampGetBase() + 0x119CBC, 1)
end
Добавить в ещё чекер сообщений,но с добавлением регулярки в начале под вип чат
 

[SA ARZ]

Известный
390
8
как сделать так ?
/pass [указал свой ид] , делает действие и показывает , если указал другого игрока - то другое действие, но проверяет подключен ли другой игрок в игре
 

enyag

Известный
345
12
как сделать, что бы один процесс в имгуи сразу выводился на экран, а второй процесс нет?
 

NetyEgo

Участник
164
10
if testCheat(mainini.binder.comman3) and imgui.Process == false and deads.v == true and not sampIsDialogActive() and not sampIsChatInputActive() and not isPlayerDead(playerHandle) then if podberdi.v == true then sampAddChatMessage("[DRPHelper]: {FFFFFF}Нажмите {00FF00}F2 чтобы подветрдить{FFFFFF}, либо же {FF0000}F3 чтобы отклонить.", 0x000FF) if isKeyJustPressed(113) then setCharHealth(PLAYER_PED, 0) end else setCharHealth(PLAYER_PED, 0) end end
Вот у меня активирован podberdi, высвечивается сообщение, жму F2 и ничего. Если уберу podberdi то он умирает
 

G W

Участник
141
5
Когда пытаюсь дать мут игроку крашет скрипт, что тут не так ?

Lua:
require "moonloader"
local samp = require 'lib.samp.events'

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(2000) end
   
    while true do

        if isKeyJustPressed(VK_LCONTROL) and active then
            active = false
            sampAddChatMessage('/mute '..testid..' 15')
        end

    wait(0)
    end
end

function samp.onServerMessage(color, text)

    testid, msg = text:match('.+%[(%d+)]: (.+)') 

    if color == -849584982 then
        sampAddChatMessage('Чтобы выдать мут нажмите клавишу CTRL', -1)
        active = true
    end
end
 

Akionka

akionka.lua
Проверенный
742
500
Когда пытаюсь дать мут игроку крашет скрипт, что тут не так ?

Lua:
require "moonloader"
local samp = require 'lib.samp.events'

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(2000) end
  
    while true do

        if isKeyJustPressed(VK_LCONTROL) and active then
            active = false
            sampAddChatMessage('/mute '..testid..' 15')
        end

    wait(0)
    end
end

function samp.onServerMessage(color, text)

    testid, msg = text:match('.+%[(%d+)]: (.+)')

    if color == -849584982 then
        sampAddChatMessage('Чтобы выдать мут нажмите клавишу CTRL', -1)
        active = true
    end
end
по какой причине крашит - то?
 

G W

Участник
141
5
по какой причине крашит - то?
Код:
[05:56:40.066639] (system)    WallHack: Script terminated. (0A94EE3C)
[05:56:40.071638] (system)    Loading script 'D:\1337SAMP_VERYLOWPC\moonloader\Admin Tools.lua'...
[05:56:40.071638] (debug)    New script: 01A33044
[05:56:40.121637] (system)    Admin Tools: Loaded successfully.
[05:56:40.121637] (system)    Loading script 'D:\1337SAMP_VERYLOWPC\moonloader\grp.lua'...
[05:56:40.121637] (debug)    New script: 0A92DEBC
[05:56:40.266642] (system)    CorrectionWords: Loaded successfully.
[05:56:40.266642] (system)    Loading script 'D:\1337SAMP_VERYLOWPC\moonloader\Imgui Admin Tools.lua'...
[05:56:40.266642] (debug)    New script: 0A92E044
[05:56:40.288644] (system)    Imgui Admin Tools.lua: Loaded successfully.
[05:56:40.288644] (system)    Loading script 'D:\1337SAMP_VERYLOWPC\moonloader\Reload_all.lua'...
[05:56:40.288644] (debug)    New script: 0A92E1CC
[05:56:40.292646] (system)    ML-ReloadAll: Loaded successfully.
[05:56:40.292646] (system)    Loading script 'D:\1337SAMP_VERYLOWPC\moonloader\SF Integration.lua'...
[05:56:40.292646] (debug)    New script: 0A92E354
[05:56:40.301645] (system)    SF Integration: Loaded successfully.
[05:56:40.301645] (system)    Loading script 'D:\1337SAMP_VERYLOWPC\moonloader\WallHack 0.26.luac'...
[05:56:40.301645] (debug)    New script: 0A92DA24
[05:56:40.340637] (system)    WallHack: Loaded successfully.
[05:56:41.688196] (error)    Admin Tools: D:\1337SAMP_VERYLOWPC\moonloader\Admin Tools.lua:1231: attempt to index global 'msg' (a nil value)
stack traceback:
    D:\1337SAMP_VERYLOWPC\moonloader\Admin Tools.lua:1231: in function 'callback'
    D:\1337SAMP_VERYLOWPC\moonloader\lib\samp\events\core.lua:77: in function 'process_event'
    D:\1337SAMP_VERYLOWPC\moonloader\lib\samp\events\core.lua:100: in function 'process_packet'
    D:\1337SAMP_VERYLOWPC\moonloader\lib\samp\events\core.lua:127: in function <D:\1337SAMP_VERYLOWPC\moonloader\lib\samp\events\core.lua:126>
[05:56:41.698198] (error)    Admin Tools: Script died due to an error. (01A33044)
[05:56:41.737190] (error)    Imgui Admin Tools.lua: cannot resume non-suspended coroutine
stack traceback:
    [C]: in function 'SetMouseCursor'
    D:\1337SAMP_VERYLOWPC\moonloader\Imgui Admin Tools.lua:94: in function <D:\1337SAMP_VERYLOWPC\moonloader\Imgui Admin Tools.lua:90>
[05:56:41.737190] (error)    Imgui Admin Tools.lua: Script died due to an error. (0A92E044)
[05:57:04.688899] (system)    CorrectionWords: Script terminated. (0A92DEBC)
[05:57:04.696897] (system)    ML-ReloadAll: Script terminated. (0A92E1CC)
[05:57:04.697901] (system)    SF Integration: Script terminated. (0A92E354)
[05:57:04.699897] (system)    WallHack: Script terminated. (0A92DA24)
[05:57:04.703889] (system)    Loading script 'D:\1337SAMP_VERYLOWPC\moonloader\Admin Tools.lua'...
[05:57:04.704889] (debug)    New script: 0A92E1CC
[05:57:04.755902] (system)    Admin Tools: Loaded successfully.
[05:57:04.755902] (system)    Loading script 'D:\1337SAMP_VERYLOWPC\moonloader\grp.lua'...
[05:57:04.755902] (debug)    New script: 0A92DEBC
[05:57:04.907900] (system)    CorrectionWords: Loaded successfully.
[05:57:04.907900] (system)    Loading script 'D:\1337SAMP_VERYLOWPC\moonloader\Imgui Admin Tools.lua'...
[05:57:04.908897] (debug)    New script: 0A92E4DC
[05:57:04.927901] (system)    Imgui Admin Tools.lua: Loaded successfully.
[05:57:04.928890] (system)    Loading script 'D:\1337SAMP_VERYLOWPC\moonloader\Reload_all.lua'...
[05:57:04.928890] (debug)    New script: 0A92DBAC
[05:57:04.932896] (system)    ML-ReloadAll: Loaded successfully.
[05:57:04.932896] (system)    Loading script 'D:\1337SAMP_VERYLOWPC\moonloader\SF Integration.lua'...
[05:57:04.932896] (debug)    New script: 0A92DD34
[05:57:04.941929] (system)    SF Integration: Loaded successfully.
[05:57:04.941929] (system)    Loading script 'D:\1337SAMP_VERYLOWPC\moonloader\WallHack 0.26.luac'...
[05:57:04.941929] (debug)    New script: 0A92D89C
[05:57:04.980893] (system)    WallHack: Loaded successfully.
[05:58:19.542750] (system)    Admin Tools: Script terminated. (0A92E1CC)
[05:58:19.548753] (system)    CorrectionWords: Script terminated. (0A92DEBC)
[05:58:19.563747] (system)    Imgui Admin Tools.lua: Script terminated. (0A92E4DC)
[05:58:19.574740] (system)    ML-ReloadAll: Script terminated. (0A92DBAC)
[05:58:19.575740] (system)    SF Integration: Script terminated. (0A92DD34)
[05:58:19.577739] (system)    WallHack: Script terminated. (0A92D89C)
[05:58:19.583262] (system)    Loading script 'D:\1337SAMP_VERYLOWPC\moonloader\Admin Tools.lua'...
[05:58:19.583262] (debug)    New script: 0A92E354
[05:58:19.653335] (system)    Admin Tools: Loaded successfully.
[05:58:19.653335] (system)    Loading script 'D:\1337SAMP_VERYLOWPC\moonloader\grp.lua'...
[05:58:19.654341] (debug)    New script: 0A92DA24
[05:58:19.775954] (system)    CorrectionWords: Loaded successfully.
[05:58:19.775954] (system)    Loading script 'D:\1337SAMP_VERYLOWPC\moonloader\Imgui Admin Tools.lua'...
[05:58:19.775954] (debug)    New script: 0A92E4DC
[05:58:19.802480] (system)    Imgui Admin Tools.lua: Loaded successfully.
[05:58:19.802480] (system)    Loading script 'D:\1337SAMP_VERYLOWPC\moonloader\Reload_all.lua'...
[05:58:19.802480] (debug)    New script: 0A92D714
[05:58:19.808474] (system)    ML-ReloadAll: Loaded successfully.
[05:58:19.808474] (system)    Loading script 'D:\1337SAMP_VERYLOWPC\moonloader\SF Integration.lua'...
[05:58:19.808474] (debug)    New script: 0A92DD34
[05:58:19.817469] (system)    SF Integration: Loaded successfully.
[05:58:19.817469] (system)    Loading script 'D:\1337SAMP_VERYLOWPC\moonloader\WallHack 0.26.luac'...
[05:58:19.817469] (debug)    New script: 0A92D89C
[05:58:19.862545] (system)    WallHack: Loaded successfully.
[05:58:22.575761] (error)    Admin Tools: D:\1337SAMP_VERYLOWPC\moonloader\Admin Tools.lua:1231: attempt to index global 'msg' (a nil value)
stack traceback:
    D:\1337SAMP_VERYLOWPC\moonloader\Admin Tools.lua:1231: in function 'callback'
    D:\1337SAMP_VERYLOWPC\moonloader\lib\samp\events\core.lua:77: in function 'process_event'
    D:\1337SAMP_VERYLOWPC\moonloader\lib\samp\events\core.lua:100: in function 'process_packet'
    D:\1337SAMP_VERYLOWPC\moonloader\lib\samp\events\core.lua:127: in function <D:\1337SAMP_VERYLOWPC\moonloader\lib\samp\events\core.lua:126>
[05:58:22.604313] (error)    Admin Tools: Script died due to an error. (0A92E354)
[05:58:22.642832] (error)    Imgui Admin Tools.lua: cannot resume non-suspended coroutine
stack traceback:
    [C]: in function 'SetMouseCursor'
    D:\1337SAMP_VERYLOWPC\moonloader\Imgui Admin Tools.lua:94: in function <D:\1337SAMP_VERYLOWPC\moonloader\Imgui Admin Tools.lua:90>
[05:58:22.642832] (error)    Imgui Admin Tools.lua: Script died due to an error. (0A92E4DC)
[05:58:42.711939] (system)    Unloading...
[05:58:42.711939] (system)    CorrectionWords: Script terminated. (0A92DA24)
[05:58:42.716935] (system)    ML-ReloadAll: Script terminated. (0A92D714)
[05:58:42.717933] (system)    SF Integration: Script terminated. (0A92DD34)
[05:58:42.718933] (system)    WallHack: Script terminated. (0A92D89C)
[05:58:42.848654] (system)    Session terminated.