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

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,784
11,246
Какие условия нужно задать, чтобы при нажатии кнопки "Установить" текст установился и больше не удалялся. При данном коде при нажатии клавиши "Установить" текст выводится и в миг удаляется.
Lua:
    if main_window_state.v then
     imgui.SetNextWindowSize(imgui.ImVec2(500, 300), imgui.Cond.FirstUseEver)
     imgui.SetNextWindowPos(imgui.ImVec2((sw / 2), sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
   imgui.Begin(fa.ICON_INDENT .. u8" Таблица наказаний", main_window_state, imgui.WindowFlags.NoCollapse)
     imgui.PushItemWidth(200)
     imgui.InputText("", text_buffer)
     imgui.SameLine()
    if imgui.Button(u8"Установить") then
     imgui.Text(text_buffer.v)
  end
     imgui.Separator()
     imgui.End()
    end
Lua:
-- в начало кода
local showText = false

-- в имгуи
if imgui.Button(u8"Установить") then showText = true end
if showText then imgui.Text(text_buffer.v) end
 

ch1ps

Участник
101
3
В джаве есть такая функция, с помощью которой можно найти символ в строке по его индексу, не помню название функции, пускай будет finds... То есть условно говоря существует строка "Hello World" и мне надо узнать, какой символ первый в строке. В переменной str как раз находится текст "Hello World". С помощью функции str.finds(0) я получаю символ, который находится под индексом 0, то есть первый символ, так вот, есть ли такая функция в луа? Просто искал, но не нашёл. Заранее спасибо и извиняюсь за кучу воды в вопросе
 

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,784
11,246
В джаве есть такая функция, с помощью которой можно найти символ в строке по его индексу, не помню название функции, пускай будет finds... То есть условно говоря существует строка "Hello World" и мне надо узнать, какой символ первый в строке. В переменной str как раз находится текст "Hello World". С помощью функции str.finds(0) я получаю символ, который находится под индексом 0, то есть первый символ, так вот, есть ли такая функция в луа? Просто искал, но не нашёл. Заранее спасибо и извиняюсь за кучу воды в вопросе
Lua:
local text = 'Hello World!'
local FirstChar = text:sub(1, 1)
print('First char:', FirstChar)
 
  • Нравится
Реакции: ch1ps

IzYniq

Новичок
20
0
Как сделать проверку на определённый чат, на сервере котором я играю, есть 2 чата, локальный и глобальный, локальный через @, глобальный через !
 

mezoxx

Новичок
12
0
как в imgui.Text вставить текст больших размеров?

Lua:
    if main_window_state.v then
     imgui.SetNextWindowSize(imgui.ImVec2(500, 300), imgui.Cond.FirstUseEver)
     imgui.SetNextWindowPos(imgui.ImVec2((sw / 2), sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
   imgui.Begin(fa.ICON_INDENT .. u8" Таблица наказаний", main_window_state, imgui.WindowFlags.NoCollapse)
   imgui.Text('')
     imgui.End()
    end

Lua:
-- в начало кода
local showText = false

-- в имгуи
if imgui.Button(u8"Установить") then showText = true end
if showText then imgui.Text(text_buffer.v) end
немного криво работает, после нажатия на баттон изначально текст правильно выводится, но дальше текст из InputText вживую выводится в imgui.text, без нажатия на баттон. Других идей нет?
 

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,784
11,246
немного криво работает, после нажатия на баттон изначально текст правильно выводится, но дальше текст из InputText вживую выводится в imgui.text, без нажатия на баттон. Других идей нет?
Lua:
-- в начало кода
local showText = {
    status = false,
    text = 'text'
}

-- в имгуи
if imgui.Button(u8"Установить") then
    showText.text = text_buffer.v
    showText.status = true
end
if showText.status then imgui.Text(showText.text) end
 
  • Нравится
Реакции: mezoxx

mezoxx

Новичок
12
0
Как сделать так, чтобы при появлении в чате символа +, прописывалась определенная команда через sampsendchat. При этом, должен быть активирован чекбокс в имгуи
 

yooze

Новичок
11
0
Как сделать чтобы при вводе кмд /ygtime 19 11 11 111(время) и когда наступало это время в чат отправлялось 4 команду /capture
 

ewin

Известный
675
370
как добавить scrollbar по оси x?
думал оно автоматом его добавляет если много элементов, но как выяснилось - нет
 

ARMOR

kjor32 is legend
Друг
4,859
6,210
как добавить scrollbar по оси x?
думал оно автоматом его добавляет если много элементов, но как выяснилось - нет
А зачем если можно просто добавить флаг AlwaysAutoResize. Ибо насколько мне известно нельзя добавить scrollbar для x
 

qdIbp

Автор темы
Проверенный
1,392
1,150
привет, как вывести свои координаты чат, скажите быро пж

привет, как вывести свои координаты чат, скажите быро пж

привет, как вывести свои координаты чат, скажите быро пж
Lua:
sampAddChatMessage(getCharCoordinates(playerPed),-1)