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

Eugene Crabs

Активный
544
30
Библиотека сампфункс, но она идёт в комплекте с уставновкой мундоадера. Кинь ошибку, с которой крашится скрипт когда вызываешь ее.
Не, дело в другом. У меня несколько этих функций подряд стоит, а перс бежит только к последней.
 

Shamanije

Известный
Друг
961
921
Не, дело в другом. У меня несколько этих функций подряд стоит, а перс бежит только к последней.
Делай проверку на координаты. Если твои координаты равны точке, куда надо бежать то беги на следующую точку
 
  • Нравится
Реакции: Kbho

Shrekynator3000

Известный
37
4
В луа почти не шарю что комманда не робит?



function main()
repeat wait(0) until isSampAvailable()
wait(1000)
sampRegisterChatCommand('/healme', cmd)
sampAddChatMessage('{FF0000}[Usmed]{FFFFFF}Loader for {FF0000}AZRP', -1)
sampAddChatMessage('{FF0000}[Usmed]{FFFFFF} /healme',-1)
end

function cmd(usemed)
while true do
wait(0)
if start then
sampSendChat('/usemed')
wait(3000)
sampSendChat('/usemed')
end
end
end
 

madrasso

Потрачен
883
324
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
В луа почти не шарю что комманда не робит?

Я вообщем то правильно понял, но сделал как у тебя задумано в этом коде..
Lua:
function main()
    repeat wait(0) until isSampAvailable()
    wait(1000)
    sampRegisterChatCommand('/healme', cmd)
    sampAddChatMessage('{FF0000}[Usmed]{FFFFFF}Loader for {FF0000}AZRP', -1)
    sampAddChatMessage('{FF0000}[Usmed]{FFFFFF} /healme',-1)
    wait(-1)
end
  
function cmd(usemed)
    start = not start
    while true do
        wait(0)
        if start then
            sampSendChat('/usemed')
            wait(3000)
            sampSendChat('/usemed')
        end
    end
end
 

Shrekynator3000

Известный
37
4
Я вообщем то правильно понял, но сделал как у тебя задумано в этом коде..
Lua:
function main()
    repeat wait(0) until isSampAvailable()
    wait(1000)
    sampRegisterChatCommand('/healme', cmd)
    sampAddChatMessage('{FF0000}[Usmed]{FFFFFF}Loader for {FF0000}AZRP', -1)
    sampAddChatMessage('{FF0000}[Usmed]{FFFFFF} /healme',-1)
    wait(-1)
end
 
function cmd(usemed)
    start = not start
    while true do
        wait(0)
        if start then
            sampSendChat('/usemed')
            wait(3000)
            sampSendChat('/usemed')
        end
    end
end
что то не работает
 

Shamanije

Известный
Друг
961
921
А по очереди их запускать, без проверки координат никак?
Персонаж начнёт бежать не завершив текущий маршрут, поэтому у тебя он бежит на последний маршрут, так как это последняя строка.
что то не работает
Lua:
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('/healme', cmd)
    sampAddChatMessage('{FF0000}[Usmed]{FFFFFF}Loader for {FF0000}AZRP', -1)
    sampAddChatMessage('{FF0000}[Usmed]{FFFFFF} /healme',-1)
    wait(-1)
end

function cmd()
    lua_thread.create(function()
        for i = 0, 2 do
            sampSendChat('/healme')
            wait(300)
        end
    end)
end
 

ChickenYaki

Участник
55
0
[code = lua] require 'lib.sampfuncs'

function main ()
if not isSampLoaded () or not isSampfuncsLoaded () then return end
while isSampAvailable () do wait (100) end
sampRegisterChatCommand ('neartest', test)
wait (-1)
end

function test (id)
if id ~ = '' and id == id: match ('% d +') then
local result, ped = sampGetCharHandleBySampPlayerId (id)
if result then
local result = doesCharExist (ped)
if result then
if locateCharAnyMeansChar3d (ped, nearPed, 5.0, 5.0, 5.0, false) then
sampSendChat (string.format ('GG% d', id))
else
sampAddChatMessage (string.format ('PlayerID with% d is not online', id))
end
else
sampAddChatMessage ('Player is not nearby', -1)
end
sampAddChatMessage ('/ test ID', -1)
end
end
end
[/ code]

Why it doesn't work ?
 

Shamanije

Известный
Друг
961
921
какой id диалога с паролем,я не знаю просто)
На каждом сервере разный. Можешь взять этот код и зайти на сервер. Когда покажет диалог, в чате будет информация про него.
Lua:
local sampev = require 'lib.samp.events'

function sampev.onShowDialog(dialogId,style,title,button1,button2,text)
    sampAddChatMessage('Dialog ID: ' .. dialogId .. ' Title: ' .. title, -1)
end
 

T1cKz

Известный
596
246
В луа почти не шарю что комманда не робит?
Потому, что задержка wait не может использоваться в функциях, кроме main и функций вызванных в другом потоке
Lua:
local isheal = false

function main()
repeat wait(0) until isSampAvailable()
wait(1000)
sampRegisterChatCommand('/healme', function() isheal = true end)
sampAddChatMessage('{FF0000}[Usmed]{FFFFFF}Loader for {FF0000}AZRP', -1)
sampAddChatMessage('{FF0000}[Usmed]{FFFFFF} /healme',-1)
while true do
wait(0)
if isheal then -- если переменная == true тогда...
sampSendChat("/usemed")
wait(3000)
sampSendChat("/usemed")
ishead = false -- переводим переменную в false
end
end
end
 

Shamanije

Известный
Друг
961
921
Замени
Lua:
sampProcessChatInput('/buy_market')
на
Lua:
sampSendChat("/buy_market")
Какая разница? Первый вариант эмулирует ввод команды в игровой чат, второй просто кидает рпк на сервер с указанным сообщением. Крашит не из-за этого.

Потому, что задержка wait не может использоваться в функциях, кроме main и функций вызванных в другом потоке
Lua:
local isheal = false

function main()
repeat wait(0) until isSampAvailable()
wait(1000)
sampRegisterChatCommand('/healme', function() isheal = true end)
sampAddChatMessage('{FF0000}[Usmed]{FFFFFF}Loader for {FF0000}AZRP', -1)
sampAddChatMessage('{FF0000}[Usmed]{FFFFFF} /healme',-1)
while true do
wait(0)
if isheal then -- если переменная == true тогда...
sampSendChat("/usemed")
wait(3000)
sampSendChat("/usemed")
ishead = false -- переводим переменную в false
end
end
end
Задержка может использоваться только в мэйне, во всех других случаях надо создавать поток. Не работает из-за того, что переменная всё время false и ты неправильно изменяешь её значение. Так-же если она станет истиной, то скрипт начнёт флудить командой.
 

dmitri4

Известный
452
79
Как добавить несколько возможных значений в if, пример
Код:
local th = блабла
if th == 01 или 02 then
  ------
end
 

Kbho

Участник
59
4
Вы долго этого ждали и вот он,moonloader.log
Код:
[17:34:02.394530] (system)    Session started.
[17:34:02.410390] (debug)    Module handle: 647E0000
MoonLoader v.026.5-beta loaded.
Developers: FYP, hnnssy, EvgeN 1137
Copyright (c) 2016, BlastHack Team
https://www.blast.hk/moonloader/
[17:34:02.410390] (info)    Working directory: F:\GTA DNO PC DAPO SHOW\moonloader
[17:34:02.410390] (debug)    FP Control: 0009001F
[17:34:02.410390] (debug)    Game: GTA SA 1.0.0.0 US
[17:34:02.410390] (system)    Installing pre-game hooks...
[17:34:02.425559] (system)    Hooks installed.
[17:34:18.476524] (debug)    Initializing opcode handler table
[17:34:18.476524] (debug)    package.path = F:\GTA DNO PC DAPO SHOW\moonloader\lib\?.lua;F:\GTA DNO PC DAPO SHOW\moonloader\lib\?\init.lua;F:\GTA DNO PC DAPO SHOW\moonloader\?.lua;F:\GTA DNO PC DAPO SHOW\moonloader\?\init.lua;.\?.lua;F:\GTA DNO PC DAPO SHOW\moonloader\lib\?.luac;F:\GTA DNO PC DAPO SHOW\moonloader\lib\?\init.luac;F:\GTA DNO PC DAPO SHOW\moonloader\?.luac;F:\GTA DNO PC DAPO SHOW\moonloader\?\init.luac;.\?.luac
[17:34:18.476524] (debug)    package.cpath = F:\GTA DNO PC DAPO SHOW\moonloader\lib\?.dll;
[17:34:18.486528] (system)    Loading script 'F:\GTA DNO PC DAPO SHOW\moonloader\AutoReboot.lua'...
[17:34:18.494555] (debug)    New script: 0DEE381C
[17:34:18.566233] (system)    ML-AutoReboot: Loaded successfully.
[17:34:18.566233] (system)    Loading script 'F:\GTA DNO PC DAPO SHOW\moonloader\AutoReplace.lua'...
[17:34:18.566233] (debug)    New script: 0DEE3CB4
[17:34:18.669205] (system)    AutoReplace: Loaded successfully.
[17:34:18.669205] (system)    Loading script 'F:\GTA DNO PC DAPO SHOW\moonloader\buym.lua'...
[17:34:18.669205] (debug)    New script: 0DEE42D4
[17:34:18.899084] (system)    buym.lua: Loaded successfully.
[17:34:18.900083] (system)    Loading script 'F:\GTA DNO PC DAPO SHOW\moonloader\check-moonloader-updates.lua'...
[17:34:18.900083] (debug)    New script: 0DEE3B2C
[17:34:18.929591] (error)    Check MoonLoader Updates: ...DNO PC DAPO SHOW\moonloader\check-moonloader-updates.lua:7: module 'game.keys' not found:
    no field package.preload['game.keys']
    no file 'F:\GTA DNO PC DAPO SHOW\moonloader\lib\game\keys.lua'
    no file 'F:\GTA DNO PC DAPO SHOW\moonloader\lib\game\keys\init.lua'
    no file 'F:\GTA DNO PC DAPO SHOW\moonloader\game\keys.lua'
    no file 'F:\GTA DNO PC DAPO SHOW\moonloader\game\keys\init.lua'
    no file '.\game\keys.lua'
    no file 'F:\GTA DNO PC DAPO SHOW\moonloader\lib\game\keys.luac'
    no file 'F:\GTA DNO PC DAPO SHOW\moonloader\lib\game\keys\init.luac'
    no file 'F:\GTA DNO PC DAPO SHOW\moonloader\game\keys.luac'
    no file 'F:\GTA DNO PC DAPO SHOW\moonloader\game\keys\init.luac'
    no file '.\game\keys.luac'
    no file 'F:\GTA DNO PC DAPO SHOW\moonloader\lib\game\keys.dll'
    no file 'F:\GTA DNO PC DAPO SHOW\moonloader\lib\game.dll'
stack traceback:
    [C]: in function 'require'
    ...DNO PC DAPO SHOW\moonloader\check-moonloader-updates.lua:7: in main chunk
[17:34:18.929591] (error)    Check MoonLoader Updates: Script died due to an error. (0DEE3B2C)
[17:34:18.930592] (system)    Loading script 'F:\GTA DNO PC DAPO SHOW\moonloader\multiconnect-decompiled.lua'...
[17:34:18.930592] (debug)    New script: 0DEE414C
[17:34:18.968187] (error)    multiconnect-decompiled.lua: ... DNO PC DAPO SHOW\moonloader\multiconnect-decompiled.lua:1: '(' expected near 'main'
[17:34:18.968187] (error)    multiconnect-decompiled.lua: Script died due to an error. (0DEE414C)
[17:34:18.968187] (system)    Loading script 'F:\GTA DNO PC DAPO SHOW\moonloader\multiconnect.luac'...
[17:34:18.968187] (debug)    New script: 0DEE3FC4
[17:34:19.021547] (system)    multiconnect.luac: Loaded successfully.
[17:34:19.021547] (system)    Loading script 'F:\GTA DNO PC DAPO SHOW\moonloader\renderobjects.lua'...
[17:34:19.021547] (debug)    New script: 0DEE350C
[17:34:19.755721] (system)    renderobjects.lua: Loaded successfully.
[17:34:19.755721] (system)    Loading script 'F:\GTA DNO PC DAPO SHOW\moonloader\roulette-decompiled.lua'...
[17:34:19.756722] (debug)    New script: 0DEE414C
[17:34:19.785722] (error)    roulette-decompiled.lua: F:\GTA DNO PC DAPO SHOW\moonloader\roulette-decompiled.lua:1: '(' expected near 'main'
[17:34:19.786723] (error)    roulette-decompiled.lua: Script died due to an error. (0DEE414C)
[17:34:19.786723] (system)    Loading script 'F:\GTA DNO PC DAPO SHOW\moonloader\roulette.luac'...
[17:34:19.786723] (debug)    New script: 0DEE414C
[17:34:19.867773] (system)    Roulette: Loaded successfully.
[17:34:19.867773] (system)    Loading script 'F:\GTA DNO PC DAPO SHOW\moonloader\sbiv_x.lua'...
[17:34:19.867773] (debug)    New script: 0DEE3694
[17:34:19.884773] (system)    SBIV_X: Loaded successfully.
[17:34:19.884773] (system)    Loading script 'F:\GTA DNO PC DAPO SHOW\moonloader\scoreboard.lua'...
[17:34:19.884773] (debug)    New script: 0DEE39A4
[17:34:20.243027] (system)    ImGui Scoreboard: Loaded successfully.
[17:34:20.243527] (system)    Loading script 'F:\GTA DNO PC DAPO SHOW\moonloader\scriptManager.lua'...
[17:34:20.243527] (debug)    New script: 0DEE3B2C
[17:34:20.305076] (system)    ScriptManager: Loaded successfully.
[17:34:20.305076] (system)    Loading script 'F:\GTA DNO PC DAPO SHOW\moonloader\SF Integration.lua'...
[17:34:20.305076] (debug)    New script: 0CFFD2D4
[17:34:20.331982] (system)    SF Integration: Loaded successfully.
[17:34:31.595196] (system)    Installing post-load hooks...
[17:34:31.596198] (system)    Hooks installed.
[18:00:08.662413] (system)    Unloading...
[18:00:08.662916] (system)    ML-AutoReboot: Script terminated. (0DEE381C)
[18:00:08.665424] (system)    AutoReplace: Script terminated. (0DEE3CB4)
[18:00:08.667423] (system)    buym.lua: Script terminated. (0DEE42D4)
[18:00:08.670928] (system)    multiconnect.luac: Script terminated. (0DEE3FC4)
[18:00:08.675935] (system)    renderobjects.lua: Script terminated. (0DEE350C)
[18:00:08.689957] (system)    Roulette: Script terminated. (0DEE414C)
[18:00:08.693462] (system)    SBIV_X: Script terminated. (0DEE3694)
[18:00:08.748554] (system)    ImGui Scoreboard: Script terminated. (0DEE39A4)
[18:00:08.754065] (system)    ScriptManager: Script terminated. (0DEE3B2C)
[18:00:08.755565] (system)    SF Integration: Script terminated. (0CFFD2D4)
[18:00:08.830744] (system)    Session terminated.
Какая разница? Первый вариант эмулирует ввод команды в игровой чат, второй просто кидает рпк на сервер с указанным сообщением. Крашит не из-за этого.


Задержка может использоваться только в мэйне, во всех других случаях надо создавать поток. Не работает из-за того, что переменная всё время false и ты неправильно изменяешь её значение. Так-же если она станет истиной, то скрипт начнёт флудить командой.