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

XRLM

Против ветра рождённый
Проверенный
1,507
1,069
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

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

XRLM

Против ветра рождённый
Проверенный
1,507
1,069
загружай свой скрипт раньше того
поставь в названии !! или чет тип такого
не работает, пробовал уже

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

188161
 
Последнее редактирование:
  • Клоун
Реакции: Air_Official

copypaste_scripter

Известный
1,261
235
Описание: легальная посадка в транспорт, с анимацией. Хз чё по задержке, поставил 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

07.11.2024 14:55
Модератор
2,830
2,660
Здрасьте, как сделать такое?
Посмотреть вложение 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,261
235
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
 

Dmitriy Makarov

25.05.2021
Проверенный
2,500
1,131
Посмотреть вложение 189688
как такое рисовать?

на 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
 
  • Нравится
Реакции: copypaste_scripter

Sadow

Известный
1,428
592
Как сделать так чтобы пользователь мог нажать двойную комбинацию клавиш и сработало какое-то действие в библиотеке mimhotkey? Если такое невозможно то есть ли аналоги этой библиотеке?
 

copypaste_scripter

Известный
1,261
235
Как сделать так чтобы пользователь мог нажать двойную комбинацию клавиш и сработало какое-то действие в библиотеке mimhotkey? Если такое невозможно то есть ли аналоги этой библиотеке?
может ты это имел ввиду?

Lua:
if testCheat('asdf') and not sampIsChatInputActive() and not sampIsDialogActive() then
    sampAddChatMessage("you pressed asdf", -1)
end

if isKeyDown(VK_S) and isKeyJustPressed(VK_W) then
    if isCharInAnyCar(PLAYER_PED) then
        sampAddChatMessage("не вперед, не назад, КУДА ЕХАТЬ", -1)
    end
end
 

Sadow

Известный
1,428
592
может ты это имел ввиду?

Lua:
if testCheat('asdf') and not sampIsChatInputActive() and not sampIsDialogActive() then
    sampAddChatMessage("you pressed asdf", -1)
end

if isKeyDown(VK_S) and isKeyJustPressed(VK_W) then
    if isCharInAnyCar(PLAYER_PED) then
        sampAddChatMessage("не вперед, не назад, КУДА ЕХАТЬ", -1)
    end
end
Нет
 

F.Fox

Участник
47
1
Как сделать так, чтобы при отправления самого объявления (evolve сервер), скрипт сам нажимал enter (отправка объявления)?
 

Вложения

  • ad.lua
    9.4 KB · Просмотры: 4