Files
VnUtest/garrysmod/lua/binder/vgui/cl_radial_hud.lua
2026-03-31 10:27:04 +03:00

95 lines
3.2 KiB
Lua

-- Garry's Mod Binder - Radial HUD
local IsRadialOpen = false
local SelectedSlot = 0
local function GetActiveProfile()
for _, p in ipairs(Binder.Profiles or {}) do
if p.Active then return p end
end
return nil
end
hook.Add("HUDPaint", "Binder_DrawRadial", function()
if not IsRadialOpen then return end
local profile = GetActiveProfile()
if not profile or not profile.Radial then return end
local cx, cy = ScrW() / 2, ScrH() / 2
local radius = 150
-- Draw Center
draw.NoTexture()
surface.SetDrawColor(Color(30, 30, 30, 240))
surface.DrawCircle(cx, cy, 50, 255, 255, 255, 255)
draw.SimpleText(Binder.GetPhrase("radial_center"), "Binder_Main", cx, cy, Color(255, 255, 255), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
local mouseX, mouseY = gui.MousePos()
if mouseX == 0 and mouseY == 0 then
mouseX, mouseY = cx, cy -- fallback if not capturing properly
end
local dist = math.Dist(cx, cy, mouseX, mouseY)
local angle = math.deg(math.atan2(mouseY - cy, mouseX - cx)) + 90
if angle < 0 then angle = angle + 360 end
-- Determine selected segment based on angle (8 segments, 45 deg each)
if dist > 50 then
SelectedSlot = math.floor((angle + 22.5) / 45) + 1
if SelectedSlot > 8 then SelectedSlot = 1 end
else
SelectedSlot = 0
end
-- Draw segments
for i = 1, 8 do
local slotData = profile.Radial[i]
if slotData then
local segAngle = (i - 1) * 45 - 90
local rad = math.rad(segAngle)
local lx, ly = cx + math.cos(rad) * radius, cy + math.sin(rad) * radius
local boxColor = (SelectedSlot == i) and Binder.Config.AccentColor or Color(40, 40, 45, 240)
draw.RoundedBox(8, lx - 40, ly - 20, 80, 40, boxColor)
draw.SimpleText(slotData.Label, "Binder_Main", lx, ly, Color(255, 255, 255), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
end
end
-- Draw cursor line
surface.SetDrawColor(255, 255, 255, 50)
surface.DrawLine(cx, cy, mouseX, mouseY)
end)
local PrevRadialState = false
hook.Add("Think", "Binder_RadialThink", function()
local cvar = GetConVar("binder_radial_key")
local radialKey = cvar and cvar:GetInt() or Binder.Config.DefaultRadialKey
local isDown = input.IsButtonDown(radialKey)
local blockNewInput = gui.IsConsoleVisible() or gui.IsGameUIVisible() or (vgui.GetKeyboardFocus() ~= nil) or (LocalPlayer() and LocalPlayer():IsValid() and LocalPlayer():IsTyping())
if isDown and not PrevRadialState then
if not blockNewInput then
PrevRadialState = true
IsRadialOpen = true
gui.EnableScreenClicker(true)
SelectedSlot = 0
end
elseif not isDown and PrevRadialState then
PrevRadialState = false
if IsRadialOpen then
IsRadialOpen = false
gui.EnableScreenClicker(false)
if SelectedSlot > 0 then
local profile = GetActiveProfile()
if profile and profile.Radial and profile.Radial[SelectedSlot] then
LocalPlayer():ConCommand(profile.Radial[SelectedSlot].Command)
end
end
end
end
end)