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

CaJlaT

Овощ
Модератор
2,805
2,606
ну блин у меня был тот сайт, но потерял, зная себя я потерять буду, или понадобится на другой компютер и не найду, лучше просто знать имя форматирования)
ну так просто обычный RGBA дели на 255, я же написал выше формулу
Это RGBA/255 (R/255, G/255, B/255, A/255)
🤨
 
  • Нравится
Реакции: copypaste_scripter

de_clain

Активный
208
47
Как получить позицию и размер диалога? типо вывести в чат как минимум
 

TWP

Участник
53
1
Здравствуйте народ, нужна Ваша помощь.
Цель: Нужно чтобы при нажятии кнопки на мини-карте ставились красные метки ( тип гоночные ), одновременно на нескольких машинах одного id в зоне прорисовки.

Пытался использовать данный метод, работал не совсем корректно, на некоторых машинах метка стояла а на других то появлялась то пропадала, зависило от моего растояния и положении камеры.

Вопрос: Какую функцию и как правильно ее использовать для того что-бы на мини-карте ставились метки на нужные машины в зоне прорисовки, вне зависимости от того как я от них далегко и в какую сторону я смотрю.
 

copypaste_scripter

Известный
1,218
223
ну так просто обычный RGBA дели на 255, я же написал выше формулу

🤨
у всего есть имя же, вот только нашел такое, но думаю есть и другое имя

edit: нет ну вы поймите уже, на другое устройство сяду - откуда вспомню где я нашел тот сайт, надо же как то погуглить -_-
 
Последнее редактирование:
  • Эм
Реакции: ARMOR

XRLM

Известный
2,539
854
как отправлять синхру прицеливания на какие то корды

Посмотреть вложение 188161
через угол поворота
актуально.
и мне над не через эту функу https://www.blast.hk/threads/13380/page-22#post-925354

как запретить другому скрипту отправлять рпс серверу? хочу хукнуть отправку рпс, но скрипт не видит отправки, потому что другой отправляет
 
Последнее редактирование:
  • Клоун
Реакции: Air_Official

xoris82

Новичок
23
1
Lua:
-- юзай это так --
-- sendEmptyPacket(PACKET_CONNECTION_LOST) --
-- closeConnect() --

function sendEmptyPacket(id)
    local bs = raknetNewBitStream()
    raknetBitStreamWriteInt8(bs, id)
    raknetSendBitStream(bs)
    raknetDeleteBitStream(bs)
end

function closeConnect()
    local bs = raknetNewBitStream()
    raknetEmulPacketReceiveBitStream(PACKET_DISCONNECTION_NOTIFICATION, bs)
    raknetDeleteBitStream(bs)
end

How to send this packets to another player and make them kicked ?
 
  • Ха-ха
Реакции: XRLM

xaviero travieso

Новичок
8
0
как сделать чтоб при виде надписи прожимался сразу же альт?
VfV4E.png
 

XRLM

Известный
2,539
854
Lua:
-- юзай это так --
-- sendEmptyPacket(PACKET_CONNECTION_LOST) --
-- closeConnect() --

function sendEmptyPacket(id)
    local bs = raknetNewBitStream()
    raknetBitStreamWriteInt8(bs, id)
    raknetSendBitStream(bs)
    raknetDeleteBitStream(bs)
end

function closeConnect()
    local bs = raknetNewBitStream()
    raknetEmulPacketReceiveBitStream(PACKET_DISCONNECTION_NOTIFICATION, bs)
    raknetDeleteBitStream(bs)
end

How to send this packets to another player and make them kicked ?
no way
 
  • Клоун
Реакции: Air_Official

sdfy

Известный
349
230
как запретить другому скрипту отправлять рпс серверу? хочу хукнуть отправку рпс, но скрипт не видит отправки, потому что другой отправляет
загружай свой скрипт раньше того
поставь в названии !! или чет тип такого
 

XRLM

Известный
2,539
854
Последнее редактирование:
  • Клоун
Реакции: Air_Official

copypaste_scripter

Известный
1,218
223
Описание: легальная посадка в транспорт, с анимацией. Хз чё по задержке, поставил 5000 мс.
Lua:
function legalCarEnter(carHandle_)
    if doesVehicleExist(carHandle_) then -- Проверяем существует ли транспорт
        local bRes, vehicleId = sampGetVehicleIdByCarHandle(carHandle_); -- Получаем SAMP ID транспорта
        if bRes then -- Если удалось получить
            sampSendEnterVehicle(vehicleId, false); -- Отправляем синхру посадки в транспорт
            taskEnterCarAsDriver(PLAYER_PED, carHandle_, 5000); -- Включаем анимацию посадки
        end
    end
end
Пример использования:
Lua:
legalCarEnter(ХЕНЛД_КАРА);
я вот сделал такое
Lua:
require "lib.moonloader"

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    
    sampRegisterChatCommand("enter", function()
        legalCarEnter()
    end)
    
    while true do
        wait(0)

    end
end

function legalCarEnter(carHandle_)
    if doesVehicleExist(carHandle_) then -- Проверяем существует ли транспорт
        local bRes, vehicleId = sampGetVehicleIdByCarHandle(); -- Получаем SAMP ID транспорта
        if bRes then -- Если удалось получить
            sampAddChatMessage("found car " .. bRes, -1)
            sampSendEnterVehicle(vehicleId, false); -- Отправляем синхру посадки в транспорт
            taskEnterCarAsDriver(PLAYER_PED, carHandle_, 1000); -- Включаем анимацию посадки
        end
    end
end

но нет реакции, что делать?
 

CaJlaT

Овощ
Модератор
2,805
2,606
Здрасьте, как сделать такое?
Посмотреть вложение 189679

Добавить изображение в правый угол, и чтоб при на нажатии на него запустить менюшку маленькую
Иконки
Картинка
Для картинки используй
C++:
IMGUI_API bool          ImageButton(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0,0),  const ImVec2& uv1 = ImVec2(1,1), int frame_padding = -1, const ImVec4& bg_col = ImVec4(0,0,0,0), const ImVec4& tint_col = ImVec4(1,1,1,1));    // <0 frame_padding uses default frame padding settings. 0 for no padding

я вот сделал такое
Lua:
require "lib.moonloader"

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
   
    sampRegisterChatCommand("enter", function()
        legalCarEnter()
    end)
   
    while true do
        wait(0)

    end
end

function legalCarEnter(carHandle_)
    if doesVehicleExist(carHandle_) then -- Проверяем существует ли транспорт
        local bRes, vehicleId = sampGetVehicleIdByCarHandle(); -- Получаем SAMP ID транспорта
        if bRes then -- Если удалось получить
            sampAddChatMessage("found car " .. bRes, -1)
            sampSendEnterVehicle(vehicleId, false); -- Отправляем синхру посадки в транспорт
            taskEnterCarAsDriver(PLAYER_PED, carHandle_, 1000); -- Включаем анимацию посадки
        end
    end
end

но нет реакции, что делать?
Ты не передаёшь хендл в функцию. Я уже отвечал на подобный вопрос

я вот сделал такое
Lua:
require "lib.moonloader"

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
   
    sampRegisterChatCommand("enter", function()
        legalCarEnter()
    end)
   
    while true do
        wait(0)

    end
end

function legalCarEnter(carHandle_)
    if doesVehicleExist(carHandle_) then -- Проверяем существует ли транспорт
        local bRes, vehicleId = sampGetVehicleIdByCarHandle(); -- Получаем SAMP ID транспорта
        if bRes then -- Если удалось получить
            sampAddChatMessage("found car " .. bRes, -1)
            sampSendEnterVehicle(vehicleId, false); -- Отправляем синхру посадки в транспорт
            taskEnterCarAsDriver(PLAYER_PED, carHandle_, 1000); -- Включаем анимацию посадки
        end
    end
end

но нет реакции, что делать?
Ты не передаёшь хендл в функцию. Я уже отвечал на подобный вопрос
 
  • Нравится
Реакции: copypaste_scripter

copypaste_scripter

Известный
1,218
223
1676204439000.png

как такое рисовать?

на 42 линии вроде та функция, но игра крашится
Lua:
require "lib.moonloader"
local keys = require "vkeys"
local imgui = require "imgui"
local encoding = require "encoding"
encoding.default = "CP1251"
u8 = encoding.UTF8

local main_window_state = imgui.ImBool(false)
local text_buffer = imgui.ImBuffer(256)

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    
    sampRegisterChatCommand("imgui", cmd_imgui)
    
    imgui.Process = false
    
    while true do
        wait(0)

        if main_window_state.v == false then
            imgui.Process = false
        end
        
    end
end

function cmd_imgui(arg)
    main_window_state.v = not main_window_state.v
    imgui.Process = main_window_state.v
end

function imgui.OnDrawFrame()

    imgui.SetNextWindowSize(imgui.ImVec2(500,300), imgui.Cond.FirstUseEver)
    imgui.SetNextWindowPos(imgui.ImVec2(950,500), imgui.Cond.FirstUseEver, imgui.ImVec2(1,1))

    imgui.Begin(u8"привет Start imgui", main_window_state)
    imgui.InputText(u8"пишем текст здесь", text_buffer)
    imgui.Text(text_buffer.v)
    --imgui.ColorEdit()
    imgui.Text("hello there")
    if imgui.Button(u8"жмякай") then
        sampAddChatMessage("buttton clicked", -1)
    end
    imgui.End()
end