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

knowfaq

Известный
10
0
Как сделать так, чтобы при входе в меню паузы таймер останавливался, а при выходе из паузы продолжал отсчитываться дальше? Пробовал с помощью isGamePaused, isPauseMenuActive - не пашет, но это я криворукий скорее всего просто. Еще, насколько я помню, script:pause() уже нету, поэтому я вообще хз как реализовать свою идею.
Буду очень благодарен если поможете

Lua:
local sampev = require "lib.samp.events"
local xCoord = 610
local yCoord = 435
local timerActive = false

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

    repeat
        wait(0)
    until sampIsLocalPlayerSpawned()
  
    wait(10000)
    sampAddChatMessage("Кд таймер запущен", -1)
    startMaskTimer()
end

function startMaskTimer()
    lua_thread.create(function()
        timerActive = true
        timer.bool = true
        timer.start_time = os.time()
        local offMaskTime = os.clock() * 1000 + 3000000
        sampTextdrawCreate(102, "00:00", xCoord, yCoord)
        while sampTextdrawIsExists(102) do
            local remainingTime = math.floor((offMaskTime - os.clock() * 1000 ) / 1000)
            local seconds = remainingTime % 60
            local minutes = math.floor(remainingTime / 60)
            if sampTextdrawIsExists(102) then
                if seconds >= 10 then
                    sampTextdrawSetString(102, minutes .. ":" .. seconds, xCoord, yCoord)
                else
                    sampTextdrawSetString(102, minutes .. ":0" .. seconds, xCoord, yCoord)
                end
                if minutes == 5 and seconds == 1 then
                    sampAddChatMessage("До кд осталось 5 минут!", -1)
                    wait(300)
                end
                if seconds < 0 or minutes < 0 then
                    sampTextdrawDelete(102)
                    sampAddChatMessage("Кд отыграно, +100 ключей ща будет", -1)
                    wait(300)
                end
            end
            wait(100)
        end
        timerActive = false
    end)
end
 
Последнее редактирование:

hajcm

Новичок
14
0
Raksamp!!

хочу сделать 24/7 бота фармера ларцов кар лакшери. нужно чтобы он каждые x часов : 50 минут по мск подключался к игре и летел на метку(это уже реализовано), а после того как находит надпись Вы получили ларец переходил бы в состояние отключения от сервера(но raksamp не закрывался)

Итог: мне нужно чтобы бот чекал время по МСК(или на пк) и каждые 50 минут каждого часа подключался к серверу, после ловли ларца он бы переходил в состояние: Отключён от сервера(НО ЧТОБЫ raksamp НЕ ЗАКРЫВАЛСЯ!!)
 

kyrtion

Известный
904
321
Raksamp!!

хочу сделать 24/7 бота фармера ларцов кар лакшери. нужно чтобы он каждые x часов : 50 минут по мск подключался к игре и летел на метку(это уже реализовано), а после того как находит надпись Вы получили ларец переходил бы в состояние отключения от сервера(но raksamp не закрывался)

Итог: мне нужно чтобы бот чекал время по МСК(или на пк) и каждые 50 минут каждого часа подключался к серверу, после ловли ларца он бы переходил в состояние: Отключён от сервера(НО ЧТОБЫ raksamp НЕ ЗАКРЫВАЛСЯ!!)
чтобы закрыть раксамп - exit()

откройте все спойлеры в документации раксамп лайт, и узнаешь
 

hajcm

Новичок
14
0
чтобы закрыть раксамп - exit()

откройте все спойлеры в документации раксамп лайт, и узнаешь
смотри, у меня есть переменная time = текущие минуты на моём пк ( os.date("%M") )
Мне нужно сделать чтобы он всё время проверял её, когда time == 50 он должен подключится к серверу(один раз, после подключения он не проверяет переменную)
Потом он летит на ловлю ларцов и ловит его(это уже реализовано и включается сразу при заходе на сервер)
После успешной ловли, то есть после нахождения надписи: Вам был добавлен предмет 'Concept Car Luxury'.
Он должен отключаться от сервера(НЕ ЗАКРЫВАТЬ РАКСАМП) и снова проверять переменную time
 

kultizdat.

Известный
131
10
Код:
if dialogId == 15039 and text:find("{ffffff}A:")then
        --{ffffff}A: Angel_Cartier ответил вам:          
        --{cccccc} Вы тут? Ответьте в /b
       
        local adm_name, adm_text = string.match(text, "{ffffff}A: (%w+_%w+) ответил вам:\n{cccccc} (.*)")
        sendTelegramNotification("Внимание! Вам написал администратор!\n\n"..tostring(adm_name).." - "..tostring(adm_text))
        print(tostring(adm_name))
        print(tostring(adm_text))
        sampSendDialogResponse(dialogId, 0, 0, nil)
        return false
    end

Почему может флудить?
При сообщении от админа льется флуд в телегу и в print()
 

chapo

чопа сребдс // @moujeek
Модератор
8,868
11,576
Код:
if dialogId == 15039 and text:find("{ffffff}A:")then
        --{ffffff}A: Angel_Cartier ответил вам:         
        --{cccccc} Вы тут? Ответьте в /b
      
        local adm_name, adm_text = string.match(text, "{ffffff}A: (%w+_%w+) ответил вам:\n{cccccc} (.*)")
        sendTelegramNotification("Внимание! Вам написал администратор!\n\n"..tostring(adm_name).." - "..tostring(adm_text))
        print(tostring(adm_name))
        print(tostring(adm_text))
        sampSendDialogResponse(dialogId, 0, 0, nil)
        return false
    end

Почему может флудить?
При сообщении от админа льется флуд в телегу и в print()
Может быть админ кидает несколько диалогов?
 

hajcm

Новичок
14
0
Может быть админ кидает несколько диалогов?
смотри, у меня есть переменная time = текущие минуты на моём пк ( os.date("%M") )
Мне нужно сделать чтобы он всё время проверял её, когда time == 50 он должен подключится к серверу(один раз, после подключения он не проверяет переменную)
Потом он летит на ловлю ларцов и ловит его(это уже реализовано и включается сразу при заходе на сервер)
После успешной ловли, то есть после нахождения надписи: Вам был добавлен предмет 'Concept Car Luxury'.
Он должен отключаться от сервера(НЕ ЗАКРЫВАТЬ РАКСАМП) и снова проверять переменную time
как это можно сделать?
 

kultizdat.

Известный
131
10
Может быть админ кидает несколько диалогов?

Может быть админ кидает несколько диалогов?
Я думал об этом, но мне кажется им нету смысла кидать по 30-40 диалогов..
В чате один и тот же айди диалога пишется
 

Вложения

  • Screenshot_2024-04-07-13-44-32-55_948cd9899890cbd5c2798760b2b95377.jpg
    Screenshot_2024-04-07-13-44-32-55_948cd9899890cbd5c2798760b2b95377.jpg
    565 KB · Просмотры: 12

hajcm

Новичок
14
0
что делает encoding? и нужен ли он если у меня стоит кодировка 1251?
 

hajcm

Новичок
14
0
1712488858591.png


Объясните мне дурачку, почему работает только одна клавиша? Я хотел сделать чтобы при нажатии q отключалось, а при нажатии e подключалось, а работает только одна из этих двух клавиш. Теперь вообще не воркает
 

Andrinall

Известный
702
518
Посмотреть вложение 236655

Объясните мне дурачку, почему работает только одна клавиша? Я хотел сделать чтобы при нажатии q отключалось, а при нажатии e подключалось, а работает только одна из этих двух клавиш. Теперь вообще не воркает
Как минимум потому, что sampSetGamestate не принимает строку...
1712489557840.png
 

hajcm

Новичок
14
0
1712495525895.png


Хотел сделать напоминание на покупку ларцов car luxury, но почему-то когда на компе становится 50 минут ничего не происходит. Что тут не так?
 

Fluffy1560

Активный
278
34
Посмотреть вложение 236678

Хотел сделать напоминание на покупку ларцов car luxury, но почему-то когда на компе становится 50 минут ничего не происходит. Что тут не так?
date = tonumber(os.date("%M")) сделай, сравнение строки и цифр у тебя, а так будет сравнение цифр только
 
  • Нравится
Реакции: hajcm