mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
292 lines
6.6 KiB
Lua
292 lines
6.6 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/
|
|
--]]
|
|
|
|
---- Tips panel shown to specs
|
|
|
|
CreateConVar("ttt_tips_enable", "1", FCVAR_ARCHIVE)
|
|
|
|
local draw = draw
|
|
|
|
TIPS = {}
|
|
|
|
--- Tip cycling button
|
|
PANEL = {}
|
|
|
|
PANEL.Colors = {
|
|
default = COLOR_LGRAY,
|
|
hover = COLOR_WHITE,
|
|
press = COLOR_RED
|
|
};
|
|
|
|
function PANEL:Paint()
|
|
-- parent panel will deal with the normal bg, we only need to worry about
|
|
-- mouse effects
|
|
|
|
local clr = self.Colors.default
|
|
if self.Depressed then
|
|
clr = self.Colors.press
|
|
elseif self.Hovered then
|
|
clr = self.Colors.hover
|
|
end
|
|
|
|
surface.SetDrawColor(clr.r, clr.g, clr.b, clr.a)
|
|
self:DrawOutlinedRect()
|
|
end
|
|
|
|
derma.DefineControl("TipsButton", "Tip cycling button", PANEL, "DButton")
|
|
|
|
|
|
--- Main tip panel
|
|
|
|
local GetTranslation = LANG.GetTranslation
|
|
local GetPTranslation = LANG.GetParamTranslation
|
|
|
|
local tips_bg = Color(0, 0, 0, 200)
|
|
|
|
local tip_ids = {}
|
|
for i=1, 41 do
|
|
table.insert(tip_ids, i)
|
|
end
|
|
|
|
table.Shuffle(tip_ids)
|
|
|
|
local tip_params = {
|
|
[1] = {walkkey = Key("+walk", "WALK"), usekey = Key("+use", "USE")},
|
|
[24] = {helpkey = Key("+gm_showhelp", "F1")},
|
|
[28] = {mutekey = Key("+gm_showteam", "F2")},
|
|
[30] = {zoomkey = Key("+zoom", "the 'Suit Zoom' key")},
|
|
[31] = {duckkey = Key("+duck", "DUCK")},
|
|
[36] = {helpkey = Key("+gm_showhelp", "F1")},
|
|
};
|
|
|
|
PANEL = {}
|
|
|
|
function PANEL:Init()
|
|
self.IdealWidth = 450
|
|
self.IdealHeight = 45
|
|
self.BgColor = tips_bg
|
|
|
|
self.NextSwitch = 0
|
|
|
|
self.AutoDelay = 15
|
|
self.ManualDelay = 25
|
|
|
|
self.tiptext = vgui.Create("DLabel", self)
|
|
self.tiptext:SetContentAlignment(5)
|
|
self.tiptext:SetText(GetTranslation("tips_panel_title"))
|
|
|
|
self.bwrap = vgui.Create("Panel", self)
|
|
|
|
self.buttons = {}
|
|
self.buttons.left = vgui.Create("TipsButton", self.bwrap)
|
|
self.buttons.left:SetText("<")
|
|
|
|
self.buttons.left.DoClick = function() self:PrevTip() end
|
|
|
|
self.buttons.right = vgui.Create("TipsButton", self.bwrap)
|
|
self.buttons.right:SetText(">")
|
|
|
|
self.buttons.right.DoClick = function() self:NextTip() end
|
|
|
|
self.buttons.help = vgui.Create("TipsButton", self.bwrap)
|
|
self.buttons.help:SetText("?")
|
|
self.buttons.help:SetConsoleCommand("ttt_helpscreen")
|
|
|
|
self.buttons.close = vgui.Create("TipsButton", self.bwrap)
|
|
self.buttons.close:SetText("X")
|
|
self.buttons.close:SetConsoleCommand("ttt_tips_hide")
|
|
|
|
self.TipIndex = math.random(1, #tip_ids) or 0
|
|
self:SetTip(self.TipIndex)
|
|
end
|
|
|
|
function PANEL:SetTip(idx)
|
|
if not idx then
|
|
self:SetVisible(false)
|
|
return
|
|
end
|
|
|
|
self.TipIndex = idx
|
|
|
|
local tip_id = tip_ids[idx]
|
|
|
|
local text = nil
|
|
if tip_params[tip_id] then
|
|
text = GetPTranslation("tip" .. tip_id, tip_params[tip_id])
|
|
else
|
|
text = GetTranslation("tip" .. tip_id)
|
|
end
|
|
|
|
self.tiptext:SetText(GetTranslation("tips_panel_tip") .. " " .. text)
|
|
|
|
self:InvalidateLayout(true)
|
|
end
|
|
|
|
function PANEL:NextTip(auto)
|
|
local idx = self.TipIndex + 1
|
|
if idx > #tip_ids then
|
|
idx = 1
|
|
end
|
|
|
|
self:SetTip(idx)
|
|
|
|
self.NextSwitch = CurTime() + (auto and self.AutoDelay or self.ManualDelay)
|
|
end
|
|
|
|
function PANEL:PrevTip(auto)
|
|
local idx = self.TipIndex - 1
|
|
if idx < 1 then
|
|
idx = #tip_ids
|
|
end
|
|
|
|
self:SetTip(idx)
|
|
|
|
self.NextSwitch = CurTime() + (auto and self.AutoDelay or self.ManualDelay)
|
|
end
|
|
|
|
function PANEL:PerformLayout()
|
|
local m = 8
|
|
local off_bottom = 10
|
|
-- need to account for voice stuff in the bottom right and the time in the
|
|
-- bottom left
|
|
local off_left = 260
|
|
local off_right = 250
|
|
local room = ScrW() - off_left - off_right
|
|
local width = math.min(room, self.IdealWidth)
|
|
|
|
if width < 200 then
|
|
-- people who run 640x480 do not deserve tips
|
|
self:SetVisible(false)
|
|
return
|
|
end
|
|
|
|
local bsize = 14
|
|
|
|
-- position buttons
|
|
self.bwrap:SetSize(bsize * 2 + 2, bsize * 2 + 2)
|
|
|
|
self.buttons.left:SetSize(bsize,bsize)
|
|
self.buttons.left:SetPos(0,0)
|
|
|
|
self.buttons.right:SetSize(bsize,bsize)
|
|
self.buttons.right:SetPos(bsize + 2, 0)
|
|
|
|
self.buttons.help:SetSize(bsize,bsize)
|
|
self.buttons.help:SetPos(0, bsize + 2)
|
|
|
|
self.buttons.close:SetSize(bsize,bsize)
|
|
self.buttons.close:SetPos(bsize + 2, bsize + 2)
|
|
|
|
-- position content
|
|
self.tiptext:SetPos(m, m)
|
|
self.tiptext:SetTall(self.IdealHeight)
|
|
self.tiptext:SetWide(width - m*2 - self.bwrap:GetWide())
|
|
self.tiptext:SizeToContentsY()
|
|
|
|
local height = math.max(self.IdealHeight, self.tiptext:GetTall() + m*2)
|
|
|
|
local x = off_left + ((room - width) / 2)
|
|
local y = ScrH() - off_bottom - height
|
|
|
|
self:SetPos(x, y)
|
|
self:SetSize(width, height)
|
|
|
|
self.bwrap:SetPos(width - self.bwrap:GetWide() - m, height - self.bwrap:GetTall() - m)
|
|
end
|
|
|
|
function PANEL:ApplySchemeSettings()
|
|
for k, but in pairs(self.buttons) do
|
|
but:SetTextColor(COLOR_WHITE)
|
|
but:SetContentAlignment(5)
|
|
end
|
|
|
|
self.bwrap:SetPaintBackgroundEnabled(false)
|
|
|
|
self.tiptext:SetFont("DefaultBold")
|
|
self.tiptext:SetTextColor(COLOR_WHITE)
|
|
self.tiptext:SetWrap(true)
|
|
end
|
|
|
|
function PANEL:Paint()
|
|
draw.RoundedBox(8, 0, 0, self:GetWide(), self:GetTall(), self.BgColor)
|
|
end
|
|
|
|
function PANEL:Think()
|
|
if self.NextSwitch < CurTime() then
|
|
self:NextTip(true)
|
|
end
|
|
end
|
|
|
|
vgui.Register("TTTTips", PANEL, "Panel")
|
|
|
|
|
|
--- Creation
|
|
|
|
local tips_panel = nil
|
|
function TIPS.Create()
|
|
if IsValid(tips_panel) then
|
|
tips_panel:Remove()
|
|
tips_panel = nil
|
|
end
|
|
|
|
tips_panel = vgui.Create("TTTTips")
|
|
|
|
-- workaround for layout oddities, give it a poke next tick
|
|
timer.Simple(0.1, TIPS.Next)
|
|
end
|
|
|
|
function TIPS.Show()
|
|
if not GetConVar("ttt_tips_enable"):GetBool() then return end
|
|
|
|
if not tips_panel then
|
|
TIPS.Create()
|
|
end
|
|
|
|
tips_panel:SetVisible(true)
|
|
end
|
|
|
|
function TIPS.Hide()
|
|
if tips_panel then
|
|
tips_panel:SetVisible(false)
|
|
end
|
|
|
|
if GAMEMODE.ForcedMouse then
|
|
-- currently the only use of unlocking the mouse is screwing around with
|
|
-- the hints, and it makes sense to lock the mouse again when closing the
|
|
-- tips
|
|
gui.EnableScreenClicker(false)
|
|
GAMEMODE.ForcedMouse = false
|
|
end
|
|
end
|
|
concommand.Add("ttt_tips_hide", TIPS.Hide)
|
|
|
|
function TIPS.Next()
|
|
if tips_panel then
|
|
tips_panel:NextTip()
|
|
end
|
|
end
|
|
|
|
function TIPS.Prev()
|
|
if tips_panel then
|
|
tips_panel:PrevTip()
|
|
end
|
|
end
|
|
|
|
local function TipsCallback(cv, prev, new)
|
|
if tobool(new) then
|
|
if LocalPlayer():IsSpec() then
|
|
TIPS.Show()
|
|
end
|
|
else
|
|
TIPS.Hide()
|
|
end
|
|
end
|
|
cvars.AddChangeCallback("ttt_tips_enable", TipsCallback)
|