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

UBP

Известный
349
191
но где эти команды посмотреть? мне надо чтобы ссылка открывалась так же как в авто обнове, типо просто переходило по ссылке и меня не выбивало с игры в браузер
асинхронный запрос, никак по другому не сделаешь без открытия браузера

асинхронный запрос, либо никак по другому не сделаешь без открытия браузера
 

Smeruxa

Известный
1,359
721
но где эти команды посмотреть? мне надо чтобы ссылка открывалась так же как в авто обнове, типо просто переходило по ссылке и меня не выбивало с игры в браузер
1661848074262.png


При авто обнове запросы, а не открытие ссылки
никак по другому не сделаешь без открытия браузера
Получается, он делает запрос открывая браузер?..
 
Последнее редактирование:

UBP

Известный
349
191
чо делать если белая картинка в imgui.Image? пробовал этот способ, нихуя не помогло
Путь проверь до картинки
Имгуи последней версии?
Попробуй подгрузить картинку в befor DrawFrame
Сообщение в теме 'Как засунуть картинку в ImGUI'
https://www.blast.hk/threads/135428/post-1055519
 

Deroni

Новичок
3
0
Здравствуйте, помогите пожалуйста. Как убрать флуд после переключения imgui.ToggleButton.
После переключения в чат начинается флуд "test". Возможно ли сделать чтобы надпись была 1 раз? (Важно, OneActive не должна отключаться)

Lua:
-- Это сам переключатель.
if imgui.ToggleButton('TestToggler', c_box_1) then OneActive = not OneActive end


function main()
    repeat wait(0) until isSampAvailable()
    while true do wait(0)
    TestFunction()
        if isKeyJustPressed(VK_X) and not (sampIsChatInputActive() or sampIsDialogActive()) then main_window.v = not main_window.v end
        if main_window.v then imgui.Process = true else imgui.Process = false end
    end
end

function TestFunction()
    if OneActive then
        sampAddChatMessage('test', -1)
    end
end
 
Последнее редактирование:

olol321

Участник
102
16
Их закидывать надо либо в moonloader\lib, либо в moonloader
ну я ж не тупой, скачал все либы от чела забыл ник, который выкладывал мунлодер

помогите эксперементирую с mysql луа а чет не так, подключаю либу
пишет ошибку
[01:18:42.323841] (error) test.lua: D:\GTA bandana\moonloader\test.lua:7: module 'luasql.mysql' not found:
no field package.preload['luasql.mysql']
no file 'D:\GTA bandana\moonloader\lib\luasql\mysql.lua'
no file 'D:\GTA bandana\moonloader\lib\luasql\mysql\init.lua'
no file 'D:\GTA bandana\moonloader\luasql\mysql.lua'
no file 'D:\GTA bandana\moonloader\luasql\mysql\init.lua'
no file '.\luasql\mysql.lua'
no file 'D:\GTA bandana\moonloader\lib\luasql\mysql.luac'
no file 'D:\GTA bandana\moonloader\lib\luasql\mysql\init.luac'
no file 'D:\GTA bandana\moonloader\luasql\mysql.luac'
no file 'D:\GTA bandana\moonloader\luasql\mysql\init.luac'
no file '.\luasql\mysql.luac'
no file 'D:\GTA bandana\moonloader\lib\luasql\mysql.dll'
no file 'D:\GTA bandana\moonloader\lib\luasql.dll'
stack traceback:
[C]: in function 'require'

есть все либы
луа.jpg

мб я както не так указываю ее?
local mysql = require("luasql.mysql")
 
Последнее редактирование:

olol321

Участник
102
16
название папки luasql-mysql, ты пишешь luasql.mysql. если не поможет, попробуй require 'lib.luasql-mysql."сюда название одного из луа в папке, я не ебу какой там главный"'

тебе даже и пишет в ошибке что не найдет такой файл, потому что ты не так путь указал к нему
я там короче папку переименовал, с luasql-mysql на luasql вроде щяс запустился без ошибок скрипт
 

UBP

Известный
349
191
Здравствуйте, помогите пожалуйста. Как убрать флуд после переключения imgui.ToggleButton.
После переключения в чат начинается флуд "test". Возможно ли сделать чтобы надпись была 1 раз? (Важно, OneActive не должна отключаться)

Lua:
-- Это сам переключатель.
if imgui.ToggleButton('TestToggler', c_box_1) then OneActive = not OneActive end


function main()
    repeat wait(0) until isSampAvailable()
    while true do wait(0)
    TestFunction()
        if isKeyJustPressed(VK_X) and not (sampIsChatInputActive() or sampIsDialogActive()) then main_window.v = not main_window.v end
        if main_window.v then imgui.Process = true else imgui.Process = false end
    end
end

function TestFunction()
    if OneActive then
        sampAddChatMessage('test', -1)
    end
end
if c_box_1.v then
—действия
End
OneActive = not OneActive убери, при таком условии, ты переключаешь значения true и false. И пока true у тебя бесконечно выполняет действие
 
  • Нравится
Реакции: Deroni

ChаtGPT

Активный
368
90
Просто имгуи работает теперь с двумя окнами, можно сделать больше, просто через and дописывай еще окна
Все остальные imgui.Process можно убирать спокойно, чамп гуес ваш этот..
Срипт не работает, даже ошибок нету. Короче я не понимаю куда его пихать, ещё раз напишу, когда открываю main_window_state2 автоматически должно закрытся main_window_state. Можно пример какой-то?

Срипт не работает, даже ошибок нету. Короче я не понимаю куда его пихать, ещё раз напишу, когда открываю main_window_state2 автоматически должно закрытся main_window_state. Можно пример какой-то?
Решил проблему так
Код:
while true do
        wait(0)
        if main_window_state5.v == true then
            main_window_state2.v = false
        end
end
 
Последнее редактирование:
  • Злость
Реакции: qdIbp

olol321

Участник
102
16
помогите как в mysql вставить переменную вместо 'nick', я пробывал ..nick но естественно ничего не сработалоfdssfda.jpg
 

olol321

Участник
102
16
без кавычек попробуй

как менять цвет загруженной картинки в имгуи?
Актуально.
не, все равно, такое ощущение что он принимает только вписанное в нутрь что-то, типа че хочу пишу скрипт работает, а в бд нет изменений
 

melody.

Участник
36
3
После вывода текста в чат сервер не дисконнетится, 2 фунция не начинает работу после нажатия F3


ю:
script_name('Arz-Troll')
script_author('melody')
script_description('Троллинг аризона рп')
require 'lib.moonloader'
require 'lib.sampfuncs'
local key = require 'vkeys'
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do
        wait(0)
        _, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
        nick = sampGetPlayerNickname(id)
    if isKeyJustPressed(VK_F3) then
        sampAddChatMessage('[Информация] {ffffff}Вы отправили жалобу: аризона помойка', 0xFF634F)
        sampAddChatMessage('На ваш вопрос обязательно ответит администрация! Вы 1 в очереди!', 0xFFFFFF)
        sampAddChatMessage('Если за вами необходимо срочно проследить, администрация сделает это вне очереди!', 0xFFFFFF)
        wait(2000)
        sampAddChatMessage('{FF634F}Администратор Renzo_Seagers[364]: {FFFFFF}Уважаемый игрок, сейчас попробую вам помочь!', 0xFFFFFF)
        wait(4000)
        sampAddChatMessage('Администратор Renzo_Seagers[364] забанил игрока ' .. nick .. '[' .. id .. ']' .. ' на 30 дней. Причина: Оск проекта', 0xFF634F)
        sampAddChatMessage('Server closed the connection.', 0xA9C4E4)
    end
end
function Disconnect(packetId)
        --[[
                [31] = 'NO_FREE_INCOMING_CONNECTIONS'
                [32] = 'DISCONNECTION_NOTIFICATION'
                [33] = 'CONNECTION_LOST'
                [34] = 'CONNECTION_REQUEST_ACCEPTED'
                [35] = 'CONNECTION_ATTEMPT_FAILED'
                [36] = 'CONNECTION_BANNED'
                [37] = 'INVALID_PASSWORD'
        ]]
        local bs = raknetNewBitStream()
        raknetBitStreamWriteInt8(bs, packetId)
        raknetEmulPacketReceiveBitStream(packetId, bs)
        raknetDeleteBitStream(bs)
end
function main()
        while not isSampAvailable() do wait(0) end
        while true do
                wait(0)
                if wasKeyPressed(VK_F3) then
                        Disconnect(32)
                end
        end
end
[/CODE
 

UBP

Известный
349
191
После вывода текста в чат сервер не дисконнетится, 2 фунция не начинает работу после нажатия F3


ю:
script_name('Arz-Troll')
script_author('melody')
script_description('Троллинг аризона рп')
require 'lib.moonloader'
require 'lib.sampfuncs'
local key = require 'vkeys'
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do
        wait(0)
        _, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
        nick = sampGetPlayerNickname(id)
    if isKeyJustPressed(VK_F3) then
        sampAddChatMessage('[Информация] {ffffff}Вы отправили жалобу: аризона помойка', 0xFF634F)
        sampAddChatMessage('На ваш вопрос обязательно ответит администрация! Вы 1 в очереди!', 0xFFFFFF)
        sampAddChatMessage('Если за вами необходимо срочно проследить, администрация сделает это вне очереди!', 0xFFFFFF)
        wait(2000)
        sampAddChatMessage('{FF634F}Администратор Renzo_Seagers[364]: {FFFFFF}Уважаемый игрок, сейчас попробую вам помочь!', 0xFFFFFF)
        wait(4000)
        sampAddChatMessage('Администратор Renzo_Seagers[364] забанил игрока ' .. nick .. '[' .. id .. ']' .. ' на 30 дней. Причина: Оск проекта', 0xFF634F)
        sampAddChatMessage('Server closed the connection.', 0xA9C4E4)
    end
end
function Disconnect(packetId)
        --[[
                [31] = 'NO_FREE_INCOMING_CONNECTIONS'
                [32] = 'DISCONNECTION_NOTIFICATION'
                [33] = 'CONNECTION_LOST'
                [34] = 'CONNECTION_REQUEST_ACCEPTED'
                [35] = 'CONNECTION_ATTEMPT_FAILED'
                [36] = 'CONNECTION_BANNED'
                [37] = 'INVALID_PASSWORD'
        ]]
        local bs = raknetNewBitStream()
        raknetBitStreamWriteInt8(bs, packetId)
        raknetEmulPacketReceiveBitStream(packetId, bs)
        raknetDeleteBitStream(bs)
end
function main()
        while not isSampAvailable() do wait(0) end
        while true do
                wait(0)
                if wasKeyPressed(VK_F3) then
                        Disconnect(32)
                end
        end
end
[/CODE
Я же тебе скинул код как оно работать будет

Я же тебе скинул код как оно работать будет
И почему у тебя две мейн функции и два бесконечных цикла?

Lua:
string.format("INSERT INTO kladbd values('ll', '%s')", nick)
Сообщение в теме 'Вопросы по Lua скриптингу'
https://www.blast.hk/threads/13892/post-1132204