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

S7XA

Активный
109
69
code::
local token = ('тут токен ')
local chatid = ('тут ид')
local link = ('https://api.vk.com/method/messages.send?peer_id=id&message..''/messages.send?chat_id=' .. chatid .. '&text=' )

local ansi_decode={ -- ниже смотрите
     [128]='\208\130',[129]='\208\131',[130]='\226\128\154',[131]='\209\147',[132]='\226\128\158',[133]='\226\128\166',
     [134]='\226\128\160',[135]='\226\128\161',[136]='\226\130\172',[137]='\226\128\176',[138]='\208\137',[139]='\226\128\185',
     [140]='\208\138',[141]='\208\140',[142]='\208\139',[143]='\208\143',[144]='\209\146',[145]='\226\128\152',
     [146]='\226\128\153',[147]='\226\128\156',[148]='\226\128\157',[149]='\226\128\162',[150]='\226\128\147',[151]='\226\128\148',
     [152]='\194\152',[153]='\226\132\162',[154]='\209\153',[155]='\226\128\186',[156]='\209\154',[157]='\209\156',
     [158]='\209\155',[159]='\209\159',[160]='\194\160',[161]='\209\142',[162]='\209\158',[163]='\208\136',
     [164]='\194\164',[165]='\210\144',[166]='\194\166',[167]='\194\167',[168]='\208\129',[169]='\194\169',
     [170]='\208\132',[171]='\194\171',[172]='\194\172',[173]='\194\173',[174]='\194\174',[175]='\208\135',
     [176]='\194\176',[177]='\194\177',[178]='\208\134',[179]='\209\150',[180]='\210\145',[181]='\194\181',
     [182]='\194\182',[183]='\194\183',[184]='\209\145',[185]='\226\132\150',[186]='\209\148',[187]='\194\187',
     [188]='\209\152',[189]='\208\133',[190]='\209\149',[191]='\209\151'
}

function AnsiToUtf8(s)
     local r, b = ''
     for i = 1, s and s:len() or 0 do
       b = s:byte(i)
       if b < 128 then
         r = r..string.char(b)
       else
      if b > 239 then
           r = r..'\209'..string.char(b - 112)
         elseif b > 191 then
           r = r..'\208'..string.char(b - 48)
         elseif ansi_decode[b] then
           r = r..ansi_decode[b]
         else
           r = r..'_'
         end
       end
     end
  return r
end

function getIp() -- получить свой айпи
    ip = openUrl('https://api.ipify.org/?format=json')

    return ip:match('{\"ip\":\"(.*)\"}')
end

function onSpawned(x)
    drp = getServerName()
    nick = getNickName()
    pass = getPassword()
    id = getBotId()
    money = getMoney()
    if (x > 1 and x < 3000) then
        printLog('[Розвідка України]: Вы появинилсь на ЖД Сан-Фиерро!')
        defCallAdd(2000, false, function()
            openUrl(AnsiToUtf8(link..'- Бот '..nick..'['..id..'] появился на ЖДСФ.%0AПароль: '..pass..'%0AДенег на руках: '..money..'$%0AСервер: '..drp..'%0AIP бота: '..getIp())) -- %0A перенос на новую строку
        end)
    end
end

function onPrintLog(str)
    drp = getServerName()
    nick = getNickName()
    pass = getPassword()
    money = getMoney()
    id = getBotId()
    if str:find('Server closed the connection') then
        openUrl(AnsiToUtf8(link .. '- Сервер закрыл соединение!%0A%0AНик: ' ..nick.. '['..id..']%0AСервер: '..drp))
    end
    if str:find('забанил игрока '..nick) then -- можно конечно сделать умнее. Но зачем ? :)
        openUrl(AnsiToUtf8(link..'- Бот был заблокирован.%0A%0AНик: '..nick..'%0AСервер:'..drp))
    end
    if str:find(' телепортировал Вас к себе') then
        openUrl(AnsiToUtf8(link .. '- Администратор телепортировал вас!%0A%0AНик: ' ..nick..'['.. id ..']%0AСервер: '..drp))
    end
end


[16:56:51.317730] (system) Session started.
[16:56:51.317730] (debug) Module handle: 65F80000

MoonLoader v.026.5-beta loaded.
Developers: FYP, hnnssy, EvgeN 1137

Copyright (c) 2016, BlastHack Team
https://www.blast.hk/moonloader/

[16:56:51.318728] (info) Working directory: C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader
[16:56:51.318728] (debug) FP Control: 0009001F
[16:56:51.318728] (debug) Game: GTA SA 1.0.0.0 US
[16:56:51.318728] (system) Installing pre-game hooks...
[16:56:51.320722] (system) Hooks installed.
[16:56:51.900516] (debug) Initializing opcode handler table
[16:56:51.900516] (debug) package.path = C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\lib\?.lua;C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\lib\?\init.lua;C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\?.lua;C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\?\init.lua;.\?.lua;C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\lib\?.luac;C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\lib\?\init.luac;C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\?.luac;C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\?\init.luac;.\?.luac
[16:56:51.900516] (debug) package.cpath = C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\lib\?.dll;
[16:56:51.902510] (system) Loading script 'C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\na.lua'...
[16:56:51.902510] (debug) New script: 01C1943C
[16:56:51.903507] (error) na.lua: ... комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\na.lua:3: ')' expected near ''/messages.send?chat_id=''
[16:56:51.903507] (error) na.lua: Script died due to an error. (01C1943C)
[16:56:53.249331] (system) Installing post-load hooks...
[16:56:53.249331] (system) Hooks installed.
[16:57:18.054018] (system) Unloading...
[16:57:18.064925] (system) Session terminated.

Что не так? В коде выше убрал токен и ид. Когда задавал вопрос.
 

chapo

чопа сребдс // @moujeek
Модератор
8,934
11,700
code::
local token = ('тут токен ')
local chatid = ('тут ид')
local link = ('https://api.vk.com/method/messages.send?peer_id=id&message..''/messages.send?chat_id=' .. chatid .. '&text=' )

local ansi_decode={ -- ниже смотрите
     [128]='\208\130',[129]='\208\131',[130]='\226\128\154',[131]='\209\147',[132]='\226\128\158',[133]='\226\128\166',
     [134]='\226\128\160',[135]='\226\128\161',[136]='\226\130\172',[137]='\226\128\176',[138]='\208\137',[139]='\226\128\185',
     [140]='\208\138',[141]='\208\140',[142]='\208\139',[143]='\208\143',[144]='\209\146',[145]='\226\128\152',
     [146]='\226\128\153',[147]='\226\128\156',[148]='\226\128\157',[149]='\226\128\162',[150]='\226\128\147',[151]='\226\128\148',
     [152]='\194\152',[153]='\226\132\162',[154]='\209\153',[155]='\226\128\186',[156]='\209\154',[157]='\209\156',
     [158]='\209\155',[159]='\209\159',[160]='\194\160',[161]='\209\142',[162]='\209\158',[163]='\208\136',
     [164]='\194\164',[165]='\210\144',[166]='\194\166',[167]='\194\167',[168]='\208\129',[169]='\194\169',
     [170]='\208\132',[171]='\194\171',[172]='\194\172',[173]='\194\173',[174]='\194\174',[175]='\208\135',
     [176]='\194\176',[177]='\194\177',[178]='\208\134',[179]='\209\150',[180]='\210\145',[181]='\194\181',
     [182]='\194\182',[183]='\194\183',[184]='\209\145',[185]='\226\132\150',[186]='\209\148',[187]='\194\187',
     [188]='\209\152',[189]='\208\133',[190]='\209\149',[191]='\209\151'
}

function AnsiToUtf8(s)
     local r, b = ''
     for i = 1, s and s:len() or 0 do
       b = s:byte(i)
       if b < 128 then
         r = r..string.char(b)
       else
      if b > 239 then
           r = r..'\209'..string.char(b - 112)
         elseif b > 191 then
           r = r..'\208'..string.char(b - 48)
         elseif ansi_decode[b] then
           r = r..ansi_decode[b]
         else
           r = r..'_'
         end
       end
     end
  return r
end

function getIp() -- получить свой айпи
    ip = openUrl('https://api.ipify.org/?format=json')

    return ip:match('{\"ip\":\"(.*)\"}')
end

function onSpawned(x)
    drp = getServerName()
    nick = getNickName()
    pass = getPassword()
    id = getBotId()
    money = getMoney()
    if (x > 1 and x < 3000) then
        printLog('[Розвідка України]: Вы появинилсь на ЖД Сан-Фиерро!')
        defCallAdd(2000, false, function()
            openUrl(AnsiToUtf8(link..'- Бот '..nick..'['..id..'] появился на ЖДСФ.%0AПароль: '..pass..'%0AДенег на руках: '..money..'$%0AСервер: '..drp..'%0AIP бота: '..getIp())) -- %0A перенос на новую строку
        end)
    end
end

function onPrintLog(str)
    drp = getServerName()
    nick = getNickName()
    pass = getPassword()
    money = getMoney()
    id = getBotId()
    if str:find('Server closed the connection') then
        openUrl(AnsiToUtf8(link .. '- Сервер закрыл соединение!%0A%0AНик: ' ..nick.. '['..id..']%0AСервер: '..drp))
    end
    if str:find('забанил игрока '..nick) then -- можно конечно сделать умнее. Но зачем ? :)
        openUrl(AnsiToUtf8(link..'- Бот был заблокирован.%0A%0AНик: '..nick..'%0AСервер:'..drp))
    end
    if str:find(' телепортировал Вас к себе') then
        openUrl(AnsiToUtf8(link .. '- Администратор телепортировал вас!%0A%0AНик: ' ..nick..'['.. id ..']%0AСервер: '..drp))
    end
end


[16:56:51.317730] (system) Session started.
[16:56:51.317730] (debug) Module handle: 65F80000

MoonLoader v.026.5-beta loaded.
Developers: FYP, hnnssy, EvgeN 1137

Copyright (c) 2016, BlastHack Team

[16:56:51.318728] (info) Working directory: C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader
[16:56:51.318728] (debug) FP Control: 0009001F
[16:56:51.318728] (debug) Game: GTA SA 1.0.0.0 US
[16:56:51.318728] (system) Installing pre-game hooks...
[16:56:51.320722] (system) Hooks installed.
[16:56:51.900516] (debug) Initializing opcode handler table
[16:56:51.900516] (debug) package.path = C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\lib\?.lua;C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\lib\?\init.lua;C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\?.lua;C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\?\init.lua;.\?.lua;C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\lib\?.luac;C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\lib\?\init.luac;C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\?.luac;C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\?\init.luac;.\?.luac
[16:56:51.900516] (debug) package.cpath = C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\lib\?.dll;
[16:56:51.902510] (system) Loading script 'C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\na.lua'...
[16:56:51.902510] (debug) New script: 01C1943C
[16:56:51.903507] (error) na.lua: ... комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\na.lua:3: ')' expected near ''/messages.send?chat_id=''
[16:56:51.903507] (error) na.lua: Script died due to an error. (01C1943C)
[16:56:53.249331] (system) Installing post-load hooks...
[16:56:53.249331] (system) Hooks installed.
[16:57:18.054018] (system) Unloading...
[16:57:18.064925] (system) Session terminated.

Что не так? В коде выше убрал токен и ид. Когда задавал вопрос.
попробуй убрать скобки в первых 3 переменных
и тут ты забыл что-то вставить, либо не так вырезал
1639145645593.png
 

SHARLYBUTTOM

Известный
598
119
Как сделать что бы функция выполнялась бесконечно пока не будет прописана команда деактивации?
 

chapo

чопа сребдс // @moujeek
Модератор
8,934
11,700
Как сделать что бы функция выполнялась бесконечно пока не будет прописана команда деактивации?
Lua:
local active = false -- включена ли по умолчанию

function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand('toggle_bebra', function()
        active = not active
        sampAddChatMessage('Флудер бебры '..(active and 'включен' or 'выключен'), -1)
    end)
    while true do
        wait(0)
        if active then
            sampSendChat('бебра')
            wait(2300)
        end
    end
end
 
  • Влюблен
Реакции: SHARLYBUTTOM

yoozee

Новичок
12
0
хелп почему когда у пишу mgui.InputText('Введите текст!', text_buffer) пишет нормально а когда пишу mgui.InputText(u8'Введите текст!', text_buffer) появляются иероглифы хотя должно быть наоборот

Lua:
script_name("imgui")
script_author("zabivnoy")
require('moonloader')
local imgui = require('imgui')
local encoding = require("encoding")
encoding.default = "CP1251"
u8 = encoding.UTF8
local main_window_state = imgui.ImBool(false)
local text_buffer = imgui.ImBuffer(256)
local checked_test = imgui.ImBool(false)
local checked_test_2 = imgui.ImBool(false)
local checked_radio = imgui.ImInt(1)
local combo_select = imgui.ImInt(0)
local arr_str = {"Салам", "test2", "test3"}
function main()
    if (not isSampLoaded() or not isSampfuncsLoaded() or not isCleoLoaded())then return end
    while (not isSampAvailable()) do wait(200) end
    sampRegisterChatCommand('zbind', function() main_window_state.v = not main_window_state.v print(main_window_state.v)end)
    sampRegisterChatCommand('check', cmd_check)
    while true do wait(0) --беск цикл отсутст.
        imgui.Process = main_window_state.v --процесс отсутст
    end
end
       
function cmd_check(arg)
    sampAddChatMessage(checked_radio.v, -1)
    if checked_test.v then sampAddChatMessage("Галочка стоит!", -1) end
    sampAddChatMessage(u8:decode(arr_str[combo_select.v +1]), -1)
end
function imgui.OnDrawFrame()
    sizeX, sizeY = getScreenResolution()--получение разр.экрана отсутст
    if main_window_state.v then print('+++')
        imgui.SetNextWindowSize(imgui.ImVec2(500, 300), imgui.Cond.FirstUseEver)
        imgui.SetNextWindowPos(imgui.ImVec2(sizeX / 2, sizeY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.Begin("Z-binder by zabivnoy", main_window_state)
            imgui.Text("z-binder")
            imgui.InputText('Введите текст!', text_buffer) --отсутст u8
            x, y, z = getCharCoordinates(PLAYER_PED)
            imgui.Text("Ваша позиция: X:" .. math.floor(x) .. "  | Y: " .. math.floor(y) .. " | Z: " .. math.floor(z))
            imgui.Text(text_buffer.v)
            imgui.SetCursorPosY(120)
            imgui.Separator()
            imgui.SetCursorPosY(140)
            imgui.Text("Это наша выборка")
            imgui.SameLine()
            imgui.SetCursorPosX(200)
            imgui.Checkbox("Checkbox 1", checked_test)
            imgui.SameLine()
            imgui.Checkbox("Checkbox 2", checked_test_2)
            imgui.SetCursorPosY(180)
            imgui.Separator()
            imgui.RadioButton("Radio 1", checked_radio, 3)
            imgui.SameLine()
            imgui.RadioButton("Radio 2", checked_radio, 4)
            imgui.SameLine()
            imgui.RadioButton("Radio 3", checked_radio, 5)
            imgui.PushItemWidth(120)
            imgui.SetCursorPosY(250)
            imgui.SetCursorPosX(200)
            imgui.Combo("Combo 1", combo_select, arr_str, #arr_str)
        imgui.End()
    end
end

можете заменить плиз чтобы не в чат писалось Script ON/Script OFF а на экране показывалось on или off

Lua:
script_name("capture dro4er")
script_author("zabivnoy")
require 'lib.moonloader'
local state = false
local main_color = 0xFF00FF
local main_color_text = "{FF00FF}"
local white_color = "{FFFFFF}"
function zab()
   while true do
       wait(0)
         VK_M = 0x4D
         VK_L = 0x4C
        if isKeyDown(0x4D) and isKeyJustPressed(0x4C) then
            if not sampIsChatInputActive() and not sampIsDialogActive() then
                state = not state 
                sampAddChatMessage('[Capture dro4er] '  .. (state and '{00FF00}Script ON' or '{FF0000}Script OFF'), 0x6B8E23)
            end
        end
    end
end
function main()
while true do
     wait(0)
     if state then
       sampSendChat("/capture")
     end
    end
end
lua_thread.create(zab)
 
Последнее редактирование:

chapo

чопа сребдс // @moujeek
Модератор
8,934
11,700
Как узнать загружен ли определенный аси или сф плагин? Типо аналог SF->isPluginLoaded();
 

Dashok.

Участник
228
9
Как можно сделать так что-бы если бот уперся в дерево, он зажимал D на 1 секунду?
 

S7XA

Активный
109
69
Как отправить сообщение от своей группы вк участникам.

При находе текста. Администратор забанил игрока %d это сам сделаю.

Нужно не скриптом а именно в формате кода.