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

un1qe

Участник
72
40
Привет, мб знает кто, знает как изменить цвет прицела при наведении на игрока?
 

Fott

Простреленный
3,436
2,281
Привет, мб знает кто, знает как изменить цвет прицела при наведении на игрока?
Lua:
function changeCrosshairColor(rgba)
    local r = bit.band(bit.rshift(rgba, 24), 0xFF)
    local g = bit.band(bit.rshift(rgba, 16), 0xFF)
    local b = bit.band(bit.rshift(rgba, 8), 0xFF)
    local a = bit.band(rgba, 0xFF)

    memory.setuint8(0x58E301, r, true)
    memory.setuint8(0x58E3DA, r, true)
    memory.setuint8(0x58E433, r, true)
    memory.setuint8(0x58E47C, r, true)

    memory.setuint8(0x58E2F6, g, true)
    memory.setuint8(0x58E3D1, g, true)
    memory.setuint8(0x58E42A, g, true)
    memory.setuint8(0x58E473, g, true)

    memory.setuint8(0x58E2F1, b, true)
    memory.setuint8(0x58E3C8, b, true)
    memory.setuint8(0x58E425, b, true)
    memory.setuint8(0x58E466, b, true)

    memory.setuint8(0x58E2EC, a, true)
    memory.setuint8(0x58E3BF, a, true)
    memory.setuint8(0x58E420, a, true)
    memory.setuint8(0x58E461, a, true)
end
 

Andrinall

Известный
684
533
Пытался сделать imgui.Selector по этому фиче https://www.blast.hk/threads/13380/post-653069

Lua:
local sw, sh = getScreenResolution()
local menu = {
    u8"Главная",
    u8"Бот для фермы",
    u8"Бот для шахты",
    u8"Другое"
}
local selected_label = imgui.ImInt(0)
local selector_pos = imgui.ImInt(0)

function imgui.OnDrawFrame()
    if farm.v then
        imgui.SetNextWindowSize(imgui.ImVec2(900, 525), imgui.Cond.FirstUseEver)
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.Begin("##1", farm, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse)
        imgui.NewLine()
        imgui.PushFont(ds_font)
        imgui.Text("Farm Bot")
        imgui.PopFont()
        imgui.Separator()
        imgui.Columns(2, "##columns1", true)
        imgui.SetColumnWidth(-1, 225)
        imgui.BeginChild("##child1", imgui.ImVec2(210, 160), true)
            _, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
            nick = sampGetPlayerNickname(id)
            ping = sampGetPlayerPing(id)
            x, y, z = getCharCoordinates(PLAYER_PED)
            imgui.Text(u8"Ваш NickName: " .. nick)
            imgui.Text(u8"Ваш ID: " .. id)
            imgui.Text(u8"Ваш пинг: " .. ping)
            imgui.Text(u8"Ваше местоположение:\nX: " .. math.floor(x) .. "\nY: " .. math.floor(y) .. "\nZ: " .. math.floor(z))
        imgui.EndChild()
        imgui.NewLine()
        imgui.NewLine()
        imgui.Selector(menu, imgui.ImVec2(130, 50), selected_label, selector_pos, 10)
        imgui.NextColumn()
        imgui.BeginChild("##child2", imgui.ImVec2(657, 440), true)
        imgui.EndChild()
        imgui.End()
    end
end

И выходит вот такой приколПосмотреть вложение 98250
Чтоб табличка с ником и т.д. была справа перенеси чилд1 внутрь чилд2. A вот с фиговой позицией селектора я пока не разобрался C:

upd: если убираю newline - нормально всё встаёт
 
Последнее редактирование:

Hatiko

Известный
Проверенный
1,471
612
Опять чет не то?Не робит
Служебные символы надо все экранировать, если необходимо учесть их как обычные символы. Открывающая квадратная скобка, где ID, не экранирована.
%[A%] Администратор %a+_%a+ %[%d+%]: .+
Круглые скобки тут не имеют значения, т.к. ты не получаешь значения по шаблону, а просто ищешь общее совпадение, поэтому их можешь опустить.
 
  • Нравится
Реакции: Sedoj

Sedoj

Участник
56
1
Служебные символы надо все экранировать, если необходимо учесть их как обычные символы. Открывающая квадратная скобка, где ID, не экранирована.
%[A%] Администратор %a+_%a+ %[%d+%]: .+
Круглые скобки тут не имеют значения, т.к. ты не получаешь значения по шаблону, а просто ищешь общее совпадение, поэтому их можешь опустить.
Почему-то поменялся только цвет timestamp (времени), остальное осталось прежним)
 

ARMOR

kjor32 is legend
Модератор
4,847
6,101
Как получить название транспорта в котором сидит пед?
Нашел вот такую функцию:
Но там название выдается только до 7 символов, а этого мало для Инфернуса к примеру.
 

komnatq

Известный
203
90
Как получить название транспорта в котором сидит пед?
Нашел вот такую функцию:
Но там название выдается только до 7 символов, а этого мало для Инфернуса к примеру.
Попробуй функцию написать, которая по 7 символам вернет полное название
 

Hatiko

Известный
Проверенный
1,471
612
Как получить название транспорта в котором сидит пед?
Для получения названия машины лучше использовать таблицу ид модели, полученной функцией getCarModel - название, например так:

Lua:
g.veh = {
    [400] = "Landstalker",
    [401] = "Bravura",
    [402] = "Buffalo"
    -- т.д. сам допишешь или найдёшь готовую.
},

Почему-то поменялся только цвет timestamp (времени), остальное осталось прежним)
Что ты конкретно хочешь. Предоставь точную копию из лога строчку и результат, который ты хочешь получить после сравнения
 

Corrygаn

Участник
225
6
В чём может быть проблема, когда загружаю inicfg?

[ML] (error) Central Market.lua: D:\ARIZONA GAMES\bin\Scripts\moonloader\Central Market.lua:98: stack index 3, expected string, received number: (bad argument into 'void(const classstd::basic_string<char,std::char_traits<char>,std::allocator<char> >&)')
stack traceback:
[C]: in function '__newindex'
D:\ARIZONA GAMES\bin\Scripts\moonloader\Central Market.lua:98: in function 'iniLoad'
D:\ARIZONA GAMES\bin\Scripts\moonloader\Central Market.lua:223: in function <D:\ARIZONA GAMES\bin\Scripts\moonloader\Central Market.lua:215>
[ML] (error) Central Market.lua: Script died due to an error. (59D66484)
 

Corrygаn

Участник
225
6
Есть примеры работ с этой штукой? https://www.blast.hk/threads/13380/post-653069
Пытаюсь сделать менюшку, но она багается, хотя вроде всё по примеру
1621874571707.png
 

Tol4ek

Активный
217
56

Sanchez.

Известный
704
187
В чём может быть проблема, когда загружаю inicfg?

[ML] (error) Central Market.lua: D:\ARIZONA GAMES\bin\Scripts\moonloader\Central Market.lua:98: stack index 3, expected string, received number: (bad argument into 'void(const classstd::basic_string<char,std::char_traits<char>,std::allocator<char> >&)')
stack traceback:
[C]: in function '__newindex'
D:\ARIZONA GAMES\bin\Scripts\moonloader\Central Market.lua:98: in function 'iniLoad'
D:\ARIZONA GAMES\bin\Scripts\moonloader\Central Market.lua:223: in function <D:\ARIZONA GAMES\bin\Scripts\moonloader\Central Market.lua:215>
[ML] (error) Central Market.lua: Script died due to an error. (59D66484)
код дай