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

HpP

Известный
368
117

Lua:
img_1st = imgui.CreateTextureFromFile(getGameDirectory() .. 'moonloader\\images\\bones.jpg') -- В самом начале кода.


    imgui.Begin(u8'[Reshala]', WindowState, imgui.WindowFlags.NoResize)
    imgui.BeginChild('Кости', imgui.ImVec2(738, 463), true)
    imgui.Image(img_1st, imgui.ImVec2(730, 400))
    imgui.Separator()
    imgui.PushItemWidth(463)
    imgui.Button(u8'Кинуть', imgui.ImVec2(-1, 20))
    imgui.EndChild()
 

Deniska.lua

Участник
43
0
Доброе время суток, возможно вопрос заезжий.
Как сделать при виде вот такого тексдрава
sa-mp-128.jpg

Выполнялось действие?
 

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113
Доброе время суток, возможно вопрос заезжий.
Как сделать при виде вот такого тексдрава
Посмотреть вложение 65112
Выполнялось действие?
Сначала хукни сам текст
Lua:
local sampev = require 'lib.samp.events'

function sampev.onDisplayGameText(style, time, text)
    sampAddChatMessage(text, -1)
end
А затем действие
Lua:
function sampev.onDisplayGameText(style, time, text)
    if text:find("тут текст с AddChatMessage") then
        -- code
    end
end
Lua:
img_1st = imgui.CreateTextureFromFile(getGameDirectory() .. 'moonloader\\images\\bones.jpg') -- В самом начале кода.


    imgui.Begin(u8'[Reshala]', WindowState, imgui.WindowFlags.NoResize)
    imgui.BeginChild('Кости', imgui.ImVec2(738, 463), true)
    imgui.Image(img_1st, imgui.ImVec2(730, 400))
    imgui.Separator()
    imgui.PushItemWidth(463)
    imgui.Button(u8'Кинуть', imgui.ImVec2(-1, 20))
    imgui.EndChild()
Сама картинка в папке-то есть? Такое бывает, когда скрипт не находит картинку. У самого было.
 
  • Нравится
Реакции: Vintik и HpP

darkjer

Активный
134
68
как взаимодействовать диалоговое окно с ImGui? к примеру InputText, Button. при этом скрыть диалоговое окно
code:
local imgui = require 'imgui'

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

local mainWindowState = imgui.ImBool(false)
local input = imgui.ImBuffer(256)
local zagolovok = imgui.ImBuffer(256)
local text = imgui.ImBuffer(256)

function main()
    sampRegisterChatCommand('dialog2', function()
        sampShowDialog(1253, u8:decode(zagolovok.v), u8:decode(input.v), 'Ясно', 'Закрыть', 2)
    end)
    sampRegisterChatCommand('imgui2', function()
        mainWindowState.v = not mainWindowState.v
    end)
    while true do
        wait(0)
        imgui.Process = mainWindowState.v
        local result, button, list, input = sampHasDialogRespond(1253)
        if result then
            if list == 0 and button == 1 then
                sampAddChatMessage(u8:decode(text.v), -1)
            end
        end
    end
end

function imgui.OnDrawFrame()
    if mainWindowState.v then
        imgui.SetNextWindowSize(imgui.ImVec2(485, 195))
        imgui.Begin(u8'Заголовок', mainWindowState)
        imgui.InputText(u8'Заголовок', zagolovok)
        imgui.InputText(u8'Название строки', input)
        imgui.InputText(u8'Текст строки', text)
        imgui.End()
    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
 

Biuti

Участник
165
8
Писал скрипт при виде тексдрава с указанным 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
 

mails2k18

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