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

Magir

Участник
58
5
script_properties('work-in-pause') в начало кода
Спасибо! Он будет отслеживать чат в свернутом режиме? (реагировать на совпадения, если такие будут) мне нужно, чтобы он отслеживать чат, и в случае чего мог воспроизвести мелодию, чтобы их свернутого режима её было слышно
 
Последнее редактирование:

Fomikus

Известный
Проверенный
475
345
Как мне через file:write() записать в текстовом документе в определённой строке, а не с 1 и так далле?
Из самого банального - читать файл > делить на строки в таблицу > менять в таблице > записывать обратно
Но в луа имеется прикол, возможно он и открытие через io.open(file, "a") поможет
DrcgXHk.png
 
  • Нравится
Реакции: danywa

Smeruxa

Известный
1,372
726
Спасибо! Он будет отслеживать чат в свернутом режиме? (реагировать на совпадения, если такие будут) мне нужно, чтобы он отслеживать чат, и в случае чего мог воспроизвести мелодию, чтобы их свернутого режима её было слышно
вместо спасибо лайки бы лучше ставил. Указывая этот дискриптор у тебя весь код будет выполняться при паузе, при свернутом нужен анти-афк, ну мб я тупой
Lua:
if status then
    memory.setuint8(7634870, 1, false)
    memory.setuint8(7635034, 1, false)
    memory.fill(7623723, 144, 8, false)
    memory.fill(5499528, 144, 6, false)
else
    memory.setuint8(7634870, 0, false)
    memory.setuint8(7635034, 0, false)
    memory.hex2bin('0F 84 7B 01 00 00', 7623723, 8)
    memory.hex2bin('50 51 FF 15 00 83 85 00', 5499528, 6)
end
 

Magir

Участник
58
5
вместо спасибо лайки бы лучше ставил. Указывая этот дискриптор у тебя весь код будет выполняться при паузе, при свернутом нужен анти-афк, ну мб я тупой
Lua:
if status then
    memory.setuint8(7634870, 1, false)
    memory.setuint8(7635034, 1, false)
    memory.fill(7623723, 144, 8, false)
    memory.fill(5499528, 144, 6, false)
else
    memory.setuint8(7634870, 0, false)
    memory.setuint8(7635034, 0, false)
    memory.hex2bin('0F 84 7B 01 00 00', 7623723, 8)
    memory.hex2bin('50 51 FF 15 00 83 85 00', 5499528, 6)
end
Понял) это в main вставить?
 

EclipsedFlow

Известный
Проверенный
1,047
476
Из самого банального - читать файл > делить на строки в таблицу > менять в таблице > записывать обратно
Но в луа имеется прикол, возможно он и открытие через io.open(file, "a") поможет
DrcgXHk.png
Мне надо отредактировать 16 строку, попробовал так, оно записало в конец!
Lua:
lua_bot:seek("set", 16)
lua_bot:write("Hello")
 

Smeruxa

Известный
1,372
726
Понял) это в main вставить?
Lua:
require 'lib.moonloader'
local status = false

function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand('status', function()
        status = not status
        sampAddChatMessage(status and 'en' or 'off', -1)
        if status then
            memory.setuint8(7634870, 1, false)
            memory.setuint8(7635034, 1, false)
            memory.fill(7623723, 144, 8, false)
            memory.fill(5499528, 144, 6, false)
        else
            memory.setuint8(7634870, 0, false)
            memory.setuint8(7635034, 0, false)
            memory.hex2bin('0F 84 7B 01 00 00', 7623723, 8)
            memory.hex2bin('50 51 FF 15 00 83 85 00', 5499528, 6)
        end
    end)
    wait(-1)
end
 
  • Нравится
Реакции: Gorskin и Magir

Magir

Участник
58
5
Lua:
require 'lib.moonloader'
local status = false

function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand('status', function()
        status = not status
        sampAddChatMessage(status and 'en' or 'off', -1)
        if status then
            memory.setuint8(7634870, 1, false)
            memory.setuint8(7635034, 1, false)
            memory.fill(7623723, 144, 8, false)
            memory.fill(5499528, 144, 6, false)
        else
            memory.setuint8(7634870, 0, false)
            memory.setuint8(7635034, 0, false)
            memory.hex2bin('0F 84 7B 01 00 00', 7623723, 8)
            memory.hex2bin('50 51 FF 15 00 83 85 00', 5499528, 6)
        end
    end)
    wait(-1)
end
Попробовал в свернутом режиме включить и инициировать AudioStream, звука не было в свернутом режиме... Поможешь решить проблему? Ошибок в логах нет (скрипт работает на всем протяжении проверки)
Lua:
function main()
    if not isSampLoaded() or not  isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(0) end
    audio =  loadAudioStream("moonloader/signal.mp3")
    if ACTIVATE then
        sampAddChatMessage(PREFIX..ACTIVATE_DISC[1],-1)
        if not MODE then
            sampAddChatMessage(PREFIX..MODE_DESC[1],-1)
        else
            sampAddChatMessage(PREFIX..MODE_DESC[2],-1)
        end
    else
        sampAddChatMessage(PREFIX..ACTIVATE_DISC[2],-1)  
    end
    sampAddChatMessage(PREFIX..SETTINGS_DESC,-1)
    sampRegisterChatCommand("aadm",function()
        ACTIVATE = not ACTIVATE
        if ACTIVATE then
            sampAddChatMessage(PREFIX..ACTIVATE_DISC[1],-1)
        else
            sampAddChatMessage(PREFIX..ACTIVATE_DISC[2],-1)
        end
     end)
    mus = lua_thread.create_suspended(sound)
    auto = lua_thread.create_suspended(autootv)
    if ACTIVATE then
        memory.setuint8(7634870, 1, false)
        memory.setuint8(7635034, 1, false)
        memory.fill(7623723, 144, 8, false)
        memory.fill(5499528, 144, 6, false)
    else
        memory.setuint8(7634870, 0, false)
        memory.setuint8(7635034, 0, false)
        memory.hex2bin('0F 84 7B 01 00 00', 7623723, 8)
        memory.hex2bin('50 51 FF 15 00 83 85 00', 5499528, 6)
    end
     sampRegisterChatCommand("amode",function()
        MODE = not MODE
        if not MODE then
            sampAddChatMessage(PREFIX..MODE_DESC[1],-1)
        else
            sampAddChatMessage(PREFIX..MODE_DESC[2],-1)
        end
     end)
     wait(-1)
end

function env.onServerMessage(col,txt)
    if ACTIVATE and col == -6732289 then
        if MODE then
            auto:run(text:match("%]:%s*(.+)"))
        else
            mus:run()
        end
    end
   
end



function sound()
        if not state then
            setAudioStreamLooped(audio, true)
            setAudioStreamVolume(audio,SOUND_VOLUME)
            setAudioStreamState(audio,au.PLAY)
            sampAddChatMessage(PREFIX.."{ffffff} Для отключения звука уведомления нажмите {ff00ff} 5",-1)
            state = true
        end
    local off = true
    while off do
        if isKeyDown(vkey.VK_5) then
            off = not off
        end
        wait(0)
    end
    state =false
    setAudioStreamState(audio,au.STOP)
    sampAddChatMessage(PREFIX.."{ffffff}Уведомление принято. Звук отключен",-1)
end
 

danywa

Активный
358
50
rakbot
Lua:
local print = printLog
local tp = false


function onDialogShow(dialogId, dialogStyle, dialogTitle, okButtonText, cancelButtonText, dialogText)
        if dialogTitle:find('GPS:') then
            sendDialog(dialogId, 1, 5, '')
            print('найден')
            tp = true
        return true
    end
end

function onRecvRpc(id, data, size)
    if id == 38 then
        bs = bitStreamInit(data, size)
        bitStreamIgnore(bs, 1)
        x, y, z = bitStreamReadFloat(bs), bitStreamReadFloat(bs), bitStreamReadFloat(bs)
        print('^'..math.floor(x)..', '..math.floor(y)..', '..math.floor(z))
        if tp == true then
            teleport(x, y, z)
            print('teleported: '..math.floor(x)..', '..math.floor(y)..', '..math.floor(z))
        end
    end
end
В чем проблема?Должен только после хука телепортироваться
 

Double Tap Inside

Известный
Проверенный
1,916
1,256
setCharKeyDown(47, true) вставляет слеш "/"
Работает только на английской раскладке, на русской не работает. Шо делать? (кроме переключения на англ.)