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

Harryss

Участник
233
26
wait(-1) зачем?


thisScript().reload()
Странновато, использую его по созданию .ini файла, однако крашит. Перезагрузка для того, дабы не перезаходить в игру, без перезахода или перезагрузки .ini файл не читает, потому что по структуре должен работать с готовым.
Lua:
local anotherIni = inicfg.load(nil, "..\\Script\\IniFile")
if anotherIni == nil then
    local settingst = {
        settings =
        {
            cmdS = true
        },
        data =
        {
            fraction = '',
            rang = ''
        },
        keys =
        {
            key_k = true
        }
    }
    inicfg.save(settingst, "..\\Script\\IniFile")
    thisScript().reload()
end
 

lorgon

Известный
657
268
Как сделать такую вещь?
upload_2018-9-3_15-2-45.png
 

imring

Ride the Lightning
Всефорумный модератор
2,355
2,516
Странновато, использую его по созданию .ini файла, однако крашит. Перезагрузка для того, дабы не перезаходить в игру, без перезахода или перезагрузки .ini файл не читает, потому что по структуре должен работать с готовым.
Lua:
local anotherIni = inicfg.load(nil, "..\\Script\\IniFile")
if anotherIni == nil then
    local settingst = {
        settings =
        {
            cmdS = true
        },
        data =
        {
            fraction = '',
            rang = ''
        },
        keys =
        {
            key_k = true
        }
    }
    inicfg.save(settingst, "..\\Script\\IniFile")
    thisScript().reload()
end
thisScript():reload()
или script.this:reload()
 
  • Нравится
Реакции: Harryss

checkdasound

Известный
Проверенный
963
406
Как сделать такую вещь?
18612
(Не ответели)
Lua:
imgui = require ('imgui')
-- ondrawframe bla bla
if imgui.CollapsingHeader('Options') then
  -- содержимое данной вкладки
end

Почему не выводит количество игроков с ником из списка в чат?
Игрок есть на сервере, а пишет: 0.
Lua:
local lines = {}
-- local nicks = {}
local count = 0

function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('adm', adm)
    wait(-1)
end

function adm()
    local path = 'moonloader/adm_list.txt'
    local file = io.open(path, 'r+')
    if file ~= nil then
        for line in file:lines() do
            print(line)
            for i = 0, sampGetMaxPlayerId(false) do
                if sampIsPlayerConnected(i) then
                    local name = sampGetPlayerNickname(i)
                    if name == list then
                        count = count + 1
                        -- table.insert(nicks, line)
                    end
                end
            end
        end
        sampAddChatMessage('В сети '..count..' админов', -1)
    file:close()
    end
end
 

Terratomorf

Известный
315
58
Не работает в чём проблема? скрипт работает так я жму K и он начинает флудить enter а когда появится диалог перестать
Код:
script_name("huina")
script_authors("pidor")
script_version_number(1)

require "lib.moonloader"

local activeItsHuina = false
function main()
    if not isSampLoaded() then return end
    while not isSampAvailable() do wait (100) end
 
    while true do
        wait(0)
        if wasKeyPressed(0x4B) then
            activeItsHuina = not activeItsHuina
            printStringNow("hop", 1000)
        end
        if activeItsHuina then
            if not sampIsDialogActive() then
                printStringNow("keyflood", 1)
                setGameKeyState(15, 255)
            end
        end
    end
end

Дайте код кликера по текстдравам
 

r0ckwe11

Известный
60
3
Lua:
imgui = require ('imgui')
-- ondrawframe bla bla
if imgui.CollapsingHeader('Options') then
  -- содержимое данной вкладки
end

Почему не выводит количество игроков с ником из списка в чат?
Игрок есть на сервере, а пишет: 0.
Lua:
local lines = {}
-- local nicks = {}
local count = 0

function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('adm', adm)
    wait(-1)
end

function adm()
    local path = 'moonloader/adm_list.txt'
    local file = io.open(path, 'r+')
    if file ~= nil then
        for line in file:lines() do
            print(line)
            for i = 0, sampGetMaxPlayerId(false) do
                if sampIsPlayerConnected(i) then
                    local name = sampGetPlayerNickname(i)
                    if name == list then
                        count = count + 1
                        -- table.insert(nicks, line)
                    end
                end
            end
        end
        sampAddChatMessage('В сети '..count..' админов', -1)
    file:close()
    end
end
Функция sampIsPlayerConnected() почему-то не работает. Всегда пишет отрицательное значение.

Дайте код кликера по текстдравам
sampSendClickTextdraw(id текстдрава)
 

Terratomorf

Известный
315
58
У меня есть кликер по текстдраву 306 когда открывается меню и там появляется этот текстдрав он на него кликает но потом почему-то зависатет камера вот код
Код:
script_name('AutoTextdrawClicker by Dessgun')
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    sampRegisterChatCommand("click", cmd_bot)
        while true do
        wait(0)
        if isPlayerPlaying(playerHandle) and enabled then
---------------------------------------------------------------------------
if sampTextdrawIsExists(306)then
sampSendClickTextdraw(306)
end
if sampTextdrawIsExists(306) then
sampSendClickTextdraw(306)
end
---------------------------------------------------------------------------
enabled = true
        end
    end
end 
function cmd_bot(param)
    enabled = not enabled
    if enabled then
        sampAddChatMessage(string.format("[%s]: Activated", thisScript().name), 0x40FF40)
    else
        sampAddChatMessage(string.format("[%s]: Deactivated", thisScript().name), 0xFF4040)
    end
end
 

r0ckwe11

Известный
60
3
Не работает в чём проблема? скрипт работает так я жму K и он начинает флудить enter а когда появится диалог перестать
script_name("huina")
script_authors("pidor")
script_version_number(1)

require "lib.moonloader"

local activeItsHuina = false
function main()
if not isSampLoaded() then return end
while not isSampAvailable() do wait (100) end

while true do
wait(0)
if wasKeyPressed(0x4B) then
activeItsHuina = not activeItsHuina
printStringNow("hop", 1000)
end
if activeItsHuina then
if not sampIsDialogActive() then
printStringNow("keyflood", 1)
setGameKeyState(15, 255)
end
end
end
end
ну дак ты сделал в цикле это всё, вот и флудит

У меня есть кликер по текстдраву 306 когда открывается меню и там появляется этот текстдрав он на него кликает но потом почему-то зависатет камера вот код
Код:
script_name('AutoTextdrawClicker by Dessgun')
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    sampRegisterChatCommand("click", cmd_bot)
        while true do
        wait(0)
        if isPlayerPlaying(playerHandle) and enabled then
---------------------------------------------------------------------------
if sampTextdrawIsExists(306)then
sampSendClickTextdraw(306)
end
if sampTextdrawIsExists(306) then
sampSendClickTextdraw(306)
end
---------------------------------------------------------------------------
enabled = true
        end
    end
end
function cmd_bot(param)
    enabled = not enabled
    if enabled then
        sampAddChatMessage(string.format("[%s]: Activated", thisScript().name), 0x40FF40)
    else
        sampAddChatMessage(string.format("[%s]: Deactivated", thisScript().name), 0xFF4040)
    end
end
он у тебя два раза подряд тыкает по одному текстдраву.
 

Terratomorf

Известный
315
58
ну дак ты сделал в цикле это всё, вот и флудит


он у тебя два раза подряд тыкает по одному текстдраву.
даже если сделать чтоб по одному текстдраву тыкало всё равно багается

ну дак ты сделал в цикле это всё, вот и флудит


он у тебя два раза подряд тыкает по одному текстдраву.
я не правильно написал я нажимаю K и он должен жать enter но не жмёт
 

r0ckwe11

Известный
60
3
я не правильно написал я нажимаю K и он должен жать enter но не жмёт
Попробуй так, короче.
Lua:
script_name("huina")
script_authors("pidor")
script_version_number(1)

require "lib.moonloader"

local activeItsHuina = false
function main()
    if not isSampLoaded() then return end
    while not isSampAvailable() do wait (100) end

    while true do
        wait(0)
        if wasKeyPressed(0x4B) then
            activeItsHuina = not activeItsHuina
            printStringNow("hop", 1000)
        end
        if activeItsHuina and sampIsDialogActive() then
            printStringNow("keyflood", 1)
            setGameKeyState(15, 255)
        end
    end
end
 

Terratomorf

Известный
315
58
Добавь задержку после клика по текстдраву
Если ты про так то не получается всё равно срзау жмёт
Код:
if sampTextdrawIsExists(306)then
wait(2000)
sampSendClickTextdraw(306)
end

Попробуй так, короче.
Lua:
script_name("huina")
script_authors("pidor")
script_version_number(1)

require "lib.moonloader"

local activeItsHuina = false
function main()
    if not isSampLoaded() then return end
    while not isSampAvailable() do wait (100) end

    while true do
        wait(0)
        if wasKeyPressed(0x4B) then
            activeItsHuina = not activeItsHuina
            printStringNow("hop", 1000)
        end
        if activeItsHuina and sampIsDialogActive() then
            printStringNow("keyflood", 1)
            setGameKeyState(15, 255)
        end
    end
end
жму K 0 реакции

Дайте код
Нужно чтоб я нажал K и скрипт начал активно ффлудить enter до того момента пока в чате не появится слово "Принято"