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

Carl_Henderson

Участник
35
8
Помогите, писал код для 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
 

Sanchez.

Известный
704
190
Помогите, писал код для 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
 
  • Нравится
Реакции: YarikVL и Andrinall

MLycoris

На вид оружие массового семяизвержения
Проверенный
2,054
2,289
Помогите, писал код для 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

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

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


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,712
1,802
Слушай, ещё помоги кое где:
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

Известный
Модератор
6,022
4,343
  • Нравится
Реакции: YarikVL
D

deleted-user-139653

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

YarikVL

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

deleted-user-139653

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

histor

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