как сделать систему ордер для копов

  • 28
  • 0
Контакты для связи отсутствуют.
система ордер, которая будет выбивать двери челику открывать, меру будет запрос присылатся что такой то коп просит ордер на чела и причина
 
  • 484
  • 4
  • 91
Контакты для связи отсутствуют.
Для реализации системы ордеров для копов в Garry's Mod на DarkRP, тебе нужно создать несколько скриптов. Я расскажу, как можно это сделать.

1. Создание системы ордеров

Для начала тебе нужно создать функцию для создания ордера и систему для отправки запроса на ордер другим игрокам, а также проверку прав.

a) Создаём модель данных для ордера​

Пример структуры ордера:

Lua:
-- ordres.lua
ORDERS = {}

-- Создаём новый ордер
function CreateOrder(cop, target, reason)
    local order = {}
    order.cop = cop -- Коп, который запрашивает ордер
    order.target = target -- Игрок, на которого выдан ордер
    order.reason = reason -- Причина
    order.timestamp = os.time() -- Время создания ордера

    table.insert(ORDERS, order)
    return order
end

-- Получаем все ордера
function GetOrders()
    return ORDERS
end

b) Скрипт для запроса ордера​

Теперь создадим команду или систему, которая будет запрашивать ордер. Допустим, для этого мы используем чат или интерфейс, где коп может запросить ордер на игрока.

Пример команды через консоль:

Lua:
-- ordersystem.lua

util.AddNetworkString("OrderRequest")

-- Команда для копа, чтобы запросить ордер
hook.Add("PlayerSay", "RequestOrder", function(ply, text)
    if string.sub(text, 1, 6) == "!order" then
        -- Проверяем, является ли игрок копом
        if not ply:IsCP() then
            ply:ChatPrint("Вы должны быть копом, чтобы запросить ордер!")
            return ""
        end

        local targetName = string.sub(text, 8)
        local target = player.GetByName(targetName)
        if not target then
            ply:ChatPrint("Игрок не найден!")
            return ""
        end

        -- Запрос причины
        ply:ChatPrint("Введите причину для ордера: ")
        local reason = ""  -- Это будет заглушка, в реальной системе нужно будет добавить ввод

        -- Создаём ордер
        local order = CreateOrder(ply, target, reason)

        -- Отправляем запрос ордера
        net.Start("OrderRequest")
        net.WriteEntity(ply)
        net.WriteEntity(target)
        net.WriteString(reason)
        net.Broadcast()

        ply:ChatPrint("Запрос на ордер отправлен!")
        return ""
    end
end)

c) Интерфейс для подтверждения ордера​

Здесь мы создадим систему, чтобы все игроки могли увидеть, что на кого-то был выдан ордер. К примеру, можно использовать уведомления или GUI элементы.

Lua:
-- Отправка уведомлений другим игрокам
net.Receive("OrderRequest", function()
    local cop = net.ReadEntity()
    local target = net.ReadEntity()
    local reason = net.ReadString()

    -- Уведомляем других копов о запросе
    for _, ply in ipairs(player.GetAll()) do
        if ply:IsCP() then
            ply:ChatPrint("Коп " .. cop:Nick() .. " запросил ордер на " .. target:Nick() .. ". Причина: " .. reason)
        end
    end
end)

2. Система для открывания дверей по ордеру

Для реализации функционала, который будет позволять открывать двери по ордеру, добавим скрипт, который проверяет, есть ли ордер на игрока, и, если ордер есть, позволяет копу открыть дверь.

Lua:
-- Открытие двери по ордеру
hook.Add("PlayerUse", "OpenDoorWithOrder", function(ply, ent)
    if ent:IsDoor() then
        for _, order in ipairs(ORDERS) do
            if order.target == ply then
                -- Если ордер на игрока существует, открываем дверь
                if ply:IsCP() then
                    ent:Fire("unlock")
                    ent:Fire("open")
                    ply:ChatPrint("Дверь открыта по ордеру!")
                    return true
                end
            end
        end
    end
end)

3. Обработка и очистка ордеров

Ордеры могут со временем устаревать, и чтобы не держать их в памяти бесконечно, нужно добавлять систему очистки ордеров. Это можно сделать, например, через таймеры.

Lua:
-- Удаляем ордеры, которые старше определённого времени (например, 10 минут)
timer.Create("ClearOldOrders", 60, 0, function()
    local currentTime = os.time()
    for i = #ORDERS, 1, -1 do
        if currentTime - ORDERS[i].timestamp > 600 then -- 600 секунд = 10 минут
            table.remove(ORDERS, i)
        end
    end
end)

4. Вывод и сообщения

Убедись, что игрокам выводятся нужные сообщения в чат, если ордер на кого-то был выдан или если они пытаются открыть дверь без ордера.

Заключение​

Это основной каркас системы ордеров для копов в Garry's Mod. Конечно, ты можешь доработать интерфейс, добавить проверки прав, реализовать команды для отмены ордера и так далее. Все зависит от того, какие именно механики ты хочешь видеть в своем сервере.
 
Сверху Снизу