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

Setkh

Участник
74
6
Как правильно использовать sampGetPlayerIdByCharHandle(PLAYER_PED) в таком виде?
Именно так, не прибегая к переменным.

Код:
if string.find(text, "Администратор " .. nick .. "[".. sampGetPlayerIdByCharHandle(PLAYER_PED) .. "] для ", 1, true) then
 

astynk

Известный
Проверенный
742
532
Как правильно использовать sampGetPlayerIdByCharHandle(PLAYER_PED) в таком виде?
Именно так, не прибегая к переменным.

[/code]if string.find(text, "Администратор " .. nick .. "[".. sampGetPlayerIdByCharHandle(PLAYER_PED) .. "] для ", 1, true) then
Код:
select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))
 
  • Нравится
Реакции: Setkh

cheremuxa

Известный
430
202
Ошибка в консоли, что это может значит ?
Код:
[ML] (error) ff.lua: D:\Games\GTA San Andreas\moonloader\ff.lua:10: bad argument #2 to 'find' (number expected, got string)
stack traceback:
    [C]: in function 'find'
    D:\Games\GTA San Andreas\moonloader\ff.lua:10: in function 'callback'
    ...ames\GTA San Andreas\moonloader\lib\samp\events\core.lua:79: in function <...ames\GTA San Andreas\moonloader\lib\samp\events\core.lua:53>
[ML] (error) ff.lua: Script died due to an error. (23FC91C4)
Lua:
-- фикс первого
local event = require('lib.samp.events')
function main()
    repeat wait(0) until isSampAvailable()
    while true do
     wait(0)
    end
end

function event.onServerMessage(color, text)
if text:find('Вы выгнали (%d+) из оганизации') then
    id, reason = text:match('Вы выгнали (%d+) из организации. Причина: (.+)')
        sampSendChat("/fs Уволил из организации "..sampGetPlayerNickname(id))
    end
end
Lua:
-- фикс второго
local sampev = require("lib.samp.events")
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(0) end
    while true do
     wait(0)
    end
  end

function sampev.onServerMessage(color, text)
if text:find("Вы выгнали (.*) из организации. Причина: (.*)") then
   local name, warn = text:match("выгнали (.*) из организации. Причина: (.*)")
   sampSendChat("/fs Уволил из организации "..name.."Причина: "..warn)
  end
end
 
  • Влюблен
Реакции: NICKNAME-ANDREW-ZAN9T

Lucifer Melton

Активный
164
57
мой вопрос как этот код сократить как написать говно кодом знаю
код:
if isKeyDown(VK_CONTROL) and isKeyJustPressed(VK_0) then
      setVirtualKeyDown(18, true)
      wait(20)
      setVirtualKeyDown(18, false)
      wait(20)
      setVirtualKeyDown(18, true)
      wait(20)
      setVirtualKeyDown(18, false)
      wait(20)
      setVirtualKeyDown(18, true)
      wait(20)
      setVirtualKeyDown(18, false)
      wait(20)
      setVirtualKeyDown(18, true)
      wait(20)
      setVirtualKeyDown(18, false)
      wait(20)
      setVirtualKeyDown(18, false)
      wait(20)
      setVirtualKeyDown(18, true)
      wait(20)
      setVirtualKeyDown(18, false)
      wait(20)
      setVirtualKeyDown(18, true)
      wait(20)
      setVirtualKeyDown(18, false)
      wait(20)
      setVirtualKeyDown(18, true)
      wait(20)
      setVirtualKeyDown(18, false)
      wait(20)
      setVirtualKeyDown(18, false)
      wait(20)
      setVirtualKeyDown(18, true)
      wait(20)
      setVirtualKeyDown(18, false)
      wait(20)
      setVirtualKeyDown(18, true)
      wait(20)
      setVirtualKeyDown(18, false)
      wait(20)
      setVirtualKeyDown(18, true)
      wait(20)
      setVirtualKeyDown(18, false)
      wait(20)
      setVirtualKeyDown(18, false)
      wait(20)
      setVirtualKeyDown(18, true)
      wait(20)
      setVirtualKeyDown(18, false)
      wait(20)
      setVirtualKeyDown(18, true)
      wait(20)
      setVirtualKeyDown(18, false)
      wait(20)
      setVirtualKeyDown(18, true)
      wait(20)
      setVirtualKeyDown(18, false)
      wait(20)
      setVirtualKeyDown(18, false)
      wait(20)
      setVirtualKeyDown(18, true)
      wait(20)
      setVirtualKeyDown(18, false)
      wait(20)
      setVirtualKeyDown(18, true)
      wait(20)
      setVirtualKeyDown(18, false)
      wait(20)
      setVirtualKeyDown(18, true)
      wait(20)
      setVirtualKeyDown(18, false)
      setVirtualKeyDown(18, true)
      wait(20)
      setVirtualKeyDown(18, false)
      wait(20)
      setVirtualKeyDown(18, true)
      wait(20)
      setVirtualKeyDown(18, false)
      wait(20)
      setVirtualKeyDown(18, true)
      wait(20)
      setVirtualKeyDown(18, false)
      wait(20)
      setVirtualKeyDown(18, true)
      wait(20)
      setVirtualKeyDown(18, false)
      wait(20)
      setVirtualKeyDown(18, true)
      wait(20)
      setVirtualKeyDown(18, false)
      wait(20)
      setVirtualKeyDown(18, true)
      wait(20)
      setVirtualKeyDown(18, false)
      wait(20)
      setVirtualKeyDown(18, true)
      wait(20)
      setVirtualKeyDown(18, false)
      wait(20)
      setVirtualKeyDown(18, true)
      wait(20)
      setVirtualKeyDown(18, false)
      wait(20)
      setVirtualKeyDown(18, true)
      wait(20)
      setVirtualKeyDown(18, false)
      wait(20)
      setVirtualKeyDown(18, true)
      wait(20)
      setVirtualKeyDown(18, false)


      sampProcessChatInput("/re")
      wait(500)
      end
Попробуй так, не знаю сработает ли оно 😅
Lua:
for i = 1, 20 do
   lua_thread.create(function()
      setVirtualKeyDown(18, true)
      wait(20)
      setVirtualKeyDown(18, false)
   end)
end
P.S. Если ты это все делаешь в бесконечном цикле убери это 2 и 6 строку))
 

NICKNAME-ANDREW-ZAN9T

Новичок
4
0
Lua:
-- фикс первого
local event = require('lib.samp.events')
function main()
    repeat wait(0) until isSampAvailable()
    while true do
     wait(0)
    end
end

function event.onServerMessage(color, text)
if text:find('Вы выгнали (%d+) из оганизации') then
    id, reason = text:match('Вы выгнали (%d+) из организации. Причина: (.+)')
        sampSendChat("/fs Уволил из организации "..sampGetPlayerNickname(id))
    end
end
Lua:
-- фикс второго
local sampev = require("lib.samp.events")
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(0) end
    while true do
     wait(0)
    end
  end

function sampev.onServerMessage(color, text)
if text:find("Вы выгнали (.*) из организации. Причина: (.*)") then
   local name, warn = text:match("выгнали (.*) из организации. Причина: (.*)")
   sampSendChat("/fs Уволил из организации "..name.."Причина: "..warn)
  end
end
Я ставлю задержку wait(1000) перед sampSendChat и вылезает ошибка в консоли.
Код:
[ML] (error) ff.lua: D:\Games\GTA San Andreas\moonloader\ff.lua:13: attempt to yield across C-call boundary
stack traceback:
    [C]: in function 'wait'
    D:\Games\GTA San Andreas\moonloader\ff.lua:13: in function 'callback'
    ...ames\GTA San Andreas\moonloader\lib\samp\events\core.lua:79: in function <...ames\GTA San Andreas\moonloader\lib\samp\events\core.lua:53>
[ML] (error) ff.lua: Script died due to an error. (23D1534C)
 

cheremuxa

Известный
430
202
Я ставлю задержку wait(1000) перед sampSendChat и вылезает ошибка в консоли.
Код:
[ML] (error) ff.lua: D:\Games\GTA San Andreas\moonloader\ff.lua:13: attempt to yield across C-call boundary
stack traceback:
    [C]: in function 'wait'
    D:\Games\GTA San Andreas\moonloader\ff.lua:13: in function 'callback'
    ...ames\GTA San Andreas\moonloader\lib\samp\events\core.lua:79: in function <...ames\GTA San Andreas\moonloader\lib\samp\events\core.lua:53>
[ML] (error) ff.lua: Script died due to an error. (23D1534C)
если хочешь добавить там wait пиши дополнительный код перед sampSendChat

Lua:
lua_thread.create(function() -- начинаем поток
    wait(1000) -- код в потоке
end) -- закрываем поток
 
  • Нравится
Реакции: NICKNAME-ANDREW-ZAN9T

cheremuxa

Известный
430
202
Здравствуйте дамы и господа.

Вопрос: Может ли быть такое что
function RPC.onServerMessage
и
function sampev.onServerMessage

Не могут находится в одном скрипте? Потому что ситуация такая то работает либо один, либо второй, но никак оба вместе
rpc и events одно и то же, в чем проблема добавить весь код в одну из функций? :/
 

sep

Известный
681
76
Попробуй так, не знаю сработает ли оно 😅
Lua:
for i = 1, 20 do
   lua_thread.create(function()
      setVirtualKeyDown(18, true)
      wait(20)
      setVirtualKeyDown(18, false)
   end)
end
P.S. Если ты это все делаешь в бесконечном цикле убери это 2 и 6 строку))

изза задержки 1 сек флуд не срабатывает но код работает
код:
if isKeyDown(VK_CONTROL) and isKeyJustPressed(VK_0) then
for i = 1,20 do
setVirtualKeyDown(18, true)
wait(20)
setVirtualKeyDown(18, false)
end
wait(3000)
sampProcessChatInput("/re")
end
 

ufdhbi

Известный
Проверенный
1,459
866
Попробуй так, не знаю сработает ли оно 😅
Lua:
for i = 1, 20 do
   lua_thread.create(function()
      setVirtualKeyDown(18, true)
      wait(20)
      setVirtualKeyDown(18, false)
   end)
end
P.S. Если ты это все делаешь в бесконечном цикле убери это 2 и 6 строку))
зачем 20 потоков, нельзя цикл в один поток?
 
  • Нравится
Реакции: Oreshka23

timurozcan2

Участник
55
2
помогите у меня такая хрень что открываю меню скрипта биндер (lua) ну не могу нажимать на кнопки меню мышка есть на екране ну не нажимается
 

Long Penis

Участник
64
5
помогите сделать так чтобы он водил команду /loto с задержкой, если увидит в чате надпись. ато сразу водит
Код:
local sampev = require "lib.samp.events"
require  "lib.moonloader"
local active = false

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


    sampRegisterChatCommand("startfind",function() sampAddChatMessage("Вы начали поиск.",-1)
    active = not active
    end)
    sampRegisterChatCommand("stopfind",function() sampAddChatMessage("{ADFF2F}{Lovlya loto}{ffffff}Поиск остановлен",-1)
    active = active
    end) ]]--
    while true do
    wait(0)
    end
end


function sampev.onServerMessage(color, text)
    if text:find('Бал', 1, true) then
        sampSendChat('/loto')
    active = true
    
    end
end

function sampev.onShowDialog(dialogId, style, title, button1, button2, text)

    if active and dialogId == 5345 then
        sampSendDialogResponse(5347, 1, 2, nil)
        active = false   
    end
end
 
Последнее редактирование:

СЛожно

Известный
222
35
Как сделать такое окно? И когда нажимаешь на кнопку связь с автором пересылает в вк
 

Вложения

  • C2856960-DE24-4234-BFA0-E37CE2C603CB.png
    C2856960-DE24-4234-BFA0-E37CE2C603CB.png
    2.3 KB · Просмотры: 127

Dmitriy Makarov

25.05.2021
Проверенный
2,500
1,131
помогите сделать так чтобы он водил команду /loto с задержкой, если увидит в чате надпись. ато сразу водит
Код:
local sampev = require "lib.samp.events"
require  "lib.moonloader"
local active = false

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


    sampRegisterChatCommand("startfind",function() sampAddChatMessage("Вы начали поиск.",-1)
    active = not active
    end)
    sampRegisterChatCommand("stopfind",function() sampAddChatMessage("{ADFF2F}{Lovlya loto}{ffffff}Поиск остановлен",-1)
    active = active
    end) ]]--
    while true do
    wait(0)
    end
end


function sampev.onServerMessage(color, text)
    if text:find('Бал', 1, true) then
        sampSendChat('/loto')
    active = true
   
    end
end

function sampev.onShowDialog(dialogId, style, title, button1, button2, text)

    if active and dialogId == 5345 then
        sampSendDialogResponse(5347, 1, 2, nil)
        active = false  
    end
end
Lua:
function sampev.onServerMessage(color, text)
    if text:find("Бал") then
        lua_thread.create(function()
        wait(3000) -- 3с. 1с - 1000мс
        sampSendChat('/loto')
        active = true
        end)
    end
end
Как сделать такое окно? И когда нажимаешь на кнопку связь с автором пересылает в вк
Lua:
if imgui.CollapsingHeader(u8"Информация о скрипте") then
    if imgui.Button(u8"Связаться с автором", imgui.ImVec2(130, 23)) then
        os.execute("start https://vk.com/qwerty")
    end
    imgui.SameLine()
    if imgui.Button(u8"Тема на BlastHack", imgui.ImVec2(130, 23)) then
        os.execute(" start https://blast.hk")
    end
end
Screenshot_1.png

Если у тебя стоит антистиллер (от дарк пикселя к примеру) то у тебя ничего не произойдет если нажать на кнопку, ибо это защита такая от антистиллера
 
Последнее редактирование:
  • Нравится
Реакции: Long Penis