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

enyag

Известный
345
12
как сделать, что бы вместо ника выводило значение, которое находится в /ran?
Lua:
script_name('broadcaster_showcase')
script_version('0.0.1')
script_author('Ranx')

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

local broadcaster = import('lib/broadcaster.lua')

local function showcaseHandler(message)
    sampAddChatMessage('BC Chat >> ' .. u8:decode(message), 0xAAAAAA)
end

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

    sampRegisterChatCommand('msg', cmdMsg)
    sampRegisterChatCommand("ran", ran)
    sampRegisterChatCommand('gethandlers', function() broadcaster._printHandlers() end)
    sampRegisterChatCommand('getsessions', function() broadcaster._printSessions() end)
  
    wait(100)
    broadcaster.registerHandler('scase', showcaseHandler)

    wait(-1)
end

function cmdMsg(params)
    local idResult, pId = sampGetPlayerIdByCharHandle(PLAYER_PED)
    if idResult then
        local message = u8(('%s[%d]: %s'):format(sampGetPlayerNickname(pId), pId, params))
        local result, returned = pcall(broadcaster.sendMessage, message, 'scase')
        if not result then
            print('error occured while sending msg:\n' .. returned)
        end
    end
end

function onScriptTerminate(scr)
    if scr == thisScript() then
        if broadcaster.unregisterHandler('scase') then
            print('unregistered successfully')
        else
            print('unregisterHandler returned false')
        end
    end
end

function ran(arg)
    if #arg ~= 0 then -- проверяет не пустое ли значение arg
        Value = arg
        sampAddChatMessage("Готово, ваш ранг:"..Value, -1)
    else
        print("Введите ник")
    end
end
акутально :3
 

Мира

Участник
455
9
Lua:
function samp.onServerMessage(col, text)
    lua_thread.create(function()
    _, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
    nick = sampGetPlayerNickname(id)
        if text:find("%> Добро пожаловать, {7FB151}"..nick.."{FAEBD7}. Надеемся, что вы хорошо проведете у нас время.") then
            sampAddChatMessage("> Добро пожаловать, {7FB151}"..nick.."{FAEBD7}. Надеемся, что вы хорошо проведете у нас время.")
            sampSendChat("/aduty")
        end
        if text:find('%(%( PM от .+%((%d+)%): где получить права? %)%)') then
        pmid = text:match('%(%( PM от .+%((%d+)%): где получить права? %)%)')
            sampSendChat("/pm "..pmid.." GPS Навигатор (/GPS) - 1. Общественные места - 2. Департамент транспорта")
        end
    end)
end
почему не работает?
Lua:
        if text:find('%(%( PM от .+%((%d+)%): где получить права? %)%)') then
        pmid = text:match('%(%( PM от .+%((%d+)%): где получить права? %)%)')
            sampSendChat("/pm "..pmid.." GPS Навигатор (/GPS) - 1. Общественные места - 2. Департамент транспорта")
        end
    end)
end
 

Biuti

Участник
165
8
Во-первых, ты сделал в бесконечном цикле бесконечное ожидание, зачем?
Во-вторых, для проверки активации ты юзаешь ту же переменную в которой записана функция
Lua:
local sampev = require "lib.samp.events"
local keys = require "vkeys"

require "lib.moonloader"
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage('{FF0000}Автор скрипта: {FF1493}Pink')
    sampAddChatMessage('{FF1493}[Pink]:{FF0000}Группа в вк',-1)
    sampRegisterChatCommand('graf', graf)
    while true do
        wait(0)
        if graf_act then
            if sampTextdrawIsExists(2184) then
                setVirtualKeyDown(0x26, true)
                wait(1000)
                setVirtualKeyDown(0x26, false)
            end

            if sampTextdrawIsExists(2185) then
                setVirtualKeyDown(0x28, true)
                wait(1000)
                setVirtualKeyDown(0x28, false)
            end

            if sampTextdrawIsExists(2186) then
                setVirtualKeyDown(0x25, true)
                wait(1000)
                setVirtualKeyDown(0x25, false)
            end

            if sampTextdrawIsExists(2187) then
                setVirtualKeyDown(0x27, true)
                wait(1000)
                setVirtualKeyDown(0x27, false)
            end
        end
    end
      
end

function graf(arg)
    graf_act = not graf_act 
   sampAddChatMessage(graf_act and '{FF1493}[Pink]:{FFFFFF}Бот {00FF00}включен' or '{FF1493}[Pink]:{FFFFFF}Бот {FF0000}выключен', -1)
end
это готовый код?
 

Мира

Участник
455
9
Код:
Команда проекта в сети:
- {FAEBD7}- хелпер.
- {FAEBD7}- хелпер.
- {FAEBD7}- хелпер. {aa3333}(AFK)
- {FAEBD7}- 4 уровень.
- {FAEBD7}- хелпер. {aa3333}(AFK)
- {FAEBD7}- 3 уровень.
- {FAEBD7}- 6 уровень.
- {FAEBD7}- хелпер. {aa3333}(AFK)
как подсчитать слова "хелпер" до фразы "Команда проекта в сети"?
 

clrn1w

Известный
316
146
Код:
Команда проекта в сети:
- {FAEBD7}- хелпер.
- {FAEBD7}- хелпер.
- {FAEBD7}- хелпер. {aa3333}(AFK)
- {FAEBD7}- 4 уровень.
- {FAEBD7}- хелпер. {aa3333}(AFK)
- {FAEBD7}- 3 уровень.
- {FAEBD7}- 6 уровень.
- {FAEBD7}- хелпер. {aa3333}(AFK)
как подсчитать слова "хелпер" до фразы "Команда проекта в сети"?
Lua:
i = 0
for line in text:gmatch("[^\n]+") do
    if line:find('хелпер') then
        i = i + 1
    end
end
попробуй
 

Biuti

Участник
165
8
всё равно не работает
Подскажите пожалуйста сделать скрипт который при виде определённого тексдрава нажимает стрелки:вверх/вниз, вправо/влево. Та стрелка которую надо нажать на тексдраве светится белым.
сам тексдрав
7WbuLh0fDw4.jpg

вот чуток моего кода
Lua:
local sampev = require "lib.samp.events"
local keys = require "vkeys"

require "lib.moonloader"
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage('{FF0000}Автор скрипта: {FF1493}Pink')
    sampAddChatMessage('{FF1493}[Pink]:{FF0000}Группа в вк',-1)
    sampRegisterChatCommand('graf', graf)
    while true do
        wait(0)
        if graf_act then
            if sampTextdrawIsExists(2184) then
                setVirtualKeyDown(0x26, true)
                wait(1000)
                setVirtualKeyDown(0x26, false)
            end

            if sampTextdrawIsExists(2185) then
                setVirtualKeyDown(0x28, true)
                wait(1000)
                setVirtualKeyDown(0x28, false)
            end

            if sampTextdrawIsExists(2186) then
                setVirtualKeyDown(0x25, true)
                wait(1000)
                setVirtualKeyDown(0x25, false)
            end

            if sampTextdrawIsExists(2187) then
                setVirtualKeyDown(0x27, true)
                wait(1000)
                setVirtualKeyDown(0x27, false)
            end
        end
    end

end

function graf(arg)
    graf_act = not graf_act
   sampAddChatMessage(graf_act and '{FF1493}[Pink]:{FFFFFF}Бот {00FF00}включен' or '{FF1493}[Pink]:{FFFFFF}Бот {FF0000}выключен', -1)
end
 
Последнее редактирование:

clrn1w

Известный
316
146
всё равно не работает
Подскажите пожалуйста сделать скрипт который при виде определённого тексдрава нажимает стрелки:вверх/вниз, вправо/влево. Та стрелка которую надо нажать на тексдраве светится белым.
сам тексдравПосмотреть вложение 65130

Lua:
local hook = require "lib.samp.events"

function hook.onShowTextDraw(id, data)
    if id == 2184 then
        sampSendClickTextdraw(id)
    end
end
 

Rei

Известный
Друг
1,611
1,668
всё равно не работает
Подскажите пожалуйста сделать скрипт который при виде определённого тексдрава нажимает стрелки:вверх/вниз, вправо/влево. Та стрелка которую надо нажать на тексдраве светится белым.
сам тексдравПосмотреть вложение 65130
1597154166491.png

хукай красный и белый текстдрав, выводи значения, по которым мб можно идентифицировать и смотри отличия ( я бы обратил внимание на color`ы и selectable )
 

Biuti

Участник
165
8
эта функция кликает по тексдраву,а мне нужно чтобы нажимались стрелки на клавиатуре
Посмотреть вложение 65135
хукай красный и белый текстдрав, выводи значения, по которым мб можно идентифицировать и смотри отличия ( я бы обратил внимание на color`ы и selectable )
а можно объяснить для чайников?
 

Rei

Известный
Друг
1,611
1,668
Форматирование кода
эта функция кликает по тексдраву,а мне нужно чтобы нажимались стрелки на клавиатуре

а можно объяснить для чайников?
Lua:
function onShowTextDraw(id, data)
    if id == нужный then
        print(data.color)
        print(data.selectable)
    end
end

вывод в консоль нужных параметров, как найдешь, то
Lua:
if data.color == 8424128 then
    --действие
end

( это как пример просто )
 
Последнее редактирование модератором:

clrn1w

Известный
316
146
эта функция кликает по тексдраву,а мне нужно чтобы нажимались стрелки на клавиатуре

а можно объяснить для чайников?
Lua:
local hook = require "lib.samp.events"

function hook.onShowTextDraw(id, data)
    if data.selectable == true then -- вроде такого
        --действие
    end
end
или
Lua:
local hook = require "lib.samp.events"

function hook.onShowTextDraw(id, data)
    if data.color == color then -- color сам достанешь
        --действие
    end
end
 
  • Нравится
Реакции: Biuti

Мира

Участник
455
9
как сделать после нажатия текстдрава 1 нажатие текстдрава 2? а точнее, как проверить нажатие текстдрава? чтобы я нажал на текстдрав 1 и если я на него нажал, то автоматически нажимался на текстдрав 2
 
Последнее редактирование:

CaJlaT

07.11.2024 14:55
Модератор
2,830
2,660
как сделать после нажатия текстдрава 1 нажатие текстдрава 2? а точнее, как проверить нажатие текстдрава? чтобы я нажал на текстдрав 1 и если я на него нажал, то автоматически нажимался на текстдрав 2
Lua:
local samp = require 'lib.samp.events'
function samp.onSendClickTextDraw(id)
    --код
end
как сделать счетчик введенной команды?
Lua:
local cmd_count = 0

sampRegisterChatCommand('cmd', function()
    cmd_count = cmd_count + 1
    --code
end)


--или, если это серверная команда или команда другого скрипта, то вот так
local cmd_count = 0
local samp = require 'lib.samp.events'
function samp.onSendCommand(command)
    if command == '/cmd' then
        cmd_count = cmd_count + 1
    end
end
 
Последнее редактирование:
  • Нравится
Реакции: Anton Nixon