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

profgold

Известный
30
1
Так у тебя в аргументе функции указан id, а сверяешь ты уже почему-то dialogId
Lua:
function onDialogShow(id, style, title, b1, b2, text)
    if dialogId == 22 and title:find('Статистика персонажа') then
И правда, спасибо
Но проблему это не пофиксило

Вот фунцкция:
Код:
function onDialogShow(dialogId, style, title, b1, b2, text)
    if dialogId == 22 and title:find('Статистика персонажа') then
    sleep(500)
    sendInput('/stats')
        exp = text:gmatch('Exp (%d+%/%d+)')
        end
        end


А вот код в функции,что отвечает за отправку сообщений в тг
Код:
elseif text == "/getexp" then
tgbot.sendMessage(from, exp)
 

Nelit

Потрачен
252
38
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как воспроизвести видео которое залитое на ютаб в имгуи окне
 

Daniil Kolysov

Новичок
3
0
Использую функцию setVirtualKeyDown(). Мне нужно, чтобы нажимались стрелки (вверх, вниз, влево, справо). Согласно таблице id клавиш их id соответственно: 38, 40, 37, 39. Но вместо стрелок нажимаются клавиши num клавиатуры со стрелками (2, 4, 6, 8). Как это исправить? И какие id у стрелок?
 

Nelit

Потрачен
252
38
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Использую функцию setVirtualKeyDown(). Мне нужно, чтобы нажимались стрелки (вверх, вниз, влево, справо). Согласно таблице id клавиш их id соответственно: 38, 40, 37, 39. Но вместо стрелок нажимаются клавиши num клавиатуры со стрелками (2, 4, 6, 8). Как это исправить? И какие id у стрелок?
Подключи мунлоадер вот так
Lua:
require 'lib.moonloader'
И юзай vk коды
 
  • Bug
Реакции: qdIbp

KhanWarden

Участник
42
3
Какая функция для релодинга скриптов с нажатием определенных кнопок?
Точнее напишите пожалуйста функцию где Alt + K = reload script
 

P3rsik

Активный
213
32
g:
 if antiafk.v then
        memory.setuint8(7634870, 1, false)
        memory.setuint8(7635034, 1, false)
        memory.fill(7623723, 144, 8, false)
        memory.fill(5499528, 144, 6, false)
    else
        memory.setuint8(7634870, 0, false)
        memory.setuint8(7635034, 0, false)
        memory.hex2bin('0F 84 7B 01 00 00', 7623723, 8)
        memory.hex2bin('50 51 FF 15 00 83 85 00', 5499528, 6)
    end

doesnt work
 

Nelit

Потрачен
252
38
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Какая функция для релодинга скриптов с нажатием определенных кнопок?
Точнее напишите пожалуйста функцию где Alt + K = reload script

Lua:
function main()
    -- main code

    while true do
        wait(0)

        if isKeyDown(VK_MENU) and isKeyJustPressed(VK_K) then
           thisScript():reload()
        end
    end
end

С телефона писал
 
  • Нравится
Реакции: Иглобрюх

Basho

Известный
148
52
g:
 if antiafk.v then
        memory.setuint8(7634870, 1, false)
        memory.setuint8(7635034, 1, false)
        memory.fill(7623723, 144, 8, false)
        memory.fill(5499528, 144, 6, false)
    else
        memory.setuint8(7634870, 0, false)
        memory.setuint8(7635034, 0, false)
        memory.hex2bin('0F 84 7B 01 00 00', 7623723, 8)
        memory.hex2bin('50 51 FF 15 00 83 85 00', 5499528, 6)
    end

doesnt work
check

Lua:
local aafk = imgui.ImBool(false)
function WorkInBackground()
work = not work
    if work then
        aafk.v = true
        memory.setuint8(7634870, 1)
        memory.setuint8(7635034, 1)
        memory.fill(7623723, 144, 8)
        memory.fill(5499528, 144, 6)
    else
        aafk.v = false
        memory.setuint8(7634870, 0)
        memory.setuint8(7635034, 0)
        memory.hex2bin('5051FF1500838500', 7623723, 8)
        memory.hex2bin('0F847B010000', 5499528, 6)
    end
end
function imgui.OnDrawFrame()
--
if imgui.Checkbox('Anti-AFK', aafk) then
    WorkInBackground()
end
--
end
 

Daniil Kolysov

Новичок
3
0
Подключи мунлоадер вот так
Lua:
require 'lib.moonloader'
И юзай vk коды
Проблема сохранилась.
Когда пишу:
function thrDownFunction()
wait(500)
setVirtualKeyDown(VK_DOWN, true)
wait(200)
setVirtualKeyDown(VK_DOWN, false)
thrDown:terminate()
end
срабатывает кнопка 2 на num клавиатуре. Аналогично, если вместо VK_DOWN пишу 0х28 (как в таблице vkeys). И если я пишу VK_NUMPAD2 (согласно таблице - это и есть num2), срабатывает тоже она. Стрелка напрочь отказывается нажиматься)
 

Basho

Известный
148
52
И правда, спасибо
Но проблему это не пофиксило

Вот фунцкция:
Код:
function onDialogShow(dialogId, style, title, b1, b2, text)
    if dialogId == 22 and title:find('Статистика персонажа') then
    sleep(500)
    sendInput('/stats')
        exp = text:gmatch('Exp (%d+%/%d+)')
        end
        end


А вот код в функции,что отвечает за отправку сообщений в тг
Код:
elseif text == "/getexp" then
tgbot.sendMessage(from, exp)
Lua:
local sampev = require 'lib.samp.events'
function sampev.onShowDialog(dialogId, style, title, button1, button2, text)
    if dialogId == 22 and title:find('Статистика персонажа') then
        sampSendChat('/stats')
        exp = text:gmatch('Exp (%d+%/%d+)')
    end
end
sleep (вроде в луа используется wait) только в main() либо в потоке (lua_thread) юзай
sendInput заменяй на sampSendChat
 

P3rsik

Активный
213
32
check

Lua:
local aafk = imgui.ImBool(false)
function WorkInBackground()
work = not work
    if work then
        aafk.v = true
        memory.setuint8(7634870, 1)
        memory.setuint8(7635034, 1)
        memory.fill(7623723, 144, 8)
        memory.fill(5499528, 144, 6)
    else
        aafk.v = false
        memory.setuint8(7634870, 0)
        memory.setuint8(7635034, 0)
        memory.hex2bin('5051FF1500838500', 7623723, 8)
        memory.hex2bin('0F847B010000', 5499528, 6)
    end
end
function imgui.OnDrawFrame()
--
if imgui.Checkbox('Anti-AFK', aafk) then
    WorkInBackground()
end
--
end
now my gta not responding