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

AnWu

https://t.me/anwublog
Всефорумный модератор
4,761
5,368
Как сделать рандом? (в коде указал где именно)

Lua:
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    sampAddChatMessage('Скрипт перегружен.', -1)
    sampRegisterChatCommand("drp_account", cmd_bot)
    sampRegisterChatCommand("myo", myo)

    local saveX = {}
    local saveY = {}
    local saveZ = {}
    while true do
        wait(0)
        if isPlayerPlaying(playerHandle) and enabled then
            wait(1000)
            sampAddChatMessage('', -1)
            myo()
            enabled = false
        end
        if isPlayerPlaying(playerHandle) and goto1 then
            BeginToPoint(1762.1155, -1897.2990, 13.5626, 1.000000, -255, true) -- Вот тут, чтобы было несколько вариантов координат.
            goto1 = false
        end
        if isPlayerPlaying(playerHandle) and goto2 then
            BeginToPoint(1153.9458, -1769.3433, 16.5938, 1.000000, -255, true) -- Вот тут, чтобы было несколько вариантов координат.
            goto2 = false
        end
        if isPlayerPlaying(playerHandle) and goto3 then
            BeginToPoint(-1969.0641, 159.2166, 27.6875, 1.000000, -255, true) -- Вот тут, чтобы было несколько вариантов координат.
            goto3 = false
        end
        if isPlayerPlaying(playerHandle) and goto4 then
            BeginToPoint(2850.0349, 1290.9664, 11.3906, 1.000000, -255, true) -- Вот тут, чтобы было несколько вариантов координат.
            goto4 = false
        end
    end
end
Пзц ты садист. Зачем isPlayerPlaying столько раз?
Создай таблицу, и через math.random(1, #tablica) делай случайную выборку координат
 

f0rtrix

Известный
208
15
Почему при
Lua:
 return {0x008080, '{4682B4} Ошибка! У Вас нет с собой аптечек'}
У меня "0x008080" принимает один цвет и в чат он темный, а
Lua:
 sampAddChatMessage("{4682B4} Test", 0x008080)
А тут другой
В чом прекол? :D
 

AnWu

https://t.me/anwublog
Всефорумный модератор
4,761
5,368
Почему при
Lua:
 return {0x008080, '{4682B4} Ошибка! У Вас нет с собой аптечек'}
У меня "0x008080" принимает один цвет и в чат он темный, а
Lua:
 sampAddChatMessage("{4682B4} Test", 0x008080)
А тут другой
В чом прекол? :D
Разные форматы, первый 0xAARRGGBB, второй 0xRRGGBBAA
 
  • Нравится
Реакции: f0rtrix

Aniki

🐰
Администратор
1,228
1,558
Почему оно не хочет работать?
Надо чтобы в случае если нету args, или если нету reason то оно возвращало sampAddChatMessage.
Lua:
function awarn(args)
  if #args > 0 then
    id, reason = args:match('(%d+)%s+(.*)')
    elseif reason ~= nil then
      sampSendChat("a /warn "..id.." "..reason)
    else
    sampAddChatMessage("{FFFFFF}Используйте /awarn [id] [причина].", 0x6C519A)
  end
end

пробовал еще так, тут в любом случае возвращает sampAddChatMessage

Lua:
function awarn(args)
  if #args < 0 or reason == nil then
    sampAddChatMessage(" {FFFFFF}Используйте /awarn [id] [причина].", 0x6C519A)
  else
    id, reason = args:match('(%d+)%s+(.*)')
    sampSendChat("a /warn "..id.." "..reason)
  end
end

Аргументов не может быть меньше нуля + важно все делать по порядку
Lua:
function awarn(args)
  local id, reason = args:match('(%d+)%s+(.*)')
  if #args == 0 or not id or not reason then
    sampAddChatMessage(" {FFFFFF}Используйте /awarn [id] [причина].", 0x6C519A)
  else
    sampSendChat("a /warn "..id.." "..reason)
  end
end

Ну тут можно обойтись и без #args == 0
 
  • Нравится
Реакции: Patrickkk

AnWu

https://t.me/anwublog
Всефорумный модератор
4,761
5,368
xDDD

Я попробовал, но не пашет, посмотри пожалуйста:
Lua:
local goto1 = {
    1753.5594, -1884.9158, 13.5571,
    1752.9579, -1906.0095, 13.5646
}

        if isPlayerPlaying(playerHandle) and goto1 then
            BeginToPoint(goto1[math.random(1, #goto1)], 0.700000, -255, true)
            goto1 = false
        end
Lua:
local goto1 = {
    {1753.5594, -1884.9158, 13.5571},
    {1752.9579, -1906.0095, 13.5646}
}

        if isPlayerPlaying(playerHandle) and goto1 then
            local rm = goto1[math.random(1, #goto1)]
            BeginToPoint(rm[1], rm[2], rm[3], 0.700000, -255, true)
            goto1 = false
        end
 

#Northn

Pears Project — уже запущен!
Всефорумный модератор
2,650
2,535
проблемка при скачивании скриптом новой версии файла с дропбокс(прямая ссылка) скачивает html страницы а не сам файл как можно исправить?

Представим такую ссылку:
Dropbox - pHelpFedRozisk.json(https://www.dropbox.com/s/ozzou2g10smzjmz/pHelpFedRozisk.json?dl=0)

Что-бы через неё можно было скачивать информацию нормально, чтобы не качался сайт а именно сам файл:
https://dl.dropboxusercontent.com/s/ozzou2g10smzjmz/pHelpFedRozisk.json?dl=0
 
Последнее редактирование:
  • Нравится
Реакции: KH9I3b_MuJIOCJIABCKu

AnWu

https://t.me/anwublog
Всефорумный модератор
4,761
5,368
проблемка при скачивании скриптом новой версии файла с дропбокс(прямая ссылка) скачивает html страницы а не сам файл как можно исправить?
Так не прямая ссылка же значит. Прямая это на сам lua / luac файл. А html что ты получаешь это редирект на файл.
 
  • Нравится
Реакции: KH9I3b_MuJIOCJIABCKu
У

Удалённый пользователь 147808

Гость
Работа в свернутом режиме.
Как на lua сделать грубо говоря работу в несколько окон.
В скрипте хук, как я понял у него есть буфер очереди, который выполняется сразу тогда, когда я снимаю игру с паузы
 

Adventurer

Известный
151
69
Работа в свернутом режиме.
Как на lua сделать грубо говоря работу в несколько окон.
В скрипте хук, как я понял у него есть буфер очереди, который выполняется сразу тогда, когда я снимаю игру с паузы
Работа в свернутом режиме:
Описание: работа в свернутом режиме(необходимо перевести игру в оконный режим и не ставить на паузу)
Lua:
function WorkInBackground(work)
    local memory = require 'memory'
    if work then -- on
        memory.setuint8(7634870, 1)
        memory.setuint8(7635034, 1)
        memory.fill(7623723, 144, 8)
        memory.fill(5499528, 144, 6)
    else -- off
        memory.setuint8(7634870, 0)
        memory.setuint8(7635034, 0)
        memory.hex2bin('5051FF1500838500', 7623723, 8)
        memory.hex2bin('0F847B010000', 5499528, 6)
    end
end

Работа нескольких окон:
Lua:
imgui.Process = окно.v or окно.v
у меня это выглядит так:
Lua:
imgui.Process = hud_window.v or main_window.v or main_menu.v or player_info.v or depmenu.v or sobmenu.v
 

Ken Block

Известный
432
31
Как сделать шоб не флудило в консоль ?
Lua:
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand("did", DialogID)
    while true do
        wait(0)
        Did = sampGetCurrentDialogId()
        print(string.format("Dialog ID: %s", Did))
    end
end