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

DanilBrain

Новичок
2
0
Lua:
nop = false
function main()
    sampRegisterChatCommand("fafk", function() 
    nop = not nop 
    sampAddChatMessage(nop and "on" or "off", -1)
    end)
    wait(-1)
end

function onSendPacket()
  return not nop
end
как сделать чтобы после ввода команды каждые N секунд nop дважды меняло состояние? (true>wait>false>wait>true)
с lua не особо знаком
 

neverlane

t.me/neverlane00
Друг
1,010
1,165
Lua:
nop = false
function main()
    sampRegisterChatCommand("fafk", function()
    nop = not nop
    sampAddChatMessage(nop and "on" or "off", -1)
    end)
    wait(-1)
end

function onSendPacket()
  return not nop
end
как сделать чтобы после ввода команды каждые N секунд nop дважды меняло состояние? (true>wait>false>wait>true)
с lua не особо знаком
Lua:
--как вариант
cmdact = false
nop = false
function main()
    while not isSampAvailable() do wait(100) end
    lua_thread.create(actnop)
    sampRegisterChatCommand("fafk", function()
    cmdact = not cmdact
    sampAddChatMessage(cmdact and "on" or "off", -1)
    end)
    wait(-1)
end
function actnop()
    while true do
        wait(1000) --тут задержка в данном случае 1000мс
        if cmdact then
            nop = not nop
        end
    end
end
function onSendPacket()
  return not nop
end
 
  • Нравится
Реакции: DanilBrain

Double Tap Inside

Известный
Проверенный
1,916
1,256
Lua:
function onWindowMessage(msg, wparam, lparam)
    if msg == 0x100 or msg == 0x101 then
        if (wparam == 0x1B and main_window_state.v) and not isPauseMenuActive() then -- и тут не забудь переменную поменять, 0x1B это VK_ESCAPE
            consumeWindowMessage(true, false)
            if msg == 0x101 then
                main_window_state.v = false -- тут переменнаяя твоего окна
                                imgui.Process = false
            end
        end
    end
end

Работает идеально, но нужно, чтобы ескейп передавался только в окно имгуя. Просто если открыт самповский диалог, то ескейп туда передается тоже. В итоге слишком опасный ескейп, чтобы им пользоваться.
Как передавать ескейп только в окно имгуя? Также заметил, что диалог закрывается уже по KeyDown, а этот код срабатывает на KeyUp

Решение:

+ Добавил, чтобы оно закрывалось только если активно.

Константы сообщений брал отсюда

1.PNG


2.PNG
 
Последнее редактирование:

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,919
1,291
Lua:
--как вариант
cmdact = false
nop = false
function main()
    while not isSampAvailable() do wait(100) end
    lua_thread.create(actnop)
    sampRegisterChatCommand("fafk", function()
    cmdact = not cmdact
    sampAddChatMessage(cmdact and "on" or "off", -1)
    end)
    wait(-1)
end
function actnop()
    while true do
        wait(1000) --тут задержка в данном случае 1000мс
        if cmdact then
            nop = not nop
        end
    end
end
function onSendPacket()
  return not nop
end
Зачем там задержка? Еще и если cmdact будет false, то значение nop не поменяется
 
Последнее редактирование:

wintreist

Активный
308
71
Ребят, как из массива удалить элемент? Было 5 элементов, я удалил 1, стало 4 элемента.
Было 5 элементов, я удалил 1, стало 4 элемента
Ты пытаешься сказать что тебе нужно, или то что ты сделал?
если надо удалить, то берешь, и array[индекс элемента который нужно удалить] = nil
 

LazyRhoda

Известный
43
2
Что делать если после команды, скрипт крашится с ошибкой:
Ошибка:
(error)    found_object.lua: opcode '0B50' call caused an unhandled exception
stack traceback:
    [C]: in function 'sampGetObjectHandleBySampId'
    ...TA ARIZONA RP by Black Bones\moonloader\found_object.lua:3: in main chunk
[09:58:25.265603] (error)    found_object.lua: Script died due to an error. (01B0D99C)

И мой недо-код:
Lua:
local sf = require "lib.sampfuncs"

object_lamp = sampGetObjectHandleBySampId(2176)

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    sampRegisterChatCommand("ac", on_off)
    while true do
        wait(0)
        if enable then
            pX, pY, pZ = getCharCoordinates(PLAYER_PED)
            result, X, Y, Z = getObjectCoordinates(object_lamp)
            sampAddChatMessage("[test_checker] Пощёл поиск объекта!", color)
            if result == true then
                renderDrawLine(pX, pY, X, Y, 2.0, -1)
        else
            return
            end
        end
    end
end

function on_off()
    enable = not enable
end
 

madrasso

Потрачен
883
325
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Что делать если после команды, скрипт крашится с ошибкой:
Ошибка:
(error)    found_object.lua: opcode '0B50' call caused an unhandled exception
stack traceback:
    [C]: in function 'sampGetObjectHandleBySampId'
    ...TA ARIZONA RP by Black Bones\moonloader\found_object.lua:3: in main chunk
[09:58:25.265603] (error)    found_object.lua: Script died due to an error. (01B0D99C)

И мой недо-код:
Lua:
local sf = require "lib.sampfuncs"

object_lamp = sampGetObjectHandleBySampId(2176)

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    sampRegisterChatCommand("ac", on_off)
    while true do
        wait(0)
        if enable then
            pX, pY, pZ = getCharCoordinates(PLAYER_PED)
            result, X, Y, Z = getObjectCoordinates(object_lamp)
            sampAddChatMessage("[test_checker] Пощёл поиск объекта!", color)
            if result == true then
                renderDrawLine(pX, pY, X, Y, 2.0, -1)
        else
            return
            end
        end
    end
end

function on_off()
    enable = not enable
end
Вызываешь самповскую функцию до того, как самп становится доступным
 

Limonchek

Участник
85
7
Может кто сделать отключение анимации ломки для Evolve RP? Ну тип визуальную. На LUA
 

Pheonixxx

Потрачен
263
46
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

neverlane

t.me/neverlane00
Друг
1,010
1,165
Зачем там задержка? Еще и если cmdact будет false, то значение nop не поменяется
Он попросил чтобы каждые N сек менялось значение nop, вот для этого задержка. А cmdact это активация по команде, когда команда прописана то значение nop будет меняться
 

Pheonixxx

Потрачен
263
46
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

Limonchek

Участник
85
7
Как сделать проверку на цвет строки? Просто когда в объявлении пишут грузчики то скрипт срабатывает, нужно сделать проверку на цвет строки из чата тип белой на Evolve RP.

Lua:
    if text:match('Грузчики') then
        lua_thread.create(function()
          wait(1200)
          sampSendChat('Хорошо, выдвигаемся.')
        end)
    end
 

Logaan

Известный
80
15
Как через ракбот сесть в кар? Через дефолт команду задержка между посадкой в машину и на сиденье отсутствует, поэтому кикает