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

Eugene Crabs

Активный
544
30
Может при запуске скрипта перебирать всех игроков и проверять у них аттачи?
По моим данным нельзя проверить, прикреплено ли что-то к игроку

Я уже решал проблему через isObjectAttached, но там жесточайший костыль на 20 строк с тремя вытекающими. А мне бы просто узнать, к какому персонажу прикреплен объект
 

Receiver

leet-cheats 👑
Модератор
645
957
По моим данным нельзя проверить, прикреплено ли что-то к игроку

Я уже решал проблему через isObjectAttached, но там жесточайший костыль на 20 строк с тремя вытекающими. А мне бы просто узнать, к какому персонажу прикреплен объект
Если тебе нужно обновить зону стрима, то может это поможет.
 
  • Нравится
Реакции: Eugene Crabs

pavl1nio

Участник
95
13
Lua:
function main()
    sampRegisterChatCommand("probiv", function()
          goKeyPressed(116)
          wait(5000)
    end)
end
Привет, хотел написать луа, который будет зажимать F5 по команде на 5 секунд, помогите оформить )0)
 

Receiver

leet-cheats 👑
Модератор
645
957
Lua:
function main()
    sampRegisterChatCommand("probiv", function()
          goKeyPressed(116)
          wait(5000)
    end)
end
Привет, хотел написать луа, который будет зажимать F5 по команде на 5 секунд, помогите оформить )0)
Lua:
function main()
    sampRegisterChatCommand("probiv", function()
          setVirtualKeyDown(116, true)
          wait(5000)
setVirtualKeyDown(116, false)
    end)
end
 

PoundFoolish

Участник
81
1
у меня вот так за правильность не ручаюсь но все работает
код:
airportls = isCharInArea2d(PLAYER_PED, 2125, -2434, 2111, -2390, true)
airportsf = isCharInArea2d(PLAYER_PED, -1251, -83, -1210, -89, true)
airportlv = isCharInArea2d(PLAYER_PED, 1590 , 1650, 1630 , 1656, true)
    if airportls or airportsf or airportlv then
    sampProcessChatInput("/v")
    wait(3000)
    end
Ped ped хендл персонажа игрока
float cornerAX первая X координата
float cornerAY первая Y координата
float cornerBX вторая X координата
float cornerBY вторая Y координата
bool sphere поиск в сфере

А почему тут 4 координаты?
 

Smeruxa

smeruxa.ru
Проверенный
1,413
757
Ped ped хендл персонажа игрока
float cornerAX первая X координата
float cornerAY первая Y координата
float cornerBX вторая X координата
float cornerBY вторая Y координата
bool sphere поиск в сфере

А почему тут 4 координаты?
от и до ищет в 2д пространстве..
 
  • Нравится
Реакции: sep и PoundFoolish

rqrq

Новичок
14
0
Не понимаю, почему мне выкидывает ошибку?

error:
[ML] (error) DA 1.0: opcode '0137' call caused an unhandled exception
stack traceback:
    [C]: in function 'isCarModel'
    F:\Rockstar Games\GTA San Andreas\moonloader\DA.lua:15: in function <F:\Rockstar Games\GTA San Andreas\moonloader\DA.lua:7>
[ML] (error) DA 1.0: Script died due to an error. (1C5BA4DC)


code:
function main()
        if not isSampLoaded() and not isSampfuncsLoaded() then return end
        while not isSampAvailable() do wait(100) end
        sampAddChatMessage("Script loaded!", 0x61ff00)
        while true do
            if isCharInAnyCar(PLAYER_PED) then --проверяем находится ли игрок в авто
                --sampAddChatMessage("Игрок в машине!", 0x61ff00)
                local car = storeCarCharIsIn(PLAYER_PED)
                if not isCarModel(car, 400) then
                    sampAddChatMessage("Yes!!", 0x61ff00)
                else
                    sampAddChatMessage("No!", 0x61ff00)
                end
            end
            wait(0)
        end
end
 

chapo

tg/inst: @moujeek
Модератор
9,074
12,037
Не понимаю, почему мне выкидывает ошибку?

error:
[ML] (error) DA 1.0: opcode '0137' call caused an unhandled exception
stack traceback:
    [C]: in function 'isCarModel'
    F:\Rockstar Games\GTA San Andreas\moonloader\DA.lua:15: in function <F:\Rockstar Games\GTA San Andreas\moonloader\DA.lua:7>
[ML] (error) DA 1.0: Script died due to an error. (1C5BA4DC)


code:
function main()
        if not isSampLoaded() and not isSampfuncsLoaded() then return end
        while not isSampAvailable() do wait(100) end
        sampAddChatMessage("Script loaded!", 0x61ff00)
        while true do
            if isCharInAnyCar(PLAYER_PED) then --проверяем находится ли игрок в авто
                --sampAddChatMessage("Игрок в машине!", 0x61ff00)
                local car = storeCarCharIsIn(PLAYER_PED)
                if not isCarModel(car, 400) then
                    sampAddChatMessage("Yes!!", 0x61ff00)
                else
                    sampAddChatMessage("No!", 0x61ff00)
                end
            end
            wait(0)
        end
end
попробуй 8 строку заменить на Vehicle car = storeCarCharIsInNoSave(Ped ped)
 
  • Нравится
Реакции: rqrq

sep

Известный
681
77
Ped ped хендл персонажа игрока
float cornerAX первая X координата
float cornerAY первая Y координата
float cornerBX вторая X координата
float cornerBY вторая Y координата
bool sphere поиск в сфере

А почему тут 4 координаты?

2д как у меня https://blast.hk/wiki/lua:ischarinarea2d
но можно и 3д https://blast.hk/wiki/lua:ischarinarea3d
 
  • Нравится
Реакции: PoundFoolish

f0rtrix

Известный
208
15
Никак не знаю как работать с БД игроков. Условно идентифицировать пользователей или разные фишки по типу своего чата и т.д. Можете подсказать где какие источники поизучать, может примеры есть какие то? Буду безумно благодарен
 

Hatiko

Известный
Проверенный
1,516
633
Никак не знаю как работать с БД игроков. Условно идентифицировать пользователей или разные фишки по типу своего чата и т.д. Можете подсказать где какие источники поизучать, может примеры есть какие то? Буду безумно благодарен
Раздел луа просто смотришь, качаешь чужие открытые скрипту, изучаешь их работу, изменяешь их, чтобы понять процессы. BH вики также в помощь,в шапке сайта есть ссылки. Темы гайды по луа, тема обсуждений.


почему если задержка 100 время на 20 минут отстает ?
а если 0 все верно
Не очень понятен вопрос/код.
Вообще у тебя время к переменной time присваивается в свободной области скрипта один раз, а событие чата вызывается произвольно при удачном совпадением шаблона. Вот у тебя событие срабатывает спустя 20 мин и получаешь этот результат.