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

LUK

Участник
54
68
Приветствую всех, господа и дамы форумчане.
Подскажите пожалуйста, как сделать цветные ники в чате, но только у тех, кто использует определённый скрипт.
К примеру, я использую скрипт "down", у меня мой ник в чате показывается синим.
Есть второй игрок, у него тоже стоит скрипт "down", поэтому у меня его ник тоже показывается синим, а у него его ник синий и мой.
Сложно, если ты не знаешь как это сделать, ты это не сделаешь.
 

neverlane

t.me/neverlane00
Друг
1,002
1,141
Приветствую всех, господа и дамы форумчане.
Подскажите пожалуйста, как сделать цветные ники в чате, но только у тех, кто использует определённый скрипт.
К примеру, я использую скрипт "down", у меня мой ник в чате показывается синим.
Есть второй игрок, у него тоже стоит скрипт "down", поэтому у меня его ник тоже показывается синим, а у него его ник синий и мой.
С помощью библиотеки broadcaster можно такое сделать, она позволяет обмениваться сообщениями(или же json таблицами, та-же строка) на одном сервере без использования IRC и хостов
Писал скрипт при виде тексдрава с указанным id скрипт должен нажимать: стрелки вверх/вниз, вправо/влево, но ничего не происходит, в чат выводится надпись то что бот запущен,а дальше ничего не происходит,знает кто как пофиксить?
code:
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(-1)
        if graf 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 = not graf 
   sampAddChatMessage(graf and '{FF1493}[Pink]:{FFFFFF}Бот {00FF00}включен' or '{FF1493}[Pink]:{FFFFFF}Бот {FF0000}выключен', -1)
end
Во-первых, ты сделал в бесконечном цикле бесконечное ожидание, зачем?
Во-вторых, для проверки активации ты юзаешь ту же переменную в которой записана функция
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
 
Последнее редактирование:

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,599
1,636
всё равно не работает
Подскажите пожалуйста сделать скрипт который при виде определённого тексдрава нажимает стрелки:вверх/вниз, вправо/влево. Та стрелка которую надо нажать на тексдраве светится белым.
сам тексдравПосмотреть вложение 65130
1597154166491.png

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

Biuti

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

Rei

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

а можно объяснить для чайников?
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