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

Sam_Monroe

Известный
58
2
Может у кого-то есть простой скрипт с диалоговым окном, где при нажатии на пункт, будет прописываться команда? Мне просто легче разбирать готовые макеты, чем с нуля пытаться написать
 
D

deleted-user-422095

Гость
Lua:
require 'lib.moonloader'
local keys = require 'vkeys'
local ip, port = sampGetCurrentServerAddress()
local ips = '185.169.134.67'

function main()
    if ip == ips then
        sampAddChatMessage('Sobaka', -1)
    end
end
qq, скрипт рабочий, только вот при первом запуске игры выдает ошибку, если дальше перезагрузить, то без вопросов работает, в чем беда?
Ошибка ниже:

[ML] (error) huina.lua: opcode '0B39' call caused an unhandled exception
stack traceback:
[C]: in function 'sampGetCurrentServerAddress'
C:\Users\User\Desktop\kichiro\moonloader\huina.lua:3: in main chunk
Самп не мгновенно инициализируется
В main делай проверку isSampAvailable() циклом. Затем уже используй в main функцию sampGetCurrentServerAddress
 

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113
Может у кого-то есть простой скрипт с диалоговым окном, где при нажатии на пункт, будет прописываться команда? Мне просто легче разбирать готовые макеты, чем с нуля пытаться написать
Lua:
require "lib.moonloader" -- Для макроса "DIALOG_STYLE_LIST". Если мешает – убери и DIALOG_STYLE_LIST замени на цифру 2.

function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand("dialog", function() -- Команда вызова диалога: /dialog
        sampShowDialog(1, "Caption", "List 1\nList 2", "Select", "Close", DIALOG_STYLE_LIST)
    end)
    while true do wait(0)
        local result, button, list, input = sampHasDialogRespond(1) -- 1 – ID диалога
        if result then
            if button == 1 then -- Можно сократить как: if button == 1 and list == 0 then
                if list == 0 then -- Строки начинаются с 0.
                    sampSendChat("/команда")
                elseif list == 1 then
                    sampSendChat("/команда2")
                end
            end
        end
    end
end
Тут ещё пример:
 

alarm0

Участник
44
3
а можно ли узнать оружие локал педа которое в разных слотах, а не только то которое в руках? есть ли для этого функция(-и)?
 

CocoJamba

Новичок
23
10
Посоветуйте пожалуйста библиотеку или чёнибудь под lua ,что бы я в скрипте мог отслеживать в реал тайме ввод игрока в чат, если не знаете под луа тогда asi или cleo
Т.е игрок начинает писать допустим : "А" и не закрывая строку ввода или не отправляя в чат эту "А" - в чат выводилось "А"
 

hasler

Новичок
16
1
z:
require("addon")

newTask(function()
    sendInput("/meatbag")
    wait(31000)
    sendInput("/meatbag")
end)

Решил написать скрипт автоеды для raksamp, я в этом не особо разбираюсь но почему-то не работает. Подскажите, что сделал не так?
 

genius.company

Известный
586
266
Lua:
require 'lib.moonloader'
local keys = require 'vkeys'
local ip, port = sampGetCurrentServerAddress()
local ips = '185.169.134.67'

function main()
    if ip == ips then
        sampAddChatMessage('Sobaka', -1)
    end
end
qq, скрипт рабочий, только вот при первом запуске игры выдает ошибку, если дальше перезагрузить, то без вопросов работает, в чем беда?
Ошибка ниже:

[ML] (error) huina.lua: opcode '0B39' call caused an unhandled exception
stack traceback:
[C]: in function 'sampGetCurrentServerAddress'
C:\Users\User\Desktop\kichiro\moonloader\huina.lua:3: in main chunk
пиздак:
require 'lib.moonloader'
local keys = require 'vkeys'
local ip, port = sampGetCurrentServerAddress()
local ips = '185.169.134.67'

function main()
    while not isSampAvailable() do wait(0) end
    if ip == ips then
        sampAddChatMessage('Sobaka', -1)
    end
end
 

Andrinall

Известный
678
531
Lua:
require 'lib.moonloader'
local keys = require 'vkeys'
local ip, port = sampGetCurrentServerAddress()
local ips = '185.169.134.67'

function main()
    if ip == ips then
        sampAddChatMessage('Sobaka', -1)
    end
end
qq, скрипт рабочий, только вот при первом запуске игры выдает ошибку, если дальше перезагрузить, то без вопросов работает, в чем беда?
Ошибка ниже:

[ML] (error) huina.lua: opcode '0B39' call caused an unhandled exception
stack traceback:
[C]: in function 'sampGetCurrentServerAddress'
C:\Users\User\Desktop\kichiro\moonloader\huina.lua:3: in main chunk
получаешь адрес сервера до инициализации сампа

Lua:
local ips = { "185.169.134.67", 7777 }
function main()
    repeat wait(100) until isSampAvailable()
    local ip, port = sampGetCurrentServerAddress()
    if ip == ips[1] and port == ips[2] then
        sampAddChatMessage('Sobaka', -1)
    end
    wait(-1)
end

а можно ли узнать оружие локал педа которое в разных слотах, а не только то которое в руках? есть ли для этого функция(-и)?
Возможно это подойдёт.
int weapon, int ammo, Model modelId = getCharWeaponInSlot(Ped ped, int slot) -- 04B8

local weapon, ammoCount, modelId = getCharWeaponInSlot(PLAYER_PED, 4)
 
  • Нравится
  • Эм
Реакции: genius.company и alarm0

sosnov

Известный
331
115
мой вопрос может показаться тупым, но не пиздите меня, пожалуйста, вообщем, я хочу использовать записанные мной маршруты в скрипте от ковра(routes recorder вроде), я уже всё попробовал, но не вышло(если я долбаёб то скажите)
к примеру в моём имгуи меню будет кнопка "начать маршрут", при нажатии на неё, будет проигрываться первый маршрут, как это сделать?
 

SyLvy

Активный
231
25
1687166055134.png

Есть ли какая-нибудь функция, которая может автоматически заполнять этот ввод текстом и автоматически нажимать кнопку ввода?
 

ChromiusJ

x B x A x R x
Друг
4,872
3,174

SyLvy

Активный
231
25
По крайней мере, у меня это не работает, это строка:
Lua:
   function puiu()
   sampSendChat('/ignore')
               lua_thread.create(function() wait(50)
               wait(150)
   sampSendDialogResponse(sampGetCurrentDialogId(), 1, 0, nil)
   sampSendDialogResponse(sampGetCurrentDialogId(), 1, 0, "cacaloco")
   sampCloseCurrentDialogWithButton(1)
   end)
   end
 

Дядя Энрик.

Активный
317
74
чем можно заменить или как сделать по-другому чтоб сохранял стиль гуи?
это функция вызывает стили гуи
Lua:
SwitchTheStyle(config.styles.theme)

мой вопрос может показаться тупым, но не пиздите меня, пожалуйста, вообщем, я хочу использовать записанные мной маршруты в скрипте от ковра(routes recorder вроде), я уже всё попробовал, но не вышло(если я долбаёб то скажите)
к примеру в моём имгуи меню будет кнопка "начать маршрут", при нажатии на неё, будет проигрываться первый маршрут, как это сделать?
Lua:
if imgui.Button(u8'Начать маршрут') then
--cod
end
 
Последнее редактирование:
  • Злость
Реакции: sosnov

sosnov

Известный
331
115
чем можно заменить или как сделать по-другому чтоб сохранял стиль гуи?
это функция вызывает стили гуи
Lua:
SwitchTheStyle(config.styles.theme)


Lua:
if imgui.Button(u8'Начать маршрут') then
--cod
end
ты меня не понял, я знаю как делать кнопку мимгуи, мне надо использовать маршруты записанные скриптом ковра, в моём скрипте(я пробовал читать файл дата.txt через опен файл, и в последствии пытаться идти к координатам таким способом, но не вышло, возможно я глупый просто)