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

Patrickkk

Участник
162
19
Как сбиыать анимку? Я понимаю что нужно проигрывать другую, но не знаю функции.
 

ImPasha

Software Developer & System Administrator
Друг
1,789
2,136
Как сбиыать анимку? Я понимаю что нужно проигрывать другую, но не знаю функции.
Через sampSendChat другую анимку запустить попробуй

Как сбиыать анимку? Я понимаю что нужно проигрывать другую, но не знаю функции.
Либо так:
Lua:
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    requestAnimation("POOL") -- загрузка файла анимаций "POOL"
    taskPlayAnim(PLAYER_PED, "POOL_XLONG_SHOT", "POOL", 4.0, false, false, false, false, -1) -- Воспроизведение самой анимации "POOL_XLONG_SHOT"
    end
 

IZDATXXX

Известный
Проверенный
172
251
Использую следующий код для нахождения вертикального угла поворота камеры до цели:
Lua:
local pitch= fix(math.atan2(ped_z - cam_z, math.sqrt( math.pow(ped_x - cam_x, 2) + math.pow(ped_y - cam_y, 2))) + coefficent_x)
coefficent_x здесь всегда отрицательное, а fix() - функция нормализации угла.
Возникает проблема. Угол увеличивается при отдалении от цели и уменьшается при приближении к ней.
 

Shamanije

Известный
Друг
961
922
Как увеличить дальность видимости 3д текста?
Возвращать из события те же аргументы, но к distance добавить числовое значение , например 1000
Пример для тюрьмы advance rp
Lua:
local sampev = require 'lib.samp.events'
function sampev.onCreate3DText(id, color, pos, dist, LOS, attachedPlayerId, attachedVehicleId, text)
    if text:match('/k') then
        return {id, color, pos, 1488, LOS, attachedPlayerId, attachedVehicleId, text}
    end
end

Как получить координаты пикапа? Допустим надо получить координаты пикапа зеленого дома(1273)
Lua:
local sampev = require 'lib.samp.events'
function sampev.onCreatePickup(id, model, pickupType, pos.x, pos.y, pos.z)
    -- body
    if model == 1273 then
        sampAddChatMessage(pos.x .. ' ' .. pos.y .. ' ' .. pos.z, -1)
    end
end
 
  • Нравится
Реакции: DeMoN3D и LZTD

biscuitt

Известный
185
14
Как сделать, чтобы при наведении на какой то объект ИмГуи (Текст например) показывалась картинка. Убираешь мышку- пропадает.

Как у примеру в скрипте SA WIKI. Я знаю что там код открыт, но там совсем по другому реализовано.
 

Adventurer

Известный
151
69
Как сделать, чтобы при наведении на какой то объект ИмГуи (Текст например) показывалась картинка. Убираешь мышку- пропадает.

Как у примеру в скрипте SA WIKI. Я знаю что там код открыт, но там совсем по другому реализовано.
как картинки выводить - уже тебе писали

показ при наведении:
Lua:
imgui.Text('i cant fly')--допустим, будем проверять этот элемент
if imgui.IsItemHovered() then
--CODE // в реализации с текстовыми подсказками же, это уже идет так:
     imgui.BeginTooltip();
     imgui.TextUnformatted('text')
     imgui.EndTooltip()
end
теперь же, при наведении на текст «i can fly», будет показываться текст «text».
 
  • Нравится
Реакции: biscuitt и Patrickkk

lorgon

Известный
656
268
У меня есть строка и нужно записать в INI конфиг у примеру:
Код:
[1] Test1 peep
и мне надо каждый раз когда отправляю команду - надо добавь новую строку такого же типа
Код:
[1] Test1 peep
, что-бы получилось что в конфиг выглядит так
Код:
[1] Test1 peep
[2] Test2 peep
 

Hatiko

Известный
Проверенный
1,471
612
Можно ли получить оффсеты от sampGetServerSettingsPtr() настроек сервера для надписей ухода в афк и семей, чтобы настроить дальность их видимости. Если что это на АРЗрп
DhxnYIU.png