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

P3rsik

Активный
213
32
Lua:
function main()
    while not isSampAvailable() do wait(0) end

    local timer = os.time() - 120;
    while true do
        wait(0)
        if (os.time() - timer <= 120) then
            sampTextdrawCreate(font,"NarkoTimer:".. 120 - (os.time() - timer),550,50,0xFFFFFFFF, 0x90000000)
        end

        if isKeyJustPressed(VK_X) then
            sampSendChat("/usedrugs 20")
            timer = os.time();
        end

    end
end

When u press x then its start cooldown when u press x then it resets timer how to fix?
 

madrasso

Потрачен
883
324
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Lua:
function main()
    while not isSampAvailable() do wait(0) end

    local timer = os.time() - 120;
    while true do
        wait(0)
        if (os.time() - timer <= 120) then
            sampTextdrawCreate(font,"NarkoTimer:".. 120 - (os.time() - timer),550,50,0xFFFFFFFF, 0x90000000)
        end

        if isKeyJustPressed(VK_X) then
            sampSendChat("/usedrugs 20")
            timer = os.time();
        end

    end
end

When u press x then its start cooldown when u press x then it resets timer how to fix?
If I understood correctly, then..
Lua:
function main()
    while not isSampAvailable() do wait(0) end

    local timer = os.time() - 120;
    while true do
        wait(0)
        if (os.time() - timer <= 120) then
            sampTextdrawCreate(font,"NarkoTimer:".. 120 - (os.time() - timer),550,50,0xFFFFFFFF, 0x90000000)
        end

        if isKeyJustPressed(0x58) and os.time() - timer > 120 then
            sampSendChat("/usedrugs 20")
            timer = os.time();
        end

    end
end
 
  • Нравится
Реакции: P3rsik

SamperJostkiy

Участник
169
19
Полный код покажи
Lua:
require "lib.moonloader"
require "lib.samp.events"

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do
    wait(200)
    end
    if text:find('Server closed the connection.') then
    while true do
        wait(0)
        if res and time ~= nil then
            sampDisconnectWithReason(quit)
            wait(time*1000)
            sampSetGamestate(1)
            res= false
            else if res and time == nil then
                sampDisconnectWithReason(quit)
                wait(15500)
                sampSetGamestate(1)
                res= false
                end
            end
        end
    end
end

function reconnect(param)
    time = tonumber(param)
    res = true
 

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,778
11,221
Lua:
require "lib.moonloader"
require "lib.samp.events"

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do
    wait(200)
    end
    if text:find('Server closed the connection.') then
    while true do
        wait(0)
        if res and time ~= nil then
            sampDisconnectWithReason(quit)
            wait(time*1000)
            sampSetGamestate(1)
            res= false
            else if res and time == nil then
                sampDisconnectWithReason(quit)
                wait(15500)
                sampSetGamestate(1)
                res= false
                end
            end
        end
    end
end

function reconnect(param)
    time = tonumber(param)
    res = true
ты пытаешься найти текст 'Server closed the connection.' в переменной, которой нет
 

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,778
11,221
Не совсем понял, это как?
ты пытаешься найти текст в переменной text, но переменной text нет
1632926723306.png
 

MAHEKEH

Известный
1,990
494
Lua:
local players = {};

function main()
    while not isSampAvailable() do wait(0) end;

    -- используй /addp player_id для добавления игрока в массив
    sampRegisterChatCommand("addP", function (player_id)
        if (tonumber(player_id) == nil) then
            return
        end;

        table.insert(players, tonumber(player_id));
    end);

    while true do wait(0);

        for i = 1, #players do
            if (sampIsPlayerConnected(players[i])) then -- если игрок с таким id подключен к серверу
                sampAddChatMessage('!' .. players[i], 0xFFFFFF00)
                -- sampSendChat('/me выдал права игроку '..players[i])
                wait(2000)
            else
                sampAddChatMessage("Игрок " .. players[i] .. " - вышел, удаляем из массива", 0xFFFFFF00)
                table.remove(players, i);
            end
        end

    end
end

Lua:
for i = 1, #players do
    if (sampIsPlayerConnected(players[i])) then
      local x, y, z = getCharCoordinates(players)

так же коорды взять не выйдет да?
 

MAHEKEH

Известный
1,990
494
ну конечно же я не могу не спросить как это сделать)

чапо накатал в прошлый раз мне вот этот код

Lua:
require "lib.moonloader"

sampRegisterChatCommand('tbl', function(arg)
    table.insert(players, arg)
end)

local players = {}

while true do
wait(0)
for k, v in ipairs(getAllChars()) do
    local myX, myY, myZ = getCharCoordinates(PLAYER_PED) -- получаешь свои коорды
    local x, y, z = getCharCoordinates(PLAYER_PED) -- получаешь коорды игрока
    if getDistanceBetweenCoords3d(myX, myY, myZ, x, y, z) <= 60 then -- если игрок менее чем в 10 метрах от тебя, то...
        _, id = sampGetPlayerIdByCharHandle(PLAYER_PED) -- получаешь ид игрока по хендлу
        table.insert(players, id) -- добавляешь ид в массив players
    end
end
for i = 1, #players do
    sampAddChatMessage('{FFFF00}!',..players[i], -1) --- sampSendChat('/me выдал права игроку '..players[i])
    wait(2000)
end
end
end

но что то мне подсказывает что тут просто берутся игроки с первого фор и добавляются в список, затем этот список проматывается и всем выдает права)
 

madrasso

Потрачен
883
324
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
ну конечно же я не могу не спросить как это сделать)

чапо накатал в прошлый раз мне вот этот код

Lua:
require "lib.moonloader"

sampRegisterChatCommand('tbl', function(arg)
    table.insert(players, arg)
end)

local players = {}

while true do
wait(0)
for k, v in ipairs(getAllChars()) do
    local myX, myY, myZ = getCharCoordinates(PLAYER_PED) -- получаешь свои коорды
    local x, y, z = getCharCoordinates(PLAYER_PED) -- получаешь коорды игрока
    if getDistanceBetweenCoords3d(myX, myY, myZ, x, y, z) <= 60 then -- если игрок менее чем в 10 метрах от тебя, то...
        _, id = sampGetPlayerIdByCharHandle(PLAYER_PED) -- получаешь ид игрока по хендлу
        table.insert(players, id) -- добавляешь ид в массив players
    end
end
for i = 1, #players do
    sampAddChatMessage('{FFFF00}!',..players[i], -1) --- sampSendChat('/me выдал права игроку '..players[i])
    wait(2000)
end
end
end

но что то мне подсказывает что тут просто берутся игроки с первого фор и добавляются в список, затем этот список проматывается и всем выдает права)
Тут берутся все игроки в зоне 60 метров от тебя и им выдаются права
 

thebestsupreme

Участник
170
12
Подскажите, пожалуйста как сделать чтобы в спец. время которые ты напишешь в inputtext выводился текст
 

MAHEKEH

Известный
1,990
494
Тут берутся все игроки в зоне 60 метров от тебя и им выдаются права
да да, но мне то по прежнему нужно выдавать права тем кто в списке, а не всем сразу
по твоему коду я могу это делать, но теперь вопрос встал в проверках(
 

madrasso

Потрачен
883
324
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
да да, но мне то по прежнему нужно выдавать права тем кто в списке, а не всем сразу
по твоему коду я могу это делать, но теперь вопрос встал в проверках(
А что за проверки тебе нужны?
 

MAHEKEH

Известный
1,990
494
А что за проверки тебе нужны?
Lua:
 if ped ~= PLAYER_PED and not isCharDead(ped) then -- local _, id = sampGetPlayerIdByCharHandle(ped)
 ---- if _ then
     local x1, y1, z1 = getCharCoordinates(PLAYER_PED)
      local x, y, z = getCharCoordinates(ped)
    
        DISTANCE= math.sqrt( ((x1-x)^2) + ((y1-y)^2) + ((z1-z)^2))
        if DISTANCE < 7.5 then sampAddChatMessage("{FFFF00}[ТЕСТ]: {A9A9A9}Права выданы игроку из списка ", ..id.., -1)

Lua:
ped ~= PLAYER_PED
на счет этого не уверен, оно вроде проверяет не является ли игрок - игроком ( мною )
если я правильно понимаю