Вопросы по 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
Ребят, можно ли сделать так, чтобы серверный 3D текст был виден на любом расстоянии?
 

savvin

Известный
412
143
Ребят, можно ли сделать так, чтобы серверный 3D текст был виден на любом расстоянии?
Lua:
local sampev = require 'lib.samp.events'

function sampev.onCreate3DText(id, color, position, distance, testLOS, attachedPlayerId, attachedVehicleId, text)
    --[[
    
    нужный id текстдрава отловишь через print(id, text)
    
    ]]--
    
    if id == твой id then
        return {id, color, position, 200.0, testLOS, attachedPlayerId, attachedVehicleId, text}
    end
end
 

Eugene Crabs

Активный
544
30
Lua:
local sampev = require 'lib.samp.events'

function sampev.onCreate3DText(id, color, position, distance, testLOS, attachedPlayerId, attachedVehicleId, text)
    --[[
  
    нужный id текстдрава отловишь через print(id, text)
  
    ]]--
  
    if id == твой id then
        return {id, color, position, 200.0, testLOS, attachedPlayerId, attachedVehicleId, text}
    end
end
Не, не текстдрав. 3D текст, тип того что бывает на респах РП серверов

А, балин. Щас чекну, спасибо
 

Rjx13

Известный
Проверенный
224
160
Не, не текстдрав. 3D текст, тип того что бывает на респах РП серверов

А, балин. Щас чекну, спасибо
А если глаза мылом промыть и посмотреть еще раз, что хукается onCreate3DText?
Тебе все верно ответили
 
  • Нравится
Реакции: savvin

Rjx13

Известный
Проверенный
224
160
Уже промыл, но все равно с таким не работал и хз что делать
Lua:
local sampev = require('lib.samp.events')

function sampev.onCreate3DText(id, color, position, distance, testLOS, attachedPlayerId, attachedVehicleId, text)
        if text:find('text') then
            return {id, color, position, 200.0, testLOS, attachedPlayerId, attachedVehicleId, text}
        end
end
 
  • Нравится
Реакции: Eugene Crabs

BlackGoblin

Известный
520
215
Как сделать команду рабочей только при определенном условии, с учетом того, что она серверная? И еще, чтобы она работала только на определенного id. Т.е если я ввожу, например /id 111, то выводило "Этот человек пидорас", а если /id 123, То исполняло бы серверную команду
 

ШPEK

Известный
1,476
523
Как сделать команду рабочей только при определенном условии, с учетом того, что она серверная? И еще, чтобы она работала только на определенного id. Т.е если я ввожу, например /id 111, то выводило "Этот человек пидорас", а если /id 123, То исполняло бы серверную команду
events.onSendCommand(text), а дальше сам
 
  • Нравится
Реакции: BlackGoblin

savvin

Известный
412
143
как получить ид объекта в определенном радиусе?
Lua:
for _, OBJECT_HANDLE in ipairs(getAllObjects()) do
    local x, y, z = getCharCoordinates(PLAYER_PED)
    local ox, oy, oz = getObjectCoordinates(OBJECT_HANDLE)
   
    if getDistanceBetweenCoords3d(x, y, z, ox, oy, oz) <= 30.0 then -- заменишь на свое
        local objectId = sampGetObjectSampIdByHandle(OBJECT_HANDLE)
        print(objectId)
    end
end
 
  • Нравится
Реакции: Wilson+

Nigel Tarrega

Новичок
4
0
Всем привет! Прошу помощи, в луа скриптах полный ноль.
Нужна переменная для ScriptPatrol которая считывает название ранга из организации из /members 1. (например, ранг 1 = Рядовой) - $myrang$ $targetrang$ - ранг выбранной цели.
Например при обращении к кому либо - например: Товарищ Прапорщик Пупкин, разрешите обратиться, Рядовой Васильев
Где прапорщик - $targetrang$,
Где Рядовой - $myrang$
Готов заплатить за работу.
 

ufdhbi

Известный
Проверенный
1,456
861
Всем привет! Прошу помощи, в луа скриптах полный ноль.
Нужна переменная для ScriptPatrol которая считывает название ранга из организации из /members 1. (например, ранг 1 = Рядовой) - $myrang$ $targetrang$ - ранг выбранной цели.
Например при обращении к кому либо - например: Товарищ Прапорщик Пупкин, разрешите обратиться, Рядовой Васильев
Где прапорщик - $targetrang$,
Где Рядовой - $myrang$
Готов заплатить за работу.
Напиши в вк https://vk.com/gfrtgf
 

Domino

Участник
326
15
Как сделать чёрный список из ников, которые будут в скрипте и если зайдёт игрок с этим ником, то скрипт не будет работать.
 

ufdhbi

Известный
Проверенный
1,456
861
Как сделать чёрный список из ников, которые будут в скрипте и если зайдёт игрок с этим ником, то скрипт не будет работать.
Lua:
local blackList = {'name1', 'name2'}

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    local r, id = sampGetPlayerIdByCharHandle(playerPed)
    if r then
        local name = sampGetPlayerNickname(id)
        if table.concat(blackList, " "):find(name) then thisScript():unload() end
    end
    while true do
        wait(0)
    end
end