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

Мира

Участник
455
9
если просто ввёл /uninvite [id] без причины, то автоматом пропишет /uninvite [id] выселен
Lua:
local samp = require "samp.events"
function samp.onSendCommand(cmd)
    if cmd:find('/uninvite (.+)') then
        local id, reason = cmd:match('/uninvite (%d+) (.+)')
        if reason == nil and id ~= nil then
            cmd = '/uninvite '..id..' выселен'
            return {cmd}
        end
    end
end

а почему они должны удалятся, если ты не сделал удаление? какая структура файл?
ты не совсем правильно поменял. мне надо чтобы открылся чат и в чате уже было всё написано, и чтобы при написании текста он писался между "/invite" и "Выселен!"
1593171675812.png

на AHK делается так:
{F6}/uninvite Выселен!{Left}{Left}{Left}{Left}{Left}{Left}{Left}{Left}{Left}
return
 
Последнее редактирование:

Vritz

Новичок
13
0
Хотел бы вопрос) Хочу написать бота пилота, суть в том что бы игрок просто летел на кординаты чекпоинта.

Начал пробивать функцию taskCarDriveToCoord,когда садился в машину персонаж ехал к указанным, а в самолете он просто стоял и ни куда не летел, дайте совет что делать дальше и получиться ли у меня вобще написать так бота, Крч просто дайте совет) Мб функции какие то есть, для самолета.
Мб кто то скажет как получить координаты чекпоинта (круглого, как на роботе пилота).

Сразу говорю в lua не очень давно, где-то 2-3 недели, только учу)
-За любую помощь буду признателен)
 
Последнее редактирование:

Rei

Известный
Друг
1,616
1,676
а почему они должны удалятся, если ты не сделал удаление? какая структура файл?
просто ники идут построчно, удаление там есть, оно считывает весь файл в переменную, гсабает строку и перезаписывает файл
все норм работало, но стопорилось на никах с описанными символами, решил предварительной очисткой файла от строчек с этими скобками

Хотел бы вопрос) Хочу написать бота пилота, суть в том что бы игрок просто летел на кординаты чекпоинта.

Начал пробивать функцию taskCarDriveToCoord,когда садился в машину персонаж ехал к указанным, а в самолете он просто стоял и ни куда не летел, дайте совет что делать дальше и получиться ли у меня вобще написать так бота, Крч просто дайте совет) Мб функции какие то есть, для самолета.
Мб кто то скажет как получить координаты чекпоинта (круглого, как на роботе пилота).

Сразу говорю в lua не очень давно, где-то 2-3 недели, только учу)
-За любую помощь буду признателен)
planeFlyInDirection(int plane, float direction, float altitudemin, float altitudemax)
пробуй это
 
  • Нравится
Реакции: Vritz

rayprod

Участник
96
1
Ребята, помогите пожалуйста, не могу понять, вот как сделать сохранение суммы, после перезахода, знаю что через ini. Но не могу понять как именно.
Напишите код, как это должно выглядеть, или пример, только не inicfg пример обычного.
Вот части кода.
Прошу помогите,3 дня сижу уже над этим, всё норм, но вот сохранение после перезахода/релога скрипта не могу сделать.
Lua:
local count = 0
local count1 = 0

function main()
all = count + count1 -- это суммирование, ниже будет понятно чего.

function imgui.OnDrawFrame()
imgui.Text(u8'СУММА: '..all) --вывод в imgui

--Это сам кода суммирование команд.
function samp.onSendCommand(cmd)
    if cmd:match('^/ans (%d+)') then
        count = count + 2
    end
    if cmd:match('^/arep (%d+)') then
        count1 = count1 + 2
    end
end

--Вот код inicfg, который я пробовал юзать, он в imgui
    if cfg.set.st then
        imgui.ImInt(0); imgui.Text(u8'СУММА: '..all)
        inicfg.save(cfg, 'stats.ini')
    end
    
--Это код inicfg, который тоже пробовал юзать.
local cfg = inicfg.load({set = {st = '0'}}, "stats")
local st = imgui.ImInt(0)

--Это в main
if not doesFileExist('moonloader/config/stats.ini') then inicfg.save(cfg, 'stats.ini') end
 

Fott

Простреленный
3,462
2,379
Ребята, помогите пожалуйста, не могу понять, вот как сделать сохранение суммы, после перезахода, знаю что через ini. Но не могу понять как именно.
Напишите код, как это должно выглядеть, или пример, только не inicfg пример обычного.
Вот части кода.
Прошу помогите,3 дня сижу уже над этим, всё норм, но вот сохранение после перезахода/релога скрипта не могу сделать.
Lua:
local count = 0
local count1 = 0

function main()
all = count + count1 -- это суммирование, ниже будет понятно чего.

function imgui.OnDrawFrame()
imgui.Text(u8'СУММА: '..all) --вывод в imgui

--Это сам кода суммирование команд.
function samp.onSendCommand(cmd)
    if cmd:match('^/ans (%d+)') then
        count = count + 2
    end
    if cmd:match('^/arep (%d+)') then
        count1 = count1 + 2
    end
end

--Вот код inicfg, который я пробовал юзать, он в imgui
    if cfg.set.st then
        imgui.ImInt(0); imgui.Text(u8'СУММА: '..all)
        inicfg.save(cfg, 'stats.ini')
    end
   
--Это код inicfg, который тоже пробовал юзать.
local cfg = inicfg.load({set = {st = '0'}}, "stats")
local st = imgui.ImInt(0)

--Это в main
if not doesFileExist('moonloader/config/stats.ini') then inicfg.save(cfg, 'stats.ini') end
Пробуй
Lua:
local count1 = 0
local count1 = 0
local alls = 0

local dirIni="moonloader/config/testing.ini"

local mainIni=inicfg.load(
 config =
{
  zero = 0,
  one = 0,
  alls = 0,
}
}, 'testing.ini')

if not doesDirectoryExist('moonloader/config') then
  createDirectory('moonloader/config')
end

if not doesFileExist('moonloader/config/testing.ini') then
  inicfg.save(mainIni, 'testing.ini')
end

function main()
  ----- в бескончный цикл
 all = count + count1 -- это суммирование, ниже будет понятно чего.
mainIni.config.alls = all
inicfg.save(mainIni, 'testing.ini')
----------------------------------------
function imgui.OnDrawFrame()
imgui.Text(u8'СУММА: '..all) --вывод в imgui

--Это сам кода суммирование команд.
function samp.onSendCommand(cmd)
    if cmd:match('^/ans (%d+)') then
        count = count + 2
        mainIni.config.zero = mainIni.config.zero + 2
        inicfg.save(mainIni, 'testing.ini')
    end
    if cmd:match('^/arep (%d+)') then
        count1 = count1 + 2
        mainIni.config.one = mainIni.config.one + 2
        inicfg.save(mainIni, 'testing.ini')
    end
end
 
  • Нравится
Реакции: rayprod

Мира

Участник
455
9
Доброго времени суток!
Требуется функция, которая автоматически откроет чат, напишет текст и переведёт "курсор написания" в необходимое место.
1593181891055.png

Требуется функция для данной реализации.
 

Akionka

akionka.lua
Проверенный
742
502
Доброго времени суток!
Требуется функция, которая автоматически откроет чат, напишет текст и переведёт "курсор написания" в необходимое место.
Посмотреть вложение 60447

Требуется функция для данной реализации.
 
  • Bug
Реакции: Мира

Мира

Участник
455
9

А можно на поём примере реализовать?

Просто я не очень в .lua!
 

Мира

Участник
455
9
Можно, Там есть пример использования..

Ой там для меня ОЧЕНЬ сложно!
Добавьте пожалуйста для меня открытие чата с командой "/uninvite (и чтобы набор начился здесь, а не в конце) Выселен!" по горячей клавише! <3

Вот мой пример скрипта:
DH:
require "lib.moonloader"
local key = require 'vkeys'

local tag = "{00ffe2}[Damiano Helper] {FFFFFF}"

function main()
    if not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(0) end
    sampAddChatMessage(tag.."Helper for Damiano {00ffe2}by Mira Damiano", -1)
    repeat wait(0) until isSampAvailable()
    while true do
        wait(0)
        local res, ped = getCharPlayerIsTargeting(playerHandle)
        if res then
            local proverka = isKeyJustPressed(VK_1)
            if proverka then
                res, ped = getCharPlayerIsTargeting(playerHandle)
                res, id = sampGetPlayerIdByCharHandle(ped)
                    id2 = id
                    sampSendChat("/faminvite "..id)
            end
        end
        local res, ped = getCharPlayerIsTargeting(playerHandle)
        if res then
            local proverka = isKeyJustPressed(VK_2)
            if proverka then
                res, ped = getCharPlayerIsTargeting(playerHandle)
                res, id = sampGetPlayerIdByCharHandle(ped)
                    id2 = id
                    sampSendChat("/invite "..id)
                    sampSendChat("/me выдал бандану человеку напротив")
            end
        end
        local res, ped = getCharPlayerIsTargeting(playerHandle)
        if res then
            local proverka = isKeyJustPressed(VK_3)
            if proverka then
                res, ped = getCharPlayerIsTargeting(playerHandle)
                res, id = sampGetPlayerIdByCharHandle(ped)
                    id2 = id
                    sampSendChat("/giverank "..id.." 7")
                    sampSendChat("/me обозначил место в банде")
            end
        end
        if isKeyJustPressed(106)
        and not sampIsChatInputActive()
        and not sampIsDialogActive()
        then
            sampSendChat("/usedrugs 3")
        end
        if isKeyJustPressed(109)
        and not sampIsChatInputActive()
        and not sampIsDialogActive()
        then
            sampSendChat("/mask")
        end
        if isKeyJustPressed(107)
        and not sampIsChatInputActive()
        and not sampIsDialogActive()
        then
            sampSendChat("/armour")
        end
        if isKeyJustPressed(100)
        and not sampIsChatInputActive()
        and not sampIsDialogActive()
        then
            sampSendChat("/ad 1 Проходит Набор в \"Varrios Los Aztecas\". Принимаем на 7 майку ! Мы в GPS 8 - 5")
        end
        if isKeyJustPressed(101)
        and not sampIsChatInputActive()
        and not sampIsDialogActive()
        then
            sampSendChat("/vr Проходит Набор в \"Varrios Los Aztecas\". Принимаем на 7 майку ! Мы в GPS 8 - 5")
        end
        if isKeyJustPressed(102)
        and not sampIsChatInputActive()
        and not sampIsDialogActive()
        then
            sampSendChat("/rt Проходит Набор в \"Varrios Los Aztecas\". Принимаем на 7 майку ! Мы в GPS 8 - 5")
            end
    end
end
 

Vritz

Новичок
13
0
Хотел бы задать вопрос, по поводу чекпоинтов. Дело в том что пишу бота на пилота, не понимаю как узнать мне координаты круглого чекпоинта, не гоночного как на машинах. А для самолета, там же круглые чекпоинты.
И мб кто-то знает как сделать что бы самолет летел в указаные координаты, пробывал через taskCarDriveToCoord, на машину работало, а самолет просто стоял, и не двигался.

-За любую помощь буду признателен!)
 

G W

Участник
141
5
Как сделать знак вопроса в lua, где можно описывать функции ?
 

_mudota_

Потрачен
208
27
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как сделать знак вопроса в lua, где можно описывать функции ?
Куда нибудь в код вставляешь данную функцию.

Lua:
function ShowHelpMarker(desc)
    imgui.TextDisabled('(?)')
    if imgui.IsItemHovered() then
        imgui.BeginTooltip()
        imgui.PushTextWrapPos(450.0)
        imgui.TextUnformatted(desc)
        imgui.PopTextWrapPos()
        imgui.EndTooltip()
    end
end

Потом если тебе куда-то надо добавить информацию, то используй это:
ShowHelpMarker(u8'Information', imgui.SameLine())
 
  • Нравится
Реакции: G W