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

trefa

Известный
Всефорумный модератор
2,097
1,233
Зяблы, как можно вытащить текст из листайтема?
CdTSC.png

Надо вытащить заголовки всех listitem (1. Статистика 2. Список команд и т.д)
Готовых функций не нашёл, либ как таковых тоже
либо через хук, либо обычной функцией
Lua:
zstring text = sampGetDialogText()
 
  • Нравится
Реакции: Shamanije

checkdasound

Известный
Проверенный
963
407
Как можно реализовать получение ближайшего к прицелу игрока? Понятно, что в цикле надо получать координаты всех игроков, переводить в 2д и отмерять от центра экрана расстояние. Но как потом рассортировать их, чтобы скрипт понимал какой игрок ближе.
 

trefa

Известный
Всефорумный модератор
2,097
1,233
Как можно реализовать получение ближайшего к прицелу игрока? Понятно, что в цикле надо получать координаты всех игроков, переводить в 2д и отмерять от центра экрана расстояние. Но как потом рассортировать их, чтобы скрипт понимал какой игрок ближе.
сравнивать дистанцию от себя и до игроков
 

dmitri4

Известный
453
79
Как добавить текст в игнор
Например идет поиск 3D текста и далее он выводится в чат но иногда находит не тот текст (рядом друг с другом) так как можно добавить в игнор тот текст который мне не надо
 

petuch228

Новичок
82
2
Как проверить, что транспорт готов к "взаимодействию"? Например у меня есть onVehicleStreamIn, но иногда, когда я получаю хэндл тачки в нем, просто-напросто ничего не происходит (задержку не юзаю), а когда юзаю задержку в 2 секунды, то всё нормально
 

Aniki

🐰
Администратор
1,226
1,516
Как проверить, что транспорт готов к "взаимодействию"? Например у меня есть onVehicleStreamIn, но иногда, когда я получаю хэндл тачки в нем, просто-напросто ничего не происходит (задержку не юзаю), а когда юзаю задержку в 2 секунды, то всё нормально
Потому что когда к тебе приходит RPC onVehicleStreamIn собственно транспорт еще не существует, поэтому ты не можешь получить его хендл по айди. Чтобы его получить нормально, нужна хотя бы нулевая задержка, а проверить готовность можно с помощью doesVehicleExists(vehHandle)
Как добавить текст в игнор
Например идет поиск 3D текста и далее он выводится в чат но иногда находит не тот текст (рядом друг с другом) так как можно добавить в игнор тот текст который мне не надо
Нужно сделать корректное условие (например регулярное выражение) для нужной тебе 3д надписи
 
  • Нравится
Реакции: petuch228

Overseas

Новичок
16
1
Нужна help'a, думаю тут очень просто должно быть. Нужно что бы в то время когда я нахожусь в открытом чате, данные отыгровки не срабатывали. Помогите пожалуйста.

Lua:
script_name("AutoGun")
script_author("Nike Kenton")
script_version("v1.0")
require "lib.moonloader"

local key = VK_R
function main()
  if not isSampLoaded() and isSampAvailable() then return end
  while true do
    wait(0)
    if isKeyJustPressed(key) then
      weapon = getCurrentCharWeapon(playerPed)
      if weapon == 0 then
        sampSendChat('/me спрятал оружие')
      end
      if weapon == 1 then
        sampSendChat('/me достал с кармана кастет и надел его на правую руку')
      end
      if weapon == 4 then
        sampSendChat('/me незаметным движением руки достал с под ремня нож')
      end
   end
end
 

Aniki

🐰
Администратор
1,226
1,516
Нужна help'a, думаю тут очень просто должно быть. Нужно что бы в то время когда я нахожусь в открытом чате, данные отыгровки не срабатывали. Помогите пожалуйста.

Lua:
script_name("AutoGun")
script_author("Nike Kenton")
script_version("v1.0")
require "lib.moonloader"

local key = VK_R
function main()
  if not isSampLoaded() and isSampAvailable() then return end
  while true do
    wait(0)
    if isKeyJustPressed(key) then
      weapon = getCurrentCharWeapon(playerPed)
      if weapon == 0 then
        sampSendChat('/me спрятал оружие')
      end
      if weapon == 1 then
        sampSendChat('/me достал с кармана кастет и надел его на правую руку')
      end
      if weapon == 4 then
        sampSendChat('/me незаметным движением руки достал с под ремня нож')
      end
   end
end
Lua:
if isKeyJustPressed(key) and not sampIsChatInputActive() then
 
  • Нравится
Реакции: Overseas

JestkiyChel123

Новичок
7
0
Как определить цвет сообщения в чате самп ? В chatlog.txt смотрел, но там не все цвета отображаются. Пробывал ловить через событие onServerMessage(color, text), но там какие-то непонятные 10 цифр выдаёт параметр "color".
 

Bogach

Активный
558
27
Как определить цвет сообщения в чате самп ? В chatlog.txt смотрел, но там не все цвета отображаются. Пробывал ловить через событие onServerMessage(color, text), но там какие-то непонятные 10 цифр выдаёт параметр "color".
Эти 10 цифр, вроде бы, цвет в формат ARGB, если я не ошибаюсь.
 

ШPEK

Известный
1,476
525
Зяблы, как можно вытащить текст из листайтема?
CdTSC.png

Надо вытащить заголовки всех listitem (1. Статистика 2. Список команд и т.д)
Готовых функций не нашёл, либ как таковых тоже
если надо все строки то через string.gmatch("[^\r\n]+") ищи их
 

BARRY BRADLEY

Известный
711
176
Как вывести мой текст на скин или над головой игрок, то есть после ввода команды будет писать у всех игроков на скине текст, код если можно (я новичек). Зарание спасибо
 

trefa

Известный
Всефорумный модератор
2,097
1,233
Как вывести мой текст на скин или над головой игрок, то есть после ввода команды будет писать у всех игроков на скине текст, код если можно (я новичек). Зарание спасибо
Получаешь координаты персонажа в 3х мерном пространстве, переводишь их в 2х мерное (функция такая есть), рендеришь текст на координатах 2х мерного пространства, а ещё можно сделать центрирование текста.