Для реализации системы ордеров для копов в Garry's Mod на DarkRP, тебе нужно создать несколько скриптов. Я расскажу, как можно это сделать.
1. Создание системы ордеров
Для начала тебе нужно создать функцию для создания ордера и систему для отправки запроса на ордер другим игрокам, а также проверку прав.
a) Создаём модель данных для ордера
Пример структуры ордера:
-- 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) Скрипт для запроса ордера
Теперь создадим команду или систему, которая будет запрашивать ордер. Допустим, для этого мы используем чат или интерфейс, где коп может запросить ордер на игрока.
Пример команды через консоль:
-- 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 элементы.
-- Отправка уведомлений другим игрокам
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. Система для открывания дверей по ордеру
Для реализации функционала, который будет позволять открывать двери по ордеру, добавим скрипт, который проверяет, есть ли ордер на игрока, и, если ордер есть, позволяет копу открыть дверь.
-- Открытие двери по ордеру
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. Обработка и очистка ордеров
Ордеры могут со временем устаревать, и чтобы не держать их в памяти бесконечно, нужно добавлять систему очистки ордеров. Это можно сделать, например, через таймеры.
-- Удаляем ордеры, которые старше определённого времени (например, 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. Конечно, ты можешь доработать интерфейс, добавить проверки прав, реализовать команды для отмены ордера и так далее. Все зависит от того, какие именно механики ты хочешь видеть в своем сервере.