Files
wnsrc/gamemodes/terrortown/gamemode/cl_tbuttons.lua
lifestorm 94063e4369 Upload
2024-08-04 22:55:00 +03:00

171 lines
5.2 KiB
Lua

--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
--- Display of and interaction with ttt_traitor_button
local surface = surface
local pairs = pairs
local math = math
local abs = math.abs
TBHUD = {}
TBHUD.buttons = {}
TBHUD.buttons_count = 0
TBHUD.focus_ent = nil
TBHUD.focus_stick = 0
function TBHUD:Clear()
self.buttons = {}
self.buttons_count = 0
self.focus_ent = nil
self.focus_stick = 0
end
function TBHUD:CacheEnts()
if IsValid(LocalPlayer()) and LocalPlayer():IsActiveTraitor() then
self.buttons = {}
for _, ent in ipairs(ents.FindByClass("ttt_traitor_button")) do
if IsValid(ent) then
self.buttons[ent:EntIndex()] = ent
end
end
else
self.buttons = {}
end
self.buttons_count = table.Count(self.buttons)
end
function TBHUD:PlayerIsFocused()
return IsValid(LocalPlayer()) and LocalPlayer():IsActiveTraitor() and IsValid(self.focus_ent)
end
function TBHUD:UseFocused()
if IsValid(self.focus_ent) and self.focus_stick >= CurTime() then
RunConsoleCommand("ttt_use_tbutton", tostring(self.focus_ent:EntIndex()))
self.focus_ent = nil
return true
else
return false
end
end
local confirm_sound = Sound("buttons/button24.wav")
function TBHUD.ReceiveUseConfirm()
surface.PlaySound(confirm_sound)
TBHUD:CacheEnts()
end
net.Receive("TTT_ConfirmUseTButton", TBHUD.ReceiveUseConfirm)
local function ComputeRangeFactor(plypos, tgtpos)
local d = tgtpos - plypos
d = d:Dot(d)
return d / range
end
local tbut_normal = surface.GetTextureID("vgui/ttt/tbut_hand_line")
local tbut_focus = surface.GetTextureID("vgui/ttt/tbut_hand_filled")
local size = 32
local mid = size / 2
local focus_range = 25
local use_key = Key("+use", "USE")
local GetTranslation = LANG.GetTranslation
local GetPTranslation = LANG.GetParamTranslation
function TBHUD:Draw(client)
if self.buttons_count != 0 then
surface.SetTexture(tbut_normal)
-- we're doing slowish distance computation here, so lots of probably
-- ineffective micro-optimization
local plypos = client:GetPos()
local midscreen_x = ScrW() / 2
local midscreen_y = ScrH() / 2
local pos, scrpos, d
local focus_ent = nil
local focus_d, focus_scrpos_x, focus_scrpos_y = 0, midscreen_x, midscreen_y
-- draw icon on HUD for every button within range
for k, but in pairs(self.buttons) do
if IsValid(but) and but.IsUsable then
pos = but:GetPos()
scrpos = pos:ToScreen()
if (not IsOffScreen(scrpos)) and but:IsUsable() then
d = pos - plypos
d = d:Dot(d) / (but:GetUsableRange() ^ 2)
-- draw if this button is within range, with alpha based on distance
if d < 1 then
surface.SetDrawColor(255, 255, 255, 200 * (1 - d))
surface.DrawTexturedRect(scrpos.x - mid, scrpos.y - mid, size, size)
if d > focus_d then
local x = abs(scrpos.x - midscreen_x)
local y = abs(scrpos.y - midscreen_y)
if (x < focus_range and y < focus_range and
x < focus_scrpos_x and y < focus_scrpos_y) then
-- avoid constantly switching focus every frame causing
-- 2+ buttons to appear in focus, instead "stick" to one
-- ent for a very short time to ensure consistency
if self.focus_stick < CurTime() or but == self.focus_ent then
focus_ent = but
end
end
end
end
end
end
-- draw extra graphics and information for button when it's in-focus
if IsValid(focus_ent) then
self.focus_ent = focus_ent
self.focus_stick = CurTime() + 0.1
local scrpos = focus_ent:GetPos():ToScreen()
local sz = 16
-- redraw in-focus version of icon
surface.SetTexture(tbut_focus)
surface.SetDrawColor(255, 255, 255, 200)
surface.DrawTexturedRect(scrpos.x - mid, scrpos.y - mid, size, size)
-- description
surface.SetTextColor(255, 50, 50, 255)
surface.SetFont("TabLarge")
local x = scrpos.x + sz + 10
local y = scrpos.y - sz - 3
surface.SetTextPos(x, y)
surface.DrawText(focus_ent:GetDescription())
y = y + 12
surface.SetTextPos(x, y)
if focus_ent:GetDelay() < 0 then
surface.DrawText(GetTranslation("tbut_single"))
elseif focus_ent:GetDelay() == 0 then
surface.DrawText(GetTranslation("tbut_reuse"))
else
surface.DrawText(GetPTranslation("tbut_retime", {num = focus_ent:GetDelay()}))
end
y = y + 12
surface.SetTextPos(x, y)
surface.DrawText(GetPTranslation("tbut_help", {key = use_key}))
end
end
end
end