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

Domino

Участник
326
15
Как в диалоговом окне (ид 32700) выбрать 2 строчку , так?
sampSendDialogResponse(32700, 0, 1, А ТУТ ЧТО?)
 

Domino

Участник
326
15
Почему не выбирает 2 строчку в окне?
Lua:
require 'moonloader'

function main()
   while not isSampAvailable() do wait(0) end
   while true do
       wait(0)
 if isKeyJustPressed(46) then
sampSendChat("/roll")
sampSendDialogResponse(32700, 0, 1, "")
end
end
end
 

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,891
1,254
Почему не выбирает 2 строчку в окне?
Lua:
require 'moonloader'

function main()
   while not isSampAvailable() do wait(0) end
   while true do
       wait(0)
if isKeyJustPressed(46) then
sampSendChat("/roll")
sampSendDialogResponse(32700, 0, 1, "")
end
end
end
пробуй делать задержку между sampsendchat и sampsenddialogresponse
 

Quasper

Известный
834
354
Почему не выбирает 2 строчку в окне?
Lua:
require 'moonloader'

function main()
   while not isSampAvailable() do wait(0) end
   while true do
       wait(0)
if isKeyJustPressed(46) then
sampSendChat("/roll")
sampSendDialogResponse(32700, 0, 1, "")
end
end
end
Потому что после ввода команды идёт отправка данных на сервер это занимает N'ное кол-во времени затем сервер отправляет тебе этот диалог, опять же это занимает некоторое время. А ты сразу же после ввода команды шлёшь нажатие в диалоге.
Используй свой пинг умноженный на 2 как задержку после отправки команды "/roll"
 

Sakura San

Активный
134
89
Lua:
[/B]
script_name('DialogBasedBinder')
script_author('Laine_prikol')
require("config.dialogbind")
function secondThread()
  while true do
    wait(0)
    if isKeyDown(Key1) and isKeyDown(Key2) then
      diastr = table.concat(tabls, "\n")
      sampShowDialog(402, "DialogBasedBinder by Laine_prikol",diastr, "Send", "Exit", 2)
    end
  end
end
function main()
  while not isSampAvailable() do wait(100) end
    local thread1 = lua_thread.create(secondThread, true)
    wait(3000)
    sampRegisterChatCommand("diabind", openmenus)
    file = io.open("moonloader/BinderDialog.cfg", "r")
    if file == nil then
      io.open("moonloader/BinderDialog.cfg", "w"):close()
    end
    if file ~= nil then
      mess = file:read("*a")
      tabls = {}
      for line in io.lines('moonloader/BinderDialog.cfg') do
        tabls[#tabls + 1] = line
      end
      io.close(file)
      sampAddChatMessage("DialogBasedBinder by Laine_prikol loaded! Loaded words: "..#tabls, 0x00ff00)
    end
    thread1:run()
    while true do
      wait(0)
      local resultMain, buttonMain, listMain = sampHasDialogRespond(402)
      if resultMain then
        if buttonMain == 1 then
          local _, yourid = sampGetPlayerIdByCharHandle(playerPed)
          youname = sampGetPlayerNickname(yourid)
          NameNOMG = string.gsub(youname, "_", " ")
          endstr = string.gsub(tabls[listMain + 1], "VAR_NAME", youname)
          endstr = string.gsub(endstr, "VAR_ID", yourid)
          endstr = string.gsub(endstr, "VAR_NOMG", NameNOMG)
          sampSendChat(endstr)
        end
      end
    end
end
[B]

Как сделать так, чтобы сообщение выводилось в чат с пробелом в конце, но не отправлялось?
 

Quasper

Известный
834
354
Lua:
[/B]
script_name('DialogBasedBinder')
script_author('Laine_prikol')
require("config.dialogbind")
function secondThread()
  while true do
    wait(0)
    if isKeyDown(Key1) and isKeyDown(Key2) then
      diastr = table.concat(tabls, "\n")
      sampShowDialog(402, "DialogBasedBinder by Laine_prikol",diastr, "Send", "Exit", 2)
    end
  end
end
function main()
  while not isSampAvailable() do wait(100) end
    local thread1 = lua_thread.create(secondThread, true)
    wait(3000)
    sampRegisterChatCommand("diabind", openmenus)
    file = io.open("moonloader/BinderDialog.cfg", "r")
    if file == nil then
      io.open("moonloader/BinderDialog.cfg", "w"):close()
    end
    if file ~= nil then
      mess = file:read("*a")
      tabls = {}
      for line in io.lines('moonloader/BinderDialog.cfg') do
        tabls[#tabls + 1] = line
      end
      io.close(file)
      sampAddChatMessage("DialogBasedBinder by Laine_prikol loaded! Loaded words: "..#tabls, 0x00ff00)
    end
    thread1:run()
    while true do
      wait(0)
      local resultMain, buttonMain, listMain = sampHasDialogRespond(402)
      if resultMain then
        if buttonMain == 1 then
          local _, yourid = sampGetPlayerIdByCharHandle(playerPed)
          youname = sampGetPlayerNickname(yourid)
          NameNOMG = string.gsub(youname, "_", " ")
          endstr = string.gsub(tabls[listMain + 1], "VAR_NAME", youname)
          endstr = string.gsub(endstr, "VAR_ID", yourid)
          endstr = string.gsub(endstr, "VAR_NOMG", NameNOMG)
          sampSendChat(endstr)
        end
      end
    end
end
[B]

Как сделать так, чтобы сообщение выводилось в чат с пробелом в конце, но не отправлялось?

Lua:
endstr = endstr .. " "
sampSetChatInputText(endstr)
sampSetChatInputEnabled(true)
 
  • Нравится
Реакции: Sakura San

ГОХА | GoxaShow

В АРМИИ С 12.12,ЗАКАЗЫ НЕ ДЕЛАЮ,ТУПЫЕ ВОПРОСЫ-НАХУ
Проверенный
1,835
1,843
привет, подскажите, как из этого диалога !серверного! убрать ебучие новые дома дно зоны, они заебали просто уже
38026

кому нужен текст диалога
Код:
{FFFFFF}
1. Дом        Слетит через: {C9B931}1{FFFFFF} Payday.
2. Дом        Слетит через: {C9B931}1{FFFFFF} Payday.
3. Дом        Слетит через: {C9B931}3{FFFFFF} Payday.
4. Дом        Слетит через: {C9B931}6{FFFFFF} Payday.
5. Дом        ID: {C9B931}1054{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
6. Дом        ID: {C9B931}1055{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
7. Дом        ID: {C9B931}1056{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
8. Дом        ID: {C9B931}1057{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
9. Дом        ID: {C9B931}1058{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
10. Дом        ID: {C9B931}1059{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
11. Дом        ID: {C9B931}1060{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
12. Дом        ID: {C9B931}1061{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
13. Дом        ID: {C9B931}1062{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
14. Дом        ID: {C9B931}1063{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
15. Дом        ID: {C9B931}1064{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
16. Дом        ID: {C9B931}1065{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
17. Дом        ID: {C9B931}1066{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
18. Дом        ID: {C9B931}1067{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
19. Дом        ID: {C9B931}1068{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
Эта информация может быть {1EA3CC}ошибочной.{FFFFFF}

Используйте {1EA3CC}/findihouse ID{FFFFFF}, чтобы найти нужный вам дом. Стоимость {1EA3CC}1500$.{FFFFFF}
{FF5B14}ID{FFFFFF} дома отображается только у {FF5B14}слетевших{FFFFFF} домов!
 

Domino

Участник
326
15
Как сделать, чтобы после этого ....

Lua:
sampSendChat("/prestige")
wait(5)
sampSendDialogResponse(32700, 1, 1, "")
sampSendDialogResponse(32700, 1, 0, "")
sampSendDialogResponse(32700, 1, 2, "")
закрывалось серверное диалоговое окно
 

DolgorukovGTA

Известный
Проверенный
652
345
Как сделать, чтобы после этого ....

Lua:
sampSendChat("/prestige")
wait(5)
sampSendDialogResponse(32700, 1, 1, "")
sampSendDialogResponse(32700, 1, 0, "")
sampSendDialogResponse(32700, 1, 2, "")
закрывалось серверное диалоговое окно
Lua:
sampCloseCurrentDialogWithButton(0)
Работу с пакетами можно осуществить через SAMP.lua также:
Lua:
local sampev = require "lib.samp.events"

function sampev.onShowDialog(id) -- не ввожу все параметры, ибо для примера хук будет ставиться по ID
    if id == 228 then -- проверка на Id, если id равен 228, то ...
        sampCloseCurrentDialogWithButton(0); return false -- закрываем физический диалог и отклоняем серверный пакет
    end
end
 

astynk

Известный
Проверенный
742
530
Lua:
sampCloseCurrentDialogWithButton(0)
Работу с пакетами можно осуществить через SAMP.lua также:
Lua:
local sampev = require "lib.samp.events"

function sampev.onShowDialog(id) -- не ввожу все параметры, ибо для примера хук будет ставиться по ID
    if id == 228 then -- проверка на Id, если id равен 228, то ...
        sampCloseCurrentDialogWithButton(0); return false -- закрываем физический диалог и отклоняем серверный пакет
    end
end
Диалог еще не создан на момент срабатывания хука, sampCloseCurrentDialogWithButton не закроет его, хотя из-за return false будет иллюзия, что все сработало как надо.
привет, подскажите, как из этого диалога !серверного! убрать ебучие новые дома дно зоны, они заебали просто уже
Посмотреть вложение 38026
кому нужен текст диалога
Код:
{FFFFFF}
1. Дом        Слетит через: {C9B931}1{FFFFFF} Payday.
2. Дом        Слетит через: {C9B931}1{FFFFFF} Payday.
3. Дом        Слетит через: {C9B931}3{FFFFFF} Payday.
4. Дом        Слетит через: {C9B931}6{FFFFFF} Payday.
5. Дом        ID: {C9B931}1054{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
6. Дом        ID: {C9B931}1055{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
7. Дом        ID: {C9B931}1056{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
8. Дом        ID: {C9B931}1057{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
9. Дом        ID: {C9B931}1058{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
10. Дом        ID: {C9B931}1059{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
11. Дом        ID: {C9B931}1060{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
12. Дом        ID: {C9B931}1061{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
13. Дом        ID: {C9B931}1062{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
14. Дом        ID: {C9B931}1063{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
15. Дом        ID: {C9B931}1064{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
16. Дом        ID: {C9B931}1065{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
17. Дом        ID: {C9B931}1066{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
18. Дом        ID: {C9B931}1067{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
19. Дом        ID: {C9B931}1068{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
Эта информация может быть {1EA3CC}ошибочной.{FFFFFF}

Используйте {1EA3CC}/findihouse ID{FFFFFF}, чтобы найти нужный вам дом. Стоимость {1EA3CC}1500$.{FFFFFF}
{FF5B14}ID{FFFFFF} дома отображается только у {FF5B14}слетевших{FFFFFF} домов!
Какие конкретно строчки убрать надо?
 

ГОХА | GoxaShow

В АРМИИ С 12.12,ЗАКАЗЫ НЕ ДЕЛАЮ,ТУПЫЕ ВОПРОСЫ-НАХУ
Проверенный
1,835
1,843
Диалог еще не создан на момент срабатывания хука, sampCloseCurrentDialogWithButton не закроет его, хотя из-за return false будет иллюзия, что все сработало как надо.

Какие конкретно строчки убрать надо?
иды и надпись слетел, чтобы осталось дом и слетит через сколько
 

DolgorukovGTA

Известный
Проверенный
652
345
Диалог еще не создан на момент срабатывания хука, sampCloseCurrentDialogWithButton не закроет его, хотя из-за return false будет иллюзия, что все сработало как надо.

Какие конкретно строчки убрать надо?
У нас нас тринити, если не сделаешь закрытие диалога через sampCloseCurrentDialogWithButton(0) будет писать на подобии "закройте диалоговые окна". Особенно это заметно, когда несколько диалогов перебираешь. Поэтому всегда его использую при нопе диалога (не знаю, как обстоит с этим на других серверах).
 

BIG BOG

Известный
654
141
Если я пишу /cmd a b c, то как я могу a, b, c записать в три разные переменные?