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

gucci-scripts

Участник
64
10
Lua:
        if selected == 1 then 
        if imgui.Button(u8'Начало езды') then
        imgui.Button(u8'Настроить говорилку')
        imgui.Button(u8'Чай')
        end
        end
Почему при нажатии на "Начать езду" сразу появляется и пропадает
 
Последнее редактирование:

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,891
1,254
Lua:
        if selected == 1 then
        if imgui.Button(u8'Начало езды') then
        imgui.Button(u8'Настроить говорилку')
        imgui.Button(u8'Чай')
        end
        end
Почему при нажатии на "Начать езду" сразу появляется и пропадает
потому что ты так задал условие, у тебя отрисовка кнопок на 1 кадр по нажатию на кнопку
Lua:
        if selected == 1 then
         if imgui.Button(u8'Начало езды') then
          ezda = not ezda
         end
         if ezda then
          imgui.Button(u8'Настроить говорилку')
          imgui.Button(u8'Чай')
         end     
        end
 

Moorich

Потрачен
96
11
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как получать ид ближайшего игрока ко мне? Чтот не нагуглилось
 

Izvinisb

Известный
Проверенный
964
598
Как получать ид ближайшего игрока ко мне? Чтот не нагуглилось
 

gucci-scripts

Участник
64
10
1 ВОПРОС Как сделать
imgui.Text в другом цвете
2 ВОПРОС
sa-mp-482.png
КАК СДЕЛАТЬ ВОТ ТАКОЙ ВОПРОС ВОЗЛЕ ТЕКСТА
 

Lucifer Melton

Активный
164
57
1 ВОПРОС Как сделать
imgui.Text в другом цвете
2 ВОПРОС Посмотреть вложение 52515 КАК СДЕЛАТЬ ВОТ ТАКОЙ ВОПРОС ВОЗЛЕ ТЕКСТА
2:
Lua:
function imgui.TextQuestion(text)
    imgui.TextDisabled("(?)")
    if imgui.IsItemHovered() then
        imgui.BeginTooltip()
        imgui.PushTextWrapPos(450)
        imgui.TextUnformatted(text)
        imgui.PopTextWrapPos()
        imgui.EndTooltip()
    end
end
 

gucci-scripts

Участник
64
10
Можно ли сделать sampSendChat но команду из скрипта
Типо в скрипте есть команда"gucci" как ее вызвать
 

Wili_Soder

Участник
68
4
Здравствуйте.
Такой вопрос: Можно ли для функции нажатия кнопки ( isKeyDown(VK_...) )Использовать кнопки из блока NumPad (Циферный блок справа на клавиатуре)
Если да то как? Если нет то напишите пожалуйста через что можно прописать кнопки этого блока.
Начал изучать не так давно... но имеется большой интерес.
Буду благодарен за помощь.
 

gucci-scripts

Участник
64
10
Lua:
function main()
      sampAddChatMessage("[Taxi Helper] Загружен", 0x0099FF -1)
   sampAddChatMessage("[Taxi Helper] /th [1.0]", 0x0099FF -1)
      sampAddChatMessage("[Taxi Helper] By Gucci", 0x0099FF -1)
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand('th', function() active_menu.v = not active_menu.v end)
    sampRegisterChatCommand("toster", tosterCallBack) -- Регистрируем ДО бесконечного цикла.
        sampRegisterChatCommand("prv", stosterCallBack) -- Регистрируем ДО бесконечного цикла
        sampRegisterChatCommand("edm", sstosterCallBack) -- Регистрируем ДО бесконечного цикла
    while true do wait(0) imgui.Process = active_menu.v end
    while true do
wait(0)
if wasKeyPressed(VK_F2) then
if wasKeyPressed(VK_F2) then
local enabled = sampIsChatInputActive()
sampSetChatInputEnabled(not enabled)
elseif wasKeyPressed(VK_F3) then
sampSendChat("/lock")
elseif wasKeyPressed(VK_NUMPAD3) then
sampSendChat("/me открепив шлем от байка, надел его себе на голову")
elseif wasKeyPressed(VK_NUMPAD2) then
sampSendChat("/me сняв шлем с головы, закрепил его на багажнике байка")
end
end
end
end
Почему нажимаю F3 не че
 

Lucifer Melton

Активный
164
57
Lua:
function main()
      sampAddChatMessage("[Taxi Helper] Загружен", 0x0099FF -1)
   sampAddChatMessage("[Taxi Helper] /th [1.0]", 0x0099FF -1)
      sampAddChatMessage("[Taxi Helper] By Gucci", 0x0099FF -1)
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand('th', function() active_menu.v = not active_menu.v end)
    sampRegisterChatCommand("toster", tosterCallBack) -- Регистрируем ДО бесконечного цикла.
        sampRegisterChatCommand("prv", stosterCallBack) -- Регистрируем ДО бесконечного цикла
        sampRegisterChatCommand("edm", sstosterCallBack) -- Регистрируем ДО бесконечного цикла
    while true do wait(0) imgui.Process = active_menu.v end
    while true do
wait(0)
if wasKeyPressed(VK_F2) then
if wasKeyPressed(VK_F2) then
local enabled = sampIsChatInputActive()
sampSetChatInputEnabled(not enabled)
elseif wasKeyPressed(VK_F3) then
sampSendChat("/lock")
elseif wasKeyPressed(VK_NUMPAD3) then
sampSendChat("/me открепив шлем от байка, надел его себе на голову")
elseif wasKeyPressed(VK_NUMPAD2) then
sampSendChat("/me сняв шлем с головы, закрепил его на багажнике байка")
end
end
end
end
Почему нажимаю F3 не че
сказать почему не работает? Потому что второй бесконечный цикл не запустился, все делай в одном цикле
и лучше использовать виртуальный код клавиш
Lua:
function main()
    while not isSampAvailable() do wait(0) end
    sampAddChatMessage("[Taxi Helper] Загружен", 0x0099FF) -- sampAddChatMessage юзай после проверки запуска samp и тут не нужно ставить -1 если поставил цвета, -1 это белый цвет
    sampAddChatMessage("[Taxi Helper] /th [1.0]", 0x0099FF)
    sampAddChatMessage("[Taxi Helper] By Gucci", 0x0099FF)
    sampRegisterChatCommand('th', function() active_menu.v = not active_menu.v end)
    sampRegisterChatCommand("toster", tosterCallBack) -- Регистрируем ДО бесконечного цикла.
    sampRegisterChatCommand("prv", stosterCallBack) -- Регистрируем ДО бесконечного цикла
    sampRegisterChatCommand("edm", sstosterCallBack) -- Регистрируем ДО бесконечного цикла
    while true do
        wait(0)
        imgui.Process = active_menu.v
        if wasKeyPressed(VK_F2) then
            sampSetChatInputEnabled(false)
        elseif wasKeyPressed(VK_F3) then
            sampSendChat("/lock")
        elseif wasKeyPressed(VK_NUMPAD3) then
            sampSendChat("/me открепив шлем от байка, надел его себе на голову")
        elseif wasKeyPressed(VK_NUMPAD2) then
            sampSendChat("/me сняв шлем с головы, закрепил его на багажнике байка")
        end
    end
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Как получать ид ближайшего игрока ко мне? Чтот не нагуглилось
код получил отсюда https://www.blast.hk/threads/13380/post-283168, но изменил немного
Lua:
function getClosestPlayerId()
    local minDist, id = 9999, -1
    for i = 0, sampGetPlayerCount(false) do
        if sampIsPlayerConnected(i) then
            local res, char = sampGetCharHandleBySampPlayerId(i)
            if res then
                local x, y, z = getCharCoordinates(char)
                local dist = getDistanceBetweenCoords3d(x, y, z, getCharCoordinates(playerPed))
                if dist <= minDist then
                    minDist, id = dist, i
                end
            end
        end
    end
    return id
end
 
Последнее редактирование:

RiTwin

Новичок
20
11
Здравствуйте.
Такой вопрос: Можно ли для функции нажатия кнопки ( isKeyDown(VK_...) )Использовать кнопки из блока NumPad (Циферный блок справа на клавиатуре)
Если да то как? Если нет то напишите пожалуйста через что можно прописать кнопки этого блока.
Начал изучать не так давно... но имеется большой интерес.
Буду благодарен за помощь.
Lua:
require "lib.moonloader"
 
function main()
  while true do
    wait(10)
    if isKeyDown(VK_NUMPAD6) then print('Клавиша нажата!') end
  end
end

Lua:
    [k.VK_NUMPAD0] = 'Numpad 0',
    [k.VK_NUMPAD1] = 'Numpad 1',
    [k.VK_NUMPAD2] = 'Numpad 2',
    [k.VK_NUMPAD3] = 'Numpad 3',
    [k.VK_NUMPAD4] = 'Numpad 4',
    [k.VK_NUMPAD5] = 'Numpad 5',
    [k.VK_NUMPAD6] = 'Numpad 6',
    [k.VK_NUMPAD7] = 'Numpad 7',
    [k.VK_NUMPAD8] = 'Numpad 8',
    [k.VK_NUMPAD9] = 'Numpad 9',
    [k.VK_MULTIPLY] = 'Numpad *',
    [k.VK_ADD] = 'Numpad +',
    [k.VK_SUBTRACT] = 'Num -',
    [k.VK_DECIMAL] = 'Numpad .',
    [k.VK_DIVIDE] = 'Numpad /',
 
  • Нравится
Реакции: Wili_Soder