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

Setkh

Участник
74
6
Как убрать стандартный бинд сампа?
Допустим как при нажатии на ЛКМ убрать удар и вместо него выводить сообщение?
 

Sakura San

Известный
134
90
Помогите кому не сложно. Скрипт нажимает клавишу home7 при проигрывании анимации посадки в авто. Нужно чтобы эта проверка происходила не по анимации, а по нахождению игрока в авто как водителя.
Код:
require "lib.moonloader"
local keys
local sampev = require "lib.samp.events"

function sampev.onSendExitVehicle(vehicleId)
        setVirtualKeyDown(36, true)
        setVirtualKeyDown(36, false)
end
function sampev.onSendEnterVehicle(vehicleId, passenger)
        setVirtualKeyDown(36, true)
        setVirtualKeyDown(36, false)
end
 

Volgus_King

Активный
155
116
Простой *авно код)
Хелпаните
Нужно привязать проверку 3д текста на координататах + перед ( if text:find('.+(%d+)%.%d+%%') then)
Мозги кипят уже =_=

если текст находится на координатах ( 1640,66 685,43 16,16 )

тут все элементарно но я уже туплю =_=


Lua:
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("sx", shlefowka)


    while true do wait(0)
    if isPlayerPlaying(playerHandle) and enabled then
 -- Жмякает Альт
    for i = 1, 2048 do
        local exist = sampIs3dTextDefined(i)
        if exist then
            local text, color, vx, vy, vz, dist, ignoreWalls, pID, vID = sampGet3dTextInfoById(i)
            if text:find('.+(%d+)%.%d+%%') then
                local num = tonumber(text:match('.+(%d+)%.%d+%%'))
                if num <= 2 then -- если полученное значение = 99, то делаешь что тебе нужно
                                
                                setGameKeyState(21, -256)

                            

                          end
            end
        end
    end
end
end
end



function shlefowka(arg)
    enabled = not enabled
    if enabled then
        sampAddChatMessage(string.format("[%s]: Активирован", thisScript().name), 0x40FF40)
    else
        sampAddChatMessage(string.format("[%s]: Деактивирован", thisScript().name), 0xFF4040)
    end
end
 

Double Tap Inside

Известный
Проверенный
1,916
1,255
Где можно спиздить хороший пример, как через имгуй настраивать пользовательские горячие клавиши? Ну, типо поле, на него тыкаешь, жмешь комбу клавиш, и эта комба сохраняецца/регистрируецца. Как я понял для такого юзают rkeys модуль, а то я уже переживал придецца писать самому такой модуль ХД. Но всё же, дайте пример, шоб я меньше ебался сам.... плез.
 

CaJlaT

07.11.2024 14:55
Модератор
2,833
2,669
Где можно спиздить хороший пример, как через имгуй настраивать пользовательские горячие клавиши? Ну, типо поле, на него тыкаешь, жмешь комбу клавиш, и эта комба сохраняецца/регистрируецца. Как я понял для такого юзают rkeys модуль, а то я уже переживал придецца писать самому такой модуль ХД. Но всё же, дайте пример, шоб я меньше ебался сам.... плез.
Там и пример есть
 
  • Нравится
Реакции: Double Tap Inside

Vespan

Чешский луашер
Проверенный
2,119
1,720
Как сделать так,что бы я писал sampRegisterChatCommand к примеру LSPD и писался id фракции,написал команду с аргументом RM и пишет мне id фракции.
Напишите мне пример как такое сделать
 

Moonlight_Ru

Известный
66
21
Как сделать так,что бы я писал sampRegisterChatCommand к примеру LSPD и писался id фракции,написал команду с аргументом RM и пишет мне id фракции.
Напишите мне пример как такое сделать
Lua:
sampRegisterChatCommand("cmd", cmd)

local fracName = {"LSPD", "SFPD", "LVPD", "Army"}

function cmd(arg)
    arg = getFracIdByName(arg)
    if arg then sampAddChatMessage(string.format("Фракция %s (ID: %d)", fracName[arg], arg), 0xFFFFFF) end
end

function getFracIdByName(name)
    name = string.lower(name) -- Меняет регистр только английских букв
    for i = 1, #fracName do
        if string.find(string.lower(fracName[i]), name) then
            return i
        end
    end
end
Простой *авно код)
Хелпаните
Нужно привязать проверку 3д текста на координатах + перед ( if text:find('.+(%d+)%.%d+%%') then)
Мозги кипят уже =_=

если текст находится на координатах ( 1640,66 685,43 16,16 )

тут все элементарно но я уже туплю =_=

Lua:
while true do
    wait(0)
    if isPlayerPlaying(playerHandle) and enabled then
        for i = 0, 2047 do -- Начинается с 0 ID
            if sampIs3dTextDefined(i) then
                local text, color, vx, vy, vz, dist, ignoreWalls, pID, vID = sampGet3dTextInfoById(i)
                if vx == 13.37 and vy == 22.8 and text:find('.+(%d+)%.%d+%%') then
                    local num = tonumber(text:match('.+(%d+)%.%d+%%'))
                    if num <= 2 then
                        setGameKeyState(21, -256)
                    end
                end
            end
        end
    end
end

Ты описание функции sampGet3dTextInfoById не читал? Да даже если ты просто скопировал чей-то код, по названию переменных ясно, где хранятся координаты. Или я просто тупой и тебя не правильно понял, а теперь бочку гоню?

Спасибо, помог. Если у кого-то тоже с этим проблемы, то вот +- решение
Lua:
local mX, mY = getCursorPos()
sampTextdrawSetPos(1245, mX/1.73, mY/1.73)
Да, костыль... но более менее работает

Вот это должно помочь convertWindowScreenCoordsToGameScreenCoords.
Подскажите пожалуйста, как узнать 3d координаты точки прицеливания, желательно вместе с указателем на объект, в который целишься.
Пробовал танцевать с бубном вокруг функции processLineOfSight(), но получается какой-то говнокод. Должны же где-то в памяти храниться эти данные, они же используются при выстреле.


Всё ещё актуально. Прошу помощи.
 
Последнее редактирование:
  • Нравится
Реакции: Vespan

Volgus_King

Активный
155
116
Lua:
sampRegisterChatCommand("cmd", cmd)

local fracName = {"LSPD", "SFPD", "LVPD", "Army"}

function cmd(arg)
    arg = getFracIdByName(arg)
    if arg then sampAddChatMessage(string.format("Фракция %s (ID: %d)", fracName[arg], arg), 0xFFFFFF) end
end

function getFracIdByName(name)
    name = string.lower(name) -- Меняет регистр только английских букв
    for i = 1, #fracName do
        if string.find(string.lower(fracName[i]), name) then
            return i
        end
    end
end


Ты описание функции sampGet3dTextInfoById не читал? Да даже если ты просто скопировал чей-то код, по названию переменных ясно, где хранятся координаты. Или я просто тупой и тебя не правильно понял, а теперь бочку гоню?




Вот это должно помочь convertWindowScreenCoordsToGameScreenCoords.


Всё ещё актуально. Прошу помощи.

хз если я правильно понял то чекай исходник https://www.blast.hk/threads/19820/
 

Vespan

Чешский луашер
Проверенный
2,119
1,720
Как сделать imgui окно в imgui. Нажал на imgui.Button и появилось новое окно (но не нужно создать заранее local imguiокно = imgui.ImBool и тд)
 

Moonlight_Ru

Известный
66
21
хз если я правильно понял то чекай исходник https://www.blast.hk/threads/19820/

Спасибо, но это совсем не то. Там используется getCharCoordinates(), а эта функция сработает, только если над игроком при прицеливании появляется зелёная метка. У каждого оружия эта метка имеет ограничение по расстоянию, которое, конечно, можно убрать, но всё равно остаётся другая проблема. Если оружие использует режим прицеливания, как снайперская винтовка, то метка над игроком вообще не появляется. А мне это как раз для снайперки нужно, чтобы на очень большом расстоянии видеть ник игрока, не меняя дальность прорисовки неймтегов, и не превращая скрипт в WH.
 

Double Tap Inside

Известный
Проверенный
1,916
1,255
Как убрать эти кнопки из imgui.InputInt() ?

Сним3ок.PNG
 

CaJlaT

07.11.2024 14:55
Модератор
2,833
2,669
Как использовать цикл for в обратном порядке? (от a до b, при том, что a>b)
Пытался так:
Lua:
for i=20,1 do
    print(i)
end
И так:
Lua:
local i = 20
while i<=1 do
    print(i)
    i = i - 1
end
Не сработало
 

Alkamal

Новичок
23
2
Как использовать цикл for в обратном порядке? (от a до b, при том, что a>b)
Пытался так:
Lua:
for i=20,1 do
    print(i)
end
И так:
Lua:
local i = 20
while i<=1 do
    print(i)
    i = i - 1
end
Не сработало
Если не ошибаюсь, по в for после запятой указывается "шаг", если указать -1, то должно заработать
 
  • Нравится
Реакции: CaJlaT

Moonlight_Ru

Известный
66
21
Как использовать цикл for в обратном порядке? (от a до b, при том, что a>b)
Пытался так:
Lua:
for i=20,1 do
    print(i)
end
И так:
Lua:
local i = 20
while i<=1 do
    print(i)
    i = i - 1
end
Не сработало

Вот тебе ссылка на огромную базу знаний про оператор for в lua

Второй вариант не сработал, потому что условие должно быть i >= 1
 
  • Нравится
Реакции: CaJlaT