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

Удалённый пользователь 147808

Гость
Как произвести выстрел?
 

#Northn

Pears Project — уже запущен!
Всефорумный модератор
2,650
2,535
Lua:
    function event.onSendCommand(cmd)
        idBan, DaysBan = string.match(cmd, "^%/ban (%d+)%s+(%d+)")
        if idBan and DaysBan then
            idBan = tonumber(idBan)
            DaysBan = tonumber(DaysBan)
                if sampIsPlayerConnected(idBan) and DaysBan <= 30 and DaysBan >= 1 then
                    lua_thread.create(function () wait(0); sampSendChat(string.format("/ans %d Для подачи жалобы сделайте скриншот наказания (F8).", idBan)) end)
                    return {cmd}
                end
        end
    end

Нужно что бы строчка из строки 7 отправлялась перед отправкой команды, не пойму почему это не так

Lua:
    function event.onSendCommand(cmd)
        idBan, DaysBan = string.match(cmd, "^%/ban (%d+)%s+(%d+)")
        if idBan and DaysBan then
            idBan = tonumber(idBan)
            DaysBan = tonumber(DaysBan)
                if sampIsPlayerConnected(idBan) and DaysBan <= '30' and DaysBan >= '1' then
                    lua_thread.create(function () sampSendChat(string.format("/ans %d Для подачи жалобы сделайте скриншот наказания (F8).", idBan)) wait(120) end)
                    return {cmd}
                end
        end
    end
 

deddosouru

Смотрю аниме, служу Сатане
Друг
2,036
1,323
Что нужно для работы switchCarSiren(Vehicle car, bool siren)?
Как отнять 7 часов ?
Lua:
sampSendChat('/do Время на часах: '..os.date('%H:%M'))
нашел в гугле крч. спешал фо ю

Lua:
local dt = os.date("*t"); dt.min = dt.min + 120
local dt = os.date("*t", os.time(dt))
print(dt.hour, dt.min)
+120 это +2 часа
Можно ли реализовать дисконнект с последующей надписью "Server closed the connection", а не "The server is restarting..."?
GAMESTATE_NONE = 0
GAMESTATE_WAIT_CONNECT = 1
GAMESTATE_AWAIT_JOIN = 2
GAMESTATE_CONNECTED = 3
GAMESTATE_RESTARTING = 4
GAMESTATE_DISCONNECTED = 5
Lua:
sampSetGamestate(5)
 

Ken Block

Известный
432
31
Lua:
local memory = require "memory"
local vehptr = nil
local key = require "vkeys"


function main()
  if not isSampfuncsLoaded() or not isSampLoaded() then return end
  while not isSampAvailable() do wait(100) end
  while true do
    wait(0)
    local car = storeCarCharIsInNoSave(PLAYER_PED)
    local state = isCarSirenOn(car)
    if isCharInAnyCar(PLAYER_PED) then
      if isKeyJustPressed(key.VK_F12) then
        if state == true then
          switchCarSiren(car, false)
        else
          switchCarSiren(car, true)
        end
      end
      if doesVehicleExist(car) then
        vehptr = getCarPointer(storeCarCharIsInNoSave(PLAYER_PED)) + 1440
        while isCarSirenOn(car) and isCharInAnyCar(PLAYER_PED) do
          callMethod(7086336, vehptr, 2, 0, 0, 0)
          callMethod(7086336, vehptr, 2, 0, 1, 1)
          wait(250)
          callMethod(7086336, vehptr, 2, 0, 0, 1)
          callMethod(7086336, vehptr, 2, 0, 1, 0)
          wait(250)
        end
        callMethod(7086336, vehptr, 2, 0, 0, 0)
        callMethod(7086336, vehptr, 2, 0, 1, 0)
      end
    end
  end
end

Почему это говно только включает сирену ?
 

deddosouru

Смотрю аниме, служу Сатане
Друг
2,036
1,323
Флудит в чат 5 строк как исправить?
Lua:
  while true do
    wait(0)
        weapon = getCurrentCharWeapon(playerPed)
        if isKeyDown(key.VK_Q) then
      if weapon == 0 then
                sampSendChat("Сука щас отпизжу")
      end
    end
  end
end
ну, замени Down на JustPressed например
 
  • Нравится
Реакции: KH9I3b_MuJIOCJIABCKu

Frapsy

Известный
Проверенный
393
227
Скинь всю функцию.


Проверка всех игроков
Lua:
function checkBlackList()
    downloadUrlToFile(url, file) -- Скачиваем файл.
    wait(3000) -- Ждём 3 секунды.
    local tobl = getWorkingDirectory() .. '/blacklist.txt' -- Местонахождение файла blacklist.txt.
    local checkerfiler = io.open(tobl, 'r') -- Открываем файл в режиме чтения.
    if checkerfiler == nil then sampAddChatMessage('[AutoMVD] Не удалось обновить Черный Список.', 0xFF0000) -- Если файл не открылся, то выводит в чат сообщение.
    else -- Если файл открылся
        for lines in checkerfiler:lines() do -- Проверяем каждую строку файла
            for id = 0, 1000 do -- Перебираем всех игроков.
                if sampIsPlayerConnected(id) then -- Если игрок подключён.
                    local nick = sampGetPlayerNickname(id) -- Выводим игрока ник.
                    if lines == nick then -- Если строка с ником будет похож на ник, то выводит в чат сообщение.
                        sampAddChatMessage('[AutoMVD] '..nick..' НАХОДИТСЯ в Черном Списке!', 0xFF0000)
                    else -- Если строка с ником НЕ будет похож на ник, то проверяем по истории ника.
                        sampSendChat('/history '..nick) -- Пишет в чат команду /history
                        local dial = sampGetDialogText() -- Получаем текст диалога.
                        if string.find(dial, lines) or string.find(dial, string.gsub(lines, '_', ' ')) then -- Если в тексте диалога есть ник со строки lines, то выводит в чат.
                            sampAddChatMessage('[AutoMVD] '..nick..' НАХОДИТСЯ в Черном Списке!', 0xFF0000)
                        end
                    end
                end
            end
        end
    end
end
Проверка одного игрока [ по ID игрока ]
Lua:
function checkBlackList(id)
    downloadUrlToFile(url, file) -- Скачиваем файл.
    wait(3000) -- Ждём 3 секунды.
    local tobl = getWorkingDirectory() .. '/blacklist.txt' -- Местонахождение файла blacklist.txt.
    local checkerfiler = io.open(tobl, 'r') -- Открываем файл в режиме чтения.
    if checkerfiler == nil then sampAddChatMessage('[AutoMVD] Не удалось обновить Черный Список.', 0xFF0000) -- Если файл не открылся, то выводит в чат сообщение.
    else -- Если файл открылся
        for lines in checkerfiler:lines() do -- Проверяем каждую строку файла
            if sampIsPlayerConnected(id) then -- Если игрок подключён.
                local nick = sampGetPlayerNickname(id) -- Выводим игрока ник.
                if lines == nick then -- Если строка с ником будет похож на ник, то выводит в чат сообщение.
                    sampAddChatMessage('[AutoMVD] '..nick..' НАХОДИТСЯ в Черном Списке!', 0xFF0000)
                else -- Если строка с ником НЕ будет похож на ник, то проверяем по истории ника.
                    sampSendChat('/history '..nick) -- Пишет в чат команду /history
                    local dial = sampGetDialogText() -- Получаем текст диалога.
                    if string.find(dial, lines) or string.find(dial, string.gsub(lines, '_', ' ')) then -- Если в тексте диалога есть ник со строки lines, то выводит в чат.
                        sampAddChatMessage('[AutoMVD] '..nick..' НАХОДИТСЯ в Черном Списке!', 0xFF0000)
                    end
                end
            end
        end
    end
end
Чет как то это.. Решил попробовать глянуть как он найдет чела первого в текстовике, в итоге ловлю сия ответ: Imgur(https://imgur.com/a/m6PreA9)
Помимо этого, даже если игрока нет в списке - такая же сита. Собсна, как быть и что делать, как чинить?
 

imring

Ride the Lightning
Всефорумный модератор
2,362
2,545
Чет как то это.. Решил попробовать глянуть как он найдет чела первого в текстовике, в итоге ловлю сия ответ: Imgur(https://imgur.com/a/m6PreA9)
Помимо этого, даже если игрока нет в списке - такая же сита. Собсна, как быть и что делать, как чинить?
добавляй задержку.
 

russia228

Новичок
29
0
помомгите пожалуйста, дело в том что у меня сбив.lua забинжен на кнопку R (англ) , но когда я хочу что то написать в чат использовав эту кнопку то у меня срабатывает сбив. кто может помочь в этом?? Чтобы я что то писал в чат у меня не было использования аптеки

Lua:
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do wait(0)
        if isKeyJustPressed(0x52) then
            sampSendChat("/anim 1")
            sampSendChat("/healme")
            setVirtualKeyDown(0x46,true)
            wait(150)
            setVirtualKeyDown(0x46,false)
            act = false
        end
    end
end
 

#Northn

Pears Project — уже запущен!
Всефорумный модератор
2,650
2,535
помомгите пожалуйста, дело в том что у меня сбив.lua забинжен на кнопку R (англ) , но когда я хочу что то написать в чат использовав эту кнопку то у меня срабатывает сбив. кто может помочь в этом??

Lua:
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do wait(0)
        if isKeyJustPressed(0x52) then
            sampSendChat("/anim 1")
            sampSendChat("/healme")
            setVirtualKeyDown(0x46,true)
            wait(150)
            setVirtualKeyDown(0x46,false)
            act = false
        end
    end
end
Lua:
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do wait(0)
        if isKeyJustPressed(0x52) and not sampIsChatInputActive() and not isSampfuncsConsoleActive() and not sampIsDialogActive() then
            sampSendChat("/anim 1")
            sampSendChat("/healme")
            setVirtualKeyDown(0x46,true)
            wait(150)
            setVirtualKeyDown(0x46,false)
            act = false
        end
    end
end