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

FYS

Потрачен
982
236
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
не работает(
Lua:
if doesCharExist(select(2, sampGetPlayerIdByCharHandle(218))) then
            sampSendChat('В стриме')
        end

218 взял потому что он возле меня стоял


если нужно чтоб скрипт нажал то setVirtualKeyDown(vkey, true) setVirtualKeyDown(vkey, false)
если нужно чтоб ты нажал на клавишу а скрипт это понял то isKeyJustPressed(key)
а если чтобы ты нажал и выполнялось пока ты не отжал то - isKeyDown
 

Howl1337

Известный
236
146
Как поставить много маркеров на разные точки сразу(сниппет setMarker)?
 

KH9I3b_MuJIOCJIABCKu

Участник
52
20
sa-mp-002.png

как мне сделать так чтобы при нажатии на Anna Clarke у меня в чат написалось её имя(и так с другими)? (текстдрав дрп)


и еще заебала эта ошибка
Код:
(error)    Nickwithtarget: cannot resume non-suspended coroutine
stack traceback:
    [C]: in function 'Nickwithtarget'
    E:\Games\ гта для каптиков\moonloader\Nickwithtarget.lua:4: in function <E:\Games\ гта для каптиков\moonloader\FastOfficier.lua:231>
[21:58:17.653598] (error) Nickwithtarget: Script died due to an error. (06449FB4)

функция
Код:
local id = 0

while true do
  NickName = sampGetPlayerNickname(id)
end
и крашит я не знаю че делать
 
Последнее редактирование:

Leo_Mendes

Известный
52
3
Ребят подскажите как пофиксить данную проблему
Отражает текст на другой стороне
2 скриншоте - госа нет, но текст там пишет
LXFMUv7.png

hyhdMjo.png

Код:
    local font1 = renderCreateFont('Century Gothic', 10, 5)
    local font2 = renderCreateFont('Century Gothic', 40, 5)
    while true do
        wait(0)
        if scriptactiv2 then
            if not pos then
            end
            for a = 1, 1024 do
                local pX, pY, pZ = getCharCoordinates(playerPed)
                local finded, objecthandle = findAllRandomObjectsInSphere(pX, pY, pZ, 300.0, true)
                if finded and doesObjectExist(objecthandle) then
                    local result, oX, oY, oZ = getObjectCoordinates(objecthandle)
                    local objmodel = getObjectModel(objecthandle)
                    if isPointOnScreen(oX, oY, oZ, 300.0) and objmodel == 1273 then
                        local hX, hY = convert3DCoordsToScreen(oX, oY, oZ)
                        renderFontDrawText(font1, string.format("[HouseCheck] House Gos", objmodel), hX, hY, -1)
                        renderFontDrawText(font2, string.format("{1DD300}House Gos{FFFFFF}", objmodel), 1100, 100, -1)
                    end
                end
            end
        end
     end
 

Oi Nikazum

Потрачен
182
232
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Ребят подскажите как пофиксить данную проблему
Отражает текст на другой стороне
2 скриншоте - госа нет, но текст там пишет
LXFMUv7.png

hyhdMjo.png

Код:
    local font1 = renderCreateFont('Century Gothic', 10, 5)
    local font2 = renderCreateFont('Century Gothic', 40, 5)
    while true do
        wait(0)
        if scriptactiv2 then
            if not pos then
            end
            for a = 1, 1024 do
                local pX, pY, pZ = getCharCoordinates(playerPed)
                local finded, objecthandle = findAllRandomObjectsInSphere(pX, pY, pZ, 300.0, true)
                if finded and doesObjectExist(objecthandle) then
                    local result, oX, oY, oZ = getObjectCoordinates(objecthandle)
                    local objmodel = getObjectModel(objecthandle)
                    if isPointOnScreen(oX, oY, oZ, 300.0) and objmodel == 1273 then
                        local hX, hY = convert3DCoordsToScreen(oX, oY, oZ)
                        renderFontDrawText(font1, string.format("[HouseCheck] House Gos", objmodel), hX, hY, -1)
                        renderFontDrawText(font2, string.format("{1DD300}House Gos{FFFFFF}", objmodel), 1100, 100, -1)
                    end
                end
            end
        end
     end
1. проверка, куда смотрит перс
2. не проще ли делать проверку по 3D тексту?..
 

ShikamaruRU

Участник
55
1
Как остановить флуд аптечкой? Скрипт должен был при <15 хп юзать аптечку, если их нет сигарету. Но сигарету юзать - юзает... А вот флуд аптечкой не прекращается)

Lua:
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end

    sampAddChatMessage(tag, 0x5A90CE)

    while true do
        wait(0)
        serdze = getCharHealth(PLAYER_PED)
            if serdze < 15 then
                sampSendChat("/usemed")
            end
    end
end


function events.onServerMessage(color, text)
lua_thread.create(function()
    if text:find("У тебя нет аптечек!") then
        wait(1000)
        sampSendChat("/smoke")
    end
    if text:find("У вас нет сигарет!") then
        wait(1000)
        sampSendChat("/usemed")
    end
    if text:find("У тебя нет аптечек!") and text:find("У вас нет сигарет!") then
        wait(1000)
        sampSendClickTextdraw(671)
    end
end)
end
 

astynk

Известный
Проверенный
744
531
Лол. Как отловить Attach3DTextLabelToVehicle с самп евентс?
Lua:
INCOMING_RPCS[RPC.CREATE3DTEXTLABEL]          = {'onCreate3DText', {id = 'int16'}, {color = 'int32'}, {position = 'vector3d'}, {distance = 'float'}, {testLOS = 'bool8'}, {attachedPlayerId = 'int16'}, {attachedVehicleId = 'int16'}, {text = 'encodedString4096'}}
 

KH9I3b_MuJIOCJIABCKu

Участник
52
20
есть такой код:
Lua:
while true do
local isPlayerInStream = sampGetCharHandleBySampPlayerId(gID)

        if isPlayerInStream then
            renderFontDrawText(my_font, NickName..'['..ID..'], (resX/2), resY/2, 0xFFaa600)
         
            sampSendChat('/pt '..ID)
                wait(1200)
end
end

оно /pt флудит но renderFontDrawText мограет, а мне это не нужно, если удаляю
sampSendChat('/pt '..ID)
wait(1200) то все норм renderFontDrawText не моргает как мне решить эту проблему?