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

Di3

Участник
432
20
Код:
imgui.BeginChild("##menu_2", imgui.ImVec2(520, 360),true)

        imgui.Text('test')
imgui.EndChild()

Как сделать чтобы текст был написан четко по центру?
 

staffed

Новичок
9
0
Вроде всё сделал, а не работает
script_name("AutoBot") — Тут наш любимый скрипт инфо :)
script_version_number(1)
script_version("0.1")
script_authors("StaFF")

require "lib.moonloader"
local ev = require("lib.samp.events")
local keys = require "vkeys"


function main()
if not isSampLoaded() or not isSumpfuncsLoaded() then return end
while not isSampAvailable() do wait(100) end

sampRegisterChatCommand("at", cmd_at)

thread = lua_thread.create_suspended(thread_function)

function cmd_at()
thread:run(...)
end

function thread_function()
setVirtualKeyDown(13, true)
wait(100)
setVirtualKeyDown(13, false)
wait(2000)
setVirtualKeyDown(18, true)
wait(100)
setVirtualKeyDown(18, false)
wait(2000)
setVirtualKeyDown(13, true)
wait(100)
setVirtualKeyDown(13, false)
wait(3000)
setVirtualKeyDown(68, true)
wait(200)
setVirtualKeyDown(68, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(50)
setVirtualKeyDown(83, true)
wait(200)
setVirtualKeyDown(83, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(50)
setVirtualKeyDown(68, true)
wait(200)
setVirtualKeyDown(68, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(50)
setVirtualKeyDown(83, true)
wait(200)
setVirtualKeyDown(83, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(50)
setVirtualKeyDown(68, true)
wait(200)
setVirtualKeyDown(68, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(50)
setVirtualKeyDown(83, true)
wait(200)
setVirtualKeyDown(83, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(50)
setVirtualKeyDown(68, true)
wait(200)
setVirtualKeyDown(68, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(50)
setVirtualKeyDown(83, true)
wait(200)
setVirtualKeyDown(83, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(1500)
setVirtualKeyDown(71, true)
wait(90)
setVirtualKeyDown(71, false)
wait(80)
setVirtualKeyDown(71, true)
wait(70)
setVirtualKeyDown(71, false)
wait(60)
setVirtualKeyDown(71, true)
wait(50)
setVirtualKeyDown(71, false)
wait(40)
setVirtualKeyDown(71, true)
wait(30)
setVirtualKeyDown(71, false)
wait(20)
setVirtualKeyDown(71, true)
wait(10)
setVirtualKeyDown(71, false)
wait(5000)
setVirtualKeyDown(40, true)
wait(200)
setVirtualKeyDown(40, false)
wait(200)
setVirtualKeyDown(13, true)
wait(50)
setVirtualKeyDown(13, false)
wait(63000)
setVirtualKeyDown(17, true)
wait(1000)
setVirtualKeyDown(70, true)
wait(500)
setVirtualKeyDown(70, false)
wait(500)
setVirtualKeyDown(17, false)
wait(500)
sampProcessChatInput('/rec 15')
end
end
 

Izvinisb

Известный
Проверенный
964
598
Код:
imgui.BeginChild("##menu_2", imgui.ImVec2(520, 360),true)

        imgui.Text('test')
imgui.EndChild()

Как сделать чтобы текст был написан четко по центру?
Lua:
function imgui.CenterText(text) -- функция
    imgui.SetCursorPosX((imgui.GetWindowWidth() - imgui.CalcTextSize(u8(text)).x) / 2)
    imgui.Text(u8(text))
end

imgui.CenterText('какой-то текст') -- пример использования
 

Fott

Простреленный
3,434
2,279
Вроде всё сделал, а не работает
script_name("AutoBot") — Тут наш любимый скрипт инфо :)
script_version_number(1)
script_version("0.1")
script_authors("StaFF")

require "lib.moonloader"
local ev = require("lib.samp.events")
local keys = require "vkeys"


function main()
if not isSampLoaded() or not isSumpfuncsLoaded() then return end
while not isSampAvailable() do wait(100) end

sampRegisterChatCommand("at", cmd_at)

thread = lua_thread.create_suspended(thread_function)

function cmd_at()
thread:run(...)
end

function thread_function()
setVirtualKeyDown(13, true)
wait(100)
setVirtualKeyDown(13, false)
wait(2000)
setVirtualKeyDown(18, true)
wait(100)
setVirtualKeyDown(18, false)
wait(2000)
setVirtualKeyDown(13, true)
wait(100)
setVirtualKeyDown(13, false)
wait(3000)
setVirtualKeyDown(68, true)
wait(200)
setVirtualKeyDown(68, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(50)
setVirtualKeyDown(83, true)
wait(200)
setVirtualKeyDown(83, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(50)
setVirtualKeyDown(68, true)
wait(200)
setVirtualKeyDown(68, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(50)
setVirtualKeyDown(83, true)
wait(200)
setVirtualKeyDown(83, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(50)
setVirtualKeyDown(68, true)
wait(200)
setVirtualKeyDown(68, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(50)
setVirtualKeyDown(83, true)
wait(200)
setVirtualKeyDown(83, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(50)
setVirtualKeyDown(68, true)
wait(200)
setVirtualKeyDown(68, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(50)
setVirtualKeyDown(83, true)
wait(200)
setVirtualKeyDown(83, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(1500)
setVirtualKeyDown(71, true)
wait(90)
setVirtualKeyDown(71, false)
wait(80)
setVirtualKeyDown(71, true)
wait(70)
setVirtualKeyDown(71, false)
wait(60)
setVirtualKeyDown(71, true)
wait(50)
setVirtualKeyDown(71, false)
wait(40)
setVirtualKeyDown(71, true)
wait(30)
setVirtualKeyDown(71, false)
wait(20)
setVirtualKeyDown(71, true)
wait(10)
setVirtualKeyDown(71, false)
wait(5000)
setVirtualKeyDown(40, true)
wait(200)
setVirtualKeyDown(40, false)
wait(200)
setVirtualKeyDown(13, true)
wait(50)
setVirtualKeyDown(13, false)
wait(63000)
setVirtualKeyDown(17, true)
wait(1000)
setVirtualKeyDown(70, true)
wait(500)
setVirtualKeyDown(70, false)
wait(500)
setVirtualKeyDown(17, false)
wait(500)
sampProcessChatInput('/rec 15')
end
end
Мои глаза ахуели от увиденного
Lua:
script_name("AutoBot") -- Тут наш любимый скрипт инфо :)
script_version_number(1)
script_version("0.1")
script_authors("StaFF")

require "lib.moonloader"
local ev = require("lib.samp.events")
local keys = require "vkeys"



function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end

sampRegisterChatCommand("at", cmd_at)

while true do
    wait(0)
    if active then
setVirtualKeyDown(13, true)
wait(100)
setVirtualKeyDown(13, false)
wait(2000)
setVirtualKeyDown(18, true)
wait(100)
setVirtualKeyDown(18, false)
wait(2000)
setVirtualKeyDown(13, true)
wait(100)
setVirtualKeyDown(13, false)
wait(3000)
setVirtualKeyDown(68, true)
wait(200)
setVirtualKeyDown(68, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(50)
setVirtualKeyDown(83, true)
wait(200)
setVirtualKeyDown(83, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(50)
setVirtualKeyDown(68, true)
wait(200)
setVirtualKeyDown(68, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(50)
setVirtualKeyDown(83, true)
wait(200)
setVirtualKeyDown(83, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(50)
setVirtualKeyDown(68, true)
wait(200)
setVirtualKeyDown(68, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(50)
setVirtualKeyDown(83, true)
wait(200)
setVirtualKeyDown(83, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(50)
setVirtualKeyDown(68, true)
wait(200)
setVirtualKeyDown(68, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(50)
setVirtualKeyDown(83, true)
wait(200)
setVirtualKeyDown(83, false)
wait(50)
sampProcessChatInput('/fillcar')
wait(1500)
setVirtualKeyDown(71, true)
wait(90)
setVirtualKeyDown(71, false)
wait(80)
setVirtualKeyDown(71, true)
wait(70)
setVirtualKeyDown(71, false)
wait(60)
setVirtualKeyDown(71, true)
wait(50)
setVirtualKeyDown(71, false)
wait(40)
setVirtualKeyDown(71, true)
wait(30)
setVirtualKeyDown(71, false)
wait(20)
setVirtualKeyDown(71, true)
wait(10)
setVirtualKeyDown(71, false)
wait(5000)
setVirtualKeyDown(40, true)
wait(200)
setVirtualKeyDown(40, false)
wait(200)
setVirtualKeyDown(13, true)
wait(50)
setVirtualKeyDown(13, false)
wait(63000)
setVirtualKeyDown(17, true)
wait(1000)
setVirtualKeyDown(70, true)
wait(500)
setVirtualKeyDown(70, false)
wait(500)
setVirtualKeyDown(17, false)
wait(500)
sampProcessChatInput('/rec 15')
sampAddChatMessage('Скрипт выключен, для повторной активации введите {ff0000}/at', -1)
active = false
  end
end
end

function cmd_at(penis)
    active = not active
    sampAddChatMessage(active and 'Активировано' or 'Деактивировано', -1)
end
 
Последнее редактирование:
  • Ха-ха
Реакции: paulohardy

Vespan

loneliness
Проверенный
2,105
1,634
Как сделать проверку,на то что в зоне стрима игрок получил (любой)урон
 

Myradov|

Известный
361
106
Подскажите, если ли функция чтобы получить IP человека?
Свой - да, чужой - нет
чтобы получить свой ип:
local request = require 'request'

sampRegisterChatCommand("checkip", ip)


function ip()
    local result, response = pcall(request.get, "http://ip-api.com/json/")
    if result then
        json_data = response.json()
        sampAddChatMessage("Ваш IP: "..json_data.query, -1)
    end
end


--[[
json_data.query - IP
json_data.country - Страна
json_data.city -- Город
json_data.regionName -- Регион
json_data.isp -- Провайдер
json_data.timezone -- Часовой пояс
]]
 
  • Нравится
Реакции: McLore

AloneRose

Потрачен
11
9
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
как сделать автоматическое доставание предмета из инвентаря(ARZ)? например лопаты на кнопку?
 

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,778
11,223
как сделать автоматическое доставание предмета из инвентаря(ARZ)? например лопаты на кнопку?
Если у тебя лопата лежит в определенном слоту (например в 5), то просто тыкаешь по текстдраву, и потом на текстдрав с кнопкой "использовать". В луа не шарю, но выглядеть должно примерно так:
Lua:
sampSendClickTextdraw(int id) --ID Ячейки в инвентаре
sampSendClickTextdraw(int id) --ID Кнопки "Использовать"

Так же можно сканировать текстдравы всех слотов, и кликать по тому, в котором находится текстура лопаты.
 
Последнее редактирование:

HpP

Известный
368
117
Как сделать так, чтобы после того, как тебя убил другой игрок, автоматически пробивался /time.
Надо чтобы /time пробивался, только когда игрока убил другой человек, а не умер по-своей глупости
 

CaJlaT

Овощ
Модератор
2,806
2,607
How do I check if I'm pressing the right mouse button

Lua:
function main()
    while true do
        wait(0)
        if isKeyJustPressed(2) then
            --code
        end
    end
end
 

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113

Lua:
function main()
    while true do
        wait(0)
        if isKeyJustPressed(2) then
            --code
        end
    end
end
or
 
  • Нравится
Реакции: CaJlaT

MeG@LaDo[N] ^_^

Известный
280
316
Как сделать так, чтобы после того, как тебя убил другой игрок, автоматически пробивался /time.
Надо чтобы /time пробивался, только когда игрока убил другой человек, а не умер по-своей глупости
должно работать(если ты упал с высоты то нечего не произойдет,а если по другому умер то будет писать в чат /time) скорее всего быдло код но мне пахую
требуется samp.events

local samp = require 'lib.samp.events'

function samp.onSendDeathNotification(reason,killerId)
if reason == 54 then
return true
else
sampSendChat("/time")
return true
end
end
 

staffed

Новичок
9
0
как сделать так чтобы скрипт работал в афк, антиафк есть хорошее, но когда я сворачиваю игру он кнопки в браузер отправляет вот надо п нажать, он п нажимает не в игре а в браузере лол