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

Стэнфорд

Потрачен
1,058
543
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
<Hitch Warning> Niko_Tin[824] открыл(5.98 s) 1-й клад (в игре: 03:05) | 4000000

переделайте в регуляторные выражения пжпжпж
 

Smeruxa

t.me/smeruxa
Проверенный
1,378
726
<Hitch Warning> Niko_Tin[824] открыл(5.98 s) 1-й клад (в игре: 03:05) | 4000000

переделайте в регуляторные выражения пжпжпж
<Hitch Warning> Niko_Tin[824] открыл(5.98 s) 1-й клад (в игре: 03:05) | 4000000
%<(.*)%> (.*)%[(%d+)%] открыл%((.*) s%) (%d+)%-й клад %(в игре%: (.*)%) %| (%d+)
 
Последнее редактирование:
  • Нравится
Реакции: Стэнфорд

EclipsedFlow

Известный
Проверенный
1,047
476
Шо за параша?

Lua:
local status = {
    ['res'] = 0
}

в любом месте:
status['res'] = status['res'] + 1

Равно:
attempt to perform arithmetic on field 'res' (a nil value)stack traceback:
 

Gorskin

♥ Love Lua ♥
Проверенный
1,345
1,184
Возможно ли сделать так чтобы imgui.Combo не закрывался при нажатии в нем чего-либо?
 

Domino

Участник
326
15
Мужики, ситуация.
Данные два скрипта имеют похожие, но разные задачи, поэтому конфликтуют друг с другом.
Они оба делают проверку списка виперов и УДАЛЯЕТ ЕГО ИЗ ЧАТА, поэтому если один из них работает стабильно, а другой просто не видит этот удаленный список.
Вопрос в том, как совместить эти два скрипта или как излечить это.
Спасибо
 

Вложения

  • famhelper.lua
    21.6 KB · Просмотры: 5
  • VipWallhack.lua
    4.2 KB · Просмотры: 3

Dmitriy Makarov

25.05.2021
Проверенный
2,505
1,134
Почему не работает? вот лог монлодера
[19:56:53.932950] (error) Police Helper Report(v 0.0.9).lua: ...SAMP low PC\moonloader\Police Helper Report(v 0.0.9).lua:289: '<name>' expected near '/'
[19:56:53.933682] (error) Police Helper Report(v 0.0.9).lua: Script died due to an error. (06F8C384)
e:
script_name("Police Helper Report")
script_author("Mr.Mastire222.")
script_description("Version 0.0.9")

require "lib.moonloader"
local keys = require "vkeys"
local tag = "[PHR]:"
local main_color = 0x00FFFF
local color_error = 0xFF0000
local dop_color = 0xC0C0C0
local active = false
local id = -1
local commands = [[ {00FFFF}Police Helper Report.{FFFFFF} Автор {FFA07A}"Mr.Mastire222"
{C0C0C0} /cuff id - {00FFFF} Надеть наручники на игрока.
{C0C0C0} /gotome id - {00FFFF} Потащить за собой игрока в наручниках.
{C0C0C0} /arrest id - {00FFFF} Арестовать игрока, посадить в кпз.
{C0C0C0} /sincar - {00FFFF} Только отыгровка посадки в машину (функция убрана из-а ошибки).
{C0C0C0} /pull id - {00FFFF} Вытащить из машины.
{C0C0C0} /prava - {00FFFF} Зачитать правила миранды.
{C0C0C0} /ask id - {00FFFF} Попросить паспорт.
{C0C0C0} /meg или зажать клавишу(держать две секунды) F4 - {00FFFF} Приказ остоновки автомобиля.
{C0C0C0} /trebs - {00FFFF} Требование после остановки авто.
{C0C0C0} /pstop - {00FFFF} Приказать всем остоваться на своих местах.
{C0C0C0} /pfind id - {00FFFF} Автометка на игрока в розыске.
{C0C0C0} /provpass - {00FFFF} Взять паспорт и проверив его отдать.
{C0C0C0} /frapson - {00FFFF} Включить камеру на груди.
{C0C0C0} /dubinka - {00FFFF} Оглушить дубинкой человека.
{C0C0C0} /frisk id - {00FFFF} Обыскать человека.
{C0C0C0} /zetka id - {00FFFF} Чтоб преступник не мог выйти без наказанным, команда с отыгровкой.
{C0C0C0} /overlay - {00FFFF} Включить оверлей.
{C0C0C0} /phrmenu - {00FFFF} Включить меню действий.
{C0C0C0} /phrsobes - {00FFFF} Меню собеседования.
{C0C0C0} Быстрый репорт ввести как чит код - {00FFFF} REP
]]

    function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end

    autoupdate("https://raw.githubusercontent.com/mrmastirie221/PHRUPD/main/phravtoupd.json", '['..string.upper(thisScript().name)..']: ', "https://www.blast.hk/threads/90585/")

    print("[PHR]: Успешно загружен. Меню помощи /PHR")
    sampAddChatMessage("[PHR]: Успешно загружен. Меню помощи /PHR. Автор Mr.Mastire222. Версия 0.0.9 ", dop_color)

    sampRegisterChatCommand('PHR', function()
        sampShowDialog(420, 'Функции Police Helper Report v 0.0.9', commands, 'OK', DIALOG_STYLE_LIST)
    end)

    sampRegisterChatCommand('pfind', function(arg)
        if active then
           active = false
           sampAddChatMessage('pfind off', -1)
        else
            if #arg ~= 0 then
                id = tonumber(arg)
                active = true
                sampAddChatMessage('pfind on', -1)
            end
        end

    end)

    sampRegisterChatCommand('cuff', cmd_cuff)
    sampRegisterChatCommand('gotome', cmd_gotome)
    sampRegisterChatCommand('arrest', cmd_arrest)
    sampRegisterChatCommand('meg', cmd_meg)
    sampRegisterChatCommand('sincar', cmd_sincar)
    sampRegisterChatCommand('prava', cmd_prava)
    sampRegisterChatCommand('pull', cmd_pull)
    sampRegisterChatCommand('ask', cmd_ask)
    sampRegisterChatCommand('trebs', cmd_trebs)
    sampRegisterChatCommand('pstop', cmd_pstop)
    sampRegisterChatCommand('provpass', cmd_provpass)
    sampRegisterChatCommand('frapson', cmd_frapson)
    sampRegisterChatCommand('dubinka', cmd_dubinka)
    sampRegisterChatCommand('frisk', cmd_frisk)



    while true do
        wait(2000)

        if isKeyJustPressed(VK_F4) then
            sampSendChat("/m Водитель вашего транспортного средства, пожалуйста прижмитесь к обочине!")
            end
        if active then
            sampSendChat('/find '..id)
        end

        local _, myid = sampGetPlayerIdByCharHandle(playerPed)
        mynick = sampGetPlayerNickname(myid)

        if testCheat("REP") then
     sampSendChat('/report')
      end
    end
end




function cmd_cuff(id)
   if id:match("%d") then
    lua_thread.create(function()
        sampSendChat("/do На поясе наручники.")
        wait(1500)
        sampSendChat("/me снял наручники с пояса затем надел их на человека")
        wait(1500)
        sampSendChat("/cuff "..id)
    end)
else
    sampAddChatMessage("[Ошибка] {FFFFFF}Введите id игрока!", color_error)
end
end


function cmd_gotome(id)
   if id:match("%d") then
    lua_thread.create(function()
        sampSendChat("/me взяв за руку человека в наручниках потащил за собой")
        wait(1500)
        sampSendChat("/gotome "..id)
    end)
else
    sampAddChatMessage("[Ошибка] {FFFFFF}Введите id игрока!", color_error)
end
end


function cmd_arrest(id)
   if id:match("%d") then
     lua_thread.create(function()
        sampSendChat("/me достал бланк протокола и ручку")
        wait(1500)
        sampSendChat("/me начал заполнять информацию о человеке ")
        wait(1500)
        sampSendChat("/do Через несколько минут бланк был заполнен. ")
        wait(1500)
        sampSendChat("/me подготовил вещи подозреваемого во время ожидания офицеров ")
        wait(1500)
        sampSendChat("/do Из департамента выходят офицеры и забирают человека и его вещи. ")
        wait(1500)
        sampSendChat("/arrest "..id)
       end)
   else
        sampAddChatMessage("[Ошибка] {FFFFFF}Введите id игрока!", color_error)
    end

end


function cmd_sincar()
    sampSendChat("/me открыл дверь машины,  затащил человека в наручниках в автомобиль, закрыл дверь")
    sampAddChatMessage("/incar id Место(1-3)", main_color)
end

function cmd_prava()
    lua_thread.create(function()
    sampSendChat("Вы имеете право хранить молчание.")
    wait(1500)
    sampSendChat("Всё, что вы скажете, может и будет использовано против вас в суде.")
    wait(1500)
    sampSendChat("Ваш адвокат может присутствовать при допросе.")
    wait(1500)
    sampSendChat("Если вы не можете оплатить услуги адвоката, он будет предоставлен вам государством.")
    wait(1500)
    sampSendChat("Вы поняли свои права?")
end)
end


function cmd_ask(id)
   if id:match("%d") then
    lua_thread.create(function()
        sampSendChat("Доброго времени суток, я сотрудник полиции " ..mynick)
        wait(1500)
        sampSendChat("/do На груди именная нашивка и жетон.")
        wait(1500)
        sampSendChat("/showbadge "..id)
        wait(1500)
        sampSendChat("Прошу предоставить ваши документы, а именно паспорт.")
    end)
else
    sampAddChatMessage("[Ошибка] {FFFFFF}Введите id игрока!", color_error)
end
end


function cmd_trebs()
    lua_thread.create(function()
        sampSendChat("/m Водитель остовайтесь в машине и держите руки на руле.")
    end)
end


function cmd_pstop()
    lua_thread.create(function()
        sampSendChat("/s Работает полиция! Всем остоваться на своих местах")
    end)
end


function cmd_provpass()
    lua_thread.create(function()
        sampSendChat("/me взяв паспорт в руки открыл его")
        wait(2100)
        sampSendChat("/me внимательно изучив паспорт вернул его обратно")
    end)
end


function cmd_frapson()
    lua_thread.create(function()
        sampSendChat("/do На груди закреплена скрытая камера.")
        wait(1500)
        sampSendChat("/do У воротничка закреплен петличный микрофон")
            wait(1500)
        sampSendChat("/me движением руки включил камеру и микрофон")
        wait(1500)
        sampSendChat("/do Гаджеты включены и ведут запись.")
    end)
end


function cmd_meg()
    lua_thread.create(function()
        sampSendChat("/me движением руки включил мегафон")
        wait(2000)
        sampSendChat("/m Водитель транспортного средства, прижмитесь к обочине и остоновитесь!")
    end)
end


function cmd_dubinka()
    lua_thread.create(function()
        sampSendChat("/me снял дубинку с пояса и сильным ударом оглушил человека")
        wait(2500)
        sampSendChat("/me повесил дубинку на пояс")
    end)
end


function cmd_frisk(id)
   if id:match("%d") then
    lua_thread.create(function()
        sampSendChat("/do Резиновые перчатки в кармане.")
        wait(1500)
        sampSendChat("/me достал из внутреннего кармана пиджака резиновые перчатки и надел их")
        wait(1500)
        sampSendChat("/me провел руками по телу после провёл руками по ногам и по рукам")
        wait(1500)
        sampSendChat("/frisk "..id)
    end)
else
    sampAddChatMessage("[Ошибка] {FFFFFF}Введите id игрока!", color_error)
    end
end

function cmd_pull(id)
    if id:match("%d") then
    lua_thread.create(function()
        sampSendChat("/me снял с пояса дубинку и начал бить по стеклу")
        wait(1500)
        sampSendChat("/me разбил стелко машины затем вытащил от туда человека")
        wait(1500)
        sampSendChat("/pull "..id)
    end)
else
    sampAddChatMessage("[Ошибка] {FFFFFF}Введите id игрока!", color_error)
    end
end

function cmd_pull(id)
    if id:match("%d") then
    lua_thread.create(function()
        sampSendChat("/me достав КПК включил его и после чего зашел в базу данных")
        wait(1500)
        sampSendChat("/me сравнивает фоторобот с подозреваемым")
        wait(1500)
        sampSendChat("/do Человек на фотороботе совпал с подозреваемым")
        wait(1500)
        sampSendChat("/z "..id)
    end)
else
    sampAddChatMessage("[Ошибка] {FFFFFF}Введите id игрока!", color_error)
    end
end

local json_url = https://github.com/mrmastirie221/PHRUPD.git
local prefix = [[
    Начинаю подгрузочку
]]
local url [[ Автообновваа ане сработала иди на сайт]]

function autoupdate(json_url, prefix, url)
    local dlstatus = require('moonloader').download_status
    local json = getWorkingDirectory() .. '\\'..thisScript().name..'-version.json'
    if doesFileExist(json) then os.remove(json) end
    downloadUrlToFile(json_url, json,
      function(id, status, p1, p2)
        if status == dlstatus.STATUSEX_ENDDOWNLOAD then
          if doesFileExist(json) then
            local f = io.open(json, 'r')
            if f then
              local info = decodeJson(f:read('*a'))
              updatelink = info.updateurl
              updateversion = info.latest
              f:close()
              os.remove(json)
              if updateversion ~= thisScript().version then
                lua_thread.create(function(prefix)
                  local dlstatus = require('moonloader').download_status
                  local color = -1
                  sampAddChatMessage((prefix..'Обнаружено обновление. Пытаюсь обновиться c '..thisScript().version..' на '..updateversion), color)
                  wait(250)
                  downloadUrlToFile(updatelink, thisScript().path,
                    function(id3, status1, p13, p23)
                      if status1 == dlstatus.STATUS_DOWNLOADINGDATA then
                        print(string.format('Загружено %d из %d.', p13, p23))
                      elseif status1 == dlstatus.STATUS_ENDDOWNLOADDATA then
                        print('Загрузка обновления завершена.')
                        sampAddChatMessage((prefix..'Обновление завершено!'), color)
                        goupdatestatus = true
                        lua_thread.create(function() wait(500) thisScript():reload() end)
                      end
                      if status1 == dlstatus.STATUSEX_ENDDOWNLOAD then
                        if goupdatestatus == nil then
                          sampAddChatMessage((prefix..'Обновление прошло неудачно. Запускаю устаревшую версию..'), color)
                          update = false
                        end
                      end
                    end
                  )
                  end, prefix
                )
              else
                update = false
                print('v'..thisScript().version..': Обновление не требуется.')
              end
            end
          else
            print('v'..thisScript().version..': Не могу проверить обновление. Смиритесь или проверьте самостоятельно на '..url)
            update = false
          end
        end
      end
    )
    while update ~= false do wait(100) end
  end
На 289 строке возьми ссылку в кавычки и на 293 строке после url поставь знак "=".
 

Smeruxa

t.me/smeruxa
Проверенный
1,378
726
Мужики, ситуация.
Данные два скрипта имеют похожие, но разные задачи, поэтому конфликтуют друг с другом.
Они оба делают проверку списка виперов и УДАЛЯЕТ ЕГО ИЗ ЧАТА, поэтому если один из них работает стабильно, а другой просто не видит этот удаленный список.
Вопрос в том, как совместить эти два скрипта или как излечить это.
Спасибо
выучить луа, задать 1000 вопросов, переписать всех их

Шо за параша?

Lua:
local status = {
    ['res'] = 0
}

в любом месте:
status['res'] = status['res'] + 1

Равно:
attempt to perform arithmetic on field 'res' (a nil value)stack traceback:
ну быть такого не должно как минимум
Lua:
for k,v in range(ptable) do
    if k == 'res' then
        v = v + 1
        break
    end
end
print(tostring(ptable['res']))
или перевожу в функцию
Lua:
function _add(ptable, key, number)
    for k,v in range(ptable) do
        if k == key then
            v = v + number
            break
        end
    end
end
 
Последнее редактирование:
  • Нравится
Реакции: EclipsedFlow

Dmitriy Makarov

25.05.2021
Проверенный
2,505
1,134
Мужики, ситуация.
Данные два скрипта имеют похожие, но разные задачи, поэтому конфликтуют друг с другом.
Они оба делают проверку списка виперов и УДАЛЯЕТ ЕГО ИЗ ЧАТА, поэтому если один из них работает стабильно, а другой просто не видит этот удаленный список.
Вопрос в том, как совместить эти два скрипта или как излечить это.
Спасибо
Если ты хочешь, чтобы в одном скрипте он удалял игроков из чата, а во втором скрипте не удалял, то найди в одном скрипте хук onServerMessage, найди в нём return false и убери его.
1632650746316.png

На скрине скрипт VipWallHack. Там кода меньше, можешь оттуда убрать.
 

Mico

Активный
251
48
1632552209281.png


Слушайте, как вывести - Уровень Администратора: 12 (0/3) - проблема в основном с (0/3)
код: (я думаю дело в скобках, их надо как то что-ли отзеркалить, пытался - нифига


Lua:
if parsim and dialogId == 1932 and title:find("Статистика игрока") then
    for line in text:gmatch("[^\r\n]+") do
        if line:find("%{FF6347%}Уровень Администратора:%s+%{FFFFFF%}%d+%(0/3)%") then
            alevel = line:match("%{FF6347%}Уровень Администратора:%s+%{FFFFFF%}(%d+)%(0/3)%")
        end
    end
    parsim = false
    return false
end
 

Smeruxa

t.me/smeruxa
Проверенный
1,378
726
1632552209281.png


Слушайте, как вывести - Уровень Администратора: 12 (0/3) - проблема в основном с (0/3)
код: (я думаю дело в скобках, их надо как то что-ли отзеркалить, пытался - нифига


Lua:
if parsim and dialogId == 1932 and title:find("Статистика игрока") then
    for line in text:gmatch("[^\r\n]+") do
        if line:find("%{FF6347%}Уровень Администратора:%s+%{FFFFFF%}%d+%(0/3)%") then
            alevel = line:match("%{FF6347%}Уровень Администратора:%s+%{FFFFFF%}(%d+)%(0/3)%")
        end
    end
    parsim = false
    return false
end
%(0/3%)