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

Akionka

akionka.lua
Проверенный
740
502
Как преобразовать response.text (Ответ от сервера) в кодировку 1251 ? А то если ответ на русском, то символы
дополню ответ сверху.
Lua:
local encoding = require 'encoding'
encoding.default = 'cp1251'
u8 = encoding.UTF8
-- Где-то в коде
--...
print(u8:decode(response.text)) -- Пример использования, можешь сувать куда угодно.
--...
-- Где-то в коде
 
  • Нравится
Реакции: mrdiimax

EvilCoder

Участник
147
1
Пацаны, как в Bot Maker записать ответ на диалог и сделать так что бы он запомнил его и всегда отвечал на него.
Вот нужно что бы я выбрал вариант и что бы Bot Marek записал этот вариант
 

Вложения

  • upload_2019-1-20_22-43-32.png
    upload_2019-1-20_22-43-32.png
    448.3 KB · Просмотры: 235

sdfaw

Активный
717
150
Lua:
function libcheckout()
    local data = LIP.load('moonloader\\config\\PHelper.ini')
    if data.enabledmodif == nil or data.hud.colorbackground == nil then
        os.remove('moonloader/config/PHelper.ini')
        data.enabledmodif =
        {
            newtab = true,
            newid = true,
            newmenu = true,
            rpgun = false,
            chwd = false,
            chud=true,
            newchat = true,
            suspend = true,
            stroboscope = true,
            ooc = true,
            speedo=true,
            hotkey = 1,
        };
        data.finder =
        {
            poswd = 1,
            wdsize = 1,
            chposw = 600,
            chposh = 600,
        };
        data.hud = {
            poshudx=600,
            poshudy=600,
            colorbackground=1610612736,
            colorhealth=-1831667,
            colorarmour=-8882056,
            colorenergy=-14763992,
            coloroxygen=-16728137,
        };
        data.speedometer = {
            speedox=600,
            speedoy=600,
            colorbackground=1056964608,
            colorshowings=-2586112,
        };
        data.tags = {
            tagr='',
            tagd='',
        };
        LIP.save('moonloader\\config\\PHelper.ini', data); --
        sampAddChatMessage("[ PHELP ]{ffffff}: В связи с изменениями в скрипте настройки были сброшены, настройте их по новой. [{0088ff} /pinfo » Модификации{ffffff} ]", 0x0088ff)
        print('1st config updated successfully.')
    end
    cfg1checked = true
end

Lua:
math.randomseed(os.time())
math.random(--[[начальная цифра]], --[[конечная цифра]])
Если хочешь рандомить БУКВЫ и ЦИФРЫ - тебе придётся потратить время и сделать несколько рандомов на буквы по алфавиту и нумерации. (хуёво объяснил)


Lua:
update2()
print('Update starts.')
while update2 ~= false do wait(20) end
print('Update check successful.')

function update2()
    local fpath = os.getenv('TEMP') .. '\\pHelpUpdaterVERSION.json'
    downloadUrlToFile('https://dl.dropboxusercontent.com/s/8glfy3d2oi05a4v/pHelpNEWUpdaterVERSION.json?dl=0', fpath, function(id, status, p1, p2)
        if p1 > 1 and p2 == 0 then
            print("Превышено время ожидания загрузки. (Нет доступа к интернету)")
            sampAddChatMessage("[ ERROR ]: {00c5ff}Police Helper {ffffff}не может получить доступ к интернету. Вполне возможно, что его блокирует AntiStealer или антивирус.", 0xc1c1c1)
            sampAddChatMessage("[ ERROR ]: {ffffff}Попробуйте перезагрузить {00c5ff}Police Helper {ffffff}[ {00c5ff}/load{ffffff} ]", 0xc1c1c1)
            sampAddChatMessage("[ ERROR ]: {ffffff}В случае, если перезагрузка скрипта не помогла - обратитесь в тех.поддержку » {ffdb00}vk.com/policehelper", 0xc1c1c1)
        elseif status == dlstatus.STATUS_ENDDOWNLOADDATA then
            local f = io.open(fpath, 'r')
            if f then
                local info = decodeJson(f:read('*a'))
                updatelink = info.updateurl
                if info and info.latest then
                    version = tonumber(info.latest)
                    if version > tonumber(thisScript().version) then
                        lua_thread.create(goupdate2)
                    else
                        update2 = false
                    end
                end
            end
        end
    end)
end

--скачивание актуальной версии
function goupdate2()
    sampAddChatMessage(("[ PHELP ]{ffffff}: Обнаружено обновление установщика. Попробую обновиться.."), 0x0088ff)
    sampAddChatMessage(("[ PHELP ]{ffffff}: Текущая версия: {0088ff}"..thisScript().version.."{ffffff}. Новая версия: {0088ff}"..version), 0x0088ff)
    wait(300)
    downloadUrlToFile(updatelink, thisScript().path, function(id3, status1, p13, p23) lua_thread.create(function()
            if status1 == dlstatus.STATUS_ENDDOWNLOADDATA then
                sampAddChatMessage(("[ PHELP ]{ffffff}: Обновление завершено!"), 0x0088ff)
                wait(200)
                reloadScripts()
            end
        end)
    end)
end
Меняй под себя и используй.


Lua:
return {col, msg:match("IP: %[(%S+)%]"):gsub("%d+", "X")}
Lua:
update2()
print('Update starts.')
while update2 ~= false do wait(20) end
print('Update check successful.')
это в main? если да то вот что пишет в логе:
[ML] (exception) Helper for Ministry of Health: CJSON: Expected value but found invalid token at character 1
[ML] (error) Helper for Ministry of Health: ...GTA San Andreas\GTA San Andreas\moonloader\MOHhelper.lua:156: attempt to index local 'info' (a nil value)
stack traceback:
...GTA San Andreas\GTA San Andreas\moonloader\MOHhelper.lua:156: in function <...GTA San Andreas\GTA San Andreas\moonloader\MOHhelper.lua:146>
[ML] (error) Helper for Ministry of Health: Script died due to an error. (067F75CC)
 
Последнее редактирование:

штейн

Известный
Проверенный
1,002
688
Lua:
update2()
print('Update starts.')
while update2 ~= false do wait(20) end
print('Update check successful.')
это в main? если да то вот что пишет в логе:
[ML] (error) MOHhelper.lua: ...GTA San Andreas\GTA San Andreas\moonloader\MOHhelper.lua:143: '<eof>' expected near 'end'
[ML] (error) MOHhelper.lua: Script died due to an error. (06A07A4C)
на 143 не хватает end`a
 

sdfaw

Активный
717
150
на 143 не хватает end`a
исправил, но теперь пишет
[ML] (exception) Helper for Ministry of Health: CJSON: Expected value but found invalid token at character 1
[ML] (error) Helper for Ministry of Health: ...GTA San Andreas\GTA San Andreas\moonloader\MOHhelper.lua:156: attempt to index local 'info' (a nil value)
stack traceback:
...GTA San Andreas\GTA San Andreas\moonloader\MOHhelper.lua:156: in function <...GTA San Andreas\GTA San Andreas\moonloader\MOHhelper.lua:146>
[ML] (error) Helper for Ministry of Health: Script died due to an error. (067F75CC)
 

EvilCoder

Участник
147
1
исправил, но теперь пишет
[ML] (exception) Helper for Ministry of Health: CJSON: Expected value but found invalid token at character 1
[ML] (error) Helper for Ministry of Health: ...GTA San Andreas\GTA San Andreas\moonloader\MOHhelper.lua:156: attempt to index local 'info' (a nil value)
stack traceback:
...GTA San Andreas\GTA San Andreas\moonloader\MOHhelper.lua:156: in function <...GTA San Andreas\GTA San Andreas\moonloader\MOHhelper.lua:146>
[ML] (error) Helper for Ministry of Health: Script died due to an error. (067F75CC)

Serty333333 Новичок

Регистрация:
17 окт 2018
Сообщения:
4
Симпатии:
0
Пацаны, как в Bot Maker записать ответ на диалог и сделать так что бы он запомнил его и всегда отвечал на него.
Вот нужно что бы я выбрал вариант и что бы Bot Marek записал этот вариант

Serty333333 Новичок

Регистрация:
17 окт 2018
Сообщения:
4
Симпатии:
0
Пацаны, как в Bot Maker записать ответ на диалог и сделать так что бы он запомнил его и всегда отвечал на него.
Вот нужно что бы я выбрал вариант и что бы Bot Marek записал этот вариант
 

Petr_Sergeevich

Известный
Проверенный
707
298
исправил, но теперь пишет
[ML] (exception) Helper for Ministry of Health: CJSON: Expected value but found invalid token at character 1
[ML] (error) Helper for Ministry of Health: ...GTA San Andreas\GTA San Andreas\moonloader\MOHhelper.lua:156: attempt to index local 'info' (a nil value)
stack traceback:
...GTA San Andreas\GTA San Andreas\moonloader\MOHhelper.lua:156: in function <...GTA San Andreas\GTA San Andreas\moonloader\MOHhelper.lua:146>
[ML] (error) Helper for Ministry of Health: Script died due to an error. (067F75CC)
Написана же ошибка..
'info' (a nil value), 156 строка
 

dmitri4

Известный
452
79
Из за скрипта появился баг, когда умираешь то на секунду появляешься в скине CJ, как можно исправить?
 

Natami

Участник
375
26
Как сделать проверку, если в imgui.InputText ничего не написано, тогда "Введите текст в окно"???
 

#Northn

Pears Project — уже запущен!
Всефорумный модератор
2,657
2,551
с другой стороны до сих пор отдельно?
Lua:
          imgui.BeginMenuBar('its menu bar');
        if imgui.BeginMenu('item 3') then
            imgui.MenuItem('item 1_2');
            imgui.MenuItem('item 2_2');
                        if imgui.BeginMenu('item 1_3') then
                imgui.MenuItem('item 2_3');
                imgui.MenuItem('item 3_3');
                imgui.EndMenu()
            end
            imgui.EndMenu()
        end
        imgui.EndMenuBar()
Перевод: "Как здесь открыть 2 и более окон?"

Как сделать проверку, если в imgui.InputText ничего не написано, тогда "Введите текст в окно"???
Проверять переменная.v этого инпута и чекать с пустотой ('')

Lua:
update2()
print('Update starts.')
while update2 ~= false do wait(20) end
print('Update check successful.')
это в main? если да то вот что пишет в логе:
[ML] (exception) Helper for Ministry of Health: CJSON: Expected value but found invalid token at character 1
[ML] (error) Helper for Ministry of Health: ...GTA San Andreas\GTA San Andreas\moonloader\MOHhelper.lua:156: attempt to index local 'info' (a nil value)
stack traceback:
...GTA San Andreas\GTA San Andreas\moonloader\MOHhelper.lua:156: in function <...GTA San Andreas\GTA San Andreas\moonloader\MOHhelper.lua:146>
[ML] (error) Helper for Ministry of Health: Script died due to an error. (067F75CC)

Не полностью дал, забыл.
В начало скрипта:
Lua:
local phv = os.getenv('TEMP') .. '\\твой скриптVERSION.json'
local dlstatus = require('moonloader').download_status
local fpath = os.getenv('TEMP') .. '\\твой скрипт.lua'
Обязательно всё настрой под себя!
 
  • Нравится
Реакции: Natami

LuaMaster

Известный
146
17
как зделать что бы автоответ админу был спустя время например через 3 секунды

if text:match("^Администратор .*%[%d+%]: .*") then
bass.BASS_ChannelPlay(admVoice, true)
--sampSendChat('Что такое?')
botE()
end

добавлял wait скрипт крашится
 

#Northn

Pears Project — уже запущен!
Всефорумный модератор
2,657
2,551
как зделать что бы автоответ админу был спустя время например через 3 секунды

if text:match("^Администратор .*%[%d+%]: .*") then
bass.BASS_ChannelPlay(admVoice, true)
--sampSendChat('Что такое?')
botE()
end
Lua:
lua_thread.create(function() wait(3000) sampSendChat('Что такое?') end)
 

sdfaw

Активный
717
150
Перевод: "Как здесь открыть 2 и более окон?"


Проверять переменная.v этого инпута и чекать с пустотой ('')



Не полностью дал, забыл.
В начало скрипта:
Lua:
local phv = os.getenv('TEMP') .. '\\твой скриптVERSION.json'
local dlstatus = require('moonloader').download_status
local fpath = os.getenv('TEMP') .. '\\твой скрипт.lua'
Обязательно всё настрой под себя!
не получается, вот отрывок с кода:
Lua:
local phv = os.getenv('TEMP') .. '\\testqVERSION.json'
local dlstatus = require('moonloader').download_status
local fpath = os.getenv('TEMP') .. '\\testq.lua'
local key = require "vkeys"
local vkeys = require 'vkeys'
local wm = require 'lib.windows.message'
local imgui = require 'imgui'
local encoding = require 'encoding'
local sampev = require 'lib.samp.events'
local rkeys = require 'rkeys'
imgui.ShowCursor = false
local style = imgui.GetStyle()
local colors = style.Colors
local clr = imgui.Col
local ImVec4 = imgui.ImVec4
local dlstatus = require('moonloader').download_status
imgui.ToggleButton = require('imgui_addons').ToggleButton
imgui.HotKey = require('imgui_addons').HotKey
imgui.Spinner = require('imgui_addons').Spinner
imgui.BufferingBar = require('imgui_addons').BufferingBar
encoding.default = 'CP1251'
u8 = encoding.UTF8

function main()
   if not isSampLoaded() then
      return
   end
   while not isSampAvailable() do
      wait(0)
    end
    sampRegisterChatCommand("test", function ()
        window.v = true
    end)
    sampRegisterChatCommand("inv", function ()
      lua_thread.create(function ()
        sampSendChat ('xyila')
      end)
    end)
    bindID = rkeys.registerHotKey(ActiveMenu.v, true, function ()
        window.v = not window.v
    end)
    while true do
        local valid, ped = getCharPlayerIsTargeting(PLAYER_HANDLE)
        if valid and doesCharExist(ped) then
          local result, id = sampGetPlayerIdByCharHandle(ped)
          if result then
            if valid and doesCharExist(ped) and isKeyJustPressed(88) then
               nickname = sampGetPlayerNickname(id)
            end
          end  
        end
        if wasKeyPressed(key.VK_X) then
            bool, player = getCharPlayerIsTargeting(PLAYER_HANDLE)
            if bool then
                _, id = sampGetPlayerIdByCharHandle(player)
            end
        end
        wait(0)
        imgui.Process = window.v
    end
        update2()
    print('Update starts.')
    while update2 ~= false do wait(20) end
    print('Update check successful.')
end

function update2()
    local fpath = os.getenv('TEMP') .. '\\pHelpUpdaterVERSION.json'
    downloadUrlToFile('https://drive.google.com/open?id=1pMOCTfLNnC2V2fuGIQ7pa5zqgNnnEwYA', fpath, function(id, status, p1, p2)
        if p1 > 1 and p2 == 0 then
            print("Превышено время ожидания загрузки. (Нет доступа к интернету)")
        elseif status == dlstatus.STATUS_ENDDOWNLOADDATA then
            local f = io.open(fpath, 'r')
            if f then
                local info = decodeJson(f:read('*a'))
                updatelink = info.updateurl
                if info and info.latest then
                    version = tonumber(info.latest)
                    if version > tonumber(thisScript().version) then
                        lua_thread.create(goupdate2)
                    else
                        update2 = false
                    end
                end
            end
        end
    end)
end

--скачивание актуальной версии
function goupdate2()
    downloadUrlToFile(updatelink, thisScript().path, function(id3, status1, p13, p23) lua_thread.create(function()
            if status1 == dlstatus.STATUS_ENDDOWNLOADDATA then
                sampAddChatMessage(("[ PHELP ]{ffffff}: Обновление завершено!"), 0x0088ff)
                wait(200)
                reloadScripts()
            end
        end)
    end)
end