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

KyRDa

Участник
86
44
вот тебе пример
Lua:
local coordinates = {
{x = 2464, y = -1715, z = 13},
{x = 2020, y = -1203, z = 20},
{x = 2243, y = -1370, z = 40},
{x = 2832, y = -1208, z = 24},
{x = 2202, y = -2307, z = 14},
{x = 2504, y = -2641, z = 13},
{x = 2209, y = -2586, z = 15},
{x = 1653, y = -2553, z = 17},
{x = 1773, y = -1958, z = 19},
{x = 1723, y = -1615, z = 14},
{x = 2164, y = -1676, z = 18},
{x = 2217, y = -1151, z = 26},
{x = 1450, y = -1017, z = 25},
{x = 560, y = -1812, z = 6},
{x = 357, y = -2029, z = 10},
{x = 170, y = -1952, z = 3},
{x = 422, y = -1520, z = 31},
{x = 953, y = -1749, z = 13},
{x = 671, y = -1277, z = 18},
{x = 1294, y = -834, z = 83},
{x = 1951, y = -1366, z = 24},
{x = 1528, y = -1349, z = 329},
{x = 548, y = -1069, z = 76},
{x = 291, y = -1387, z = 13},
{x = -78, y = -1582, z = 5},
{x = -289, y = -2166, z = 31},
{x = -20, y = -2470, z = 36},
{x = 20, y = -2650, z = 45},
{x = -1568, y = -2732, z = 51},
{x = -2158, y = -2446, z = 33},
{x = -2402, y = -1633, z = 521},
{x = -2271, y = -1731, z = 487},
{x = -1955, y = -2441, z = 32},
{x = -1893, y = -1698, z = 24},
{x = 903, y = -1492, z = 13},
{x = -557, y = -1092, z = 23},
{x = -622, y = -470, z = 25},
{x = -1062, y = -563, z = 32},
{x = -531, y = -168, z = 81},
{x = -92, y = -405, z = 1},
{x = -109, y = -1174, z = 2},
{x = 1213, y = 224, z = 22},
{x = 1927, y = 169, z = 40},
{x = 2263, y = -79, z = 26},
{x = 2847, y = 944, z = 12},
{x = 2693, y = 825, z = 12},
{x = 2335, y = 987, z = 10},
{x = 2192, y = 923, z = 11},
{x = 812, y = 860, z = 15},
{x = 1552, y = 788, z = 11},
{x = 1669, y = 971, z = 11},
{x = 1854, y = 693, z = 11},
{x = 2579, y = 1062, z = 11},
{x = 2819, y = 1307, z = 10},
{x = 2473, y = 1544, z = 10},
{x = 2621, y = 1827, z = 13},
{x = 2402, y = 1883, z = 10},
{x = 2920, y = 2103, z = 21},
{x = 2821, y = 2359, z = 11},
{x = 2545, y = 2796, z = 10},
{x = 2327, y = 2427, z = 11},
{x = 2616, y = 2206, z = 13},
{x = 2098, y = 2368, z = 60},
{x = 2136, y = 2037, z = 10},
{x = 1999, y = 1539, z = 13},
{x = 2098, y = 1294, z = 10},
{x = 1325, y = 1537, z = 10},
{x = 1129, y = 1386, z = 10},
{x = 1034, y = 2063, z = 14},
{x = 1628, y = 1856, z = 10},
{x = 1621, y = 2210, z = 15},
{x = 1493, y = 2778, z = 10},
{x = -41, y = 17, z = 3},
{x = -323, y = 844, z = 18},
{x = -181, y = 1211, z = 21},
{x = -810, y = 1467, z = 19},
{x = -1050, y = 1563, z = 36},
{x = -1370, y = 2055, z = 55},
{x = -1480, y = 2646, z = 58},
{x = -1665, y = 2556, z = 88},
{x = -2376, y = 2434, z = 9},
{x = -2605, y = 1407, z = 7},
{x = -1817, y = 1399, z = 7},
{x = -1872, y = 1088, z = 47},
{x = -2070, y = 650, z = 52},
{x = -2400, y = 948, z = 47},
{x = -2615, y = 676, z = 28},
{x = -2837, y = 854, z = 44},
{x = -2378, y = 42, z = 35},
{x = -2156, y = -84, z = 35},
{x = -2138, y = -247, z = 36},
{x = -1990, y = 320, z = 35},
{x = -1527, y = 108, z = 19},
{x = -1458, y = -431, z = 6},
{x = -1361, y = -180, z = 6},
{x = -1227, y = 49, z = 14},
{x = -1437, y = -1447, z = 105},
{x = -1104, y = -1640, z = 79},
{x = 1357, y = -1663, z = 17},
{x = 1953, y = -1742, z = 18},
{x = 1656, y = -2553, z = 17},
}

local blips = {}
local isBlipCreated = {}

function main()
    repeat wait(0) until isSampAvailable()

    sampRegisterChatCommand("fp", function()
        on = not on
        sampAddChatMessage("{FFFFFF}FindPumpkin: " .. (on and "{00FF00}ON" or "{FF0000}OFF"))
        if not on then
            for i, blip in pairs(blips) do
                removeBlip(blip)
            end
            blips = {}
            isBlipCreated = {}
        end
    end)

    while true do wait(0)
        if on then
            x, y, z = getCharCoordinates(PLAYER_PED)
            for i, markerCoords in ipairs(coordinates) do
                local distance = getDistanceBetweenCoords3d(markerCoords.x, markerCoords.y, markerCoords.z, x, y, z)
         
                if distance < 500 and not isBlipCreated[i] then
                    local blip = addSpriteBlipForCoord(markerCoords.x, markerCoords.y, markerCoords.z, 41)
                    blips[i] = blip
                    isBlipCreated[i] = true
                elseif distance > 500 and isBlipCreated[i] then
                    if blips[i] then
                        removeBlip(blips[i])
                        blips[i] = nil
                    end
                    isBlipCreated[i] = false
                end
            end
        end
    end
end
image.png
Возможно я не правильно задал вопрос. Это не то, что мне нужно
Я бы хотел брать иконки из отдельного файла и рисовать их на этой карте

1705006332963.png
 
Последнее редактирование:

lalalalalagg

Новичок
4
4
qq, нужна помощь.

Lua:
imgui.InputText('##1', text_buffer)
imgui.SameLine()
if imgui.Button(u8'Добавить', imgui.ImVec2(70, 25)) and text_buffer.v ~= nil and text_buffer.v ~= '' then
    if current == 1 then
        table.insert(lvl1, text_buffer.v)
    end
end
if current == 1 then
    for k, v in ipairs(lvl1) do
        imgui.Text(k.. '. ' ..v)
        imgui.SameLine()
        if imgui.Button('-', imgui.ImVec2(20, 20)) then
            table.remove(lvl1)
        end
    end
end

В чем беда, рядом с добавленным текстом должна появляться кнопка в виде " - " и по её нажатию строка стоящая рядом должна удаляться, как исправить?
Щас оно удаляет только последнюю строку и только при нажатии на первую кнопку.
 
Последнее редактирование:

Andrinall

Известный
702
518
Это замечательно, однако функционал этого плагина возвращает не тот указатель. Возможно я им не так пользуюсь?
Возможно. С документацией ознакомился?
Lua:
local mad = require 'MoonAdditions'
function main()
    repeat wait(100) until isSampAvailable()
    sampRegisterChatCommand('/get', function()
        if not isPlayerPlaying(PLAYER_HANDLE) then return end
        if not isCharInAnyCar(PLAYER_PED) then return end

        local car = storeCarCharIsInNoSave(PLAYER_PED)
        local car_pointer = getCarPointer(car)
        local components = mad.get_all_vehicle_components(car)

        for i, comp in ipairs(components) do
            local comp_pointer = comp:get_pointer()
            print(i, comp.name, ("0x%X + 0x%X"):format(car_pointer, comp_pointer - car_pointer))
            if comp.name == 'wheel_rf_dummy' then comp:set_visibility(false) end
        end
    end)
    wait(-1)
1705037449801.png
1705037426409.png
[/screens]
 
Последнее редактирование:

chapo

чопа сребдс // @moujeek
Модератор
8,868
11,576
qq, нужна помощь.

Lua:
imgui.InputText('##1', text_buffer)
imgui.SameLine()
if imgui.Button(u8'Добавить', imgui.ImVec2(70, 25)) and text_buffer.v ~= nil and text_buffer.v ~= '' then
    if current == 1 then
        table.insert(lvl1, text_buffer.v)
    end
end
if current == 1 then
    for k, v in ipairs(lvl1) do
        imgui.Text(k.. '. ' ..v)
        imgui.SameLine()
        if imgui.Button('-', imgui.ImVec2(20, 20)) then
            table.remove(lvl1)
        end
    end
end

В чем беда, рядом с добавленным текстом должна появляться кнопка в виде " - " и по её нажатию строка стоящая рядом должна удаляться, как исправить?
Щас оно удаляет только последнюю строку и только при нажатии на первую кнопку.
измени текст кнопки удаления с '-' на '-##' .. k и в table.remove в качестве второго аргумента укажи k
 
  • Влюблен
Реакции: lalalalalagg

DiteD331

Участник
95
12
Как оцените сложность Lua в плане кодинга? С какими трудностями может встретиться человек при его изучении? За какой промежуток времени можно освоить его? Легче ли Lua, чем Python? Рекомендуете к освоению LUA? Поделитесь своим опытом.
 
Последнее редактирование:
D

deleted-user-139653

Гость
Как оцените сложность Lua в плане кодинга? С какими трудностями может встретиться человек при его изучении? За какой промежуток времени можно освоить его? Легче ли Lua, чем Python? Поделитесь своим опытом.
в плане сложности я думаю никакой нет, раз ты сравниваешь луа и питон. луа кстати написал на питоне если что.
все что нужно, это лишь изучить api gta sa(mp)
по времени все зависит от тебя
чужоков накидайте мне если не прав)
 
  • Вау
  • Bug
Реакции: nanobrick и minxty

DiteD331

Участник
95
12
в плане сложности я думаю никакой нет, раз ты сравниваешь луа и питон. луа кстати написал на питоне если что.
все что нужно, это лишь изучить api gta sa(mp)
по времени все зависит от тебя
чужоков накидайте мне если не прав)
Спасибо за отклик. Я вот тоже год назад пайтон изучал, и увидел в нём и в Lua нечто схожее. Вот и спросил про сравнение именно с Пайтоном). Можешь подробнее про api gta sa? Типо знаю, что API это про те случаи, когда приложение A запрашивает определенные данные у приложения B для своей работы.
 
D

deleted-user-139653

Гость
Спасибо за отклик. Я вот тоже год назад пайтон изучал, и увидел в нём и в Lua нечто схожее. Вот и спросил про сравнение именно с Пайтоном). Можешь подробнее про api gta sa? Типо знаю, что API это про те случаи, когда приложение A запрашивает определенные данные у приложения B для своей работы.
 
  • Нравится
Реакции: DiteD331

alprazolam

Новичок
2
0
Приветствую ребята, у меня очень специфическая проблема, опишу проект в котором она встретилась (для контекста) и саму неполадку.

Я пишу сайт на python используя фреймворк django. Задача сайта: выводить карту сампа, а на ней маркер, который указывает на местонахождение игрока. Выглядит это приблизительно так:
GzhJJFq.jpeg

Так вот, чтобы синхронизировать всю эту систему - нужно как-то передавать координаты игрока с сампа, дабы потом отобразить на карте. Первая мысль, как это сделать - написать lua скрипт, который будет с помощью функции получать координаты и передавать их в базу данных сайта (база данных sqlite, находится пока что в виде файлика db.sqlite3 в корне проекта с сайтом). Но вот передавать данные не получается, нужно подключать библиотеку luasql.sqlite3, которую на винде не так уж и просто подключить. Я пробовала решение с этой темы, но честно говоря так и не получилось - ловлю ошибки в консоли sf. Буду рада, если кто-то реально шарит и поможет, либо предложит другой вариант реализации идеи.

upd: установила версию мунлоадера 027 (ту, что поддерживает luarocks), начала появляться вот такая ошибка при попытке установить необходимые библиотеки при запуске игры. вот скрин:
bTFxbJg.png


Вот код на lua:
Lua:
script_name("CUD (getter_coordinates)")

require 'deps' {
    'luasql.sqlite3'
}

local sqlite3 = require("luasql.sqlite3")
local env = sqlite3.sqlite3()
local con = env:connect("my path to db")


function main()
    while not isSampAvailable() do wait (100) end
    sampRegisterChatCommand("coords", returnCoordinate)
    wait(-1)
end

function returnCoordinate()
    local xCoordinate, yCoordinate, zCoordinate = getCharCoordinates(PLAYER_PED)
end
 
Последнее редактирование:

chapo

чопа сребдс // @moujeek
Модератор
8,868
11,576
Приветствую ребята, у меня очень специфическая проблема, опишу проект в котором она встретилась (для контекста) и саму неполадку.

Я пишу сайт на python используя фреймворк django. Задача сайта: выводить карту сампа, а на ней маркер, который указывает на местонахождение игрока. Выглядит это приблизительно так:
GzhJJFq.jpeg

Так вот, чтобы синхронизировать всю эту систему - нужно как-то передавать координаты игрока с сампа, дабы потом отобразить на карте. Первая мысль, как это сделать - написать lua скрипт, который будет с помощью функции получать координаты и передавать их в базу данных сайта (база данных sqlite, находится пока что в виде файлика db.sqlite3 в корне проекта с сайтом). Но вот передавать данные не получается, нужно подключать библиотеку luasql.sqlite3, которую на винде не так уж и просто подключить. Я пробовала решение с этой темы, но честно говоря так и не получилось - ловлю ошибки в консоли sf. Буду рада, если кто-то реально шарит и поможет, либо предложит другой вариант реализации идеи.

Вот код на lua:
Lua:
script_name("CUD (getter_coordinates)")

require 'deps' {
    'luasql.sqlite3'
}

local sqlite3 = require("luasql.sqlite3")
local env = sqlite3.sqlite3()
local con = env:connect("my path to db")


function main()
    while not isSampAvailable() do wait (100) end
    sampRegisterChatCommand("coords", returnCoordinate)
    wait(-1)
end

function returnCoordinate()
    local xCoordinate, yCoordinate, zCoordinate = getCharCoordinates(PLAYER_PED)
end
Лучше, проще и быстрее передавать инфу через вебсокеты
 

alprazolam

Новичок
2
0
Лучше, проще и быстрее передавать инфу через вебсокеты
об этом тоже задумывалась, но не шарю как там всё организованно - пока что ни разу не работала с web real-time apps. Если через веб-сокеты, всё равно же нужно со стороны клиента (сампа) собрать данные и отправить их, как это организовать +-?
желательно на lua поясните, а то на клео и сф не умею писать xD

upd: при подгрузке библиотеки websockets через deps получаю такую ошибку:
kb07F0K.png
 
Последнее редактирование:

Arizona Mobile 3

Потрачен
117
12
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Lua:
 function se.onServerMessage(text)
    if text:marh('Принят') then
    invs = invs +1
    end
    -- body 
end

В чем ошибка
 

Max_Northwood

Участник
43
17
Lua:
 function se.onServerMessage(text)
    if text:marh('Принят') then
    invs = invs +1
    end
    -- body
end

В чем ошибка
Пропустил первый аргумент в функции color. Что значит "text:marh"? Используй text:find, либо text:match
Lua:
function sampev.onServerMessage(color, text)
    if text:find("Принят") then
        invs = invs + 1;
    end
end