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

mld

Участник
99
11
Объясните тупому,как сделать при нажатии кнопки появлялось 2-ое меню?
К примеру,у меня появляется 1-ое меню и там кнопки:
1.Устав
2.Реклама
3.Другие Эфиры
и тд.
а мне надо,чтобы при нажатии на "Устав" вылезало 2-ое меню с уставом.
Я хз,поняли меня,или нет.
 

tlwsn

Известный
537
85
И? ctrl + c и вставляй в мунлоадер
ну ок, зарегал так:
Lua:
gunfont = renderCreateFont(getGameDirectory()..'\\gtaweap3.ttf', 10, 0)
но чот когда юзал в рендере писал просто число
Lua:
renderFontDrawText(gunfont, '24', screenx/2, screeny/2, -1)
46uamWb.png
 

mixeq

Известный
67
8
Lua:
if text == "Текст" then

я уверен, что тут что то не так, скажите как правильно
 

mixeq

Известный
67
8
так? или че ты хочешь
Lua:
imgui.Text("text")
или ты про это
Lua:
if text:find('Text') then
Второй вариант, спасибо

Как отправить в диалог текст?
Использовал эту функцию, но только вставляет текст в поле
sampSetCurrentDialogEditboxText()
Диалог такой
3DkHoBjgpIo.jpg
 
У

Удалённый пользователь 257097

Гость
Перейду сразу к теме. Делаю я значит скрипт, и нужно мне в 1 функцию пихнуть 10+ аргументов, казалось бы просто, но у меня то руки не от туда растут, поэтому я решил фигачить аргументы через команду по типу: /command [arg1] [arg2] [arg3] [arg4] [arg5] [arg7] [arg8]....и т.д. Но это неудобно! (как так то?!) И из-за этой ахенеи мне хочется использовать dxut диалоги, т.к. можно сделать табличку, написать какие то подсказки и в поле около них забивать эти аргументы уже в строку, но дальше создания окна и появления кнопки "Далее" мои знания закончились. Не могу даже по введенный текст в строку фигануть в аргумент, т.к. не умею(. (про любое событие после нажати кнопки, вовсе молчу). Так вот, хотелось бы спросить/попросить, как мне это сделать?! Дайте гайд если есть, но сам облазил инет с форумом и кроме dxut диалогов в cleo ничего более не нашел. Прошу помочь. Или показть как сделать простейший dxut диалог со строкой и передачей в аргумент текста после нажатия кнопки 'Далее'.
Мой недошедевр:
Lua:
require "lib.moonloader"

function main ()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand ("fc", fc)
    while true do wait (0) end
end

function fc()
    dialog = dxutCreateDialog("Idialog")
    dxutSetDialogPos(dialog, 600, 120, 380, 500)
    dxutAddStatic(dialog, 1, "Имя", 15, 10, 100, 30)
    dxutAddEditbox(dialog, 1, "", 150, 10, 200, 35)
    dxutAddButton(dialog, 228, "Далее", 150, 450, 100, 30)
end
 

astynk

Известный
Проверенный
741
533
Второй вариант, спасибо

Как отправить в диалог текст?
Использовал эту функцию, но только вставляет текст в поле
sampSetCurrentDialogEditboxText()
Диалог такой
3DkHoBjgpIo.jpg

Код:
sampSetCurrentDialogEditboxText("text")
sampCloseCurrentDialogWithButton(1) -- 1 = Готово, 0 = Отмена
 

trefa

3d print
Всефорумный модератор
2,114
1,281
Второй вариант, спасибо

Как отправить в диалог текст?
Использовал эту функцию, но только вставляет текст в поле
sampSetCurrentDialogEditboxText()
Диалог такой
3DkHoBjgpIo.jpg
https://blast.hk/wiki/lua:sampsenddialogresponse

Код:
sampSetCurrentDialogEditboxText("text")
sampCloseCurrentDialogWithButton(1) -- 1 = Готово, 0 = Отмена
костыль
 
  • Нравится
Реакции: 777qwerty777

xISRAPILx

Перепишу свою жизнь на PHP
Проверенный
247
165
Перейду сразу к теме. Делаю я значит скрипт, и нужно мне в 1 функцию пихнуть 10+ аргументов, казалось бы просто, но у меня то руки не от туда растут, поэтому я решил фигачить аргументы через команду по типу: /command [arg1] [arg2] [arg3] [arg4] [arg5] [arg7] [arg8]....и т.д. Но это неудобно! (как так то?!) И из-за этой ахенеи мне хочется использовать dxut диалоги, т.к. можно сделать табличку, написать какие то подсказки и в поле около них забивать эти аргументы уже в строку, но дальше создания окна и появления кнопки "Далее" мои знания закончились. Не могу даже по введенный текст в строку фигануть в аргумент, т.к. не умею(. (про любое событие после нажати кнопки, вовсе молчу). Так вот, хотелось бы спросить/попросить, как мне это сделать?! Дайте гайд если есть, но сам облазил инет с форумом и кроме dxut диалогов в cleo ничего более не нашел. Прошу помочь. Или показть как сделать простейший dxut диалог со строкой и передачей в аргумент текста после нажатия кнопки 'Далее'.
Мой недошедевр:
Lua:
require "lib.moonloader"

function main ()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand ("fc", fc)
    while true do wait (0) end
end

function fc()
    dialog = dxutCreateDialog("Idialog")
    dxutSetDialogPos(dialog, 600, 120, 380, 500)
    dxutAddStatic(dialog, 1, "Имя", 15, 10, 100, 30)
    dxutAddEditbox(dialog, 1, "", 150, 10, 200, 35)
    dxutAddButton(dialog, 228, "Далее", 150, 450, 100, 30)
end
С кодом помочь не смогу, но могу дать подсказку. Лови события используя dxutPopEvent, ниже все найденные ID событий:
Lua:
local EVENT_BUTTON_CLICKED                = 257
local EVENT_COMBOBOX_SELECTION_CHANGED    = 513
local EVENT_RADIOBUTTON_CHANGED           = 769
local EVENT_CHECKBOX_CHANGED              = 1025
local EVENT_SLIDER_VALUE_CHANGED          = 1281
local EVENT_EDITBOX_STRING                = 1537
local EVENT_EDITBOX_CHANGE                = 1538
local EVENT_LISTBOX_ITEM_DBLCLK           = 1793
local EVENT_LISTBOX_SELECTION             = 1794
Как отловишь нужное событие, просто используй функции для получения состояния элемента:
 

atizoff

приобретаю кашель за деньги
Проверенный
1,296
1,179
как по нажатию кнопки открыть новое имгуи окно и закрыть активное?