Вопросы по 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
39
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как воспроизвести видео которое залитое на ютаб в имгуи окне
 

Daniil Kolysov

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

Nelit

Потрачен
252
39
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Использую функцию 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
39
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Какая функция для релодинга скриптов с нажатием определенных кнопок?
Точнее напишите пожалуйста функцию где 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
 

Basho

Известный
148
52
lua:
script_name("KFR")
script_author("Keon Krewazz")
script_version("0.1")

require ("lib.moonloader")
local w, h = getScreenResolution()
local ffi = require "ffi"
local memory = require ("memory")
local ev = require ("lib.samp.events")
local inicfg = require ('inicfg')
local imgui = require ("imgui")

local aafk = imgui.ImBool(false)

kfr_menu = imgui.ImBool(false)

local ini = inicfg.load({
    Main =
    {
        nobat = false,
        longhpbar = true,
        rpkrava = false,
        fullSkill = false,
        capfld = false,
        sensFix = false
    }
}, '..\\config\\[KFR menu] settings.ini')

--imgui
sensFix = imgui.ImBool(ini.Main.sensFix)
nobat = imgui.ImBool(ini.Main.nobat)
longhpbar = imgui.ImBool(ini.Main.longhpbar)
rpkrava = imgui.ImBool(ini.Main.rpkrava)
fullSkill = imgui.ImBool(ini.Main.fullSkill)
capfld = imgui.ImBool(ini.Main.capfld)

function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('kfr', function() kfr_menu.v = not kfr_menu.v end)
    while true do
        wait(0)
        imgui.Process = kfr_menu.v
        checkbox()
        if capfld.v then
            sampSendChat("/capture")
            wait(0)
        end
    end
end


function imgui.OnDrawFrame()
    if kfr_menu.v then
        imgui.SetNextWindowPos(imgui.ImVec2(w / 2, h / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(576, 576), imgui.Cond.FirstUseEver)
        imgui.Begin('KFR MENU 0.1', kfr_menu)
        imgui.Checkbox('NoBat', nobat)
        imgui.SameLine()
        imgui.Text('*Nonemt Bat')
        imgui.Checkbox('160hp bar', longhpbar)
        imgui.SameLine()
        imgui.Text('*Uzlikt hpbar 160hp')
        imgui.Checkbox('RpKrava', rpkrava)
        imgui.SameLine()
        imgui.Text('*Noerpo, kad panem kravu')
        imgui.Checkbox('AntiAfk', antiafk)
        imgui.SameLine()
        imgui.Text('*AntiAfk')
        imgui.Checkbox('Skill', fullSkill)
        imgui.SameLine()
        imgui.Text('*Full skills uz ierociem')
        imgui.Checkbox('SensFix', sensFix)

        if imgui.Checkbox('Anti-AFK', aafk) then
            WorkInBackground()
        end

        imgui.Separator()

        if imgui.CollapsingHeader('Kommandas KFR MENU 0.1') then
            imgui.Text('Kommanda /dg sataisa sev [DEAGLE]')
            imgui.Text('Kommanda /m4 sataisa sev [M4]')
        end
    end
    imgui.End()
end

function checkbox()

-- sensfix  
    if sensFix.v then
        if axisx ~= axisy then
            writeMemory(0xB6EC18, 4, axisx, false)
        end
    else
        writeMemory(0xB6EC18, 4, axisy, false)
    end


-- hpbar
    if longhpbar.v then
        memory.setfloat(0xB793E0, 910.4)
    else
        memory.setfloat(0xB793E0, 569.0)
    end

-- nobat
    if nobat.v then
        if hasCharGotWeapon(PLAYER_PED, 5) then
            removeWeaponFromChar(PLAYER_PED, 5)
        end
    end

 
-- full skill
    if fullSkill.v then
        if isPlayerPlaying(PLAYER_HANDLE) then
            registerIntStat(70, 1000.0)
            registerIntStat(71, 1000.0)
            registerIntStat(72, 1000.0)
            registerIntStat(76, 1000.0)
            registerIntStat(77, 1000.0)
            registerIntStat(78, 1000.0)
            registerIntStat(79, 1000.0)
        end
    end
end

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


-- rpkrava
function ev.onServerMessage(color,text)
    if string.find(text, "^Jus iekravat") and rpkrava.v then
        sampSendChat("/do Redzams, ka stradnieki pielade kravu un novieto to sanemsanai.")
    end
    if string.find(text, "^Jus izskravat") and rpkrava.v then
        sampSendChat("/do Stradnieki ataketu kravu no smaga auto un izkrametu to.")
    end
end


function ev.onGangZoneFlash(zoneid,color)
    sampAddChatMessage("{01DF3A}[F] Kada banda iespamoja ar krasu:{FFFFFF} "..color, -1)
end

function ev.onGangZoneStopFlash(zoneid)
    sampAddChatMessage("{01DF3A}[F] Terra beidzas!{FFFFFF} "..zoneid, -1)
end

Take
check
Lua:
script_name("KFR")
script_author("Keon Krewazz")
script_version("0.1")

require ("lib.moonloader")
local w, h = getScreenResolution()
local ffi = require "ffi"
local memory = require ("memory")
local ev = require ("lib.samp.events")
local inicfg = require ('inicfg')
local imgui = require ("imgui")

local antiafk = imgui.ImBool(false)

kfr_menu = imgui.ImBool(false)

local ini = inicfg.load({
    Main =
    {
        nobat = false,
        longhpbar = true,
        rpkrava = false,
        fullSkill = false,
        capfld = false,
        sensFix = false
    }
}, '..\\config\\[KFR menu] settings.ini')

--imgui
sensFix = imgui.ImBool(ini.Main.sensFix)
nobat = imgui.ImBool(ini.Main.nobat)
longhpbar = imgui.ImBool(ini.Main.longhpbar)
rpkrava = imgui.ImBool(ini.Main.rpkrava)
fullSkill = imgui.ImBool(ini.Main.fullSkill)
capfld = imgui.ImBool(ini.Main.capfld)

function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('kfr', function() kfr_menu.v = not kfr_menu.v end)
    while true do
        wait(0)
        imgui.Process = kfr_menu.v
        checkbox()
        if capfld.v then
            sampSendChat("/capture")
            wait(0)
        end
    end
end


function imgui.OnDrawFrame()
    if kfr_menu.v then
        imgui.SetNextWindowPos(imgui.ImVec2(w / 2, h / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(576, 576), imgui.Cond.FirstUseEver)
        imgui.Begin('KFR MENU 0.1', kfr_menu)
        imgui.Checkbox('NoBat', nobat)
        imgui.SameLine()
        imgui.Text('*Nonemt Bat')
        imgui.Checkbox('160hp bar', longhpbar)
        imgui.SameLine()
        imgui.Text('*Uzlikt hpbar 160hp')
        imgui.Checkbox('RpKrava', rpkrava)
        imgui.SameLine()
        imgui.Text('*Noerpo, kad panem kravu')
        if imgui.Checkbox('Anti-AFK', antiafk) then
            WorkInBackground()
        end
        imgui.SameLine()
        imgui.Text('*AntiAfk')
        imgui.Checkbox('Skill', fullSkill)
        imgui.SameLine()
        imgui.Text('*Full skills uz ierociem')
        imgui.Checkbox('SensFix', sensFix)


        imgui.Separator()

        if imgui.CollapsingHeader('Kommandas KFR MENU 0.1') then
            imgui.Text('Kommanda /dg sataisa sev [DEAGLE]')
            imgui.Text('Kommanda /m4 sataisa sev [M4]')
        end
    end
    imgui.End()
end

function checkbox()

-- sensfix   
    if sensFix.v then
        if axisx ~= axisy then
            writeMemory(0xB6EC18, 4, axisx, false)
        end
    else
        writeMemory(0xB6EC18, 4, axisy, false)
    end


-- hpbar
    if longhpbar.v then
        memory.setfloat(0xB793E0, 910.4)
    else
        memory.setfloat(0xB793E0, 569.0)
    end

-- nobat
    if nobat.v then
        if hasCharGotWeapon(PLAYER_PED, 5) then
            removeWeaponFromChar(PLAYER_PED, 5)
        end
    end

 
-- full skill
    if fullSkill.v then
        if isPlayerPlaying(PLAYER_HANDLE) then
            registerIntStat(70, 1000.0)
            registerIntStat(71, 1000.0)
            registerIntStat(72, 1000.0)
            registerIntStat(76, 1000.0)
            registerIntStat(77, 1000.0)
            registerIntStat(78, 1000.0)
            registerIntStat(79, 1000.0)
        end
    end
end

function WorkInBackground()
work = not work
    if work then
        antiafk.v = true
        memory.setuint8(7634870, 1)
        memory.setuint8(7635034, 1)
        memory.fill(7623723, 144, 8)
        memory.fill(5499528, 144, 6)
    else
        antiafk.v = false
        memory.setuint8(7634870, 0)
        memory.setuint8(7635034, 0)
        memory.hex2bin('5051FF1500838500', 7623723, 8)
        memory.hex2bin('0F847B010000', 5499528, 6)
    end
end

 
-- rpkrava
function ev.onServerMessage(color,text)
    if string.find(text, "^Jus iekravat") and rpkrava.v then
        sampSendChat("/do Redzams, ka stradnieki pielade kravu un novieto to sanemsanai.")
    end
    if string.find(text, "^Jus izskravat") and rpkrava.v then
        sampSendChat("/do Stradnieki ataketu kravu no smaga auto un izkrametu to.")
    end
end


function ev.onGangZoneFlash(zoneid,color)
    sampAddChatMessage("{01DF3A}[F] Kada banda iespamoja ar krasu:{FFFFFF} "..color, -1)
end

function ev.onGangZoneStopFlash(zoneid)
    sampAddChatMessage("{01DF3A}[F] Terra beidzas!{FFFFFF} "..zoneid, -1)
end