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

EvilCoder

Участник
147
1
"moonloader/message.mp3" - это путь к mp3 файлу, укажи свой и будет тебе
Lua:
radio = bass.BASS_StreamCreateFile(false, "moonloader/message.mp3", 0, 0, 0)


Лучше же конечно в папке со скриптом держать звуковой файл
так у меня и указан к моему, который находится в moonloader. Но он почему то не воспроизводится при сообщении от администратора, как мне и нужно.
 

madrasso

Потрачен
883
324
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
так у меня и указан к моему, который находится в moonloader. Но он почему то не воспроизводится при сообщении от администратора, как мне и нужно.
мэйби потому, что ты загрузил либу бас в функции мэйн локально?
 
  • Нравится
Реакции: WebDim

AnWu

Guardian of Order
Всефорумный модератор
4,690
5,193
я не очень шарю в луа,можешь написать как это реализовать тут:
Код:
function test
--здесь надо начать игнорировать серверные сообщения
      sendOnfootSync (x, y, z)
--здесь надо перестать игнорировать серверные сообщения
end
такую логику невозможно реализовать, в одном кадре и разрешить и запретить принимать сообщения это глупо.
 

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,891
1,254
делал удаление всякой хуйни и мусора из чата вроде объяв и прочего кала, пробывал несколько способов:

Lua:
 function sampev.onServerMessage(color, text)
    if text:find('Объявление') then
       sampAddChatMessage("123", -1)
    end
end
Lua:
function sampev.onServerMessage(color, text)
 if string.find(text, "Объявление проверил:", 1, true) then
  return false
 end
end
Вторую функцию взял с одного гайда, у чела все норм работает и сообщения не выходят в чат, но у меня не работает ни одна из функций, в чем ошибка и как исправить?
В консоли сф ошибок никаких нет, скрипт норм грузится
 

штейн

Известный
Проверенный
1,001
687
Lua:
function getPlayersOnServer()
    local count = 0
    for i = 0, sampGetMaxPlayerId() do
        count = count + 1
    end
    return count
end
в чём смысл твоей функции? он вернет не кол-во игроков на сервере, ведь на сервере в онлайн 100 может находиться человек с 200-м id
хотя если добавить в цикл проверку на подключенность всё будет норм
Lua:
local count = 0
for i = 0, sampGetMaxPlayerId() do
    if sampIsPlayerConnected(i) then
        count = count + 1
    end
end
return count
 

EvilCoder

Участник
147
1
Почему у меня появляется новое окно с белым квадратиком по середине? Путь указал, Хелп)
Lua:
imgui.Image(texture_1, imgui.ImVec2(100, 100))
      imgui.SetNextWindowSize(texture_1, imgui.ImVec2(1200, 500), imgui.Cond.FirstUseEver)
 

Yuan

Участник
77
26
Почему у меня появляется новое окно с белым квадратиком по середине? Путь указал, Хелп)
Lua:
imgui.Image(texture_1, imgui.ImVec2(100, 100))
      imgui.SetNextWindowSize(texture_1, imgui.ImVec2(1200, 500), imgui.Cond.FirstUseEver)
Image это такой же объект как текст, чилды, переключатели и прочее, а не отдельное окно. Его нужно вставлять между Begin(...) и End().
 
  • Нравится
Реакции: EvilCoder

Musaigen

abobusnik
Проверенный
1,583
1,302
в чём смысл твоей функции? он вернет не кол-во игроков на сервере, ведь на сервере в онлайн 100 может находиться человек с 200-м id
хотя если добавить в цикл проверку на подключенность всё будет норм
Lua:
local count = 0
for i = 0, sampGetMaxPlayerId() do
    if sampIsPlayerConnected(i) then
        count = count + 1
    end
end
return count
Рад тому что ты научился ставить за других базовые проверки.
Как поймать ошибку request.get через pcall
Точно не уверен.
Lua:
local result, error_message = pcall(request.get(...))
if not result then print(error_message) end
 

Benya

Активный
145
44
делал удаление всякой хуйни и мусора из чата вроде объяв и прочего кала, пробывал несколько способов:

Lua:
 function sampev.onServerMessage(color, text)
    if text:find('Объявление') then
       sampAddChatMessage("123", -1)
    end
end
Lua:
function sampev.onServerMessage(color, text)
 if string.find(text, "Объявление проверил:", 1, true) then
  return false
 end
end
Вторую функцию взял с одного гайда, у чела все норм работает и сообщения не выходят в чат, но у меня не работает ни одна из функций, в чем ошибка и как исправить?
В консоли сф ошибок никаких нет, скрипт норм грузится

Попробуй такой вариант. Можно еще блокировать по цвету.

Lua:
local sampev = require 'lib.samp.events'

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do
        wait(0)
    end
end



function sampev.onServerMessage(color, message)
    if string.find(message, "Объявление проверил:") then
        return false
    end
end

Может кто дать исходник GM на lua с открытым кодом для изучения. Буду рад.
Держи, самый обычный GM
 

Вложения

  • GM by EvgeN 1137.lua
    1 KB · Просмотры: 11
  • Нравится
Реакции: paulohardy

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113
с прицеливанием на игрока?
да
вот код
Lua:
        local valid, ped = getCharPlayerIsTargeting(PLAYER_HANDLE)
        if valid and doesCharExist(ped) then
            local result, id = sampGetPlayerIdByCharHandle(ped)
            if result and isKeyJustPressed(VK_E) then
                local nick = sampGetPlayerNickname(id):gsub('_', ' ')
                sampSendChat('/me ударив '..nick..' по голове')
                wait(500)
                sampSendChat('/try вырубил '..nick..'')
end
надо чтобы отыгровка была такая, если в руке есть какое-то оружие
Lua:
/me ударив прикладом оружия (оружие которое в руке) '..nick..' по голове
если оружии нету (кулак), то отыгровка остается как есть
Lua:
/me ударив '..nick..' по голове
wait(500)
/try вырубил '..nick..'