136 lines
3.3 KiB
Lua
136 lines
3.3 KiB
Lua
PLUGIN.captureData = PLUGIN.captureData or {}
|
|
|
|
net.Receive("ixCaptureSync", function()
|
|
local plugin = ix.plugin.Get("capture")
|
|
if (!plugin) then return end
|
|
|
|
local point = net.ReadEntity()
|
|
local progress = net.ReadFloat()
|
|
local owner = net.ReadUInt(8)
|
|
local capturing = net.ReadUInt(8)
|
|
local players = net.ReadUInt(8)
|
|
local blocked = net.ReadBool()
|
|
|
|
if (IsValid(point)) then
|
|
plugin.captureData[point] = {
|
|
progress = progress,
|
|
owner = owner,
|
|
capturing = capturing,
|
|
players = players,
|
|
blocked = blocked
|
|
}
|
|
end
|
|
end)
|
|
|
|
local PANEL = {}
|
|
|
|
function PANEL:Init()
|
|
self.progress = 0
|
|
self.targetProgress = 0
|
|
self.alpha = 0
|
|
self.targetAlpha = 0
|
|
self.blinkAlpha = 0
|
|
end
|
|
|
|
function PANEL:SetCaptureData(data)
|
|
self.targetProgress = data.progress or 0
|
|
self.owner = data.owner or 0
|
|
self.capturing = data.capturing or 0
|
|
self.players = data.players or 0
|
|
self.blocked = data.blocked or false
|
|
|
|
if (data.capturing and data.capturing > 0) then
|
|
self.targetAlpha = 255
|
|
else
|
|
self.targetAlpha = 0
|
|
end
|
|
end
|
|
|
|
function PANEL:Think()
|
|
self.progress = Lerp(FrameTime() * 5, self.progress, self.targetProgress)
|
|
self.alpha = Lerp(FrameTime() * 8, self.alpha, self.targetAlpha)
|
|
|
|
if (self.blocked) then
|
|
self.blinkAlpha = math.abs(math.sin(CurTime() * 5)) * 255
|
|
else
|
|
self.blinkAlpha = 0
|
|
end
|
|
|
|
local plugin = ix.plugin.Get("capture")
|
|
if (plugin) then
|
|
self:SetSize(plugin.hudWidth, plugin.hudHeight)
|
|
self:SetPos(ScrW() - plugin.hudWidth - plugin.hudPosX, plugin.hudPosY)
|
|
end
|
|
end
|
|
|
|
function PANEL:Paint(w, h)
|
|
if (self.alpha < 1) then return end
|
|
|
|
surface.SetAlphaMultiplier(self.alpha / 255)
|
|
|
|
local barW = 40
|
|
local barH = h
|
|
local padding = 10
|
|
local barX = (w - barW) / 2
|
|
|
|
draw.RoundedBox(8, barX, 0, barW, barH, ColorAlpha(Color(20, 20, 20), self.alpha * 0.9))
|
|
|
|
if (self.progress > 0) then
|
|
local fillH = (barH - 4) * (self.progress / 100)
|
|
local color = Color(100, 150, 255)
|
|
|
|
if (self.capturing and self.capturing > 0) then
|
|
if (self.capturing == FACTION_RUSSIAN) then
|
|
color = Color(200, 50, 50)
|
|
elseif (self.capturing == FACTION_UKRAINE) then
|
|
color = Color(50, 100, 200)
|
|
end
|
|
end
|
|
|
|
if (self.blocked) then
|
|
color = ColorAlpha(color, self.blinkAlpha)
|
|
end
|
|
|
|
draw.RoundedBox(6, barX + 2, 2, barW - 4, fillH, ColorAlpha(color, self.alpha))
|
|
end
|
|
|
|
local text = string.format("%.0f%%", self.progress)
|
|
if (self.players and self.players > 0) then
|
|
text = text .. "\n(" .. self.players .. ")"
|
|
end
|
|
|
|
draw.SimpleText(text, "DermaDefault", w / 2, barH + 15, ColorAlpha(color_white, self.alpha), TEXT_ALIGN_CENTER, TEXT_ALIGN_TOP)
|
|
|
|
surface.SetAlphaMultiplier(1)
|
|
end
|
|
|
|
vgui.Register("ixCaptureUI", PANEL, "DPanel")
|
|
|
|
function PLUGIN:HUDPaint()
|
|
local ply = LocalPlayer()
|
|
if (!IsValid(ply)) then return end
|
|
|
|
for point, data in pairs(self.captureData) do
|
|
if (IsValid(point) and ply:GetPos():Distance(point:GetPos()) <= self.captureRadius) then
|
|
if (!IsValid(self.captureUI)) then
|
|
self.captureUI = vgui.Create("ixCaptureUI")
|
|
end
|
|
|
|
self.captureUI:SetCaptureData(data)
|
|
return
|
|
end
|
|
end
|
|
|
|
if (IsValid(self.captureUI)) then
|
|
self.captureUI:SetCaptureData({progress = 0, owner = 0, capturing = 0, players = 0, blocked = false})
|
|
end
|
|
end
|
|
|
|
function PLUGIN:OnReloaded()
|
|
if (IsValid(self.captureUI)) then
|
|
self.captureUI:Remove()
|
|
self.captureUI = nil
|
|
end
|
|
end
|
|
|