120 lines
4.4 KiB
Lua
120 lines
4.4 KiB
Lua
local PLUGIN = PLUGIN
|
||
|
||
if CLIENT then
|
||
-- Данные NLR
|
||
local nlrEndTime = 0
|
||
local inWarning = false
|
||
local warningEndTime = 0
|
||
|
||
-- Шрифты
|
||
surface.CreateFont("NLRTimer", {
|
||
font = "Exo 2",
|
||
size = 32,
|
||
weight = 700
|
||
})
|
||
|
||
surface.CreateFont("NLRWarning", {
|
||
font = "Exo 2",
|
||
size = 48,
|
||
weight = 700
|
||
})
|
||
|
||
-- Получение сетевых сообщений
|
||
net.Receive("ixNLRStart", function()
|
||
nlrEndTime = net.ReadFloat()
|
||
inWarning = false
|
||
warningEndTime = 0
|
||
end)
|
||
|
||
net.Receive("ixNLREnd", function()
|
||
nlrEndTime = 0
|
||
inWarning = false
|
||
warningEndTime = 0
|
||
end)
|
||
|
||
net.Receive("ixNLRWarning", function()
|
||
inWarning = net.ReadBool()
|
||
warningEndTime = net.ReadFloat()
|
||
end)
|
||
|
||
-- Отрисовка эффектов
|
||
function PLUGIN:HUDPaint()
|
||
local ply = LocalPlayer()
|
||
if not IsValid(ply) or not ply:Alive() then return end
|
||
|
||
local scrW, scrH = ScrW(), ScrH()
|
||
local currentTime = CurTime()
|
||
|
||
-- Если NLR активен
|
||
if nlrEndTime > 0 and currentTime < nlrEndTime then
|
||
local timeLeft = math.ceil(nlrEndTime - currentTime)
|
||
local minutes = math.floor(timeLeft / 60)
|
||
local seconds = timeLeft % 60
|
||
|
||
-- Таймер NLR
|
||
local timerText = string.format("NLR: %02d:%02d", minutes, seconds)
|
||
draw.SimpleText(timerText, "NLRTimer", scrW / 2, 50, Color(255, 200, 0), TEXT_ALIGN_CENTER, TEXT_ALIGN_TOP)
|
||
end
|
||
|
||
-- Если игрок вне зоны (предупреждение)
|
||
if inWarning and warningEndTime > 0 then
|
||
local warningTimeLeft = math.ceil(warningEndTime - currentTime)
|
||
|
||
if warningTimeLeft > 0 then
|
||
-- Красный экран
|
||
local alpha = 100 + math.sin(currentTime * 5) * 50
|
||
surface.SetDrawColor(255, 0, 0, alpha)
|
||
surface.DrawRect(0, 0, scrW, scrH)
|
||
|
||
-- Рамка
|
||
surface.SetDrawColor(255, 0, 0, 255)
|
||
surface.DrawOutlinedRect(10, 10, scrW - 20, scrH - 20, 5)
|
||
|
||
-- Предупреждение
|
||
local warningText = "ВЕРНИТЕСЬ НА БАЗУ!"
|
||
draw.SimpleText(warningText, "NLRWarning", scrW / 2, scrH / 2 - 50, Color(255, 255, 255), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
|
||
|
||
-- Таймер предупреждения
|
||
local warningTimerText = string.format("Осталось: %d секунд", warningTimeLeft)
|
||
draw.SimpleText(warningTimerText, "NLRTimer", scrW / 2, scrH / 2 + 20, Color(255, 255, 255), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
|
||
end
|
||
end
|
||
end
|
||
|
||
-- Отображение информации о зонах (для дебага)
|
||
function PLUGIN:DrawNLRZones()
|
||
if not GetConVar("developer"):GetBool() then return end
|
||
|
||
local ply = LocalPlayer()
|
||
if not IsValid(ply) then return end
|
||
|
||
local char = ply:GetCharacter()
|
||
if not char then return end
|
||
|
||
local faction = char:GetFaction()
|
||
local zones = self.config.zones[faction]
|
||
|
||
if not zones then return end
|
||
|
||
for _, zone in ipairs(zones) do
|
||
-- Рисуем границы зоны (упрощенно)
|
||
local corners = {
|
||
Vector(zone.min.x, zone.min.y, zone.min.z),
|
||
Vector(zone.max.x, zone.min.y, zone.min.z),
|
||
Vector(zone.max.x, zone.max.y, zone.min.z),
|
||
Vector(zone.min.x, zone.max.y, zone.min.z),
|
||
Vector(zone.min.x, zone.min.y, zone.max.z),
|
||
Vector(zone.max.x, zone.min.y, zone.max.z),
|
||
Vector(zone.max.x, zone.max.y, zone.max.z),
|
||
Vector(zone.min.x, zone.max.y, zone.max.z),
|
||
}
|
||
|
||
for i = 1, 4 do
|
||
debugoverlay.Line(corners[i], corners[i % 4 + 1], 0.1, Color(0, 255, 0), true)
|
||
debugoverlay.Line(corners[i + 4], corners[(i % 4 + 1) + 4], 0.1, Color(0, 255, 0), true)
|
||
debugoverlay.Line(corners[i], corners[i + 4], 0.1, Color(0, 255, 0), true)
|
||
end
|
||
end
|
||
end
|
||
end
|