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

NoName_001

Участник
152
21
перечислите, пожалуйста, все гайды БХ(и других сайтов, возможно) по samp.lua(samp events) Благорад0чка заранее <3.
 

ya nator

Участник
32
2
Lua:
imgui.PushItemWidth(140)
    --один или несколько элементов
imgui.PopItemWidth()
Погоди, что-то не работает, что не так?
Lua:
imgui.BeginChild(u8'first', imgui.ImVec2(300, 245), true)
            imgui.PushItemWidth(80)
                imgui.Columns(2, 'Columns', true)
                    for i=1, 50 do
                        if imgui.Selectable(u8'Слот №'..i,false, imgui.ImVec2(imgui.CalcTextSize(u8'Слот №'..i).x, imgui.CalcTextSize(u8'Слот №'..i).y)) then
                            z = i
                            editingWindow = true
                        end
                    end
            imgui.PopItemWidth()
            imgui.NextColumn()
                for i=1, 50 do
                    if servers[i] then
                        imgui.Text(servers[i]['ip'])
                    else
                        imgui.Text(u8'Свободен')
                    end
                end
            imgui.EndChild()

-------------------------------------------------------

И ещё вопрос; как рисовать вертикальную полоску по типу imgui.Separator()
 
Последнее редактирование:

ya nator

Участник
32
2
Проблема состоит в том что какая бы высота не была в /dl Т.С в котором я нахожусь, всегда возвращает "Минимальная", пусть высота и будет больше 350. Даже 650.

Lua:
registerVariable('height', 'Возвращает текующую высоту машыни', function()
    local height = getGroundZFor3dCoord(getCharCoordinates(PLAYER_PED))
    if height <= 350 then
        return "Минимальная"
    elseif height <= 450 then
        return "Ниже средней"
    elseif height <= 550 then
        return "Средняя"
    elseif height <= 650 then
        return "Выше среднее"
    else
        return "Максимальная"
    end
end)
Попробуй
Lua:
    local height = getGroundZFor3dCoord(getCharCoordinates(PLAYER_PED))
    if height <= 350 then
        return "Минимальная"
    elseif height <= 450 and height >=351 then
        return "Ниже средней"
    elseif height <= 550 and height >= 451 then
        return "Средняя"
    elseif height <= 650 and height >= 551 then
        return "Выше среднее"
    else
        return "Максимальная"
    end
Дело в том, что скрипт делает проверки по порядку и если первая выдаёт true - дальше не идёт проверятся.
 

VyacheslavUA

Новичок
7
0
Попробуй
Lua:
    local height = getGroundZFor3dCoord(getCharCoordinates(PLAYER_PED))
    if height <= 350 then
        return "Минимальная"
    elseif height <= 450 and height >=351 then
        return "Ниже средней"
    elseif height <= 550 and height >= 451 then
        return "Средняя"
    elseif height <= 650 and height >= 551 then
        return "Выше среднее"
    else
        return "Максимальная"
    end
Дело в том, что скрипт делает проверки по порядку и если первая выдаёт true - дальше не идёт проверятся.
Не помогло, по прежнему возвращает "Минимальная"
Возможно сщитивает не то что нужно?
висота.jpg

Может вместо того что бы считать cPos считивает sPos. Если да то я хз как пофикстить.
 

sep

Известный
681
77
кто может подскажите как эт осделать на 026
видно она на 027 сделано
ПРОШУ РАСКАЗАТЬ ПОДРОБНЕЕ Я НОВЕЧЕК
код:
local wantedLevel = memory.getuint8(0x58DB60)

if wantedLevel > 0 then

local x_distance = res_x / 250

for i = 1, wantedLevel do

if wantedLevel > 6 or not set.show.stars then break end

renderDrawTexture(stars_render, set.Position.posX + x_distance, y_start_pos, res_x / 100, res_x / 100, 0, set.colors.stars)

x_distance = x_distance + res_x / 65

end

end
 

Rei

Известный
Друг
1,616
1,674
кто может подскажите как эт осделать на 026
видно она на 027 сделано
ПРОШУ РАСКАЗАТЬ ПОДРОБНЕЕ Я НОВЕЧЕК
код:
local wantedLevel = memory.getuint8(0x58DB60)

if wantedLevel > 0 then

local x_distance = res_x / 250

for i = 1, wantedLevel do

if wantedLevel > 6 or not set.show.stars then break end

renderDrawTexture(stars_render, set.Position.posX + x_distance, y_start_pos, res_x / 100, res_x / 100, 0, set.colors.stars)

x_distance = x_distance + res_x / 65

end

end
какой из двух функций нет в 026?
 

BetDonneR

Новичок
11
0
Я научился вылавливать циферки из чата, но фиксированное количество, а как нибудь можно узнавать Id в неопределённом количестве? От слова любого слова до ввода команды.
 

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,920
1,292
Я научился вылавливать циферки из чата, но фиксированное количество, а как нибудь можно узнавать Id в неопределённом количестве? От слова любого слова до ввода команды.
Используй регулярные выражения, если тебе нужно достать любое число: n = text:match("(%d+)")
 

samartinell1

Участник
98
14
если можно, подскажите вкратце и в порядке, чтобы понять алгоритм, как можно сделать чекер на ЧС, который бы черпал инфу с форума проекта?
Вот чтобы прямо оттуда, а не через регулярное обновление файлика с ЧС, который бы скачивался каждый раз и который нужно было бы вручную обновлять на хосте
Я научился вылавливать циферки из чата, но фиксированное количество, а как нибудь можно узнавать Id в неопределённом количестве? От слова любого слова до ввода команды.
вот тебе сайтик, прочитай разок, думаю разберёшься http://bot4sale.ru/blog-menu/qlua/265-lua-patterns.html
 
Последнее редактирование:

sep

Известный
681
77
какой из двух функций нет в 026?
незнаю что не не так делаю вот скрипт плиз помогите
если я захажу на акк где есть звезды скрипт не пашет (Script died due to an error. (0AFA939C)) = это ошибка говарит что трубуется версия 027
на акке где нет звезд пашет мож я не так вставил что я новечек помогите
(скрипт не мой я переделываю автор dolgorukov )
(надо чтобы работало на 026)
 

Вложения

  • miniHud.lua
    10.9 KB · Просмотры: 7
Последнее редактирование:

HpP

Известный
368
119
Привет всем, вопрос таков, как сделать так, чтобы имгуй открывался и были пункты по-типу "настройки", "биндер" и прочее. (Такое реализовано в том же MVDHelper). То есть, выбираешь "Настройки" --> открывается меню со всеми настройками.
 

Dmitriy Makarov

25.05.2021
Проверенный
2,505
1,134
Привет всем, вопрос таков, как сделать так, чтобы имгуй открывался и были пункты по-типу "настройки", "биндер" и прочее. (Такое реализовано в том же MVDHelper). То есть, выбираешь "Настройки" --> открывается меню со всеми настройками.
Lua:
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
-- То, что сверху добавляешь в начало кода, если у тебя их нету.
-- Они нужны для того, чтобы в ImGui выводился русский текст, иначе будет так "???????"
-- Пример с imgui.Text, как это использовать, будет ниже



-- function imgui.OnDrawFrame
-- После imgui.Begin
imgui.BeginChild("child", imgui.ImVec2(130, 300), true)
if imgui.Button(u8"Основное", imgui.ImVec2(-1, 25)) then menu = 1 end
if imgui.Button(u8"Биндер", imgui.ImVec2(-1, 25)) then menu = 2 end
if imgui.Button(u8"О скрипте", imgui.ImVec2(-1, 25)) then menu = 3 end
if imgui.Button(u8"Автор", imgui.ImVec2(-1, 25)) then menu = 4 end
imgui.EndChild()
imgui.SameLine()
if menu == 1 then
    imgui.BeginChild("main", imgui.ImVec2(200, 100), true)
    imgui.Text(u8"Тут твои основные настройки")
    imgui.EndChild()
end
imgui.SameLine()
if menu == 2 then
    imgui.BeginChild("binder", imgui.ImVec2(200, 100), true)
    imgui.Text(u8"Тут твои биндеры")
    imgui.EndChild()
end
imgui.SameLine()
if menu == 3 then
    imgui.BeginChild("info", imgui.ImVec2(200, 100), true)
    imgui.Text(u8"Тут информация о скрипте")
    imgui.EndChild()
end
imgui.SameLine()
if menu == 4 then
    imgui.BeginChild("autrho", imgui.ImVec2(200, 100), true)
    imgui.Text(u8"Информация об авторе")
    imgui.EndChild()
end
Результат:
основное.png

биндер.png

о скрипте.png

автор.png
С размерами поиграй только
 
  • Нравится
Реакции: sep и HpP