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

MLycoris

На вид оружие массового семяизвержения
Проверенный
1,980
2,201
Помогите, писал код для imgui окна но он что-то не сработал
Lua:
require "lib.moonloader"
 
local vkeys = require "vkeys"
local imgui = require "imgui"
 
local main_window_state = imgui.ImBool()
 
function imgui.OnDrawFrame()
 if main_window_state.v then
 imgui.SetNextWindowSize(imgui.ImVec2(150, 200), imgui.Cond.FirstUseEver)
 imgui.Begin("Меню", main_window_state)
 imgui.Text("сглыпа")
 if imgui.button('Press Me') then
 printStringNow('Button Pressed! 1800')
 end
 imgui.End()
 end
end
 
function main()
 while true do
 wait(0)
 if isKeyPressed(vkeys.VK_X) then
 main_window_state.v = not main_window_state.v
 end
 imgui.ProcessEvents()
 end
end
 

Carl_Henderson

Участник
35
8
Как исправить чтобы каждая команда была с новой строчки? (( Вставил скрин ))

и вот ещё код на всякий:


Lua:
local imgui = require 'mimgui' — подключаем библиотеку мимгуи
 
local encoding = require 'encoding' — подключаем библиотеку для работы с разными кодировками
encoding.default = 'CP1251' — задаём кодировку по умолчанию
local u8 = encoding.UTF8 — это позволит нам писать задавать названия/текст на кириллице
 
local new = imgui.new — создаём короткий псевдоним для удобства
local WinState = new.bool() — создаём буффер для открытия окна
 
imgui.OnFrame(function() return WinState[0] end,
 function(player)
 imgui.SetNextWindowPos(imgui.ImVec2(500,500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5)) — отвечает за положение окна на экране
 imgui.SetNextWindowSize(imgui.ImVec2(245, 280), imgui.Cond.Always) — отвечает за размер окна
 imgui.Begin(u8'Меню. Сборка Carl_Henderson', WinState, imgui.WindowFlags.NoResize) — отвечает за отображение окна, его заголовок и флаги
  if imgui.CollapsingHeader(u8'Сглыпа: команды') then
 imgui.TextWrapped(u8'команды:/clon - включения скрипта. /cloff - отключения скрипта. /slm - Проверка работоспособности скрипта. *примечание: скрипт автоматические запускается при входе в игру')
 if imgui.Button(u8'Включить сглыпу') then
 sampSendChat("/slon")
end
 if imgui.Button(u8'Выключить сглыпу') then
 sampSendChat("/sloff")
end
 if imgui.Button(u8'Проверка работоспособности') then
 sampSendChat("/sl")
end
 imgui.Separator()
end
 
 if imgui.Button('Button') then
 sampAddChatMessage('Вы нажали кнопку',-1)
end
 imgui.End()
 end
)
 
function main()
 sampRegisterChatCommand('cc', function() WinState[0] = not WinState[0] end) — команда по которой будет вызываться наше окно
 wait(-1)
end
 

Andrinall

Известный
701
520
Как исправить чтобы каждая команда была с новой строчки? (( Вставил скрин ))

и вот ещё код на всякий:


Lua:
local imgui = require 'mimgui' — подключаем библиотеку мимгуи
 
local encoding = require 'encoding' — подключаем библиотеку для работы с разными кодировками
encoding.default = 'CP1251' — задаём кодировку по умолчанию
local u8 = encoding.UTF8 — это позволит нам писать задавать названия/текст на кириллице
 
local new = imgui.new — создаём короткий псевдоним для удобства
local WinState = new.bool() — создаём буффер для открытия окна
 
imgui.OnFrame(function() return WinState[0] end,
 function(player)
 imgui.SetNextWindowPos(imgui.ImVec2(500,500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5)) — отвечает за положение окна на экране
 imgui.SetNextWindowSize(imgui.ImVec2(245, 280), imgui.Cond.Always) — отвечает за размер окна
 imgui.Begin(u8'Меню. Сборка Carl_Henderson', WinState, imgui.WindowFlags.NoResize) — отвечает за отображение окна, его заголовок и флаги
  if imgui.CollapsingHeader(u8'Сглыпа: команды') then
 imgui.TextWrapped(u8'команды:/clon - включения скрипта. /cloff - отключения скрипта. /slm - Проверка работоспособности скрипта. *примечание: скрипт автоматические запускается при входе в игру')
 if imgui.Button(u8'Включить сглыпу') then
 sampSendChat("/slon")
end
 if imgui.Button(u8'Выключить сглыпу') then
 sampSendChat("/sloff")
end
 if imgui.Button(u8'Проверка работоспособности') then
 sampSendChat("/sl")
end
 imgui.Separator()
end
 
 if imgui.Button('Button') then
 sampAddChatMessage('Вы нажали кнопку',-1)
end
 imgui.End()
 end
)
 
function main()
 sampRegisterChatCommand('cc', function() WinState[0] = not WinState[0] end) — команда по которой будет вызываться наше окно
 wait(-1)
end
Мб так по простому костыльнуть.
imgui.TextWrapped((u8'команды:/clon - включения скрипта. /cloff - отключения скрипта. /slm - Проверка работоспособности скрипта. *примечание: скрипт автоматические запускается при входе в игру'):gsub("%.", ".\n"))
 
  • Нравится
Реакции: YarikVL и Carl_Henderson

Carl_Henderson

Участник
35
8
Мб так по простому костыльнуть.
imgui.TextWrapped((u8'команды:/clon - включения скрипта. /cloff - отключения скрипта. /slm - Проверка работоспособности скрипта. *примечание: скрипт автоматические запускается при входе в игру'):gsub("%.", ".\n"))
Слушай, ещё помоги кое где:
Lua:
if imgui.Button(u8'Хилл') then
 sampSendChat("/do У Карла в кармане рюкзака лежит баночка с обезбаливающим.")
 wait(900)
 sampSendChat("/me достал баночку из кармана, затем открутил крышку банки")
 wait(900)
 sampSendChat("/me немного повернул банку и достал одну таблетку")
 wait(900)
 sampSendChat("/me повернул банку назад, затем закрутил крышку и положил в карман")
 wait(900)
 sampSendChat("/me поднёс руку ко рту, затем закинул таблетку и проглатил её")
 wait(900)
 sampSendChat("Здоров как бык")
 wait(900)
 sampSendChat("/healme")

После нажатия кнопки в Имгаи срабатывает только 1 анимка, выключается это окно и больше не работает, что делать
 

YarikVL

Известный
Проверенный
4,729
1,815
Слушай, ещё помоги кое где:
Lua:
if imgui.Button(u8'Хилл') then
 sampSendChat("/do У Карла в кармане рюкзака лежит баночка с обезбаливающим.")
 wait(900)
 sampSendChat("/me достал баночку из кармана, затем открутил крышку банки")
 wait(900)
 sampSendChat("/me немного повернул банку и достал одну таблетку")
 wait(900)
 sampSendChat("/me повернул банку назад, затем закрутил крышку и положил в карман")
 wait(900)
 sampSendChat("/me поднёс руку ко рту, затем закинул таблетку и проглатил её")
 wait(900)
 sampSendChat("Здоров как бык")
 wait(900)
 sampSendChat("/healme")

После нажатия кнопки в Имгаи срабатывает только 1 анимка, выключается это окно и больше не работает, что делать
Поток надо юзать для использование задержек:
lua_thread.create(function()

end)
 

Carl_Henderson

Участник
35
8
Помогите пожалуйста, пишу скрипт который будет сообщать когда я был ранен, но не понимаю с чего начинать.
 

chromiusj

fullstack eblan
Модератор
5,819
4,141
  • Нравится
Реакции: YarikVL
D

deleted-user-139653

Гость
Можно ли как-то заменить прицел прям в игре через скриптик?
 

YarikVL

Известный
Проверенный
4,729
1,815
Можно ли как-то заменить прицел прям в игре через скриптик?
Можно рисовать:
 
  • Вау
Реакции: deleted-user-139653
D

deleted-user-139653

Гость
Можно рисовать:
Чёт вроде бы смотрел, не нашел(
 
  • Эм
Реакции: YarikVL

histor

Известный
191
138
День добрый.
На лаунчере аризоны функция changeBlipColor() работает некорректно. (цвет не изменяется если указать HEX, но если в качестве цвета вы используете id любого игрока на сервере, тогда маркер на карте принимает цвет данного игрока)
Как это исправить? Можно ли создать такую же функцию, но под лаунчер аризоны?
Буду очень благодарен, если найдёте решение данной проблемы)
 

SUNDU4OK

Новичок
13
2
Добрый день, нашёл скрипт мне подходящий, если кто-то сможет сделать активацию по кнопке чтоб на фрапсе непалить
lua:
local samp =  require 'samp.events'

local state = false
local counter = {}

function main()
while not isSampAvailable() do wait(0) end wait(1)
wait(1300)
sampAddChatMessage("{FFFFFF}[{4b8078}by suzuchka{FFFFFF}] - {4b6980}Loaded",-1)
    sampRegisterChatCommand('timet', function()
        state = not state
    end)
    
    sampRegisterChatCommand('rstream', function()
        for _, ped in ipairs(getAllChars()) do
            if doesCharExist(ped) and ped ~= PLAYER_PED then
                removePlayer(select(2, sampGetPlayerIdByCharHandle(ped)))
            end
        end
    end)

    while true do wait(0)
        if state then
            for k, v in ipairs(counter) do
                if (os.clock() - v) > 1.0 then
                    table.remove(counter, k)
                end
            end
            setGameKeyState(21, 255)
            wait(100)
            setGameKeyState(21, 0)
        end
    end
end

function samp.onServerMessage(clr, msg)
    if state and msg:find('^%s*Вы были телепортированы администратором (.*)_(.*)') then
        state = false
        sampAddChatMessage("{FFFFFF}[{4b8078}Concept Car Luxury lovec{FFFFFF}] {257699}Администратор тепнул, скрипт выключен.",-1)
    end
    if state and msg:find('^%s*Администратор (.*) телепортировал вас на координаты: (.+)') then
        state = false
        sampAddChatMessage("{FFFFFF}[{4b8078}Concept Car Luxury lovec{FFFFFF}] {257699}Администратор тепнул, скрипт выключен.",-1)
    end
end

function samp.onShowDialog(id, style, title, but_1, but_2, text)
    if state and id == 25190 or title:find('Concept Car Luxury') then
        sampSendDialogResponse(id, 1, nil, nil)
        counter[#counter + 1] = os.clock()
        return false
    end
    if state and id == 0 then
        sampSendDialogResponse(id, 1, nil, nil)
        counter[#counter + 1] = os.clock()
        return false
    end
end

function removePlayer(id)
    local bs = raknetNewBitStream()
    raknetBitStreamWriteInt16(bs, id)
    raknetEmulRpcReceiveBitStream(163, bs)
    raknetDeleteBitStream(bs)
end
 

YarikVL

Известный
Проверенный
4,729
1,815
Добрый день, нашёл скрипт мне подходящий, если кто-то сможет сделать активацию по кнопке чтоб на фрапсе непалить
lua:
local samp =  require 'samp.events'

local state = false
local counter = {}

function main()
while not isSampAvailable() do wait(0) end wait(1)
wait(1300)
sampAddChatMessage("{FFFFFF}[{4b8078}by suzuchka{FFFFFF}] - {4b6980}Loaded",-1)
    sampRegisterChatCommand('timet', function()
        state = not state
    end)
   
    sampRegisterChatCommand('rstream', function()
        for _, ped in ipairs(getAllChars()) do
            if doesCharExist(ped) and ped ~= PLAYER_PED then
                removePlayer(select(2, sampGetPlayerIdByCharHandle(ped)))
            end
        end
    end)

    while true do wait(0)
        if state then
            for k, v in ipairs(counter) do
                if (os.clock() - v) > 1.0 then
                    table.remove(counter, k)
                end
            end
            setGameKeyState(21, 255)
            wait(100)
            setGameKeyState(21, 0)
        end
    end
end

function samp.onServerMessage(clr, msg)
    if state and msg:find('^%s*Вы были телепортированы администратором (.*)_(.*)') then
        state = false
        sampAddChatMessage("{FFFFFF}[{4b8078}Concept Car Luxury lovec{FFFFFF}] {257699}Администратор тепнул, скрипт выключен.",-1)
    end
    if state and msg:find('^%s*Администратор (.*) телепортировал вас на координаты: (.+)') then
        state = false
        sampAddChatMessage("{FFFFFF}[{4b8078}Concept Car Luxury lovec{FFFFFF}] {257699}Администратор тепнул, скрипт выключен.",-1)
    end
end

function samp.onShowDialog(id, style, title, but_1, but_2, text)
    if state and id == 25190 or title:find('Concept Car Luxury') then
        sampSendDialogResponse(id, 1, nil, nil)
        counter[#counter + 1] = os.clock()
        return false
    end
    if state and id == 0 then
        sampSendDialogResponse(id, 1, nil, nil)
        counter[#counter + 1] = os.clock()
        return false
    end
end

function removePlayer(id)
    local bs = raknetNewBitStream()
    raknetBitStreamWriteInt16(bs, id)
    raknetEmulRpcReceiveBitStream(163, bs)
    raknetDeleteBitStream(bs)
end
Lua:
local samp =  require 'samp.events'
require "lib.moonloader"
local state = false
local counter = {}

function main()
    while not isSampAvailable() do wait(0) end wait(1)
    
    while true do wait(0)
        if wasKeyPressed(VK_G) then
            state = not state
        end
        if wasKeyPressed(VK_R) then
            for _, ped in ipairs(getAllChars()) do
                if doesCharExist(ped) and ped ~= PLAYER_PED then
                    removePlayer(select(2, sampGetPlayerIdByCharHandle(ped)))
                end
            end
        end
        if state then
            for k, v in ipairs(counter) do
                if (os.clock() - v) > 1.0 then
                    table.remove(counter, k)
                end
            end
            setGameKeyState(21, 255)
            wait(100)
            setGameKeyState(21, 0)
        end
    end
end

function samp.onServerMessage(clr, msg)
    if state and msg:find('^%s*Вы были телепортированы администратором (.*)_(.*)') then
        state = false
        sampAddChatMessage("{FFFFFF}[{4b8078}Concept Car Luxury lovec{FFFFFF}] {257699}Администратор тепнул, скрипт выключен.",-1)
    end
    if state and msg:find('^%s*Администратор (.*) телепортировал вас на координаты: (.+)') then
        state = false
        sampAddChatMessage("{FFFFFF}[{4b8078}Concept Car Luxury lovec{FFFFFF}] {257699}Администратор тепнул, скрипт выключен.",-1)
    end
end

function samp.onShowDialog(id, style, title, but_1, but_2, text)
    if state and id == 25190 or title:find('Concept Car Luxury') then
        sampSendDialogResponse(id, 1, nil, nil)
        counter[#counter + 1] = os.clock()
        return false
    end
    if state and id == 0 then
        sampSendDialogResponse(id, 1, nil, nil)
        counter[#counter + 1] = os.clock()
        return false
    end
end

function removePlayer(id)
    local bs = raknetNewBitStream()
    raknetBitStreamWriteInt16(bs, id)
    raknetEmulRpcReceiveBitStream(163, bs)
    raknetDeleteBitStream(bs)
end
Вроде должно работать. Активация на кнопки G и R. Если не будет работать скинешь файл moonloader из папки moonloader.
Если нужно будет убрать сообщение в чате то удали все строчки где есть sampAddChatMessage