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

Morse

Потрачен
436
70
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как сделать флуд по зажатию хоткея, т.е что писать в регистрацию хоткея, в цикл я знаю что нужно писать
Lua:
if isKeyDown() and not sampIsChatInputActive() then
    sampSendChat("text")
end
, но как это сделать на хоткей
 

Sanchez.

Известный
705
188
Как сделать флуд по зажатию хоткея, т.е что писать в регистрацию хоткея, в цикл я знаю что нужно писать
Lua:
if isKeyDown() and not sampIsChatInputActive() then
    sampSendChat("text")
end
, но как это сделать на хоткей
В isKeyDown() нужно вписать айди клавиши. Айди клавиш можно найти в гугле.
 

Morse

Потрачен
436
70
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

relog

Участник
62
0
Я так понял, ты делаешь телепорт к респе банды, по её названию.
Lua:
local gang_names = {'Grove', 'Ballas', 'Vagos', 'Rifa', 'Aztec'} -- Начало

-- main
sampRegisterChatCommand("gang_tp", function()
    sampShowDialog(123, "Телепорт к банде", "Введите название банды:\nP.S: Grove/Ballas/Vagos/Rifa/Aztec", "Выбрать", "Закрыть", 1)
end)

-- Беск. цикл (while true do)
local result, button, list, input = sampHasDialogRespond(123)
if result then
    if button == 1 then
        for _, v in pairs(gang_names) do
            if input:lower() == v:lower() then
                sampProcessChatInput("/ttp "..v)
            end
        end
    end
end
Спасибо брат, ещё вопрос кароче, типо можно было сделать Баллас-координаты респы, вагос-координаты
Респы вагос и тд. Коорды я сам раставлю просто функция нужна. Сорямба если отвлекаю, спасибо
 

Dmitriy Makarov

25.05.2021
Проверенный
2,505
1,134
Спасибо брат, ещё вопрос кароче, типо можно было сделать Баллас-координаты респы, вагос-координаты
Респы вагос и тд. Коорды я сам раставлю просто функция нужна. Сорямба если отвлекаю, спасибо
Так тебе телепорт на базы нужен или как? ;0
Ну ниже телепорт, только если ты не админ и тебе сервер не позволит ТПхаться, то тебя античит кикнет, учти.
Lua:
-- Координаты я от себя добавил всяких спавнов (ЖД, АВ) для теста. Меняй их только на коорды респов
local gang_names = {
    {'Grove', 1761.5470, -1897.4117, 13.5625},
    {'Ballas', 1154.6569, -1768.8401, 16.5938},
    {'Vagos', 2844.0352, 1290.9229, 11.3906},
    {'Rifa', -1972.8901, 127.2267, 27.6875},
    {'Aztec', 1481.0181, -1772.2040, 18.7958}
}

-- В main диалог остаётся тот же

-- Беск. цикл
-- Код немножечко другой
local result, button, list, input = sampHasDialogRespond(123)
if result then
    if button == 1 then
        for i = 1, #gang_names do
            if input:lower() == gang_names[i][1]:lower() then
                setCharCoordinates(PLAYER_PED, gang_names[i][2], gang_names[i][3], gang_names[i][4]) -- ТПхаем себя на коорды респы по названию
                sampAddChatMessage("Вы были телепортированы на респу "..gang_names[i][1], -1) -- Для удобства выводит текст, что мол тебя ТПхнули на такую-то базу. Можешь убрать если лишнее
            end
        end
    end
end
 
  • Нравится
Реакции: relog

Morse

Потрачен
436
70
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как сделать флуд по зажатию хоткея, т.е что писать в регистрацию хоткея, в цикл я знаю что нужно писать
Lua:
if isKeyDown() and not sampIsChatInputActive() then
    sampSendChat("text")
end
, но как это сделать на хоткей
 

Dmitriy Makarov

25.05.2021
Проверенный
2,505
1,134
Как сделать флуд по зажатию хоткея, т.е что писать в регистрацию хоткея, в цикл я знаю что нужно писать
Lua:
if isKeyDown() and not sampIsChatInputActive() then
    sampSendChat("text")
end
, но как это сделать на хоткей
Этот хоткей?
1627560690033.png
 

Dmitriy Makarov

25.05.2021
Проверенный
2,505
1,134
Lua:
local rkeys = require 'rkeys'
imgui.HotKey = require('imgui_addons').HotKey

local tLastKeys = {}
local active = false
local flood_hot_key = {
    v = decodeJson('[67]') -- Key "C"
}

-- main
hot_key = rkeys.registerHotKey(flood_hot_key.v, true, function() active = not active end)

-- Беск. цикл
if active then
    sampAddChatMessage("+", -1)
end


-- OnDrawFrame
if imgui.HotKey("##1", flood_hot_key, tLastKeys, 100) then
    rkeys.changeHotKey(hot_key, flood_hot_key.v)
end
Попробуй так.
Как это сохранить в ini - я не знаю.)) Сам уже сколько раз пробовал.
 

Morse

Потрачен
436
70
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Lua:
local rkeys = require 'rkeys'
imgui.HotKey = require('imgui_addons').HotKey

local tLastKeys = {}
local active = false
local flood_hot_key = {
    v = decodeJson('[67]') -- Key "C"
}

-- main
hot_key = rkeys.registerHotKey(flood_hot_key.v, true, function() active = not active end)

-- Беск. цикл
if active then
    sampAddChatMessage("+", -1)
end


-- OnDrawFrame
if imgui.HotKey("##1", flood_hot_key, tLastKeys, 100) then
    rkeys.changeHotKey(hot_key, flood_hot_key.v)
end
Попробуй так.
Как это сохранить в ini - я не знаю.)) Сам уже сколько раз пробовал.
это не зажатие получается, это 1 раз нажал оно флудит пока не нажмешь еще раз
 

Smeruxa

Известный
1,372
726
это не зажатие получается, это 1 раз нажал оно флудит пока не нажмешь еще раз
боже блять, в rkeys существуют разные типы нажатия, 1 - down, 2 - hold, 3 - xz, зайди в библиотеку и найди, в ней же и документация небольшая есть, хочешь чтобы все за тебя делали
UPD:
Код:
  - aType - тип хоткея:
            1 - срабатывает на нажатие клавиши
            2 - срабатывает на нажатие и до тех пор пока клавиша зажата
            3 - срабатывает при отжатии последней(!) клавиши в комбо (Alt + Shift + R - сработает если зажать комбинацию и отпустить R)
Теперь разберем функцию
Lua:
function mod.registerHotKey(keycombo, activationType, isBlock_or_callback, callback)
2-ое - параметр нам нужный
Туда вписываешь 2
Lua:
local rkeys = require 'rkeys'
imgui.HotKey = require('imgui_addons').HotKey

local tLastKeys = {}
local active = false
local flood_hot_key = {
    v = decodeJson('[67]') -- Key "C"
}

-- main
hot_key = rkeys.registerHotKey(flood_hot_key.v, true, function() active = not active end)

-- Беск. цикл
if active then
    sampAddChatMessage("+", -1)
end


-- OnDrawFrame
if imgui.HotKey("##1", flood_hot_key, tLastKeys, 100) then
    rkeys.changeHotKey(hot_key, flood_hot_key.v)
end
Попробуй так.
Как это сохранить в ini - я не знаю.)) Сам уже сколько раз пробовал.
По твоему же коду постараюсь сделать
Lua:
local rkeys = require 'rkeys'
local inicfg = require 'inicfg'
imgui.HotKey = require('imgui_addons').HotKey

local HLcfg = inicfg.load({
    config = {
        hotkey = encodeJson({VK_NUMPAD1})
    }
})

local tLastKeys = {}
local active = false
local flood_hot_key = { v = decodeJson(HLcfg.config.hotkey) }

-- main
hot_key = rkeys.registerHotKey(flood_hot_key.v, true, function() active = not active end)

-- Беск. цикл
if active then
    sampAddChatMessage("+", -1)
end


-- OnDrawFrame
if imgui.HotKey("##1", flood_hot_key, tLastKeys, 100) then
    rkeys.changeHotKey(hot_key, flood_hot_key.v)
    HLcfg.config.hotkey = encodeJson(floot_hot_key.v)
end
 
Последнее редактирование:
  • Нравится
Реакции: Morse и Dmitriy Makarov

Morse

Потрачен
436
70
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Не могу найти в чем ошибка подскажите пожалуйста скинул строки 70-89
Ошибка:
[ML] (error) Report Helper ByMorse.lua: ...A GAMES\bin\Arizona\moonloader\Report Helper ByMorse.lua:80: 'end' expected (to close 'function' at line 70) near 'elseif'
[ML] (error) Report Helper ByMorse.lua: Script died due to an error. (3E2F396C)
Lua:
    bindrep = rkeys.registerHotKey(ActiveRep.v, 2, false, function()
        if selected_item.v == 0 and not sampIsChatInputActive() and not sampIsDialogActive() and not menushka.v then
            activateflud = not activateflud if activateflud and selected_item.v == 0 then
                sampAddChatMessage('{FF69B4}[Report Helper] {FFFFFF}Ловля репорта флудом включена', -1)
        elseif selected_item.v == 0 then
            sampAddChatMessage('{FF69B4}[Report Helper] {FFFFFF}Ловля репорта флудом выключена', -1)
        end
        elseif selected_item.v == 1 and not sampIsChatInputActive() and not sampIsDialogActive() and not menushka.v then
            sampSendChat('/ot')
        end
        elseif selected_item.v == 2 and not sampIsChatInputActive() and not sampIsDialogActive() and not menushka.v then
            activateautolov = not activateautolov if activateautolov and selected_item.v == 2 then
                sampAddChatMessage('{FF69B4}[Report Helper] {FFFFFF}Автоматическая ловля репорта включена', -1)
        elseif selected_item.v == 2 then
            sampAddChatMessage('{FF69B4}[Report Helper] {FFFFFF}Автоматическая ловля репорта выключена', -1)
        end
        elseif selected_item.v == 3 and not sampIsChatInputActive() and not sampIsDialogActive() and not menushka.v then
            sampSendChat('/ot')
        end
    end)
 

Smeruxa

Известный
1,372
726
Не могу найти в чем ошибка подскажите пожалуйста скинул строки 70-89
Ошибка:
[ML] (error) Report Helper ByMorse.lua: ...A GAMES\bin\Arizona\moonloader\Report Helper ByMorse.lua:80: 'end' expected (to close 'function' at line 70) near 'elseif'
[ML] (error) Report Helper ByMorse.lua: Script died due to an error. (3E2F396C)
Lua:
    bindrep = rkeys.registerHotKey(ActiveRep.v, 2, false, function()
        if selected_item.v == 0 and not sampIsChatInputActive() and not sampIsDialogActive() and not menushka.v then
            activateflud = not activateflud if activateflud and selected_item.v == 0 then
                sampAddChatMessage('{FF69B4}[Report Helper] {FFFFFF}Ловля репорта флудом включена', -1)
        elseif selected_item.v == 0 then
            sampAddChatMessage('{FF69B4}[Report Helper] {FFFFFF}Ловля репорта флудом выключена', -1)
        end
        elseif selected_item.v == 1 and not sampIsChatInputActive() and not sampIsDialogActive() and not menushka.v then
            sampSendChat('/ot')
        end
        elseif selected_item.v == 2 and not sampIsChatInputActive() and not sampIsDialogActive() and not menushka.v then
            activateautolov = not activateautolov if activateautolov and selected_item.v == 2 then
                sampAddChatMessage('{FF69B4}[Report Helper] {FFFFFF}Автоматическая ловля репорта включена', -1)
        elseif selected_item.v == 2 then
            sampAddChatMessage('{FF69B4}[Report Helper] {FFFFFF}Автоматическая ловля репорта выключена', -1)
        end
        elseif selected_item.v == 3 and not sampIsChatInputActive() and not sampIsDialogActive() and not menushka.v then
            sampSendChat('/ot')
        end
    end)

Lua:
 elseif selected_item.v == 3 and not sampIsChatInputActive() and not sampIsDialogActive() and not menushka.v then

            sampSendChat('/ot')

        end
На
Lua:
     if selected_item.v == 3 and not sampIsChatInputActive() and not sampIsDialogActive() and not menushka.v then

            sampSendChat('/ot')

        end