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

Dmitriy Makarov

25.05.2021
Проверенный
2,500
1,131
как задать кд чего-то прямо в игре?
вот сам код:
Lua:
local game_keys = require 'game.keys'
activate = 0


function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    sampRegisterChatCommand("cmd", emulcmd)
     while true do
      wait(0)
       if activate == 1 then
         setVirtualKeyDown(17, true)
         wait(1000)
         setVirtualKeyDown(17, false)
       end
     end
end

function emulcmd()
   if activate == 0 then
    activate = 1
   else
       activate = 0
   end
end

пока что там каждую секунду нажимается клавиша атаки (ctrl) вроде
команда активации /cmd
как сделать так, чтоб кд нажатия клавиши можно было указать прямо в игре?
пример:
вводишь просто команду /cmd без цифр, скрипт пишет:
addChatMessage("Укажите кд нажатий в секундах")
а когда вводишь например /cmd 3, то каждые 3 секунды нажимается клавиша атаки (game key id 17)
 

Frapsy

Известный
Проверенный
393
227
Как pcall работает
Lua:
local res, sampev = pcall(require, 'lib.samp.events')
assert(res, 'Library SAMP Events not found')
как проверить, находится ли игрок в гангзоне
Собрать координаты, чтобы сделать огромный квадрат, через который сверять. Есесна эти коорды будут покрывать гангзону.
Юзай isCharInArea2d
Знать бы еще, почему конкретно выбивает ошибку, чтобы исправить ее.
Асинхронные не дружат с асинхронными, по этому, в случае чего - будет крашить скрипт с нелогичными причинами в логе и это никак не исправимо, за исключением каких-нить костылей
Я тебе пишу что, не нужно делать дохера функций с запросами, сделай одну и юзай для разных задач.
На каждый обработчик нужен свой запрос, то есть, отдельный вызов функции, а если это совместить в пару - будет крашить, пушо 1 активный + 1 сверху = краш, потому-что потому. Он об этом.
Попробую переключатель сделать просто.
Переведи запросы по типу автообновления и подобные мелочные - на другую сетевую функцию, а асинхронные юзай только тогда, когда хочешь избежать микрофриза в игре. Такие вот жертвы.
.
 

kotov

Участник
128
12
Как сделать надпись на весь экран, это не текстдрав и не текст луашный, это из стандартной гта
 

kotov

Участник
128
12
printStyledString, цвет как менять? Я видел такие же ток красные к примеру
 

штейн

Известный
Проверенный
1,003
688
Lua:
local game_keys = require 'game.keys'
kd = 1
activate = false

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    sampRegisterChatCommand("cmd", emulcmd)
    sampRegisterChatCommand("cmd2", cmd)
    while true do wait(0)
        if activate then
             setVirtualKeyDown(17, true)
             wait(kd * 1000)
             setVirtualKeyDown(17, false)
        end
    end
end

function emulcmd()
    activate = not activate
end

function cmd(param)
    if param ~= '' and type(param) == 'number' then
        kd = param
    else
        sampAddChatMessage("Укажите кд нажатий в секундах")
    end
end
 

Dmitriy Makarov

25.05.2021
Проверенный
2,500
1,131
Lua:
local game_keys = require 'game.keys'
kd = 1
activate = false

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    sampRegisterChatCommand("cmd", emulcmd)
    sampRegisterChatCommand("cmd2", cmd)
    while true do wait(0)
        if activate then
             setVirtualKeyDown(17, true)
             wait(kd * 1000)
             setVirtualKeyDown(17, false)
        end
    end
end

function emulcmd()
    activate = not activate
end

function cmd(param)
    if param ~= '' and type(param) == 'number' then
        kd = param
    else
        sampAddChatMessage("Укажите кд нажатий в секундах")
    end
end
спасибо большое

Lua:
local game_keys = require 'game.keys'
kd = 1
activate = false

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    sampRegisterChatCommand("cmd", emulcmd)
    sampRegisterChatCommand("cmd2", cmd)
    while true do wait(0)
        if activate then
             setVirtualKeyDown(17, true)
             wait(kd * 1000)
             setVirtualKeyDown(17, false)
        end
    end
end

function emulcmd()
    activate = not activate
end

function cmd(param)
    if param ~= '' and type(param) == 'number' then
        kd = param
    else
        sampAddChatMessage("Укажите кд нажатий в секундах")
    end
end
шото он кривой ;D
когда прописываю /cmd без цифр, то кд 1 секунда
а если /cmd2 то пишет мол укакзать кд, пишу /cmd2 3, то снова пишет
 

Di3

Участник
432
20
можно ли как то выполнять опр.действия пока игра на паузе
?