remove cfc interface and use out-of-tree interface
This commit is contained in:
parent
292ea567b1
commit
b92c1912ce
@ -1,672 +0,0 @@
|
|||||||
include( "cfc_disconnect_interface/client/cl_api.lua" )
|
|
||||||
|
|
||||||
surface.CreateFont( "CFC_Normal",
|
|
||||||
{
|
|
||||||
font = "arial",
|
|
||||||
size = 18,
|
|
||||||
weight = 500
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
surface.CreateFont( "CFC_Special",
|
|
||||||
{
|
|
||||||
font = "coolvetica",
|
|
||||||
size = 30,
|
|
||||||
weight = 500
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
surface.CreateFont( "CFC_Special_Small",
|
|
||||||
{
|
|
||||||
font = "coolvetica",
|
|
||||||
size = 22,
|
|
||||||
weight = 400
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
surface.CreateFont( "CFC_Mono",
|
|
||||||
{
|
|
||||||
font = "Lucida Console",
|
|
||||||
size = 30,
|
|
||||||
weight = 1500
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
surface.CreateFont( "CFC_Mono_Small",
|
|
||||||
{
|
|
||||||
font = "Lucida Console",
|
|
||||||
size = 18,
|
|
||||||
weight = 400,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
surface.CreateFont( "CFC_Button",
|
|
||||||
{
|
|
||||||
font = "arial",
|
|
||||||
size = 18,
|
|
||||||
weight = 1500
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
local GAME_URL = GetConVar( "cfc_disconnect_interface_game_url" ):GetString()
|
|
||||||
-- Width of the game on the website in pixels, needed as I didn't write the dinosaur game, and it doesn't like centering nicely
|
|
||||||
local GAME_WIDTH = 1256
|
|
||||||
local GAME_CODE
|
|
||||||
|
|
||||||
local interfaceDerma = false
|
|
||||||
|
|
||||||
local TIME_TO_RESTART = GetConVar( "cfc_disconnect_interface_restart_time" ):GetInt()
|
|
||||||
|
|
||||||
local timeDown = 0
|
|
||||||
local apiState
|
|
||||||
local previouslyShown = false
|
|
||||||
local disconnectMessages = {
|
|
||||||
[CFCCrashAPI.SERVER_DOWN] = "Are you sure? Hang in there, the server will restart soon...",
|
|
||||||
[CFCCrashAPI.SERVER_UP] = "Are you sure? The server is already back up and ready!",
|
|
||||||
[CFCCrashAPI.NO_INTERNET] = "Are you sure? If your internet comes back, you can easily rejoin from this page."
|
|
||||||
}
|
|
||||||
|
|
||||||
-- Colors
|
|
||||||
local primaryCol = Color( 36, 41, 67 )
|
|
||||||
local secondaryCol = Color( 42, 47, 74 )
|
|
||||||
local accentCol = Color( 84, 84, 150 )
|
|
||||||
local whiteCol = Color( 255, 255, 255 )
|
|
||||||
local redCol = Color( 255, 0, 0 )
|
|
||||||
local yellowCol = Color( 255, 255, 0 )
|
|
||||||
local greenCol = Color( 50, 255, 50 )
|
|
||||||
|
|
||||||
local function lerpColor( fraction, from, to )
|
|
||||||
local r = from.r + ( to.r - from.r ) * fraction
|
|
||||||
local g = from.g + ( to.g - from.g ) * fraction
|
|
||||||
local b = from.b + ( to.b - from.b ) * fraction
|
|
||||||
|
|
||||||
return Color( r, g, b )
|
|
||||||
end
|
|
||||||
|
|
||||||
local function secondsAsTime( s )
|
|
||||||
return string.FormattedTime( s, "%02i:%02i" )
|
|
||||||
end
|
|
||||||
|
|
||||||
local function rejoin()
|
|
||||||
dTimer.Simple( 1, function()
|
|
||||||
RunConsoleCommand( "snd_restart" ) -- Restarts sound engine, good practice?
|
|
||||||
RunConsoleCommand( "retry" )
|
|
||||||
end )
|
|
||||||
end
|
|
||||||
|
|
||||||
local function leave()
|
|
||||||
dTimer.Simple( 1, function()
|
|
||||||
RunConsoleCommand( "disconnect" )
|
|
||||||
end )
|
|
||||||
end
|
|
||||||
|
|
||||||
local function getGame()
|
|
||||||
local success
|
|
||||||
repeat
|
|
||||||
success, GAME_CODE = await( NP.http.fetch( GAME_URL ) )
|
|
||||||
GAME_CODE = success and GAME_CODE
|
|
||||||
until GAME_CODE
|
|
||||||
end
|
|
||||||
|
|
||||||
hook.Add( "InitPostEntity", "CFC_DisconnectInterface_GetGame", function()
|
|
||||||
asyncCall( getGame )
|
|
||||||
end )
|
|
||||||
|
|
||||||
-- Creates and populates a title bar for the frame
|
|
||||||
local function addTitleBar( frame )
|
|
||||||
local frameW = frame:GetWide()
|
|
||||||
local titleBarHeight = 70
|
|
||||||
|
|
||||||
-- The bar itself
|
|
||||||
local titleBar = vgui.Create( "DPanel", frame )
|
|
||||||
titleBar:SetSize( frameW, titleBarHeight )
|
|
||||||
titleBar:SetPos( 0, 0 )
|
|
||||||
function titleBar:Paint( w, h )
|
|
||||||
surface.SetDrawColor( secondaryCol )
|
|
||||||
surface.DrawRect( 0, 0, w, h )
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Close button, could be removed, but I personally think it should stay, allows you to save e2/sf files
|
|
||||||
local closeBtnSize = 32
|
|
||||||
local closeBtnPadding = ( titleBarHeight - closeBtnSize ) / 2
|
|
||||||
local closeBtn = vgui.Create( "DImageButton", titleBar )
|
|
||||||
closeBtn:SetSize( closeBtnSize, closeBtnSize )
|
|
||||||
closeBtn:SetPos( frameW - closeBtnSize - closeBtnPadding, closeBtnPadding )
|
|
||||||
closeBtn:SetImage( "icons/cross.png" )
|
|
||||||
function closeBtn:DoClick()
|
|
||||||
if frame.OnHide then
|
|
||||||
frame:Hide()
|
|
||||||
frame:OnHide()
|
|
||||||
else
|
|
||||||
frame:Close()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Title label
|
|
||||||
local titleLabelPadding = ( titleBarHeight - 26 ) / 2
|
|
||||||
local titleLabel = vgui.Create( "DLabel", titleBar )
|
|
||||||
titleLabel:SetFont( "CFC_Special" )
|
|
||||||
|
|
||||||
local function setTitle( title )
|
|
||||||
titleLabel:SetText( title )
|
|
||||||
titleLabel:SizeToContents()
|
|
||||||
titleLabel:SetPos( 0, titleLabelPadding + 2 )
|
|
||||||
titleLabel:CenterHorizontal()
|
|
||||||
end
|
|
||||||
|
|
||||||
setTitle( "Oops! Looks like you disconnected..." )
|
|
||||||
titleBar.setTitle = setTitle
|
|
||||||
|
|
||||||
return titleBar
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Create a button in specific format for button bar
|
|
||||||
-- xFraction is 0-1 for how far across the button should be
|
|
||||||
-- Colours are self explan
|
|
||||||
local function makeButton( frame, text, xFraction, doClick, outlineCol, fillCol, hoverOutlineCol, hoverFillCol )
|
|
||||||
local frameW, frameH = frame:GetSize()
|
|
||||||
local btn = vgui.Create( "DButton", frame )
|
|
||||||
|
|
||||||
-- Defaults for colours
|
|
||||||
btn.outlineCol = outlineCol or whiteCol
|
|
||||||
btn.fillCol = fillCol or primaryCol
|
|
||||||
btn.hoverOutlineCol = hoverOutlineCol or whiteCol
|
|
||||||
btn.hoverFillCol = hoverFillCol or primaryCol
|
|
||||||
|
|
||||||
btn:SetText( text )
|
|
||||||
btn:SetTextColor( whiteCol )
|
|
||||||
btn:SetFont( "CFC_Button" )
|
|
||||||
btn:SetSize( frameW * 0.3, frameH )
|
|
||||||
btn:CenterHorizontal( xFraction )
|
|
||||||
btn:CenterVertical()
|
|
||||||
btn.DoClick = doClick
|
|
||||||
|
|
||||||
-- Fade animation state and time for consistant animation speed on different FPS
|
|
||||||
btn.fadeState = 0
|
|
||||||
btn.prevTime = SysTime()
|
|
||||||
|
|
||||||
local btnAnimSpeed = 0.1 * 60
|
|
||||||
|
|
||||||
function btn:Think()
|
|
||||||
-- Make anim same speed for all framerates
|
|
||||||
local dt = SysTime() - self.prevTime
|
|
||||||
self.prevTime = SysTime()
|
|
||||||
if dt > 1 then dt = 0 end -- This happens on first Think after being Shown, dt ends up being very large
|
|
||||||
|
|
||||||
if self:IsHovered() and self.fadeState < 1 then
|
|
||||||
self.fadeState = math.Clamp( self.fadeState + btnAnimSpeed * dt, 0, 1 )
|
|
||||||
elseif not self:IsHovered() and self.fadeState > 0 then
|
|
||||||
self.fadeState = math.Clamp( self.fadeState - btnAnimSpeed * dt, 0, 1 )
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local btnBorderWeight = 2
|
|
||||||
function btn:Paint( w, h )
|
|
||||||
local lineCol
|
|
||||||
local bgCol
|
|
||||||
local borderWeight
|
|
||||||
if self:IsEnabled() then
|
|
||||||
lineCol = lerpColor( self.fadeState, self.outlineCol, self.hoverOutlineCol )
|
|
||||||
bgCol = lerpColor( self.fadeState, self.fillCol, self.hoverFillCol )
|
|
||||||
borderWeight = 1.5 * btnBorderWeight + 1.5 * self.fadeState * btnBorderWeight
|
|
||||||
self:SetCursor( "hand" )
|
|
||||||
else
|
|
||||||
lineCol = Color( 74, 74, 74 )
|
|
||||||
bgCol = self.fillCol
|
|
||||||
borderWeight = btnBorderWeight
|
|
||||||
self:SetCursor( "no" )
|
|
||||||
end
|
|
||||||
|
|
||||||
self:SetTextColor( lineCol )
|
|
||||||
|
|
||||||
local boxH = h / 2
|
|
||||||
draw.RoundedBox( boxH, 0, 0, w, h, lineCol )
|
|
||||||
|
|
||||||
local nw, nh = w - ( borderWeight * 2 ), h - ( borderWeight * 2 )
|
|
||||||
draw.RoundedBox( nh / 2, borderWeight, borderWeight, nw, nh, bgCol )
|
|
||||||
end
|
|
||||||
|
|
||||||
return btn
|
|
||||||
end
|
|
||||||
|
|
||||||
local function showMessage( msg, col )
|
|
||||||
if not interfaceDerma then return end
|
|
||||||
local label = interfaceDerma.messageLabel
|
|
||||||
|
|
||||||
if label:GetText() == msg and label:IsVisible() then return end
|
|
||||||
|
|
||||||
if label:IsVisible() then
|
|
||||||
label:AlphaTo( 0, 0.25 )
|
|
||||||
dTimer.Simple( 0.25, function()
|
|
||||||
label:setTextAndAlign( msg, col )
|
|
||||||
label:AlphaTo( 255, 0.25 )
|
|
||||||
end )
|
|
||||||
else
|
|
||||||
label:setTextAndAlign( msg, col )
|
|
||||||
label:Show()
|
|
||||||
label:AlphaTo( 255, 0.5 )
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Create bar panel and add buttons
|
|
||||||
local function addButtonsBar( frame )
|
|
||||||
local frameW, frameH = frame:GetSize()
|
|
||||||
|
|
||||||
local buttonBarHeight = 90
|
|
||||||
local buttonBarOffset = 90
|
|
||||||
|
|
||||||
|
|
||||||
local barPanel = vgui.Create( "DPanel", frame )
|
|
||||||
barPanel:SetSize( frameW, buttonBarHeight )
|
|
||||||
barPanel:SetPos( 0, frameH - buttonBarHeight - buttonBarOffset )
|
|
||||||
barPanel.Paint = nil
|
|
||||||
function barPanel:Think()
|
|
||||||
if not self.showOnce then
|
|
||||||
if GAMEMODE_NAME == "sandbox" then
|
|
||||||
showMessage( "You'll automatically rejoin the server when it's up", greenCol )
|
|
||||||
end
|
|
||||||
self.showOnce = true
|
|
||||||
end
|
|
||||||
|
|
||||||
if not self.confirmDisconnect then return end
|
|
||||||
if apiState ~= CFCCrashAPI.SERVER_UP then return end
|
|
||||||
if self.backUp then return end
|
|
||||||
|
|
||||||
showMessage( disconnectMessages[apiState] )
|
|
||||||
self.backUp = true
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Put buttons onto the panel as members for easy access
|
|
||||||
barPanel.reconBtn = makeButton( barPanel, "WAITING...", 0.25, function( self )
|
|
||||||
if barPanel.confirmDisconnect then
|
|
||||||
showMessage( "Disconnecting...", redCol )
|
|
||||||
barPanel.disconBtn:SetEnabled( false )
|
|
||||||
return leave()
|
|
||||||
end
|
|
||||||
|
|
||||||
local serverDown = apiState ~= CFCCrashAPI.SERVER_UP
|
|
||||||
|
|
||||||
if serverDown then
|
|
||||||
self.autoJoin = not self.autoJoin
|
|
||||||
|
|
||||||
local text = self.autoJoin and "WAITING..." or "AUTO-RECONNECT"
|
|
||||||
self:SetText( text )
|
|
||||||
|
|
||||||
if self.autoJoin then
|
|
||||||
dTimer.Simple( 0.15, function()
|
|
||||||
self.fadeState = 0
|
|
||||||
self.outlineCol = greenCol
|
|
||||||
self.hoverOutlineCol = redCol
|
|
||||||
end )
|
|
||||||
showMessage( "You'll automatically rejoin the server when it's up", greenCol )
|
|
||||||
else
|
|
||||||
dTimer.Simple( 0.15, function()
|
|
||||||
self.fadeState = 0
|
|
||||||
self.outlineCol = whiteCol
|
|
||||||
self.hoverOutlineCol = greenCol
|
|
||||||
end )
|
|
||||||
showMessage( "You'll have the option to respawn your props when you rejoin.", yellowCol )
|
|
||||||
end
|
|
||||||
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
showMessage( "Reconnecting...", greenCol )
|
|
||||||
barPanel.disconBtn:SetEnabled( false )
|
|
||||||
rejoin()
|
|
||||||
end )
|
|
||||||
|
|
||||||
barPanel.reconBtn._Think = barPanel.reconBtn.Think
|
|
||||||
function barPanel.reconBtn:Think()
|
|
||||||
self:_Think()
|
|
||||||
|
|
||||||
local text
|
|
||||||
|
|
||||||
if barPanel.confirmDisconnect then
|
|
||||||
text = "YES"
|
|
||||||
|
|
||||||
else
|
|
||||||
if apiState == CFCCrashAPI.SERVER_UP then
|
|
||||||
text = self.autoJoin and "RECONNECTING..." or "RECONNECT"
|
|
||||||
else
|
|
||||||
if self:IsHovered() then
|
|
||||||
text = self.autoJoin and "CANCEL" or "AUTO-RECONNECT"
|
|
||||||
else
|
|
||||||
text = self.autoJoin and "WAITING..." or "AUTO-RECONNECT"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
self:SetText( text )
|
|
||||||
end
|
|
||||||
barPanel.reconBtn.outlineCol = greenCol
|
|
||||||
barPanel.reconBtn.autoJoin = true
|
|
||||||
barPanel.reconBtn.hoverOutlineCol = redCol
|
|
||||||
|
|
||||||
barPanel.disconBtn = makeButton( barPanel, "DISCONNECT", 0.75, function( self )
|
|
||||||
if not barPanel.confirmDisconnect then
|
|
||||||
showMessage( disconnectMessages[apiState] )
|
|
||||||
barPanel.confirmDisconnect = true
|
|
||||||
self:SetText( "NO" )
|
|
||||||
self.fadeState = 0
|
|
||||||
self.hoverOutlineCol = redCol
|
|
||||||
|
|
||||||
local recon = barPanel.reconBtn
|
|
||||||
recon.fadeState = 0
|
|
||||||
|
|
||||||
recon.savedOutlineCol = recon.outlineCol
|
|
||||||
recon.savedHoverOutlineCol = recon.hoverOutlineCol
|
|
||||||
|
|
||||||
recon.outlineCol = whiteCol
|
|
||||||
recon.hoverOutlineCol = greenCol
|
|
||||||
else
|
|
||||||
--hideMessage()
|
|
||||||
--
|
|
||||||
local recon = barPanel.reconBtn
|
|
||||||
recon.outlineCol = recon.savedOutlineCol
|
|
||||||
recon.hoverOutlineCol = recon.savedHoverOutlineCol
|
|
||||||
|
|
||||||
recon.savedOutlineCol = nil
|
|
||||||
recon.savedHoverOutlineCol = nil
|
|
||||||
|
|
||||||
dTimer.Simple( 0.25, function()
|
|
||||||
showMessage( "You'll have the option to respawn your props when you rejoin.", yellowCol )
|
|
||||||
end )
|
|
||||||
|
|
||||||
barPanel.confirmDisconnect = false
|
|
||||||
self:SetText( "DISCONNECT" )
|
|
||||||
self.hoverOutlineCol = whiteCol
|
|
||||||
end
|
|
||||||
end )
|
|
||||||
|
|
||||||
return barPanel
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Making lines of text for body
|
|
||||||
local function makeLabel( frame, text, top, col, xFraction, font )
|
|
||||||
col = col or whiteCol
|
|
||||||
local label = vgui.Create( "DLabel", frame )
|
|
||||||
label:SetFont( font or "CFC_Special" )
|
|
||||||
function label:setTextAndAlign( str, colOverride )
|
|
||||||
self:SetText( str )
|
|
||||||
self:SizeToContents()
|
|
||||||
self:SetPos( 0, top )
|
|
||||||
self:SetTextColor( colOverride or col )
|
|
||||||
self:CenterHorizontal( xFraction )
|
|
||||||
end
|
|
||||||
label:setTextAndAlign( text )
|
|
||||||
|
|
||||||
return label
|
|
||||||
end
|
|
||||||
|
|
||||||
local function makeDiscordRow( frame )
|
|
||||||
local row = vgui.Create( "DPanel", frame )
|
|
||||||
row:SetSize( frame:GetWide(), 64 )
|
|
||||||
row:SetPos( 0, frame:GetTall() - 64 )
|
|
||||||
row.Paint = nil
|
|
||||||
|
|
||||||
local labelHolder = vgui.Create( "DPanel", row )
|
|
||||||
local holderWidth = frame:GetWide() / 4
|
|
||||||
labelHolder:SetSize( frame:GetWide() / 4, 64 )
|
|
||||||
labelHolder:SetPos( frame:GetWide() / 2 - (holderWidth / 2), 0 )
|
|
||||||
labelHolder.Paint = nil
|
|
||||||
|
|
||||||
local label = makeLabel( labelHolder, "Join our Discord!", 0, whiteCol, 0.5, "CFC_Special_Small" )
|
|
||||||
label:SetSize( frame:GetWide() / 6, 64 )
|
|
||||||
label:Dock( LEFT )
|
|
||||||
|
|
||||||
local linkColor = Color( 41, 182, 246 )
|
|
||||||
local link = makeLabel( labelHolder, "discord.gg/cfcservers", 0, linkColor, 0.5, "CFC_Mono_Small" )
|
|
||||||
label:SetSize( frame:GetWide() / 6, 64 )
|
|
||||||
link:Dock( RIGHT )
|
|
||||||
link:SetMouseInputEnabled( true )
|
|
||||||
link.DoClick = function()
|
|
||||||
gui.OpenURL( "https://discord.gg/cfcservers" )
|
|
||||||
end
|
|
||||||
link:SetCursor( "hand" )
|
|
||||||
|
|
||||||
return row
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
-- Text for internet down on body
|
|
||||||
local function populateBodyInternetDown( body )
|
|
||||||
makeLabel( body, "Please check you're still connected to the internet.", 20 )
|
|
||||||
makeLabel( body, "In the meantime, ", 80 )
|
|
||||||
|
|
||||||
return "Oops, looks like you disconnected"
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Text for server down on body
|
|
||||||
local function populateBodyServerDown( body )
|
|
||||||
local restartTimeStr = "The server normally takes about " .. secondsAsTime( TIME_TO_RESTART ) .. " to restart."
|
|
||||||
|
|
||||||
-- Restart time label
|
|
||||||
makeLabel( body, restartTimeStr, 0 )
|
|
||||||
|
|
||||||
local curTimePreLabel = makeLabel( body, "It has been down for", 32 )
|
|
||||||
|
|
||||||
-- When the server comes back up, "It has been down for" => "It was down for"
|
|
||||||
-- Then resize and move
|
|
||||||
function curTimePreLabel:Think()
|
|
||||||
if apiState == CFCCrashAPI.SERVER_UP and not self.backUp then
|
|
||||||
self:setTextAndAlign( "It was down for" )
|
|
||||||
self.backUp = true
|
|
||||||
surface.PlaySound( "garrysmod/save_load1.wav" )
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Text for downTime, update its value in Think
|
|
||||||
-- If server comes back up, make it green and stop updating it
|
|
||||||
-- If timeDown > averageTimeDown, make it red and show the messageLabel
|
|
||||||
local curTimeLabel = makeLabel( body, secondsAsTime( math.floor( timeDown ) ), 70, Color( 251, 191, 83 ), 0.5, "CFC_Mono" )
|
|
||||||
function curTimeLabel:Think()
|
|
||||||
if apiState ~= CFCCrashAPI.SERVER_UP then
|
|
||||||
self:setTextAndAlign( secondsAsTime( math.floor( timeDown ) ) )
|
|
||||||
if timeDown > TIME_TO_RESTART then
|
|
||||||
self:SetTextColor( redCol )
|
|
||||||
if not interfaceDerma.messageLabel:IsVisible() then
|
|
||||||
showMessage( "Uh oh, seems it's taking a little longer than usual..." )
|
|
||||||
end
|
|
||||||
end
|
|
||||||
else
|
|
||||||
self:SetTextColor( greenCol )
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return "The server is restarting..."
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Fill the body with elements, body created elsewhere as it's size relies on size of titleBar and buttonsBar
|
|
||||||
local function populateBody( body )
|
|
||||||
body.Paint = nil
|
|
||||||
local title
|
|
||||||
local frameW, frameH = body:GetSize()
|
|
||||||
|
|
||||||
-- Warning message label
|
|
||||||
interfaceDerma.messageLabel = makeLabel( body, "", frameH - 45, greenCol, 0.5 )
|
|
||||||
interfaceDerma.messageLabel:SetAlpha( 0 )
|
|
||||||
interfaceDerma.messageLabel:Hide()
|
|
||||||
|
|
||||||
-- Fill top text based on CFCCrashAPI state
|
|
||||||
if apiState == CFCCrashAPI.NO_INTERNET then
|
|
||||||
title = populateBodyInternetDown( body )
|
|
||||||
else -- Server down or up via api, and down via net
|
|
||||||
title = populateBodyServerDown( body )
|
|
||||||
end
|
|
||||||
|
|
||||||
makeLabel( body, "Why not play a game while you wait? ( Press space )", 108 )
|
|
||||||
|
|
||||||
-- Game wrapper, in case we ever want to make a game that runs in lua
|
|
||||||
local gamePanel = vgui.Create( "DPanel", body )
|
|
||||||
gamePanel:SetSize( frameW - 20, frameH - 134 - 15 )
|
|
||||||
gamePanel:SetPos( 10, 134 )
|
|
||||||
gamePanel.Paint = nil
|
|
||||||
|
|
||||||
-- HTML element rending game at GAME_URL, constantly grabs focus
|
|
||||||
local gameHtml = vgui.Create( "DHTML", gamePanel )
|
|
||||||
gameHtml:SetSize( gamePanel:GetSize() )
|
|
||||||
gameHtml:SetPos( ( gamePanel:GetWide() - GAME_WIDTH ) / 2, 0 )
|
|
||||||
gameHtml:SetHTML( GAME_CODE or "Oops, it didn't load lol" )
|
|
||||||
function gameHtml:Think()
|
|
||||||
if not gameHtml:HasFocus() then gameHtml:RequestFocus() end
|
|
||||||
end
|
|
||||||
|
|
||||||
return title
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Entry point for creating the interface
|
|
||||||
local function createInterface()
|
|
||||||
|
|
||||||
-- Sized at 80% of the screen
|
|
||||||
local frameW, frameH = 0.8 * ScrW(), 0.8 * ScrH()
|
|
||||||
|
|
||||||
-- Needed for bg blur
|
|
||||||
local startTime = SysTime()
|
|
||||||
-- Main frame
|
|
||||||
local frame = vgui.Create( "DFrame" )
|
|
||||||
interfaceDerma = frame
|
|
||||||
frame:SetSize( frameW, frameH )
|
|
||||||
frame:Center()
|
|
||||||
frame:SetTitle( "" )
|
|
||||||
frame:SetDraggable( false )
|
|
||||||
frame:MakePopup()
|
|
||||||
frame:ShowCloseButton( false )
|
|
||||||
|
|
||||||
function frame:Paint( w, h )
|
|
||||||
Derma_DrawBackgroundBlur( self, startTime )
|
|
||||||
surface.SetDrawColor( primaryCol )
|
|
||||||
surface.DrawRect( 0, 0, w, h )
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Generate title and buttons bars
|
|
||||||
local titlePanel = addTitleBar( frame )
|
|
||||||
local buttonsPanel = addButtonsBar( frame )
|
|
||||||
local discordRow = makeDiscordRow( frame )
|
|
||||||
|
|
||||||
-- Create body that fills the unused space
|
|
||||||
local _, y = buttonsPanel:GetPos()
|
|
||||||
|
|
||||||
local body = vgui.Create( "DPanel", frame )
|
|
||||||
body:SetSize( frameW - 32, y - 32 - titlePanel:GetTall() )
|
|
||||||
body:SetPos( 16, titlePanel:GetTall() + 16 )
|
|
||||||
|
|
||||||
local title = populateBody( body )
|
|
||||||
titlePanel.setTitle( title )
|
|
||||||
|
|
||||||
-- If server fully recovers without crashing, close menu
|
|
||||||
-- If server reboots, enabled the reconnect button
|
|
||||||
function frame:Think()
|
|
||||||
if apiState == CFCCrashAPI.INACTIVE then
|
|
||||||
frame:Close() -- Server recovered without ever closing
|
|
||||||
elseif apiState == CFCCrashAPI.SERVER_UP then
|
|
||||||
if buttonsPanel.reconBtn.autoJoin then
|
|
||||||
rejoin()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
-- Custom method used for hiding the main popup
|
|
||||||
function frame:OnHide()
|
|
||||||
local miniWindow = frame._miniWindow
|
|
||||||
if miniWindow then
|
|
||||||
miniWindow:Show()
|
|
||||||
local rejoinOn = buttonsPanel.reconBtn.autoJoin
|
|
||||||
miniWindow.rejoinLabel:setTextAndAlign( "Rejoin " .. ( rejoinOn and "enabled" or "disabled" ) )
|
|
||||||
miniWindow.rejoinLabel:SetTextColor( rejoinOn and greenCol or yellowCol )
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
miniWindow = vgui.Create( "DFrame" )
|
|
||||||
frame._miniWindow = miniWindow
|
|
||||||
local miniW, miniH = 200, 100
|
|
||||||
miniWindow:SetSize( miniW, miniH )
|
|
||||||
local screenWidth = ScrW()
|
|
||||||
miniWindow:SetPos( screenWidth - miniW - 30, 30 )
|
|
||||||
miniWindow:SetTitle( "Mini window" )
|
|
||||||
miniWindow:SetDraggable( true )
|
|
||||||
miniWindow:SetScreenLock( true )
|
|
||||||
miniWindow:ShowCloseButton( false )
|
|
||||||
|
|
||||||
local curTimeLabel = makeLabel( miniWindow, secondsAsTime( math.floor( timeDown ) ), 30, Color( 251, 191, 83 ), 0.5, "CFC_Mono" )
|
|
||||||
function curTimeLabel:Think()
|
|
||||||
if apiState ~= CFCCrashAPI.SERVER_UP then
|
|
||||||
self:setTextAndAlign( secondsAsTime( math.floor( timeDown ) ) )
|
|
||||||
else
|
|
||||||
self:SetTextColor( greenCol )
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local btn = vgui.Create( "DButton", miniWindow )
|
|
||||||
btn:SetText( "" )
|
|
||||||
btn:SetSize( miniW, miniH - 25 )
|
|
||||||
btn:SetPos( 0, 25 )
|
|
||||||
btn:SetMouseInputEnabled( true )
|
|
||||||
|
|
||||||
function btn:Paint( w, h )
|
|
||||||
if not btn:IsHovered() then return end
|
|
||||||
surface.SetDrawColor( accentCol )
|
|
||||||
surface.DrawRect( 0, 0, w, h )
|
|
||||||
|
|
||||||
surface.SetFont( "CFC_Special" )
|
|
||||||
surface.SetTextColor( greenCol:Unpack() )
|
|
||||||
surface.SetTextPos( w / 4, 10 )
|
|
||||||
surface.DrawText( "Maximize" )
|
|
||||||
end
|
|
||||||
btn.Think = frame.Think
|
|
||||||
function btn:DoClick()
|
|
||||||
frame:Show()
|
|
||||||
miniWindow:Hide()
|
|
||||||
end
|
|
||||||
|
|
||||||
function miniWindow:Paint( w, h )
|
|
||||||
surface.SetDrawColor( primaryCol )
|
|
||||||
surface.DrawRect( 0, 0, w, h )
|
|
||||||
end
|
|
||||||
|
|
||||||
local rejoinOn = buttonsPanel.reconBtn.autoJoin
|
|
||||||
local rejoinStr = rejoinOn and "enabled" or "disabled"
|
|
||||||
local txtColor = rejoinOn and greenCol or yellowCol
|
|
||||||
miniWindow.rejoinLabel = makeLabel( miniWindow, "Rejoin " .. rejoinStr, 60, txtColor )
|
|
||||||
end
|
|
||||||
|
|
||||||
function frame:OnClose()
|
|
||||||
interfaceDerma = nil
|
|
||||||
local miniWindow = frame._miniWindow
|
|
||||||
if miniWindow then
|
|
||||||
miniWindow:Close()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
hook.Add( "ShutDown", "CFC_DisconnectInterface_Shutdown", function()
|
|
||||||
if interfaceDerma then
|
|
||||||
interfaceDerma:Close()
|
|
||||||
end
|
|
||||||
end )
|
|
||||||
|
|
||||||
|
|
||||||
hook.Add( "CFC_CrashTick", "CFC_DisconnectInterface_InterfaceUpdate", function( isCrashing, _timeDown, _apiState )
|
|
||||||
timeDown = _timeDown
|
|
||||||
if _apiState ~= CFCCrashAPI.PINGING_API then
|
|
||||||
apiState = _apiState
|
|
||||||
end
|
|
||||||
local shouldShowInterface = hook.Run( "CFC_DisconnectInterface_ShouldShowInterface" )
|
|
||||||
if shouldShowInterface ~= false and isCrashing then
|
|
||||||
-- Open interface if server is crashing, API has responded, interface isn't already open, and interface has not yet been opened
|
|
||||||
if _apiState == CFCCrashAPI.PINGING_API or _apiState == CFCCrashAPI.SERVER_UP then return end
|
|
||||||
if interfaceDerma or previouslyShown then return end
|
|
||||||
createInterface()
|
|
||||||
previouslyShown = true
|
|
||||||
else
|
|
||||||
-- Close menu if server stops crashing
|
|
||||||
previouslyShown = false
|
|
||||||
if interfaceDerma then
|
|
||||||
if interfaceDerma._miniWindow then
|
|
||||||
interfaceDerma._miniWindow:Remove()
|
|
||||||
end
|
|
||||||
interfaceDerma:Close()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end )
|
|
Loading…
Reference in New Issue
Block a user