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

хуега)

РП игрок
Модератор
2,571
2,277
на касету нажимаю,так и сохраняю,потом не закрывая редактор захожу в самп,может ли припятствовать работоспособности скрипта,куча других читов в мунлоадере? или то что я не выключаю редактор?

он в мунлоадере моей сборки,все верно
Попробуй переустановить мунлоадер и все его зависимости или попробовать другую сборку
 
  • Нравится
Реакции: Tango

хуега)

РП игрок
Модератор
2,571
2,277
можно ли как-то упростить сея код?
Lua:
if multiline then
    imgui.InputTextMultiline("##", var, sizeof(var))
else
    imgui.InputText("##", var, sizeof(var))
end  

imgui.InputText[muiltiline and "Multiline" or nil]("##", var, sizeof(var)) -- как абстрактно я себе это представляю
А, ебать, чет я затупил и не подумал о том, что imgui это объект (таблица)
 
Последнее редактирование:
  • Нравится
Реакции: Tango

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,776
11,234
можно ли как-то упростить сея код?
Lua:
if multiline then
    imgui.InputTextMultiline("##", var, sizeof(var))
else
    imgui.InputText("##", var, sizeof(var))
end 

imgui.InputText[muiltiline and "Multiline" or nil]("##", var, sizeof(var)) -- как абстрактно я себе это представляю
Lua:
imgui[muiltiline and 'InputTextMultiline' or 'InputText']("##", var, sizeof(var))
или
Lua:
imgui['InputText'..(muiltiline and 'Multiline' or '')]("##", var, sizeof(var))
 
  • Нравится
  • Вау
Реакции: Tango, qdIbp и хуега)

Tango

Новичок
28
4
123:
local choiceBuyArray = {}
local myBuyArray = {}
local choiceSellArray = {}
local mySellArray = {}
local menu = 3
local mode = 0
local tw = 100
local imyBuyArray = 1
local imySellArra = {{}}
local imySellArray = 1
local pagesell = 0

  local page2 = {title:match('Страница (%d+)/(%d+)')}
  if mode == 8 and #mySellArray > 0 then
    lua_thread.create(function ()
      if text:find('Прекратить покупку товара') and text:find('Удалить товар с продажи') then
        wait(tw)
        sampSendDialogResponse(id, 1, getLineOnTextDialog(text, 'Выставить товар на продажу'), nil)
      end
      if text:find('В наличии' ) and text:find('Предыдущая страница') and text:find('Следующая страница') then
        for line in text:gmatch('[^\n]+') do
          if line:find('.+') and not line:find('В наличии') and not line:find('Предыдущая страница') and not line:find('Следующая страница') then
            if line:find('{777777}') then
              local namebad = line:match('{777777}.+{777777}')
              local nameb = namebad:gsub('{......}','')
              name = nameb:gsub('%s+$','')
              if line:find('{777777}(%d+) шт%.') then
                local numb = line:match('{777777}(%d+)')
                num = numb:gsub('{......}','')
                table.insert(imySellArra,{name,num})
              else
                table.insert(imySellArra,{name,1})
              end
              if name == mySellArray[imySellArray][1] then
                wait(tw)
                sampSendDialogResponse(id, 1, pagesell, nil)
              else
                
              end
            end
            pagesell = pagesell + 1
          end
          if line:find('Предыдущая страница') then
            pagesell = 0
          end
        end
      end
      if text:find('Введите количество и цену за один товар') then
        wait(tw)
        sampSendDialogResponse(id, 1, nil, num..','..mySellArray[imySellArray][3])
      end
      if text:find('Введите цену за товар') then
        wait(tw)
        sampSendDialogResponse(id, 1, nil, mySellArray[imySellArray][3])
      end
    end)
  end
сори за говнокод,
1678120781695.png
- у меня есть диалоговое окно и
1678120960930.png
- массив, в котором хранится 1 - название, 2 - количество, 3 - цена
мне нужно, чтобы если находило серую строчку с текстом елемента, который есть в массиве[1] - и нажимало на него, потом вводит в следующий диалог
1678121266693.png
и вводить сюда количество, которое писалось справа от названия предмета
1678121339684.png
- 3, и цену, в найденном массиве [2] елемент через запятую, но это ладно, главное чтобы после ввода перенаправит сюда
1678121435648.png
и после нажатия на Выставить на продажу - он уже следующий элемент начал ставить и все по новой, я код написал по говнокодски, надеюсь на ваше исправление
 

the same

Активный
171
22
1)как узнать подключении игрок к серверу по нику?
2) как узнать id игрока по нику
 

хуега)

РП игрок
Модератор
2,571
2,277
1)как узнать подключении игрок к серверу по нику?
Lua:
local nick = {"Ebat_Ochko", "Mamut_Rahal"}

for id = 0, 999 do
    if sampIsPlayerConnected(id) then                   
        for _, name in ipairs(nick) do
            if sampGetPlayerNickname(id) == name then
                print(("Гей: %s в сети"):format(name))                           
            end
        end                   
    end
end

2) как узнать id игрока по нику
Lua:
local name = "Ochko_Porvano"

for id = 0, 999 do
    if sampIsPlayerConnected(id) then                           
        if sampGetPlayerNickname(id) == name then
            print(("У %s %s ID"):format(name, id))                           
        end                           
    end
end
 
  • Нравится
  • Вау
Реакции: de_clain, Tango и the same

sssilvian

Активный
237
25
Привет, мне нужен скрипт, который облегчит мою работу, я имею в виду: вместо ввода (/claninvite ID) мод напечатает его, если я наберу (/cinv ID). Также мне нужен скрипт, который упоминает имя игрока в чате, вроде: "CristianKARA, пожалуйста, прекрати стрелять в меня."
 

the same

Активный
171
22
как с помощь text:match получать ник игрока из чата (сообщения перед/ за ником может быть любое )?
 

хуега)

РП игрок
Модератор
2,571
2,277
Привет, мне нужен скрипт, который облегчит мою работу, я имею в виду: вместо ввода (/claninvite ID) мод напечатает его, если я наберу (/cinv ID). Также мне нужен скрипт, который упоминает имя игрока в чате, вроде: "CristianKARA, пожалуйста, прекрати стрелять в меня."
Как варик использовать говно-способ через регистрацию своей команды, каллбеком которой будет отправка нужной команды, но более правильно будет перехватывать твою команду с помощью samp.events (хук вроде называется onSendCommand(str)) и изменять ее на нужную
 
  • Нравится
Реакции: Tango

MLycoris

Режим чтения
Проверенный
1,831
1,902
как с помощь text:match получать ник игрока из чата (сообщения перед/ за ником может быть любое )?
если ник формата Nick_Name, то
Lua:
    if text:find("(%w+%_%w+)") then
        local name = text:match('(%w+%_%w+)')
        sampAddChatMessage(name..' - {FF0000}Result',-1)
    end
 

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,776
11,234
1)как узнать подключении игрок к серверу по нику?
2) как узнать id игрока по нику
Lua:
function pizda(name)
    for id = 0, sampGetMaxPlayerId(false) do
        if sampIsPlayerConnected(id) then
            if sampGetPlayerNickname(id) == name then
                return true, id
            end
        end
    end
    return false, 'долбаеб, его нет на сервере'
end

--

local isConnected, id = pizda('Pasito_Dva')
sampAddChatMessage(('Игрок %sк серверу %s'):format(not isConnected and 'не ' or '', isConnected and 'его айди: '..id or ''), -1)
 
  • Эм
  • Ха-ха
  • Нравится
Реакции: de_clain, Tango и MLycoris

sssilvian

Активный
237
25
Как варик использовать говно-способ через регистрацию своей команды, каллбеком которой будет отправка нужной команды, но более правильно будет перехватывать твою команду с помощью samp.events (хук вроде называется onSendCommand(str)) и изменять ее на нужную
Я новичок в LUA, не могли бы вы сделать для меня скрипт, пожалуйста?
 

MLycoris

Режим чтения
Проверенный
1,831
1,902
Я новичок в LUA, не могли бы вы сделать для меня скрипт, пожалуйста?
 

sssilvian

Активный
237
25
Я хочу интегрировать его в свой собственный скрипт, а не использовать отдельный.