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

tlwsn

Известный
537
85
Мне нужно сделать так: Есть текстовый документ в котором вот такое содержимое:
Как сделать, что бы при вводе команды /z id и номер строки выдавался розыск по той причине, которая указана в текстовом файле + розыск который написан в этой же строке
 

dmitri4

Известный
453
79
Lua:
local file = io.open('moonloader/nick.txt', 'r')
local nick = file:read('*l')
file:close()
if nick:find(sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED)))) then
    sampRegisterChatCommand('test', test)
end
Аналогично, все тоже самое второй по списку ник уже выводит ошибку
Lua:
local file = io.open('moonloader/nick.txt', 'r')
local nick = file:read('*l')
file:close()
if nick:find(sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED)))) then
sampRegisterChatCommand('test', test) else sampAddChatMessage('Ошибка',-1)
end
 

штейн

Известный
Проверенный
1,001
687
Аналогично, все тоже самое второй по списку ник уже выводит ошибку
Lua:
local file = io.open('moonloader/nick.txt', 'r')
local nick = file:read('*l')
file:close()
if nick:find(sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED)))) then
sampRegisterChatCommand('test', test) else sampAddChatMessage('Ошибка',-1)
end
значит проблема не в коде
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,639
2,489
Последнее редактирование:
  • Нравится
Реакции: dmitri4

vova2999

Известный
65
24
Обьясните как можно более развернуто (можно даже просто ссылки на нужную мне литературу) как реализовать бег к определенный точке, сколько бы не бился
с BeginToPoint но не хочет робить
да да я ламер
да да я скрипт киди
на форумах был
гуглил
 

_-Sasha-_

Новичок
24
1
Допустим, что после ввода команды /help сервер выводит тебе в чат сообщение "Вы ввели команду /help. Молодец!". Можно ли с помощью lua как-то скрыть это сообщение, что бы я его не видел? Я догадываюсь, что реализация сего действия как-то связана с отдельным чатом.
 

sdfaw

Активный
718
150
как сделать задержку в sampProcessChatInput ?
пробовал wait выдаёт ошибку в логе и когда нажимаю на кнопку выходит только первая строка и закрывается окно imgui.
[ML] (error) mo.lua: D:\ss\GTA San Andreas\moonloader\mo.lua:148: attempt to yield across C-call boundary
stack traceback:
[C]: in function 'wait'
D:\ss\GTA San Andreas\moonloader\mo.lua:148: in function 'OnDrawFrame'
D:\ss\GTA San Andreas\moonloader\lib\imgui.lua:1378: in function <D:\ss\GTA San Andreas\moonloader\lib\imgui.lua:1367>
[ML] (error) mo.lua: Script died due to an error. (0685674C)


if imgui.Button('Go') then
sampProcessChatInput ('парапампам')
wait(1500)
sampProcessChatInput ('турурутуру')
wait(1500)
sampProcessChatInput ('тыщтыщтыщкур')
wait(1500)
sampProcessChatInput ('тестовый')
wait(1500)
sampProcessChatInput ('прампрампарм')
wait(500)
end
 

dmitri4

Известный
453
79
if imgui.Button('Go') then
sampProcessChatInput ('парапампам')
wait(1500)
sampProcessChatInput ('турурутуру')
wait(1500)
sampProcessChatInput ('тыщтыщтыщкур')
wait(1500)
sampProcessChatInput ('тестовый')
wait(1500)
sampProcessChatInput ('прампрампарм')
wait(500)
end
Если тебе нужна отправка сообщений то используй sampSendChat
 

Fuexie

Известный
108
30
Допустим, что после ввода команды /help сервер выводит тебе в чат сообщение "Вы ввели команду /help. Молодец!". Можно ли с помощью lua как-то скрыть это сообщение, что бы я его не видел? Я догадываюсь, что реализация сего действия как-то связана с отдельным чатом.
Lua:
sampSetChatString(99, "", "", 0x00FFFFFF, 0x00FFFFFF) -- 99 - номер строки, 99 - последняя строка.
Он сделает его невидимым, как пустое сообщение.
 

_-Sasha-_

Новичок
24
1
как сделать задержку в sampProcessChatInput ?
пробовал wait выдаёт ошибку в логе и когда нажимаю на кнопку выходит только первая строка и закрывается окно imgui.
[ML] (error) mo.lua: D:\ss\GTA San Andreas\moonloader\mo.lua:148: attempt to yield across C-call boundary
stack traceback:
[C]: in function 'wait'
D:\ss\GTA San Andreas\moonloader\mo.lua:148: in function 'OnDrawFrame'
D:\ss\GTA San Andreas\moonloader\lib\imgui.lua:1378: in function <D:\ss\GTA San Andreas\moonloader\lib\imgui.lua:1367>
[ML] (error) mo.lua: Script died due to an error. (0685674C)


if imgui.Button('Go') then
sampProcessChatInput ('парапампам')
wait(1500)
sampProcessChatInput ('турурутуру')
wait(1500)
sampProcessChatInput ('тыщтыщтыщкур')
wait(1500)
sampProcessChatInput ('тестовый')
wait(1500)
sampProcessChatInput ('прампрампарм')
wait(500)
end

Lua:
if imgui.Button('Go') then
   lua_thread.create(function()
      sampProcessChatInput ('парапампам')
      wait(1500)
      sampProcessChatInput ('турурутуру')
      wait(1500)
      sampProcessChatInput ('тыщтыщтыщкур')
      wait(1500)
      sampProcessChatInput ('тестовый')
      wait(1500)
      sampProcessChatInput ('прампрампарм')
      wait(500)
   end)
end

lua_thread.create() создаёт поток, внутри которого можно использовать wait()
 
Последнее редактирование:

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,639
2,489
Допустим, что после ввода команды /help сервер выводит тебе в чат сообщение "Вы ввели команду /help. Молодец!". Можно ли с помощью lua как-то скрыть это сообщение, что бы я его не видел? Я догадываюсь, что реализация сего действия как-то связана с отдельным чатом.
Lua:
sampSetChatString(99, "", "", 0x00FFFFFF, 0x00FFFFFF) -- 99 - номер строки, 99 - последняя строка.
Он сделает его невидимым, как пустое сообщение.
https://blast.hk/threads/14624/

как сделать задержку в sampProcessChatInput ?
пробовал wait выдаёт ошибку в логе и когда нажимаю на кнопку выходит только первая строка и закрывается окно imgui.
[ML] (error) mo.lua: D:\ss\GTA San Andreas\moonloader\mo.lua:148: attempt to yield across C-call boundary
stack traceback:
[C]: in function 'wait'
D:\ss\GTA San Andreas\moonloader\mo.lua:148: in function 'OnDrawFrame'
D:\ss\GTA San Andreas\moonloader\lib\imgui.lua:1378: in function <D:\ss\GTA San Andreas\moonloader\lib\imgui.lua:1367>
[ML] (error) mo.lua: Script died due to an error. (0685674C)


if imgui.Button('Go') then
sampProcessChatInput ('парапампам')
wait(1500)
sampProcessChatInput ('турурутуру')
wait(1500)
sampProcessChatInput ('тыщтыщтыщкур')
wait(1500)
sampProcessChatInput ('тестовый')
wait(1500)
sampProcessChatInput ('прампрампарм')
wait(500)
end
Lua:
if imgui.Button('Go') then
   lua_thread.create(function()
      sampProcessChatInput ('парапампам')
      wait(1500)
      sampProcessChatInput ('турурутуру')
      wait(1500)
      sampProcessChatInput ('тыщтыщтыщкур')
      wait(1500)
      sampProcessChatInput ('тестовый')
      wait(1500)
      sampProcessChatInput ('прампрампарм')
      wait(500)
   end)
end

lua.thread.create() создаёт поток, внутри которого можно использовать wait()

Lua:
if imgui.Button('Go') then
   lua_thread.create(function()
      sampSendChat('парапампам')
      wait(1500)
      sampSendChat('турурутуру')
      wait(1500)
      sampSendChat ('тыщтыщтыщкур')
      wait(1500)
      sampSendChat('тестовый')
      wait(1500)
      sampSendChat('прампрампарм')
      wait(500)
   end)
end
:monkey:
 
  • Нравится
Реакции: _-Sasha-_

_-Sasha-_

Новичок
24
1
Каким образом можно сделать 2 действия на одну кнопку? К примеру, при первичном нажатии запускается цикл какой-нибудь, при повторном цикл останавливается.
 

l Piko l

Известный
57
15
Lua:
while true do
    wait (0)
    if Activation == 1 then
        for ID = 0, 1000 do
            if sampIsPlayerConnected(ID) then
            handle = sampGetCharHandleBySampPlayerId(ID)
            X, Y, Z = getCharCoordinates(PLAYER_PED)
                XX, YY, ZZ = getCharCoordinates(handle)
                distance = getDistanceBetweenCoords3d(X, Y, Z, XX, YY, ZZ)
                sampAddChatMessage('{00CED1}[hotdog]: {FFFfff} Player ['..ID..'] Connected distance ['..distance..']', 0xFFFfff)
                wait (750)
                end
            end
        end
    end
end

[ML] (error) hotdog: opcode '00A0' call caused an unhandled exception
stack traceback:
[C]: in function 'getCharCoordinates'
D:\SAMP\moonloader\hotdog: opcode.lua:24: in function <D:\SAMP\moonloader\hotdog: opcode.lua:9>
[ML] (error) hotdog: opcode: Script died due to an error. (16FE57DC)

Как правильно получить координаты игрока
Если что не мои
 

sdfaw

Активный
718
150
Lua:
if imgui.Button('Go') then
   lua_thread.create(function()
      sampSendChat('парапампам')
      wait(1500)
      sampSendChat('турурутуру')
      wait(1500)
      sampSendChat ('тыщтыщтыщкур')
      wait(1500)
      sampSendChat('тестовый')
      wait(1500)
      sampSendChat('прампрампарм')
      wait(500)
   end)
end
:monkey:[/QUOTE]
не получается, тоже самое всё
 

_-Sasha-_

Новичок
24
1
Lua:
if imgui.Button('Go') then
   lua_thread.create(function()
      sampSendChat('парапампам')
      wait(1500)
      sampSendChat('турурутуру')
      wait(1500)
      sampSendChat ('тыщтыщтыщкур')
      wait(1500)
      sampSendChat('тестовый')
      wait(1500)
      sampSendChat('прампрампарм')
      wait(500)
   end)
end
:monkey:
не получается, тоже самое всё[/QUOTE]


Lua:
if imgui.Button('test') then
        lua_thread.create(function()
          sampAddChatMessage('парапампам', 0xFFFFFF)
          wait(1000)
          sampAddChatMessage('турутутуту', 0xFFFFFF)
        end)
    end

У меня почему-то всё работает