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

Tornamic

Новичок
14
4
помогите перевести функцию на lua

C++:
0x5E01C0 - RwV3d *__thiscall CPed__getBonePositionWithOffset(RwV3d *vOffset, int iBoneID, bool bIncludeAnim)
 
Lua:
function main()
    repeat wait(0) until isSampAvailable()
    while true do wait(0)
        if wasKeyPressed(VK_L) then
            sampSendChat("команда")
        end
    end
end
Слушай, написал обычный бинд на lua закинул в moonloader захожу в игру 1-4 фпс (crmp) удаляю скрипт с игры сразу 200 фпс

Код чётко написан
Слушай, написал обычный бинд на lua закинул в moonloader захожу в игру 1-4 фпс (crmp) удаляю скрипт с игры сразу 200 фпс
require("lib.moonloader") local list = { [VK_L] = "/lock", [VK_1] = "/usemed", [VK_2] = "/armour", [VK_G] = "/open" } function main () while not isSampAvailable() do wait (0) end sampAddChatMessage("[Binder]Скрипт Загружен!", 0xFFff255) while true do wait(0) for key, text in pairs(list) do if wasKeyPressed(key) and not sampIsCursorActive() then sampSendChat(text) end end end end
 

Дядя Энрик.

Активный
319
75
Слушай, написал обычный бинд на lua закинул в moonloader захожу в игру 1-4 фпс (crmp) удаляю скрипт с игры сразу 200 фпс

Код чётко написан

require("lib.moonloader") local list = { [VK_L] = "/lock", [VK_1] = "/usemed", [VK_2] = "/armour", [VK_G] = "/open" } function main () while not isSampAvailable() do wait (0) end sampAddChatMessage("[Binder]Скрипт Загружен!", 0xFFff255) while true do wait(0) for key, text in pairs(list) do if wasKeyPressed(key) and not sampIsCursorActive() then sampSendChat(text) end end end end
Lua:
local list = {
    {key = 0x4C, command = "/lock"},
    {key = 0x31, command = "/usemed"},
    {key = 0x32, command = "/armour"},
    {key = 0x47, command = "/open"},
}
function main()
    repeat wait(0) until isSampAvailable()
    while true do wait(0)
        for i = 1, #list do
            if wasKeyPressed(list[i].key) then
                sampAddChatMessage(list[i].command, -1)
            end
        end
    end
end
проверяй. sampSendChat только поставь вместо sampAddChatMessage
 

.caterpillarteal$

Участник
24
6
помогите перевести функцию на lua

C++:
0x5E01C0 - RwV3d *__thiscall CPed__getBonePositionWithOffset(RwV3d *vOffset, int iBoneID, bool bIncludeAnim)
lua: function CPed__getBonePositionWithOffset(vOffset, iBoneID, bIncludeAnim)
-- здесь должна быть реализация функции end
 

UBP

Известный
330
169
помогите перевести функцию на lua

C++:
0x5E01C0 - RwV3d *__thiscall CPed__getBonePositionWithOffset(RwV3d *vOffset, int iBoneID, bool bIncludeAnim)
Lua:
local ffi = require 'ffi'

ffi.cdef[[
typedef struct {
    float x, y, z;
} RwV3d;

typedef struct CPed CPed;
RwV3d* CPed__getBonePositionWithOffset(CPed* self, RwV3d* vOffset, int iBoneID, bool bIncludeAnim);
]]

local function getBonePositionWithOffset(ped, offset, boneId, includeAnim)
    local pedPtr = ffi.cast('CPed*', ped)
    local offsetVec = ffi.new('RwV3d', {x = offset.x, y = offset.y, z = offset.z})
    local resultVec = ffi.new('RwV3d[1]')
    
    ffi.C.CPed__getBonePositionWithOffset(pedPtr, resultVec, boneId, includeAnim)
    
    return {
        x = resultVec[0].x,
        y = resultVec[0].y,
        z = resultVec[0].z
    }
end

-- Пример использования
local pedAddress = 0x5E01C0 -- Это пример, замени на реальный адрес педа
local offset = {x = 0.0, y = 0.0, z = 0.0} -- Смещение
local boneId = 1 -- ID кости
local includeAnim = true -- Учитывать анимацию

local bonePosition = getBonePositionWithOffset(pedAddress, offset, boneId, includeAnim)
print(string.format("Координаты кости: x=%f, y=%f, z=%f", bonePosition.x, bonePosition.y, bonePosition.z))

Пытаюсь округлить кнопку(mimgui) ну чета не работает attempt to call field 'PushStyleVar' (a nil value)
PushStyleVarFloat
 
Последнее редактирование:
  • Влюблен
Реакции: Tornamic
Lua:
local list = {
    {key = 0x4C, command = "/lock"},
    {key = 0x31, command = "/usemed"},
    {key = 0x32, command = "/armour"},
    {key = 0x47, command = "/open"},
}
function main()
    repeat wait(0) until isSampAvailable()
    while true do wait(0)
        for i = 1, #list do
            if wasKeyPressed(list[i].key) then
                sampAddChatMessage(list[i].command, -1)
            end
        end
    end
end
проверяй. sampSendChat только поставь вместо sampAddChatMessage
Тогда же будет в чат писать только для меня, не?
 
  • Эм
Реакции: Дядя Энрик.

UBP

Известный
330
169
Тогда же будет в чат писать только для меня, не?
Lua:
local list = {
    {key = 0x4C, command = "/lock"},
    {key = 0x31, command = "/usemed"},
    {key = 0x32, command = "/armour"},
    {key = 0x47, command = "/open"},
}

function main()
    repeat wait(0) until isSampAvailable()
    while true do
        wait(0) -- Эффективнее поместить wait в начало цикла
        for _, item in ipairs(list) do -- Использование ipairs для итерации по массиву
            if wasKeyPressed(item.key) then
                sampSendChat(item.command) -- Отправка команды в чат
            end
        end
    end
end
 

Tornamic

Новичок
14
4
Lua:
local ffi = require 'ffi'

ffi.cdef[[
typedef struct {
    float x, y, z;
} RwV3d;

typedef struct CPed CPed;
RwV3d* CPed__getBonePositionWithOffset(CPed* self, RwV3d* vOffset, int iBoneID, bool bIncludeAnim);
]]

local function getBonePositionWithOffset(ped, offset, boneId, includeAnim)
    local pedPtr = ffi.cast('CPed*', ped)
    local offsetVec = ffi.new('RwV3d', {x = offset.x, y = offset.y, z = offset.z})
    local resultVec = ffi.new('RwV3d[1]')
   
    ffi.C.CPed__getBonePositionWithOffset(pedPtr, resultVec, boneId, includeAnim)
   
    return {
        x = resultVec[0].x,
        y = resultVec[0].y,
        z = resultVec[0].z
    }
end

-- Пример использования
local pedAddress = 0x5E01C0 -- Это пример, замени на реальный адрес педа
local offset = {x = 0.0, y = 0.0, z = 0.0} -- Смещение
local boneId = 1 -- ID кости
local includeAnim = true -- Учитывать анимацию

local bonePosition = getBonePositionWithOffset(pedAddress, offset, boneId, includeAnim)
print(string.format("Координаты кости: x=%f, y=%f, z=%f", bonePosition.x, bonePosition.y, bonePosition.z))


PushStyleVarFloat
блен, я запутал, по адресу надо вызывать 0x5E01C0
 
Парни как сделать что бы по нажитию одной клавиши сразу нажимались две, пример - Нажал L нажалось и N и Enter (Чтобы тачки на аб ловить биндер)
 

percheklii

Известный
728
267
Парни как сделать что бы по нажитию одной клавиши сразу нажимались две, пример - Нажал L нажалось и N и Enter (Чтобы тачки на аб ловить биндер)
 

UBP

Известный
330
169
Парни как сделать что бы по нажитию одной клавиши сразу нажимались две, пример - Нажал L нажалось и N и Enter (Чтобы тачки на аб ловить биндер)
Lua:
local vkeys = require 'vkeys'

function main()
    while true do
        wait(0)

        if wasKeyPressed(vkeys.VK_L) then -- Проверяем, была ли нажата клавиша L
            -- Эмулируем нажатие клавиши N
            setVirtualKeyDown(vkeys.VK_N, true)
            wait(50) -- небольшая задержка для имитации реального нажатия
            setVirtualKeyDown(vkeys.VK_N, false)
            
            -- Эмулируем нажатие клавиши Enter
            setVirtualKeyDown(vkeys.VK_RETURN, true)
            wait(50) -- небольшая задержка для имитации реального нажатия
            setVirtualKeyDown(vkeys.VK_RETURN, false)
            
            wait(1000) -- задержка перед следующим возможным нажатием, чтобы избежать спама
        end
    end
end
 
Lua:
local vkeys = require 'vkeys'

function main()
    while true do
        wait(0)

        if wasKeyPressed(vkeys.VK_L) then -- Проверяем, была ли нажата клавиша L
            -- Эмулируем нажатие клавиши N
            setVirtualKeyDown(vkeys.VK_N, true)
            wait(50) -- небольшая задержка для имитации реального нажатия
            setVirtualKeyDown(vkeys.VK_N, false)
          
            -- Эмулируем нажатие клавиши Enter
            setVirtualKeyDown(vkeys.VK_RETURN, true)
            wait(50) -- небольшая задержка для имитации реального нажатия
            setVirtualKeyDown(vkeys.VK_RETURN, false)
          
            wait(1000) -- задержка перед следующим возможным нажатием, чтобы избежать спама
        end
    end
end
spasibo broy
local vkeys = require 'vkeys' function main() while true do wait(0) if wasKeyPressed(vkeys.VK_L) and not sampIsCursorActive() then -- Проверяем, была ли нажата клавиша L -- Эмулируем нажатие клавиши N setVirtualKeyDown(vkeys.VK_N, true) wait(50) -- небольшая задержка для имитации реального нажатия setVirtualKeyDown(vkeys.VK_N, false) setVirtualKeyDown(vkeys.VK_RETURN, true) wait(50) -- небольшая задержка для имитации реального нажатия setVirtualKeyDown(vkeys.VK_RETURN, false) wait(1000) -- задержка перед следующим возможным нажатием, чтобы избежать спама end end end
воо должно работать
 
Последнее редактирование: