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

Frapsy

Известный
Проверенный
393
227
Ребят, хочу сделать скрипт, который будет рендерить текст в месте педа, где в него попала пуля
-46 это дигл
-10 это мка и тд
Вот скрин, 3д текст остается на некоторое время и пропадает
подскажите, что для этого всего нужно? с названиями функций, пжлст
над челиком это серверное отображение хп, мне нужно то что левее
Для рендера - https://blast.hk/wiki/lua:render
Для получения инфы об уроне, который наносишь лучше хуком sampev'a - onSendGiveDamage.
Чтобы отключить серверный показ дамага над бошкой(а это вроде как баблы тут, но это не точно) - хуком onPlayerChatBubble отключишь.
Как то так, но без гарантий.

Как подсчет отыгранного времени с возможностью вывода его в файл.
Считаешь время от старта скрипта в определенном моменте(например, когда подключило к серверу) до его завершения, когда скрипт завершает работу - записываешь данные в файл.
Lua:
local file = io.open('расположение файла', 'a+')
file:write('тут типо сессия за игру бла бла часов и бла бла минут') -- перенос через \n
file:flush()
file:close()
Вывод количества отыгранного времени проще простого, тебе лишь нужно сделать счетчик, а дальше все по маслу.

Посмотреть вложение 19405
Как сделать штуку по-типу этой в имгуи, где будет несколько категорий, при нажатии на которые будет меняться содержимое окна ниже.
Судя по картинке - тупо напичканы кнопки с sameine'нами, если тебе точно такое же надо - то по нажатию на кнопку присваивай переменной, например menu, значение 1,2,3,4 и т.д на каждую из кнопок., а потом чекай:
Lua:
if menu == 1 then bla bla
elseif  menu == 2 bla bla end
 

deddosouru

Смотрю аниме, служу Сатане
Друг
2,036
1,323
Как сделать подсчет того, сколько раз я ввел команду какую либо. Но при этом обязательным условием должно быть то, чтобы серверная команда тоже работала.
Например пишу /help. В счётчик +1 и открывается сноверный диалог.
хукаешь пакет отправки команды и там счетчик делаешь. по желанию добавляешь проверки
Lua:
sampAddChatMessage(sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))), -1)


Lua:
local var = 0

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('mn', mn)
    wait(-1)
end

function mn()
    var = var + 1
    sampSendChat('/mn')
    sampAddChatMessage(var, -1)
end
костыль
se.onSendCommand() для кого делали? ща бы команду регать чтобы считать колва отправок
шарит
Как подсчет отыгранного времени с возможностью вывода его в файл.
Например: /online- посмотреть сколько поиграл.
/writeo- записать в файл.
есть же вроде такое
 
  • Нравится
Реакции: wD.D159

#Daste [CHEATING TEAM]

Новичок
10
0
ребят, хелп. на выходе вместо ника игрока пишется свой ник.
Lua:
  {
    title = ' {9966cc}• {ffffff}За некорректную выдачу розыска',
    onclick = function(pam)
      sampSendChat("/d [LVPD] Офицер "..sampGetPlayerNickname(id):gsub('_', ' ').." получает предупреждение за неккоректную выдачу розыска.")
    end 
  },
 

trefa

3d print
Всефорумный модератор
2,107
1,264
ребят, хелп. на выходе вместо ника игрока пишется свой ник.
Lua:
  {
    title = ' {9966cc}• {ffffff}За некорректную выдачу розыска',
    onclick = function(pam)
      sampSendChat("/d [LVPD] Офицер "..sampGetPlayerNickname(id):gsub('_', ' ').." получает предупреждение за неккоректную выдачу розыска.")
    end
  },
Откуда переменую "id" получаешь?
 

#Daste [CHEATING TEAM]

Новичок
10
0
Откуда переменую "id" получаешь?
Lua:
  {
    title = ' {9966cc}• {ffffff}За некорректную выдачу розыска',
    onclick = function(pam)
      local id, dep = string.match(pam, '(%d+)%s*(%d*)')
      sampSendChat("/d [LVPD] Офицер "..sampGetPlayerNickname(id):gsub('_', ' ').." получает предупреждение за неккоректную выдачу розыска.")
    end
  },

с таким вариантом кода скрипт крашится с ошибкой.
 

trefa

3d print
Всефорумный модератор
2,107
1,264
Lua:
  {
    title = ' {9966cc}• {ffffff}За некорректную выдачу розыска',
    onclick = function(pam)
      local id, dep = string.match(pam, '(%d+)%s*(%d*)')
      sampSendChat("/d [LVPD] Офицер "..sampGetPlayerNickname(id):gsub('_', ' ').." получает предупреждение за неккоректную выдачу розыска.")
    end
  },

с таким вариантом кода скрипт крашится с ошибкой.
что содержит переменая "pam"
 

mixeq

Известный
67
8
Для рендера - https://blast.hk/wiki/lua:render
Для получения инфы об уроне, который наносишь лучше хуком sampev'a - onSendGiveDamage.
Чтобы отключить серверный показ дамага над бошкой(а это вроде как баблы тут, но это не точно) - хуком onPlayerChatBubble отключишь.
Как то так, но без гарантий.
да, спасибо
я про хук onSendGiveDamage знал, но не представляю как он работает
а как взять педа, его координату, ибо на этих координатах рендерить же нужно

а то что над челиком это вообще меня не интересует)
 

trefa

3d print
Всефорумный модератор
2,107
1,264
да, спасибо
я про хук onSendGiveDamage знал, но не представляю как он работает
а как взять педа, его координату, ибо на этих координатах рендерить же нужно

а то что над челиком это вообще меня не интересует)
- getAllChars()
- float positionX, float positionY, float positionZ = getCharCoordinates(Ped ped)
вики есть для этого
 

trefa

3d print
Всефорумный модератор
2,107
1,264
мля, далек от всей этой темы). можешь объяснить как сделать правильный код, чтобы на выходе выводился ник игрока, а не свой?
Откуда id игрока получаешь?

Как сделать таблицу в inicfg?
Сделать

Lua:
data.main.template[n]
вместо
Lua:
template_1 = '',
template_2 = '',
template_3 = '',
template_4 = '',
template_5 = '',
template_6 = '',
template_7 = '',
template_8 = '',
template_9 = '',
template_10 = '',
template_11 = '',
template_12 = '',
template_13 = '',
template_14 = '',
template_15 = '',
-
data.main.template_n
Lua:
data = {
main = {
template = {
"",
"",
"",
""
}}}
И в чём тут сложность?:thinking:
 

AnWu

https://t.me/anwublog
Всефорумный модератор
4,770
5,377
Как сделать таблицу в inicfg?
Сделать

Lua:
data.main.template[n]
вместо
Lua:
template_1 = '',
template_2 = '',
template_3 = '',
template_4 = '',
template_5 = '',
template_6 = '',
template_7 = '',
template_8 = '',
template_9 = '',
template_10 = '',
template_11 = '',
template_12 = '',
template_13 = '',
template_14 = '',
template_15 = '',
-
data.main.template_n
вместо иникфг использовать jsonencode & jsondecode с обычной таблицей
 

#Daste [CHEATING TEAM]

Новичок
10
0
Откуда id игрока получаешь?
вот функция
Lua:
function warn(pam)
  local id, dep = string.match(pam, '(%d+)%s*(%d*)')
  --if frac == 'FBI' then
    if dep == nil or id == nil then
      sampAddChatMessage("{9966CC}FBI Tools {FFFFFF}| Введите: /warn ID Департамент", -1)
      sampAddChatMessage("{9966CC}FBI Tools {FFFFFF}| 1 - LSPD | 2 - SFPD | 3 - LVPD",-1)
    end
    if id ~= nil and sampIsPlayerConnected(id) then
      if dep == "" or dep < "1" or dep > "3" then
        sampAddChatMessage("{9966CC}FBI Tools {FFFFFF}| Введите: /warn ID Департамент", -1)
        sampAddChatMessage("{9966CC}FBI Tools {FFFFFF}| 1 - LSPD | 2 - SFPD | 3 - LVPD",-1)
      elseif dep == "1" then
        lua_thread.create(function()
          submenus_show(warnmenu1, "{9966cc}FBI Tools {ffffff}| Warn Menu")
        end)     
      elseif dep == '2' then
        lua_thread.create(function()
          submenus_show(warnmenu2, "{9966cc}FBI Tools {ffffff}| Warn Menu")
        end) 
      elseif dep == '3' then
        lua_thread.create(function()
          submenus_show(warnmenu3, "{9966cc}FBI Tools {ffffff}| Warn Menu")
        end) 
      end
    end
--else
    --sampAddChatMessage("{9966CC}FBI Tools {ffffff}| Вы не сотрудник ФБР", -1)
--end
end
вот меню, при выборе пункта в котором, должно выходить сообщения с ником игрока id которого вписал.
Lua:
local warnmenu3 =
{
  {
    title = ' {9966cc}• {ffffff}За некорректную выдачу розыска',
    onclick = function()
      local _, id = sampGetPlayerIdByCharHandle(ped)
      sampSendChat("/d [LVPD] Офицер "..sampGetPlayerNickname(id):gsub('_', ' ').." получает предупреждение за неккоректную выдачу розыска.")
    end 
  },
end

при выборе пункта с таким вариантом меню, скрипт крашится
 

trefa

3d print
Всефорумный модератор
2,107
1,264
вот функция
Lua:
function warn(pam)
  local id, dep = string.match(pam, '(%d+)%s*(%d*)')
  --if frac == 'FBI' then
    if dep == nil or id == nil then
      sampAddChatMessage("{9966CC}FBI Tools {FFFFFF}| Введите: /warn ID Департамент", -1)
      sampAddChatMessage("{9966CC}FBI Tools {FFFFFF}| 1 - LSPD | 2 - SFPD | 3 - LVPD",-1)
    end
    if id ~= nil and sampIsPlayerConnected(id) then
      if dep == "" or dep < "1" or dep > "3" then
        sampAddChatMessage("{9966CC}FBI Tools {FFFFFF}| Введите: /warn ID Департамент", -1)
        sampAddChatMessage("{9966CC}FBI Tools {FFFFFF}| 1 - LSPD | 2 - SFPD | 3 - LVPD",-1)
      elseif dep == "1" then
        lua_thread.create(function()
          submenus_show(warnmenu1, "{9966cc}FBI Tools {ffffff}| Warn Menu")
        end)   
      elseif dep == '2' then
        lua_thread.create(function()
          submenus_show(warnmenu2, "{9966cc}FBI Tools {ffffff}| Warn Menu")
        end)
      elseif dep == '3' then
        lua_thread.create(function()
          submenus_show(warnmenu3, "{9966cc}FBI Tools {ffffff}| Warn Menu")
        end)
      end
    end
--else
    --sampAddChatMessage("{9966CC}FBI Tools {ffffff}| Вы не сотрудник ФБР", -1)
--end
end
вот меню, при выборе пункта в котором, должно выходить сообщения с ником игрока id которого вписал.
Lua:
local warnmenu3 =
{
  {
    title = ' {9966cc}• {ffffff}За некорректную выдачу розыска',
    onclick = function()
      local _, id = sampGetPlayerIdByCharHandle(ped)
      sampSendChat("/d [LVPD] Офицер "..sampGetPlayerNickname(id):gsub('_', ' ').." получает предупреждение за неккоректную выдачу розыска.")
    end
  },
end

при выборе пункта с таким вариантом меню, скрипт крашится
id локальная переменная, делай её глобальной
 
  • Нравится
Реакции: AnWu

AnWu

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