Вопросы по 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

Известный
2,591
906
И?? Я тебе еще раз говорю, функция НЕ МОЖЕТ садить человека в мотоцикл!!!!!!!
я проверил ее в отдельном скрипте, где только эта функция, всё равно сажает.
Lua:
local ignore_car = {434, 440, 448, 449, 463, 464, 500, 536, 537, 563, 568, 569, 570, 583, 589, 590, 593, 605, 606, 607, 609, 610, }
local ignore_moto = {447, 460, 461, 462, 467, 480, 508, 509, 520, 521, 522, 580, 585, }
function getClosestCarId()
    local minDist = 300
    local closestId = -1
    local x, y, z = getCharCoordinates(PLAYER_PED)
    for i = 0, 1800 do
        local streamed, pedID = sampGetCarHandleBySampVehicleId(i)
        if streamed then
            local xi, yi, zi = getCarCoordinates(pedID)
            local dist = math.sqrt( (xi - x) ^ 2 + (yi - y) ^ 2 + (zi - z) ^ 2 )
            if dist < minDist then
                minDist = dist
                local model = getCarModel(pedID)
                for k = 1, #ignore_car do
                    if model ~= ignore_car[k] then
                        for v = 1, #ignore_moto do
                            if model ~= ignore_moto[v] then
                                closestId = i
                            elseif model == ignore_moto[v] then 
                                local doors = getCarDoorLockStatus(pedID)
                                if doors == 0 then
                                    closestId = i
                                end
                            end
                        end
                    end
                end
            end
        end
    end
    return closestId
end
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand('seatt', function()
        lua_thread.create(function()
            local _, veh = sampGetCarHandleBySampVehicleId(getClosestCarId())
            if _ then
                sampSendEnterVehicle(getClosestCarId(), true)
                wait(1000)
                warpCharIntoCar(playerPed, veh)
            end
        end)
    end)
    wait(-1)
end
 

Smeruxa

Известный
1,315
692
я проверил ее в отдельном скрипте, где только эта функция, всё равно сажает.
Lua:
local ignore_car = {434, 440, 448, 449, 463, 464, 500, 536, 537, 563, 568, 569, 570, 583, 589, 590, 593, 605, 606, 607, 609, 610, }
local ignore_moto = {447, 460, 461, 462, 467, 480, 508, 509, 520, 521, 522, 580, 585, }
function getClosestCarId()
    local minDist = 300
    local closestId = -1
    local x, y, z = getCharCoordinates(PLAYER_PED)
    for i = 0, 1800 do
        local streamed, pedID = sampGetCarHandleBySampVehicleId(i)
        if streamed then
            local xi, yi, zi = getCarCoordinates(pedID)
            local dist = math.sqrt( (xi - x) ^ 2 + (yi - y) ^ 2 + (zi - z) ^ 2 )
            if dist < minDist then
                minDist = dist
                local model = getCarModel(pedID)
                for k = 1, #ignore_car do
                    if model ~= ignore_car[k] then
                        for v = 1, #ignore_moto do
                            if model ~= ignore_moto[v] then
                                closestId = i
                            elseif model == ignore_moto[v] then
                                local doors = getCarDoorLockStatus(pedID)
                                if doors == 0 then
                                    closestId = i
                                end
                            end
                        end
                    end
                end
            end
        end
    end
    return closestId
end
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand('seatt', function()
        lua_thread.create(function()
            local _, veh = sampGetCarHandleBySampVehicleId(getClosestCarId())
            if _ then
                sampSendEnterVehicle(getClosestCarId(), true)
                wait(1000)
                warpCharIntoCar(playerPed, veh)
            end
        end)
    end)
    wait(-1)
end
ФУНКЦИЯ ВАРП ЧАР ИНТО КАР ТЕБЯ САДИТ ЛИБО ЕНТЕР ВЕХАЙСЛ!!!!!!!!!!!!!!!!!!!!!! ФУНКЦИЯ НЕ МОЖЕТ ТЕБЯ САЖАТЬ!!!!!!!!!!!!!!!
 

XRLM

Известный
2,591
906
ФУНКЦИЯ ВАРП ЧАР ИНТО КАР ТЕБЯ САДИТ ЛИБО ЕНТЕР ВЕХАЙСЛ!!!!!!!!!!!!!!!!!!!!!! ФУНКЦИЯ НЕ МОЖЕТ ТЕБЯ САЖАТЬ!!!!!!!!!!!!!!!
да блять ебаный сыр, функция получает id тачки и потом варп чар инто кар садит в тачку по id полученного тс, ентер вехайсл тоже самое, только уже по хендлу тачки, который получается перед этим, але нахуй
Lua:
local _, veh = sampGetCarHandleBySampVehicleId(getClosestCarId())
    if _ then
        sampSendEnterVehicle(getClosestCarId(), true)
        wait(1000)
        warpCharIntoCar(playerPed, veh)
    end
 
Последнее редактирование:

Basedbounty

Активный
181
76
почему WARNING в игре высвечивается белым, "а нельзя такое писать в чат!" красным, хотя должно наоборот
а:
script_name("poka matam")
script_author("WeWorny")
script_description("скажи нет матам")

require "lib.moonloader"

local pizdakita = require 'lib.samp.events'

function pizdakita.onSendChat(text)
    if text == "сука" then
     sampAddChatMessage("[WARNING]" .. "{FF0000}" .. 'нельзя такое писать в чат!', -1)
          return false
    end
 end
Код:
 

XRLM

Известный
2,591
906
почему WARNING в игре высвечивается белым, "а нельзя такое писать в чат!" красным, хотя должно наоборот
а:
script_name("poka matam")
script_author("WeWorny")
script_description("скажи нет матам")

require "lib.moonloader"

local pizdakita = require 'lib.samp.events'

function pizdakita.onSendChat(text)
    if text == "сука" then
     sampAddChatMessage("[WARNING]" .. "{FF0000}" .. 'нельзя такое писать в чат!', -1)
          return false
    end
 end
Код:
sampAddChatMessage("[WARNING] {FFFFFF}Нельзя такое писать в чат!', 0xFF0000})

бля, я заебался себе мозги ебать. меня сажает в закрытый мото
Lua:
local ignore_car = {434, 440, 448, 449, 463, 464, 500, 536, 537, 563, 568, 569, 570, 583, 589, 590, 593, 605, 606, 607, 609, 610, }
local ignore_moto = {447, 460, 461, 462, 467, 480, 508, 509, 520, 521, 522, 580, 585, }
function GetCarHandle()
    local var_veh = {}
    local var_dist = 300
    for _, veh in ipairs(getAllVehicles()) do
        local mX, mY, mZ = getCarCoordinates(veh)
        local x, y, z = getCharCoordinates(PLAYER_PED)
        local dist = getDistanceBetweenCoords3d(x, y, z, mX, mY, mZ)
        if var_dist == nil or dist < var_dist then
            local result, vehid = sampGetVehicleIdByCarHandle(veh)
            if result then
                var_veh[#var_veh + 1] = vehid
            end
        end
    end
    return var_veh
end
function GetNearestCar()
    local vehid = -1
    for _, i in ipairs(GetCarHandle()) do
        local res, veh = sampGetCarHandleBySampVehicleId(i)
        if res then
            local model = getCarModel(veh)
            for k = 1, #ignore_car do
                for v = 1, #ignore_moto do
                    if model ~= ignore_car[k] then
                        local door = getCarDoorLockStatus(veh)
                        if model ~= ignore_moto[v] then
                            vehid = i
                        elseif model == ignore_moto[v] and door == 0 then
                            vehid = i
                        elseif model == ignore_moto[v] and door == 1 then
                            vehid = -1
                        end
                    end
                end
            end
        end
    end
    return vehid
end
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand('seat.near', function()
        lua_thread.create(function()
            local vehid = GetNearestCar()
            local _, veh = sampGetCarHandleBySampVehicleId(vehid)
            if _ then
                sampSendEnterVehicle(vehid, true)
                wait(1000)
                warpCharIntoCar(PLAYER_PED, veh)
            end
        end)
    end)
    wait(-1)
end

дело в 29 строке, как сделать проверку неравенства модели т/с моделям из таблицы.
 
Последнее редактирование:
  • Нравится
Реакции: Basedbounty

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,778
11,240
как сделать проверку неравенства модели т/с моделям из таблицы.
Lua:
local ignore_car = {...}
function isValueInTable(tbl, value)
    for k, v in next, tbl do
        if v == value then
            return true
        end
    end
    return false
end

if not isValueInTable(ignore_car, model) then
    -- code
end
 
  • Нравится
Реакции: XRLM

XRLM

Известный
2,591
906
Lua:
local ignore_car = {...}
function isValueInTable(tbl, value)
    for k, v in next, tbl do
        if v == value then
            return true
        end
    end
    return false
end

if not isValueInTable(ignore_car, model) then
    -- code
end
Код:
ML] (error) jopasuka.lua: ...iles (x86)\a gta bh\red-blue gta\moonloader\jopasuka.lua:4: bad argument #1 to '(for generator)' (table expected, got nil)
stack traceback:
    [C]: in function '(for generator)'
    ...iles (x86)\a gta bh\red-blue gta\moonloader\jopasuka.lua:4: in function 'isValueInTable'
    ...iles (x86)\a gta bh\red-blue gta\moonloader\jopasuka.lua:23: in function 'getClosestCarId'
    ...iles (x86)\a gta bh\red-blue gta\moonloader\jopasuka.lua:43: in function <...iles (x86)\a gta bh\red-blue gta\moonloader\jopasuka.lua:42>
stack traceback:
    [C]: in function 'create'
    ...iles (x86)\a gta bh\red-blue gta\moonloader\jopasuka.lua:42: in function <...iles (x86)\a gta bh\red-blue gta\moonloader\jopasuka.lua:41>
[ML] (error) jopasuka.lua: Script died due to an error. (439A942C)
что не так делаю?
Lua:
local ignore_car = {434, 440, 448, 449, 463, 464, 500, 536, 537, 563, 568, 569, 570, 583, 589, 590, 593, 605, 606, 607, 609, 610, }
local ignore_moto = {447, 460, 461, 462, 467, 480, 508, 509, 520, 521, 522, 580, 585, }
function isValueInTable(tbl, value)
    for k, v in next, tbl do
        if v == value then
            return true
        end
    end
    return false
end
function getClosestCarId()
    local minDist = 300
    local closestId = -1
    local x, y, z = getCharCoordinates(PLAYER_PED)
    for i = 0, 1800 do
        local streamed, pedID = sampGetCarHandleBySampVehicleId(i)
        if streamed then
            local xi, yi, zi = getCarCoordinates(pedID)
            local dist = math.sqrt( (xi - x) ^ 2 + (yi - y) ^ 2 + (zi - z) ^ 2 )
            if dist < minDist then
                minDist = dist
                local model = getCarModel(pedID)
                if not isValueInTable(ignote_car, model) then
                    if not isValueInTable(ignote_moto, model) then
                        closestId = i
                    else
                        local door = getCarDoorLockStatus(pedID)
                        if door == 0 then
                            closestId = i
                        end
                    end
                end
            end
        end
    end
    return closestId
end
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand('seatt', function()
        lua_thread.create(function()
            local _, veh = sampGetCarHandleBySampVehicleId(getClosestCarId())
            if _ then
                sampSendEnterVehicle(getClosestCarId(), true)
                wait(1000)
                warpCharIntoCar(playerPed, veh)
            end
        end)
    end)
    wait(-1)
end
 

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,778
11,240
Код:
ML] (error) jopasuka.lua: ...iles (x86)\a gta bh\red-blue gta\moonloader\jopasuka.lua:4: bad argument #1 to '(for generator)' (table expected, got nil)
stack traceback:
    [C]: in function '(for generator)'
    ...iles (x86)\a gta bh\red-blue gta\moonloader\jopasuka.lua:4: in function 'isValueInTable'
    ...iles (x86)\a gta bh\red-blue gta\moonloader\jopasuka.lua:23: in function 'getClosestCarId'
    ...iles (x86)\a gta bh\red-blue gta\moonloader\jopasuka.lua:43: in function <...iles (x86)\a gta bh\red-blue gta\moonloader\jopasuka.lua:42>
stack traceback:
    [C]: in function 'create'
    ...iles (x86)\a gta bh\red-blue gta\moonloader\jopasuka.lua:42: in function <...iles (x86)\a gta bh\red-blue gta\moonloader\jopasuka.lua:41>
[ML] (error) jopasuka.lua: Script died due to an error. (439A942C)
что не так делаю?
Lua:
local ignore_car = {434, 440, 448, 449, 463, 464, 500, 536, 537, 563, 568, 569, 570, 583, 589, 590, 593, 605, 606, 607, 609, 610, }
local ignore_moto = {447, 460, 461, 462, 467, 480, 508, 509, 520, 521, 522, 580, 585, }
function isValueInTable(tbl, value)
    for k, v in next, tbl do
        if v == value then
            return true
        end
    end
    return false
end
function getClosestCarId()
    local minDist = 300
    local closestId = -1
    local x, y, z = getCharCoordinates(PLAYER_PED)
    for i = 0, 1800 do
        local streamed, pedID = sampGetCarHandleBySampVehicleId(i)
        if streamed then
            local xi, yi, zi = getCarCoordinates(pedID)
            local dist = math.sqrt( (xi - x) ^ 2 + (yi - y) ^ 2 + (zi - z) ^ 2 )
            if dist < minDist then
                minDist = dist
                local model = getCarModel(pedID)
                if not isValueInTable(ignote_car, model) then
                    if not isValueInTable(ignote_moto, model) then
                        closestId = i
                    else
                        local door = getCarDoorLockStatus(pedID)
                        if door == 0 then
                            closestId = i
                        end
                    end
                end
            end
        end
    end
    return closestId
end
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand('seatt', function()
        lua_thread.create(function()
            local _, veh = sampGetCarHandleBySampVehicleId(getClosestCarId())
            if _ then
                sampSendEnterVehicle(getClosestCarId(), true)
                wait(1000)
                warpCharIntoCar(playerPed, veh)
            end
        end)
    end)
    wait(-1)
end
у тебя таблица называется ignoRe_moto, в при вызове функции ты написал ignoTe_moto
 
  • Нравится
Реакции: XRLM

#SameLine

Активный
421
37
Lua:
if imgui.InputTextMultiline('text', s.textspurs, 128, imgui.ImVec2(-1.0, -0.1)) then
        save()
end
почему сохраняется только верхняя строка, как сделать чтобы текст сохранялся на весь multiline с enter'ами
 

ch1ps

Участник
101
3
как создать иконку на карте? к примеру поставить иконку пистолета на нужные координаты