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

ppelledka

Участник
37
2
Ку, кто знает, как сделать так чтобы скрипт нажимал какую то кнопку (альт допустим) на кордах? Но не в бесконечном цикле, я буду через чекбокс делать
 
  • Грустно
Реакции: IlyaHL2

Sierrabozz

Новичок
3
0
раз в какой промежутор и вообще какой из аммо те нужен?
Этот скрипт отправляет запрос на сайт и у всех который этот скрипт передает всем инфу о нем, я не могу найди переменую впринципе, можно как то через эти тексты выписывать в чат рацию /f AMMO LV - min:sec | AMMO SF - min:sec | AMMO LS - min:sec, типо вот так.
 

ewin

Известный
672
376
из-за чего может не работать isKeyJustPressed на клавише "1"?
Lua:
if isKeyJustPressed(ini.binds.button) then
   --func
end   

--INI
[binds]
button=1
 

ewin

Известный
672
376
потому что ты передаешь в функцию 1, а не номер клавиши "1"
Используй VK_1, 49 или 0x31
предполагал, но даже если через vkeys переводить название в номер - все равно не работает, не могу использовать номера, потому что бинд может меняться
 

ARMOR

Я креветка
Модератор
5,068
7,427
предполагал, но даже если через vkeys переводить название в номер - все равно не работает, не могу использовать номера, потому что бинд может меняться
wasKeyPressed пробывал? С isKeyJustPressed бывают проблемы.
 

chapo

tg/inst: @moujeek
Всефорумный модератор
9,235
12,655
предполагал, но даже если через vkeys переводить название в номер - все равно не работает, не могу использовать номера, потому что бинд может меняться
Lua:
isKeyJustPressed(_G['VK_'..ini.binds.button])
-- не забудь подключить lib.moonloader
 
  • Влюблен
  • Нравится
Реакции: ewin и вайега52

Sierrabozz

Новичок
3
0
изображение_2023-01-25_000250420.png

можно как это вывесть на экран и что-бы пошёл ещё таймер на 2 минуты после этого текста.
 

Sadow

Известный
1,412
589
Как узнать на какие кнопки у пользователя настроено сесть в машину? И как сделать так чтобы персонаж пользователя сел в машину?
 

CaJlaT

07.11.2024 14:55
Модератор
2,854
2,727
Как узнать на какие кнопки у пользователя настроено сесть в машину? И как сделать так чтобы персонаж пользователя сел в машину?
всё намного проще, чем ты думаешь...
Lua:
sampSendEnterVehicle(int id, bool passenger) -- отправка пакета серверу
taskEnterCarAsPassenger(Ped ped, Vehicle car, int time, int passengerSeat) -- садимся на пассажирское сидение с анимацией
taskEnterCarAsDriver(Ped ped, Vehicle car, int timeMS) -- то же самое, но на место водителя
Вот готовый вариант посадки на пассажирское место в ближайшую тачку (сядет на первое попавшееся свободное место)
Lua:
function main()
    sampRegisterChatCommand('enter', function()
        local res, handle, dist = GetNearestCarByPed(PLAYER_PED, 200, false) -- Находим ближайшую тачку
        if res then
            local bResult, iID = sampGetVehicleIdByCarHandle(handle)
            for i = 0, getMaximumNumberOfPassengers(handle) do -- Получаем все пассажирские места
                if isCarPassengerSeatFree(handle, i) then -- Если место свободное
                    sampSendEnterVehicle(iID, true) -- Отправляем пакет серверу
                    taskEnterCarAsPassenger(PLAYER_PED, handle, 2, i) -- Воспроизводим анимацию
                    return
                end
            end
        else
            sampAddChatMessage('Ошибка, рядом нет машин', 0xFF0000)
        end
    end)
    wait(-1)
end


function GetNearestCarByPed(HndlPed, radius, minPlayerNear) -- https://www.blast.hk/threads/13380/page-16#post-638465
    if doesCharExist(HndlPed) then
        local tableArr = {}
        local countPlayers = 0
        local posXpl, posYpl = getCharCoordinates(HndlPed)
        for _,car in pairs(getAllVehicles()) do
            if getDriverOfCar(car) ~= HndlPed then
                local posX, posY, posZ = getCarCoordinates(car)
                for _,player in pairs(getAllChars()) do
                    if player ~= HndlPed then
                        local playerid = select(2, sampGetPlayerIdByCharHandle(player))
                        if not sampIsPlayerNpc(playerid) and playerid ~= -1 then
                            local x,y,z = getCharCoordinates(player)
                            if getDistanceBetweenCoords2d(x, y, posX, posY) < 3 then countPlayers = countPlayers + 1 end
                        end
                    end
                end
                local distBetween2d = getDistanceBetweenCoords2d(posXpl, posYpl, posX, posY)
                if minPlayerNear ~= false then
                    if tonumber(minPlayerNear) >= countPlayers then
                        table.insert(tableArr, {distBetween2d, car, posX, posY, posZ, countPlayers})
                    end
                else table.insert(tableArr, {distBetween2d, car, posX, posY, posZ, countPlayers}) end
                countPlayers = 0
            end
        end
        if #tableArr > 0 then
            table.sort(tableArr, function(a, b) return (a[1] < b[1]) end)
            if radius ~= false then
                if tableArr[1][1] <= tonumber(radius) then
                    return true, tableArr[1][2], tableArr[1][1], tableArr[1][3], tableArr[1][4], tableArr[1][5], tableArr[1][6]
                end
            else return true, tableArr[1][2], tableArr[1][1], tableArr[1][3], tableArr[1][4], tableArr[1][5], tableArr[1][6] end
        end
    end
    return false
end
Ну или используй
Но это будет выглядеть как телепорт
 

Sadow

Известный
1,412
589
всё намного проще, чем ты думаешь...
Lua:
sampSendEnterVehicle(int id, bool passenger) -- отправка пакета серверу
taskEnterCarAsPassenger(Ped ped, Vehicle car, int time, int passengerSeat) -- садимся на пассажирское сидение с анимацией
taskEnterCarAsDriver(Ped ped, Vehicle car, int timeMS) -- то же самое, но на место водителя
Вот готовый вариант посадки на пассажирское место в ближайшую тачку (сядет на первое попавшееся свободное место)
Lua:
function main()
    sampRegisterChatCommand('enter', function()
        local res, handle, dist = GetNearestCarByPed(PLAYER_PED, 200, false) -- Находим ближайшую тачку
        if res then
            local bResult, iID = sampGetVehicleIdByCarHandle(handle)
            for i = 0, getMaximumNumberOfPassengers(handle) do -- Получаем все пассажирские места
                if isCarPassengerSeatFree(handle, i) then -- Если место свободное
                    sampSendEnterVehicle(iID, true) -- Отправляем пакет серверу
                    taskEnterCarAsPassenger(PLAYER_PED, handle, 2, i) -- Воспроизводим анимацию
                    return
                end
            end
        else
            sampAddChatMessage('Ошибка, рядом нет машин', 0xFF0000)
        end
    end)
    wait(-1)
end


function GetNearestCarByPed(HndlPed, radius, minPlayerNear) -- https://www.blast.hk/threads/13380/page-16#post-638465
    if doesCharExist(HndlPed) then
        local tableArr = {}
        local countPlayers = 0
        local posXpl, posYpl = getCharCoordinates(HndlPed)
        for _,car in pairs(getAllVehicles()) do
            if getDriverOfCar(car) ~= HndlPed then
                local posX, posY, posZ = getCarCoordinates(car)
                for _,player in pairs(getAllChars()) do
                    if player ~= HndlPed then
                        local playerid = select(2, sampGetPlayerIdByCharHandle(player))
                        if not sampIsPlayerNpc(playerid) and playerid ~= -1 then
                            local x,y,z = getCharCoordinates(player)
                            if getDistanceBetweenCoords2d(x, y, posX, posY) < 3 then countPlayers = countPlayers + 1 end
                        end
                    end
                end
                local distBetween2d = getDistanceBetweenCoords2d(posXpl, posYpl, posX, posY)
                if minPlayerNear ~= false then
                    if tonumber(minPlayerNear) >= countPlayers then
                        table.insert(tableArr, {distBetween2d, car, posX, posY, posZ, countPlayers})
                    end
                else table.insert(tableArr, {distBetween2d, car, posX, posY, posZ, countPlayers}) end
                countPlayers = 0
            end
        end
        if #tableArr > 0 then
            table.sort(tableArr, function(a, b) return (a[1] < b[1]) end)
            if radius ~= false then
                if tableArr[1][1] <= tonumber(radius) then
                    return true, tableArr[1][2], tableArr[1][1], tableArr[1][3], tableArr[1][4], tableArr[1][5], tableArr[1][6]
                end
            else return true, tableArr[1][2], tableArr[1][1], tableArr[1][3], tableArr[1][4], tableArr[1][5], tableArr[1][6] end
        end
    end
    return false
end
Ну или используй
Но это будет выглядеть как телепорт
А есть вообще способ получить на какую кнопку человек может сесть в машину? Мне это для проверки надо. Неважно зачем