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

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,931
1,301
Lua:
function toghMenu()
    local resultMain, buttonMain, listMain = sampHasDialogRespond(154)
    if resultMain == true then
      if buttonMain == 1 then
        if listMain == 0 then
            if chathelper == true then
                chathelper = false
                sampfuncsLog("* ChatIndicator OFF!")
                sampAddChatMessage("* Apollon: {ffffff}Chat Indicator выключён",0x0088ff)
                chathelper_state = '{FF0000} Выключен'
            else
                chathelper = true
                sampfuncsLog("* ChatIndicator ON!")
                sampAddChatMessage("* Apollon: {ffffff}Chat Indicator включён",0x0088ff)
                chathelper_state = '{00FF00} Включен'
            end
        end
        if listMain == 1 then
            if fpsshow == true then
                fpsshow = false
                sampfuncsLog("* FPS Indicator OFF!")
                sampAddChatMessage("* Apollon: {ffffff}FPS Indicator выключён",0x0088ff)
                fps_state = '{FF0000} Выключен'
            else
                fpsshow = true
                sampfuncsLog("* FPS Indicator ON!")
                sampAddChatMessage("* Apollon: {ffffff}FPS Indicator включён",0x0088ff)
                fps_state = '{00FF00} Включен'
            end
        end
        if listMain == 2 then
          if hphud == true then
            hphud = false
            sampfuncsLog("* HP Indicator OFF!")
            sampAddChatMessage("* Apollon: {ffffff}HP Indicator выключён",0x0088ff)
            hphud_state = '{FF0000} Выключен'
          else
            hphud = true
            sampfuncsLog("* HP Indicator ON!")
            sampAddChatMessage("* Apollon: {ffffff}HP Indicator включён",0x0088ff)
            hphud_state = '{00FF00} Включен'
          end
        end
        if listMain == 3 then
          if hp2hud == true then
            hp2hud = false
            sampfuncsLog("* 160 HP Indicator OFF!")
            sampAddChatMessage("* Apollon: {ffffff}160 HP Indicator выключён",0x0088ff)
            hphud_state2 = '{FF0000} Выключен'
          else
            hp2hud = true
            sampfuncsLog("* 160 HP Indicator ON!")
            sampAddChatMessage("* Apollon: {ffffff}160 HP Indicator включён",0x0088ff)
            hphud_state2 = '{00FF00} Включен'
          end
        end
        if listMain == 4 then
         if armhud == true then
            armhud = false
            sampfuncsLog("* Armour Indicator OFF!")
            sampAddChatMessage("* Apollon: {ffffff}Armour Indicator выключён",0x0088ff)
            armhud_state = '{FF0000} Выключен'
         else
            armhud = true
            sampfuncsLog("* Armour Indicator ON!")
            sampAddChatMessage("* Apollon: {ffffff}Armour Indicator включён",0x0088ff)
            armhud_state = '{00FF00} Включен'
         end
        end
        if listMain == 5 then
        sampAddChatMessage("* Apollon: {ffffff}Из за нагрузки диалоговое окно может не запускатся с первого раза. Если окно не запускался, пожалуйста попробуйте снова.",0x0088ff)
            local help = [[
{ffffff}  {0088ff}__________________________________________________________________________________________________________ {ffffff}
{0088ff}
{0088ff}SA:MP Indicators{ffffff} - Скрипт в базе Lua, который даёт возможность посмотреть свой HP, уровень броня так же поиощник чата.
{ffffff}
{ffffff}      •     {0088ff}/igelp{ffffff} - информация.   
{ffffff}      •     {0088ff}/ireload {ffffff} - перезагрузка скрипта.             
{ffffff}      •     {0088ff}/indicators{ffffff} - Меню скрипта                                               
{0088ff} 
{ffffff}  {0088ff}__________________________________________________________________________________________________________ {ffffff}
            ]]
                sampShowDialog(155, "Что я могу делать?", help, "*", "", 0)
        end
     end
    end
end


function toghmenu()
    sampShowDialog(154, "Панель индикаторов", string.format("{00ffd5}Chat Indicator: {cccccc}[ %s {cccccc}]\n{00ffd5}FPS Indicator: {cccccc}[ %s {cccccc}]\n{00ffd5}HP Indicator[100]: {cccccc}[ %s {cccccc}]\n{00ffd5}HP Indicator[160]: {cccccc}[ %s {cccccc}]\n{00ffd5}Armour Indicator: {cccccc}[ %s {cccccc}]\n{000018}Информация(Список команд)", chathelper_state, fps_state, hphud_state, hphud_state2, armhud_state), "Выбрать", "Отмена", 2)
end
 

BlackGoblin

Известный
520
217
переведи это число ARGB (пример был в полезных сниппетах)
Я чет вообще не понимаю, это какого типа вообще цвет приходит? Это разве ARGB?
2164227710
39375

Как оно разбивается правильно?
 

FYS

Потрачен
981
236
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

S-Sirius

Известный
351
21
Как можно делать текст кнопок ImgUi на русском? Писал там русские буквы, а там отображается "???".

39377
 

JustFedot

Известный
336
341
Ребята, help me пожалуйста)

Как мне получить в переменную текст который игрок ввёл в созданный скриптом диалог? Оч надо)
 

BlackGoblin

Известный
520
217
Ребята, help me пожалуйста)

Как мне получить в переменную текст который игрок ввёл в созданный скриптом диалог? Оч надо)
Lua:
sampShowDialog(123, " ", " ", "OK", "Отмена", DIALOG_STYLE_INPUT)
while sampIsDialogActive(123) do wait(100) end
local result, button, _, input = sampHasDialogRespond(123)
sampAddChatMessage(input, -1)
 
  • Нравится
Реакции: JustFedot

FYS

Потрачен
981
236
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Lua:
:133: 'do' expected near 'if'

function testss()
  for _, nickname in ipairs(nicknamesArray)
    133 ---- if nickname == 'Firstname_Lastname' then
      print("+")
      break
    else
      print("-")
      break
    end
  end
end
Lua:
function testss()
  for _, nickname in ipairs(nicknamesArray) do
    133 ---- if nickname == 'Firstname_Lastname' then
      print("+")
      break
    else
      print("-")
      break
    end
  end
end
 

ARI

Участник
63
11
Нужно вывести данные из массива в чат.
Юзаю следующие строчки:

Код::
local function ganghelp()
    local namesOfGangs = {"Vagos", "Rifa", "Groove", "Ballas", "Aztec"}
    lua_thread.create(function()
        for i=0, 5, 1 do
            sampAddChatMessage(namesOfGangs[i].. " --> id - " ..i, -1) // должно получиться: Имя банды --> id - 1/2/3/4/5   
            wait(400)
        end
    end)
end

По итогу ловлю ошибку:

(В 41 строчке написано, что-то вроде вы пытаетесь использовать пустую(nil) переменную, но массив не пустой и переменной i также присвоено значение )

(error) autoMats.lua: C:\GTA San Andreas\GTA San Andreas\moonloader\autoMats.lua:41: attempt to concatenate a nil value
stack traceback:
C:\GTA San Andreas\GTA San Andreas\moonloader\autoMats.lua: in function <C:\GTA San Andreas\GTA San Andreas\moonloader\autoMats.lua:39>
stack traceback:
[C]: in function 'create'
C:\GTA San Andreas\GTA San Andreas\moonloader\autoMats.lua:39: in function <C:\GTA San Andreas\GTA San Andreas\moonloader\autoMats.lua:38>
[20:55:06.781033] (error) autoMats.lua: Script died due to an error. (0FD76194)

Спасибо.
 
Последнее редактирование модератором:

savvin

Известный
404
139
Нужно вывести данные из массива в чат.
Юзаю следующие строчки:

Код::
local function ganghelp()
    local namesOfGangs = {"Vagos", "Rifa", "Groove", "Ballas", "Aztec"}
    lua_thread.create(function()
        for i=0, 5, 1 do
            sampAddChatMessage(namesOfGangs[i].. " --> id - " ..i, -1) // должно получиться: Имя банды --> id - 1/2/3/4/5   
            wait(400)
        end
    end)
end

По итогу ловлю ошибку:

(В 41 строчке написано, что-то вроде вы пытаетесь использовать пустую(nil) переменную, но массив не пустой и переменной i также присвоено значение )

(error) autoMats.lua: C:\GTA San Andreas\GTA San Andreas\moonloader\autoMats.lua:41: attempt to concatenate a nil value
stack traceback:
C:\GTA San Andreas\GTA San Andreas\moonloader\autoMats.lua: in function <C:\GTA San Andreas\GTA San Andreas\moonloader\autoMats.lua:39>
stack traceback:
[C]: in function 'create'
C:\GTA San Andreas\GTA San Andreas\moonloader\autoMats.lua:39: in function <C:\GTA San Andreas\GTA San Andreas\moonloader\autoMats.lua:38>
[20:55:06.781033] (error) autoMats.lua: Script died due to an error. (0FD76194)

Спасибо.
В lua индексы таблиц всегда начинаются с 1, а не с 0
for i = 0, 5, 1 do замени на for i = 1, 5, 1 do
 

ufdhbi

Известный
Проверенный
1,460
866
Вот например игрок в чате написал : Name_Name[524] говорит: /commmand id текст
Как вырезать с чата именно /command id текст ?
Lua:
local cmd = ("Name_Name[524] говорит: /commmand id текст"):match("%g+%[%d+%] говорит: (.+)")
print(cmd) -- /commmand id текст
 

ShikamaruRU

Участник
55
1
Привет. Как сделать переход по ссылке в imgui?
Например нажимаю на кнопку и меня перекидывает по ссылке, которую я указал кнопке