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

suumer

Участник
31
0
Как сделать следующую проверку в диалоге7

если введено число больше 600 или число меньше 100, то
...
все
 

Yuriy Code

Известный
753
928
Как сделать следующую проверку в диалоге7

если введено число больше 600 или число меньше 100, то
...
все
Если используешь sampShowDialog,
то в бесконечном цикле
Lua:
result, button, list, input = sampHasDialogRespond(тут ID диалога)
input = tonumber(input)
if input < 100 or input > 600 then
-- тут свой код
end
Но ещё надо сделать проверку, что юзер введёт цифры.
Проверить можно так:
Lua:
result, button, list, input = sampHasDialogRespond(тут ID диалога)
if tonumber(input) then
input = tonumber(input)
if input < 100 or input > 600 then
-- тут свой код
end
end

Если помог, оцени лайком пожалуйста :)
 
  • Нравится
Реакции: suumer

suumer

Участник
31
0
Как добавить такую штуку?

1621786738415.png
 

Sedoj

Участник
56
1
Lua:
if text:match("%[FA%] .+ Family .+: .+") then
    color = argb_to_rgba(join_argb(211, colors.fam.r, colors.fam.g, colors.fam.b))
    return {color, text}
end
Есть такой код, помогите написать text:match, чтобы цвет менял ник: Jon_Tayler

{E69A00}[A] Администратор Jon_Tayler [39]: {E6C600}Ну вот..
 

BARRY BRADLEY

Известный
711
177
Может кто то продемонстрировать нормальную загрузку картинки на обработчик PHP, передать картинку нужно в image=ТУТ_КАРТИНКА, нужно передавать уже в base64.
Пробовал передавать io.open(file, 'rb'), а в обработчике делать уже base64_encode, но надо как то без доп. обработчика передать multipart/form-data через effil запрос.

Данная тема не подходит ибо не рабочая тема как не пробовал та и там через измененный copas:
Остальные темы в Гугле тоже не канают.

Загружать буду на imgbb через API:
Код:
"https://api.imgbb.com/1/upload?expiration=600&key=YOUR_CLIENT_API_KEY"
--forma
"image=R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"
 

Sedoj

Участник
56
1
Что не так?

{E69A00}[A] Администратор Tom_Red [49]: {E6C600}Ну вот..

Lua:
if text:match("%[A%] Администратор (%a+_%a+)%[(%d+)%]: (.+)") then
    color = argb_to_rgba(join_argb(211, colors.fam.r, colors.fam.g, colors.fam.b))
    return {color, text}
end
 

Hatiko

Известный
Проверенный
1,513
630
Что не так?

{E69A00}[A] Администратор Tom_Red [49]: {E6C600}Ну вот..

Lua:
if text:match("%[A%] Администратор (%a+_%a+)%[(%d+)%]: (.+)") then
    color = argb_to_rgba(join_argb(211, colors.fam.r, colors.fam.g, colors.fam.b))
    return {color, text}
end
У тебя между ником и ид пробел, либо он лишний, либо ты его не учёл.
 
  • Нравится
Реакции: Sedoj

Corrygаn

Участник
225
6
Пытался сделать 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

И выходит вот такой прикол
1621849694134.png
 

kawada

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

Fott

Простреленный
3,462
2,379
Привет, мб знает кто, знает как изменить цвет прицела при наведении на игрока?
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

Известный
701
518
Пытался сделать 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 - нормально всё встаёт
 
Последнее редактирование: