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

qdIbp

Автор темы
Проверенный
1,387
1,142
Че тут заказывать, 3 строчки? Опытный скриптер накалякает это за 2 минуты
Ну ничего себе, 3 строчки да за 2 минуты, так может сам тогда напишешь, не то с твоими то условиями

1 активацию на клавишу
2 определение дистанции игроков в пространстве
2.1 чтобы расстояние между игроками было не больше 5 метров + настраиваемое расстояние
3 Отправлять на сервер кмд (Просто придирка)
4 что бы еще какая та менюшка была

тут 3 строками не обойтись, и 2 минутами тем более

Ты слишком легко представляешь программирование
3 строки... 3 строки это только функцию main можно будет написать (в ручную)
Lua:
function main()
    while not isSampAvailable() do wait(100) end
    wait(-1)
end
А забыл end подсчитать. 4 строки
Вот это можно написать за минуту, А то что ты просишь, нужно больше двух минут
 
Последнее редактирование:

Flexxxing

Новичок
19
0
Ну ничего себе, 3 строчки да за 2 минуты, так может сам тогда напишешь, не то с твоими то условиями

1 активацию на клавишу
2 определение дистанции игроков в пространстве
2.1 чтобы расстояние между игроками было не больше 5 метров + настраиваемое расстояние
3 Отправлять на сервер кмд (Просто придирка)
4 что бы еще какая та менюшка была

тут 3 строками не обойтись, и 2 минутами тем более

Ты слишком легко представляешь программирование
3 строки... 3 строки это только функцию main можно будет написать (в ручную)
Lua:
function main()
    while not isSampAvailable() do wait(100) end
    wait(-1)
end
А забыл end подсчитать. 4 строки
Вот это можно написать за минуту, А то что ты просишь, нужно больше двух минут
Гонишь? Ты вообще знаешь такое понятие как "образно"?
 

qdIbp

Автор темы
Проверенный
1,387
1,142
Гонишь? Ты вообще знаешь такое понятие как "образно"?
Нет, это ты гонишь, такой бред нести, пускай и образно но это бред
Че тут заказывать, 3 строчки? Опытный скриптер накалякает это за 2 минуты

Всем привет, кто может помочь?
Сделать активацию на определенную кнопку что бы вылезало меню с активацией.
Нужно что бы скрипт в N радиусе (5 например) искал ID игрока и вводил команду /sell (например) [ID ближайшего игрока] [значение которое можно поменять в меню]
Итого:
Активация по кнопке, после чего меню, в меню включить выключить, команда которую можно поменять, значение которое можно поменять.


Ещё желательно настраиваемый радиус через это же меню
Lua:
local key = require("vkeys")
local imgui = require("imgui")

local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local window = imgui.ImBool(false)
local radius = imgui.ImBuffer(256)
local xz = imgui.ImBuffer(256)

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
        sampRegisterChatCommand("menu",function() window.v = not window.v end) -- открытие меню /menu
    while true do wait(0)
        imgui.Process = window.v
        if isKeyJustPressed(key.VK_N) and not isSampfuncsConsoleActive() and not sampIsChatInputActive() and not sampIsDialogActive() and not isPauseMenuActive() then -- активация N
            if #radius.v ~= 0 and #xz.v ~= 0 then
                if string.match(radius.v, "%d+")then
                    for id = 0, 1000 do
                        if sampIsPlayerConnected(id) then
                            local x1,y1,z1 = getCharCoordinates(playerPed)
                            local res, hand = sampGetCharHandleBySampPlayerId(id)
                            if res then
                                local x2,y2,z2 = getCharCoordinates(hand)
                                if getDistanceBetweenCoords3d(x1, y1, z1, x2, y2, z2) <= tonumber(radius.v) then
                                    sampSendChat("/sell "..id.." "..xz.v)
                                    wait(1000)
                                end
                            end
                        end
                    end
                else
                    sampAddChatMessage("Ну тупой @М.Задорнов",-1)
                end
            else
                sampAddChatMessage("Хотя бы значение вставь придурошный, команда /menu если что",-1)
            end
        end
    end
end

function imgui.OnDrawFrame()
    imgui.SetNextWindowSize(imgui.ImVec2(500, 150), imgui.Cond.FirstUseEver)
    imgui.Begin(u8'Меню',window)
        imgui.Text(u8"Вводи свой радиус")
            imgui.SameLine()
        imgui.InputText('##', radius)
        imgui.Text(u8"вторая хуита")
            imgui.SameLine()
        imgui.InputText('###', xz)
    imgui.End()  
end
Итог: Пиздуй учить язык! Чтобы потратить на это 17 мин

Можешь добавить куда нибудь
radius.v = "5"
Чтобы радиус по умолчанию стоял
 
Последнее редактирование:
  • Нравится
Реакции: Flexxxing

Xomyachok-chok-chok

Новичок
16
1
require "lib.moonloader"

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

sampAddChatMessage(tag .. "Загружен. Узнать команды: /infomed.", -1)
sampRegisterChatCommand("infomed",cmd_infomed)

while true do
wait(0)

if isKeyDown(2) and isKeyJustPressed(98) then
result, ped = getCharPlayerIsTargeting(PLAYER_PED)
if result then
r, i = sampGetPlayerIdByCharHandle(ped)
if r then
wait(100)
sampSendChat('/me достал пачку чистых мед.карт')
wait(1500)
sampSendChat('/do Пачка чистых мед.карт в руках.')
wait(1500)
sampSendChat('/me положил на стол мед.карты')
wait(1500)
sampSendChat('/do Мед.карты находятся на столе.')
wait(1500)
sampSendChat('/me записал данные пациента')
wait(1500)
sampSendChat('/do Данные записаны.')
wait(1500)
sampSendChat('/me передал мед.карту человеку, стоящему напротив')
wait(1500)
sampSendChat('/do Передача...')
wait(1500)
sampSendChat('/medcard '..i)
end
end
end

Почему Варнинг в чате и вот "
stack traceback:
[C]: in function 'getCharPlayerIsTargeting'
...IR LAUNCHER\resources\projects\crmp\moonloader\Medic.lua:34: in function <...IR LAUNCHER\resources\projects\crmp\moonloader\Medic.lua:5>"
 

YarikVL

Известный
Проверенный
4,798
1,814
require "lib.moonloader"

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

sampAddChatMessage(tag .. "Загружен. Узнать команды: /infomed.", -1)
sampRegisterChatCommand("infomed",cmd_infomed)

while true do
wait(0)

if isKeyDown(2) and isKeyJustPressed(98) then
result, ped = getCharPlayerIsTargeting(PLAYER_PED)
if result then
r, i = sampGetPlayerIdByCharHandle(ped)
if r then
wait(100)
sampSendChat('/me достал пачку чистых мед.карт')
wait(1500)
sampSendChat('/do Пачка чистых мед.карт в руках.')
wait(1500)
sampSendChat('/me положил на стол мед.карты')
wait(1500)
sampSendChat('/do Мед.карты находятся на столе.')
wait(1500)
sampSendChat('/me записал данные пациента')
wait(1500)
sampSendChat('/do Данные записаны.')
wait(1500)
sampSendChat('/me передал мед.карту человеку, стоящему напротив')
wait(1500)
sampSendChat('/do Передача...')
wait(1500)
sampSendChat('/medcard '..i)
end
end
end

Почему Варнинг в чате и вот "
stack traceback:
[C]: in function 'getCharPlayerIsTargeting'
...IR LAUNCHER\resources\projects\crmp\moonloader\Medic.lua:34: in function <...IR LAUNCHER\resources\projects\crmp\moonloader\Medic.lua:5>"
Смотри, у тебя там 3 штуки if и while true do но в конце 3 штуки end а надо ещё закрыть while true do то есть ещё один end дописать в конце.

Тот что ты дал огрызок "варнинга" по нему не понятно, лучше кидай полностью файл лога, возможно там ещё ошибка которую я не увидел потому что не полный лог

И используй Visual Studio Code там "удобнее замечать ошибки"
Ну и ролики The Champ Guess по несколько раз каждый смотри
И когда кидаешь код то надо делать так: [C0DE=lua] твой код [/C0DE]
 

Xomyachok-chok-chok

Новичок
16
1
Смотри, у тебя там 3 штуки if и while true do но в конце 3 штуки end а надо ещё закрыть while true do то есть ещё один end дописать в конце.

Тот что ты дал огрызок "варнинга" по нему не понятно, лучше кидай полностью файл лога, возможно там ещё ошибка которую я не увидел потому что не полный лог

И используй Visual Studio Code там "удобнее замечать ошибки"
Ну и ролики The Champ Guess по несколько раз каждый смотри
И когда кидаешь код то надо делать так: [C0DE=lua] твой код [/C0DE]
Lua:
 require "lib.moonloader"

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

sampRegisterChatCommand("infomed",cmd_infomed)

while true do
wait(0)


if isKeyDown(VK_RBUTTON) and isKeyJustPressed(VK_1) then
result, ped = getCharPlayerIsTargeting(PLAYER_PED)
if result then
r, i = sampGetPlayerIdByCharHandle(ped)
if r then
wait(100)
sampSendChat('/me достал пачку чистых мед.карт')
wait(1500)
sampSendChat('/do Пачка чистых мед.карт в руках.')
wait(1500)
sampSendChat('/me положил на стол мед.карты')
wait(1500)
sampSendChat('/do Мед.карты находятся на столе.')
wait(1500)
sampSendChat('/me записал данные пациента')
wait(1500)
sampSendChat('/do Данные записаны.')
wait(1500)
sampSendChat('/me передал мед.карту человеку, стоящему напротив')
wait(1500)
sampSendChat('/do Передача...')
wait(1500)
sampSendChat('/medcard '..i)
end
end
end
end
end
 

Вложения

  • moonloader.log
    9.7 KB · Просмотры: 4
Последнее редактирование:
D

deleted-user-399997

Гость
Ребят, вообще не шарю в луа, чет раньше пробовал писать но сейчас вообще не понимаю ничего, нужна ваша помощь, хочу сделать что бы тг бот писал сообщение мне когда видит сообщение в чате, или часть и дальше отправит его продолжение, например "Вам был добавлен предмет..." а в тг пришло "Вам был добавлен предмет 'название его' используйте инвентарь" что то типа того, вот сделал набросок кода но не понимаю как сделать постоянную проверку, тип через цикл но все равно не выходит
Lua:
local settings = {
    token = '', -- токен бота
    chat_id = 0 -- твой телеграм id
}
local message = ''

function sendTelegramMessage(text)
    openUrl(('https://api.telegram.org/bot%s/sendMessage?chat_id=%d&text=%s'):format(settings.token, settings.chat_id))
end

function onServerMessage(text)
    while true do
        wait(0)
        if text == 'мое сообещение' then
            message = text
            sendTelegramMessage(message)
            message = ''
        end
    end    
end
 

YarikVL

Известный
Проверенный
4,798
1,814
[C0DE=lua] require "lib.moonloader"

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

sampRegisterChatCommand("infomed",cmd_infomed)

while true do
wait(0)


if isKeyDown(VK_RBUTTON) and isKeyJustPressed(VK_1) then
result, ped = getCharPlayerIsTargeting(PLAYER_PED)
if result then
r, i = sampGetPlayerIdByCharHandle(ped)
if r then
wait(100)
sampSendChat('/me достал пачку чистых мед.карт')
wait(1500)
sampSendChat('/do Пачка чистых мед.карт в руках.')
wait(1500)
sampSendChat('/me положил на стол мед.карты')
wait(1500)
sampSendChat('/do Мед.карты находятся на столе.')
wait(1500)
sampSendChat('/me записал данные пациента')
wait(1500)
sampSendChat('/do Данные записаны.')
wait(1500)
sampSendChat('/me передал мед.карту человеку, стоящему напротив')
wait(1500)
sampSendChat('/do Передача...')
wait(1500)
sampSendChat('/medcard '..i)
end
end
end
end
end [/C0DE]
Там надо не 0 ( ноль ), а буква O ( английская ) в слове CODE

Это весь код?
 

YarikVL

Известный
Проверенный
4,798
1,814
да, мне бы просто научиться правильно использовать getCharPlayerIsTargeting
Попробуй по вписывать все варианты отсюда https://www.blast.hk/threads/53841/post-764732 в скобки после getCharPlayerIsTargeting
А ещё можешь по гуглить эту функу ( ну типо getCharPlayerIsTargeting ) увидишь примеры работы с ней
Но ты вроде всё правильно делаешь
 

Xomyachok-chok-chok

Новичок
16
1
Я попробовал так
Lua:
local tag = "{fff000}[TEST]: {ffffff}"

require 'lib.moonloader'
require 'lib.sampfuncs'
require 'vkeys'

function main()

    while not isSampAvailable() do
        wait(100)
    end
    wait(500)
    sampAddChatMessage(tag .. "Загружен.", -1)
    lua_thread.create(codeforjesusmcwood) -- in main

function codeforjesusmcwood() -- qde xochesh
    while true do
        wait(0)
        result, ped = getCharPlayerIsTargeting(PLAYER_HANDLE)
        if result then
            if isKeyJustPressed(vkeys.VK_E) then
                local _, i = sampGetPlayerIdByCharHandle(ped)
                sampSendChat('Прив '..i)
            end   
        end
    end
end
    while true do
        wait(0)

    end
end

НО у меня нифига не работает
 

Вложения

  • moonloader.log
    4.8 KB · Просмотры: 2