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

BARRY BRADLEY

Известный
711
176
Код:
Lua:
function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand('ss', function()
        local closestId, closestModel = getClosestPlayer()
        if closestId ~= -1 then
            if (closestModel ~= 280 and closestModel ~= 281 and closestModel ~= 282 and closestModel ~= 283 and closestModel ~= 284 and closestModel ~= 285 and closestModel ~= 286 and closestModel ~= 288 and closestModel ~= 295 and closestModel ~= 71 and closestModel ~= 265 and closestModel ~= 163 and closestModel ~= 164 and closestModel ~= 165 and closestModel ~= 166 and closestModel ~= 266 and closestModel ~= 267 and closestModel ~= 300 and closestModel ~= 301 and closestModel ~= 302 and closestModel ~= 306 and closestModel ~= 307 and closestModel ~= 309 and closestModel ~= 310 and closestModel ~= 311) then
                sampSendChat('/m [US:PD] '..sampGetPlayerNickname(closestId)..', немедленно остановитесь или будут предприняты меры')
            else
                sampSendChat('/m [US:PD] Немедленно остановитесь или будут предприняты меры')
            end
        end
    end)
    wait(-1)
end


function getClosestPlayer()
    local maxDist = 50.0
    local closestPlayer = -1
    for i = 0, sampGetMaxPlayerId(true) do
        if sampIsPlayerConnected(i) and not sampIsPlayerNpc(i) then
            if sampGetCharHandleBySampPlayerId(i) then
                local playerPosX, playerPosY, playerPosZ = getCharCoordinates(select(2, sampGetCharHandleBySampPlayerId(i)))
                local myPosX, myPosY, myPosZ = getCharCoordinates(PLAYER_PED)
                local dist = getDistanceBetweenCoords3d(myPosX, myPosY, myPosZ, playerPosX, playerPosY, playerPosZ)
                if dist < maxDist then
                    maxDist, closestPlayer, closestModel = dist, i, getCharModel(select(2, sampGetCharHandleBySampPlayerId(i)))
                end
            end
        end
    end
    return closestModel
end

Как сделать проверку если у игрока определенный скин (в коде есть), то код будет проверять другого а его нет. Типа игнорировать игрока с определенным айди скина. Нужно дописать но моих знаний пока что очень мало. Зарание спасибо
 

Petr_Sergeevich

Известный
Проверенный
707
296
Как узнать, находится ли хендл или ID в транспорте? (другой игрок, не свой)
 

~Justie~

Участник
133
25
Как менять цвет в sampAddChatMessage(' ')? И где найти таблицу цветов? Ибо у меня только одно значение и это только синий почему-то.
И еще, как в том-же sampAddChatMessage(' ') писать по русски? Кодировка чет не работает.
 
Последнее редактирование:

samespoon

Известный
163
20
Загруженные звуки — GTAModding.ru(http://gtamodding.ru/wiki/%D0%97%D0%B0%D0%B3%D1%80%D1%83%D0%B6%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B7%D0%B2%D1%83%D0%BA%D0%B8)
Есть звуки, которые при входе в игру загружаются сразу, их можно проиграть при помощи
addOneOffSound(0.0, 0.0, 0.0, 1052).
Но также есть куча звуков, которая по дефолту не загружена. Sound IDs - SA-MP Wiki(https://sampwiki.blast.hk/wiki/SoundID)
Вопрос: как загрузить эти звуки в игру?
Как всё-таки загрузил звуки?
 

ufdhbi

Известный
Проверенный
1,455
862
Как менять цвет в sampAddChatMessage(' ')? И где найти таблицу цветов? Ибо у меня только одно значение и это только синий почему-то.
И еще, как в том-же sampAddChatMessage(' ') писать по русски? Кодировка чет не работает.
используй HTML цвета
 

kmsfax

Известный
154
89
Код:
Lua:
function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand('ss', function()
        local closestId, closestModel = getClosestPlayer()
        if closestId ~= -1 then
            if (closestModel ~= 280 and closestModel ~= 281 and closestModel ~= 282 and closestModel ~= 283 and closestModel ~= 284 and closestModel ~= 285 and closestModel ~= 286 and closestModel ~= 288 and closestModel ~= 295 and closestModel ~= 71 and closestModel ~= 265 and closestModel ~= 163 and closestModel ~= 164 and closestModel ~= 165 and closestModel ~= 166 and closestModel ~= 266 and closestModel ~= 267 and closestModel ~= 300 and closestModel ~= 301 and closestModel ~= 302 and closestModel ~= 306 and closestModel ~= 307 and closestModel ~= 309 and closestModel ~= 310 and closestModel ~= 311) then
                sampSendChat('/m [US:PD] '..sampGetPlayerNickname(closestId)..', немедленно остановитесь или будут предприняты меры')
            else
                sampSendChat('/m [US:PD] Немедленно остановитесь или будут предприняты меры')
            end
        end
    end)
    wait(-1)
end


function getClosestPlayer()
    local maxDist = 50.0
    local closestPlayer = -1
    for i = 0, sampGetMaxPlayerId(true) do
        if sampIsPlayerConnected(i) and not sampIsPlayerNpc(i) then
            if sampGetCharHandleBySampPlayerId(i) then
                local playerPosX, playerPosY, playerPosZ = getCharCoordinates(select(2, sampGetCharHandleBySampPlayerId(i)))
                local myPosX, myPosY, myPosZ = getCharCoordinates(PLAYER_PED)
                local dist = getDistanceBetweenCoords3d(myPosX, myPosY, myPosZ, playerPosX, playerPosY, playerPosZ)
                if dist < maxDist then
                    maxDist, closestPlayer, closestModel = dist, i, getCharModel(select(2, sampGetCharHandleBySampPlayerId(i)))
                end
            end
        end
    end
    return closestModel
end

Как сделать проверку если у игрока определенный скин (в коде есть), то код будет проверять другого а его нет. Типа игнорировать игрока с определенным айди скина. Нужно дописать но моих знаний пока что очень мало. Зарание спасибо
Как-то так:
Lua:
function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand('test', function()
        for i = 0, sampGetMaxPlayerId(true) do
            if sampIsPlayerConnected(i) and not sampIsPlayerNpc(i) then
                local result, handle = sampGetCharHandleBySampPlayerId(i)
                if result then
                    if getDistanceToPlayer(PLAYER_PED, handle) < 50 then
                        if getCharModel(handle) ~= 280 and getCharModel(handle) ~= 281 and getCharModel(handle) ~= 282 and getCharModel(handle) ~= 283 and getCharModel(handle) ~= 284 and getCharModel(handle) ~= 285 and getCharModel(handle) ~= 286 and getCharModel(handle) ~= 288 and getCharModel(handle) ~= 295 and getCharModel(handle) ~= 71 and getCharModel(handle) ~= 265 and getCharModel(handle) ~= 163 and getCharModel(handle) ~= 164 and getCharModel(handle) ~= 165 and getCharModel(handle) ~= 166 and getCharModel(handle) ~= 266 and getCharModel(handle) ~= 267 and getCharModel(handle) ~= 300 and getCharModel(handle) ~= 301 and getCharModel(handle) ~= 302 and getCharModel(handle) ~= 306 and getCharModel(handle) ~= 307 and getCharModel(handle) ~= 309 and getCharModel(handle) ~= 310 and getCharModel(handle) ~= 311 then
                            sampSendChat('/c [US:PD] '..sampGetPlayerNickname(i)..', немедленно остановитесь или будут предприняты меры')
                        else
                            sampSendChat('/c [US:PD] Немедленно остановитесь или будут предприняты меры')
                        end
                    end
                end
            end
        end
    end)
    wait(-1)
end

function getDistanceToPlayer(PLAYER_PED, handle)
    local X, Y, Z = getCharCoordinates(handle)
    local myX, myY, myZ = getCharCoordinates(PLAYER_PED)
    local distance = getDistanceBetweenCoords3d(X, Y, Z, myX, myY, myZ)
    return distance
end
 

DeXer23

Участник
30
14
Ребят помогите, сам не знаю из-за чего эта ошибка вылазит
 

Вложения

  • Screenshot_1.png
    Screenshot_1.png
    4.9 KB · Просмотры: 106

BW-Samp

Новичок
71
0
Как базовый вариант
Lua:
-- main, также можно в самом начале кода
local image = imgui.renderTextureFromFile(path)
-- imgui.drawframe bla bla
imgui.Image(image, imgui.ImVec2(sizeX, sizeY))
-- imgui code
Lua:
if mlogo then
                    imgui.Image(mlogo, imgui.ImVec2(73, 73))
                else
                    imgui.Text("Error with image loading")
            end
ну данный вариант у меня двигает все объекты, а я хочу, чтобы картинка был под ними