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

Dmitriy Makarov

25.05.2021
Проверенный
2,512
1,139
Всем привет, как сделать цвет кнопок как на скриншоте ? Если не трудно, помогите пожалуйста.

Посмотреть вложение 105761
 

#Kai-

Известный
699
292
Почему когда я захожу мне не пишет
Код:
    ASHelperMessage('ASBinder V.'..thisScript().version..' Скрипт загружен.')
    ASHelperMessage("Введите /asb чтобы открыть настройки.")
Фулл код:
script_name('ASBinder')
script_description('Помощник для автошколы.')
script_author('Nazar1ky')
script_version_number(13)
script_version('2.0')
script_dependencies('imgui; samp events')

-- Библиотеки
require "lib.moonloader"
local dlstatus = require('moonloader').download_status
local se = require 'samp.events'
local vkeys = require 'vkeys'
local encoding = require 'encoding'
local inicfg = require 'inicfg'
local font = renderCreateFont('Arial',8,5)
local imguicheck, imgui    = pcall(require, "imgui")

local ScreenX, ScreenY = getScreenResolution()

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

-- Переменные
update_state = false
local script_vers = 13
local script_vers_text = "2.0"

local update_url = "https://raw.githubusercontent.com/Nazar1ky/ASHelper/main/update.ini"
local update_path = getWorkingDirectory() .. "/update.ini"

local script_url = "https://github.com/Nazar1ky/ASHelper/raw/main/ASHelper.lua"
local script_path = thisScript().path

local inprocess = false

local mainIni = inicfg.load({
    main_settings = {
        myrankint = 0,
        myrank = '',
        gender = 0,
        openmenu = "E",
        openmenuactive = false,
        ASChatColor = 4281558783
    },
    prices = {
        avtoprice = 10000,
        motoprice = 12000,
        ribaprice = 20000,
        lodkaprice = 22000,
        gunaprice = 50000,
        huntprice = 100000,
        kladprice = 200000,
        taxiprice = 200000
    },
    my_stats = {
        avto = 0,
        moto = 0,
        riba = 0,
        lodka = 0,
        guns = 0,
        hunt = 0,
        klad = 0,
        taxi = 0
    },
}, "ASBinder")
function ASHelperMessage(text)
    if imguicheck then
        local r, g, b, a = imgui.ImColor(mainIni.main_settings.ASChatColor):GetRGBA()
        sampAddChatMessage("[ASbinder] {EBEBEB}"..text,join_rgb(r, g, b))
    else
        sampAddChatMessage("[ASbinder] {EBEBEB}"..text,0xff6633)
    end
end
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then
    return end
    while not isSampAvailable() do
        wait(200)
    end
    local checking = libcheck()
    while not checking do
        wait(200)
    end
    if not checkServer(select(1, sampGetCurrentServerAddress())) then
        ASHelperMessage('Скрипт работает только на серверах Arizona RP. Скрипт выгружен.')
        thisScript():unload()
    end
    ASHelperMessage('ASBinder V.'..thisScript().version..' Скрипт загружен.')
    ASHelperMessage("Введите /asb чтобы открыть настройки.")
    sampRegisterChatCommand('asb', function()
        ASHelperMessage("ТЕСТ.")
    end)
end
function checkServer(ip)
    for k, v in pairs({
        '185.169.134.3',
        '185.169.134.4',
        '185.169.134.43',
        '185.169.134.44',
        '185.169.134.45',
        '185.169.134.5',
        '185.169.134.59',
        '185.169.134.61',
        '185.169.134.107',
        '185.169.134.109',
        '185.169.134.166',
        '185.169.134.171',
        '185.169.134.172',
        '185.169.134.173',
        '185.169.134.174'}) do
        if v == ip then
            return true
        end
    end
    return false
end
function join_rgb(rr, gg, bb)
    return bit.bor(bit.bor(bb, bit.lshift(gg, 8)), bit.lshift(rr, 16))
end
function onQuitGame()
    inicfg.save(mainIni, 'ASBinder.ini')
end
function onScriptTerminate(script, quitGame)
    if script == thisScript() then
        if not sampIsDialogActive() then
            showCursor(false, false)
        end
        inicfg.save(mainIni, 'ASBinder.ini')
        sampShowDialog(1313, "{ff6633}[ASBinder]{ffffff} Скрипт был выгружен сам по себе.", [[
{ffffff}                                                                             Что делать в таких случаях?{f51111}

Если вы самостоятельно перезагрузили скрипт, то можете закрыть это диалоговое окно.
В ином случае, для начала попытайтесь восстановить работу скрипта сочетанием клавиш CTRL + R.
Если же это не помогло, то читайте следующие пункты.{ff6633}

1. Возможно у вас установлены другие LUA файлы и хелперы, попытайтесь удалить их.

2. Возможно вы не доустановили некоторые дополнения, а именно:
- SAMPFUNCS
- CLEO 4.1+
- MoonLoader 0.26

3. Если данной ошибки не было ранее, попытайтесь сделать следующие действия:
- В папке moonloader > config > Удаляем файл ASBinder.ini

4. Если ничего из вышеперечисленного не исправило ошибку, то следует установить скрипт на другую сборку.

5. Если у вас скрипт вылетает по нажатию на какую-то кнопку, то можете отправить (Nazar1ky#1000) эту ошибку.]], "ОК", nil, 0)
    end
end

function libcheck()
    local function DownloadFile(url, file)
        downloadUrlToFile(url,file,function(id,status)
            if status == dlstatus.STATUSEX_ENDDOWNLOAD then
            end
        end)
        while not doesFileExist(file) do
            wait(1000)
        end
    end
    if not imguicheck then
            sampAddChatMessage(tag .. "Библиотека imgui не найдена... Установим!", -1)
            DownloadFile('https://raw.githubusercontent.com/Nazar1ky/ASHelper/main/imgui.lua', 'moonloader/lib/imgui.lua')
            DownloadFile('https://raw.githubusercontent.com/Nazar1ky/ASHelper/main/MoonImGui.dll', 'moonloader/lib/MoonImGui.dll')
            sampAddChatMessage(tag .. "Библиотека imgui была установлена! Перезапускаю...!", -1)
            thisScript():reload()
            return false
    end
end
куда ты заходишь, mooloader.log, скрипт вообще загрузился?
 

fantavise

Потрачен
126
99
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Почему когда я захожу мне не пишет
Код:
    ASHelperMessage('ASBinder V.'..thisScript().version..' Скрипт загружен.')
    ASHelperMessage("Введите /asb чтобы открыть настройки.")
Фулл код:
script_name('ASBinder')
script_description('Помощник для автошколы.')
script_author('Nazar1ky')
script_version_number(13)
script_version('2.0')
script_dependencies('imgui; samp events')

-- Библиотеки
require "lib.moonloader"
local dlstatus = require('moonloader').download_status
local se = require 'samp.events'
local vkeys = require 'vkeys'
local encoding = require 'encoding'
local inicfg = require 'inicfg'
local font = renderCreateFont('Arial',8,5)
local imguicheck, imgui    = pcall(require, "imgui")

local ScreenX, ScreenY = getScreenResolution()

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

-- Переменные
update_state = false
local script_vers = 13
local script_vers_text = "2.0"

local update_url = "https://raw.githubusercontent.com/Nazar1ky/ASHelper/main/update.ini"
local update_path = getWorkingDirectory() .. "/update.ini"

local script_url = "https://github.com/Nazar1ky/ASHelper/raw/main/ASHelper.lua"
local script_path = thisScript().path

local inprocess = false

local mainIni = inicfg.load({
    main_settings = {
        myrankint = 0,
        myrank = '',
        gender = 0,
        openmenu = "E",
        openmenuactive = false,
        ASChatColor = 4281558783
    },
    prices = {
        avtoprice = 10000,
        motoprice = 12000,
        ribaprice = 20000,
        lodkaprice = 22000,
        gunaprice = 50000,
        huntprice = 100000,
        kladprice = 200000,
        taxiprice = 200000
    },
    my_stats = {
        avto = 0,
        moto = 0,
        riba = 0,
        lodka = 0,
        guns = 0,
        hunt = 0,
        klad = 0,
        taxi = 0
    },
}, "ASBinder")
function ASHelperMessage(text)
    if imguicheck then
        local r, g, b, a = imgui.ImColor(mainIni.main_settings.ASChatColor):GetRGBA()
        sampAddChatMessage("[ASbinder] {EBEBEB}"..text,join_rgb(r, g, b))
    else
        sampAddChatMessage("[ASbinder] {EBEBEB}"..text,0xff6633)
    end
end
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then
    return end
    while not isSampAvailable() do
        wait(200)
    end
    local checking = libcheck()
    while not checking do
        wait(200)
    end
    if not checkServer(select(1, sampGetCurrentServerAddress())) then
        ASHelperMessage('Скрипт работает только на серверах Arizona RP. Скрипт выгружен.')
        thisScript():unload()
    end
    ASHelperMessage('ASBinder V.'..thisScript().version..' Скрипт загружен.')
    ASHelperMessage("Введите /asb чтобы открыть настройки.")
    sampRegisterChatCommand('asb', function()
        ASHelperMessage("ТЕСТ.")
    end)
end
function checkServer(ip)
    for k, v in pairs({
        '185.169.134.3',
        '185.169.134.4',
        '185.169.134.43',
        '185.169.134.44',
        '185.169.134.45',
        '185.169.134.5',
        '185.169.134.59',
        '185.169.134.61',
        '185.169.134.107',
        '185.169.134.109',
        '185.169.134.166',
        '185.169.134.171',
        '185.169.134.172',
        '185.169.134.173',
        '185.169.134.174'}) do
        if v == ip then
            return true
        end
    end
    return false
end
function join_rgb(rr, gg, bb)
    return bit.bor(bit.bor(bb, bit.lshift(gg, 8)), bit.lshift(rr, 16))
end
function onQuitGame()
    inicfg.save(mainIni, 'ASBinder.ini')
end
function onScriptTerminate(script, quitGame)
    if script == thisScript() then
        if not sampIsDialogActive() then
            showCursor(false, false)
        end
        inicfg.save(mainIni, 'ASBinder.ini')
        sampShowDialog(1313, "{ff6633}[ASBinder]{ffffff} Скрипт был выгружен сам по себе.", [[
{ffffff}                                                                             Что делать в таких случаях?{f51111}

Если вы самостоятельно перезагрузили скрипт, то можете закрыть это диалоговое окно.
В ином случае, для начала попытайтесь восстановить работу скрипта сочетанием клавиш CTRL + R.
Если же это не помогло, то читайте следующие пункты.{ff6633}

1. Возможно у вас установлены другие LUA файлы и хелперы, попытайтесь удалить их.

2. Возможно вы не доустановили некоторые дополнения, а именно:
- SAMPFUNCS
- CLEO 4.1+
- MoonLoader 0.26

3. Если данной ошибки не было ранее, попытайтесь сделать следующие действия:
- В папке moonloader > config > Удаляем файл ASBinder.ini

4. Если ничего из вышеперечисленного не исправило ошибку, то следует установить скрипт на другую сборку.

5. Если у вас скрипт вылетает по нажатию на какую-то кнопку, то можете отправить (Nazar1ky#1000) эту ошибку.]], "ОК", nil, 0)
    end
end

function libcheck()
    local function DownloadFile(url, file)
        downloadUrlToFile(url,file,function(id,status)
            if status == dlstatus.STATUSEX_ENDDOWNLOAD then
            end
        end)
        while not doesFileExist(file) do
            wait(1000)
        end
    end
    if not imguicheck then
            sampAddChatMessage(tag .. "Библиотека imgui не найдена... Установим!", -1)
            DownloadFile('https://raw.githubusercontent.com/Nazar1ky/ASHelper/main/imgui.lua', 'moonloader/lib/imgui.lua')
            DownloadFile('https://raw.githubusercontent.com/Nazar1ky/ASHelper/main/MoonImGui.dll', 'moonloader/lib/MoonImGui.dll')
            sampAddChatMessage(tag .. "Библиотека imgui была установлена! Перезапускаю...!", -1)
            thisScript():reload()
            return false
    end
end
а где функция ASHelperMessage?
 

shrug228

Активный
212
77
Есть функция A, в нее передается, как один из параметров функция B. Вопрос: как из функции A вызвать функцию B?
 

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,759
4,893
Есть функция A, в нее передается, как один из параметров функция B. Вопрос: как из функции A вызвать функцию B?
Lua:
function get_users(data, end_work_callback)
    do_some_work(data)
    -- notify callback function after work has been completed
    end_work_callback()
end



--code
function callback()
    print("END WORKING!")
end

get_users(some_data, callback)
--or
get_users(some_data, function() print("END WORKING!") end)
 
  • Нравится
Реакции: shrug228

Pashyka

Участник
220
17
Добрый вечер, был от меня такой вопрос как текст из чата добавить в имгуи, это я понял, но там юзается imgui.Text(), а как сделать чтобы этот текст дублировался в imgui.InputTextMultiline(), то есть хочу сделать чтобы переменная перкзаписывалась в зависимости от того есть ли ещё текст от данного игрока, приведу пример.
Rayan_Broun[1] сказал: Привет
Переменная sobes записала в себя привет, далее
Rayan_Broun[1] сказал: Как дела
Переменная sobes должна записать в себя:
Привет
Как дела
То есть, эти 2 сообщения с новой строки, с одним я понимаю как сделать, а как добавить в переменную ещё текст, да ещё и с новой строки его пихнуть, можно использовать sobes.v:gsub("\n", "&") и Типо Привет&Как дела будет писаться как:
Привет
Как дела

К сути, я не знаю как добавить новое сообщение в переменную, можете как-нибудь нацелить на правильный код, ну или написать пример реализации пожалуйста
 
  • Нравится
Реакции: #Kai-

chapo

tg/inst: @moujeek
Всефорумный модератор
9,236
12,655
Добрый вечер, был от меня такой вопрос как текст из чата добавить в имгуи, это я понял, но там юзается imgui.Text(), а как сделать чтобы этот текст дублировался в imgui.InputTextMultiline(), то есть хочу сделать чтобы переменная перкзаписывалась в зависимости от того есть ли ещё текст от данного игрока, приведу пример.
Rayan_Broun[1] сказал: Привет
Переменная sobes записала в себя привет, далее
Rayan_Broun[1] сказал: Как дела
Переменная sobes должна записать в себя:
Привет
Как дела
То есть, эти 2 сообщения с новой строки, с одним я понимаю как сделать, а как добавить в переменную ещё текст, да ещё и с новой строки его пихнуть, можно использовать sobes.v:gsub("\n", "&") и Типо Привет&Как дела будет писаться как:
Привет
Как дела

К сути, я не знаю как добавить новое сообщение в переменную, можете как-нибудь нацелить на правильный код, ну или написать пример реализации пожалуйста
sobes.v = sobes.v..'\n'..новый текст
 
  • Нравится
Реакции: Pashyka

PanSeek

t.me/dailypanseek
Всефорумный модератор
912
1,801
Как получить X и Y координату текстдрава заканчивающие?
Вот получить координаты X и Y обычные, но это начальные X и Y
Lua:
local x, y = sampTextdrawGetPos(id)
 

chapo

tg/inst: @moujeek
Всефорумный модератор
9,236
12,655
Как получить X и Y координату текстдрава заканчивающие?
Вот получить координаты X и Y обычные, но это начальные X и Y
Lua:
local x, y = sampTextdrawGetPos(id)
так пробовал?

Lua:
function getFinishTextdrawPosX(id)
    local x, y = sampTextdrawGetPos(id)
    local letSizeX, letSizeY, color = sampTextdrawGetLetterSizeAndColor(id)
    local text = sampTextdrawGetString(id)
    return x + letSizeX * text:len()
end
Lua:
select(1, sampTextdrawGetPos(id)) + select(1, sampTextdrawGetLetterSizeAndColor(id)) * string.len(sampTextdrawGetString(id))
 
Последнее редактирование:

PanSeek

t.me/dailypanseek
Всефорумный модератор
912
1,801
так пробовал?

Lua:
function getFinishTextdrawPosX(id)
    local x, y = sampTextdrawGetPos(id)
    local letSizeX, letSizeY, color = sampTextdrawGetLetterSizeAndColor(id)
    local text = sampTextdrawGetString(id)
    return x + letSizeX * text:len()
end
Нет. Но не помогло. Мне нужно без считывания текста.
 
  • Грустно
Реакции: chapo