mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
288 lines
6.3 KiB
Lua
288 lines
6.3 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/
|
||
|
|
--]]
|
||
|
|
|
||
|
|
|
||
|
|
g_ServerName = ""
|
||
|
|
g_MapName = ""
|
||
|
|
g_ServerURL = ""
|
||
|
|
g_MaxPlayers = ""
|
||
|
|
g_SteamID = ""
|
||
|
|
|
||
|
|
local PANEL = {}
|
||
|
|
|
||
|
|
function PANEL:Init()
|
||
|
|
|
||
|
|
self:SetSize( ScrW(), ScrH() )
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:ShowURL( url, force )
|
||
|
|
|
||
|
|
if ( string.len( url ) < 5 ) then
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
if ( IsValid( self.HTML ) ) then
|
||
|
|
if ( !force ) then return end
|
||
|
|
self.HTML:Remove()
|
||
|
|
end
|
||
|
|
|
||
|
|
self:SetSize( ScrW(), ScrH() )
|
||
|
|
|
||
|
|
self.HTML = vgui.Create( "DHTML", self )
|
||
|
|
self.HTML:SetSize( ScrW(), ScrH() )
|
||
|
|
self.HTML:Dock( FILL )
|
||
|
|
self.HTML:OpenURL( url )
|
||
|
|
|
||
|
|
self:InvalidateLayout()
|
||
|
|
self:SetMouseInputEnabled( false )
|
||
|
|
|
||
|
|
self.LoadedURL = url
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:PerformLayout()
|
||
|
|
|
||
|
|
self:SetSize( ScrW(), ScrH() )
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:Paint()
|
||
|
|
|
||
|
|
surface.SetDrawColor( 30, 30, 30, 255 )
|
||
|
|
surface.DrawRect( 0, 0, self:GetWide(), self:GetTall() )
|
||
|
|
|
||
|
|
if ( self.JavascriptRun && IsValid( self.HTML ) && !self.HTML:IsLoading() ) then
|
||
|
|
|
||
|
|
self:RunJavascript( self.JavascriptRun )
|
||
|
|
self.JavascriptRun = nil
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:RunJavascript( str )
|
||
|
|
|
||
|
|
if ( !IsValid( self.HTML ) ) then return end
|
||
|
|
if ( self.HTML:IsLoading() ) then return end
|
||
|
|
|
||
|
|
self.HTML:RunJavascript( str )
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:OnActivate()
|
||
|
|
|
||
|
|
g_ServerName = ""
|
||
|
|
g_MapName = ""
|
||
|
|
g_ServerURL = ""
|
||
|
|
g_MaxPlayers = ""
|
||
|
|
g_SteamID = ""
|
||
|
|
|
||
|
|
self:ShowURL( GetDefaultLoadingHTML() )
|
||
|
|
|
||
|
|
self.NumDownloadables = 0
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:OnDeactivate()
|
||
|
|
|
||
|
|
if ( IsValid( self.HTML ) ) then self.HTML:Remove() end
|
||
|
|
self.LoadedURL = nil
|
||
|
|
self.NumDownloadables = 0
|
||
|
|
|
||
|
|
-- Notify the user that the game is ready.
|
||
|
|
-- TODO: A convar for this?
|
||
|
|
system.FlashWindow()
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:OnScreenSizeChanged( oldW, oldH, newW, newH )
|
||
|
|
|
||
|
|
self:InvalidateLayout( true )
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:Think()
|
||
|
|
|
||
|
|
self:CheckForStatusChanges()
|
||
|
|
self:CheckDownloadTables()
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:StatusChanged( strStatus )
|
||
|
|
|
||
|
|
-- new FastDL/ServerDL format
|
||
|
|
local matchedFileName = string.match( strStatus, "%w+/%w+ [-] (.+) is downloading" )
|
||
|
|
if ( matchedFileName ) then
|
||
|
|
|
||
|
|
self:RunJavascript( "if ( window.DownloadingFile ) DownloadingFile( '" .. matchedFileName:JavascriptSafe() .. "' )" )
|
||
|
|
|
||
|
|
return
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
-- WorkshopDL and old FastDL
|
||
|
|
local startPos, _ = string.find( strStatus, "Downloading " )
|
||
|
|
if ( startPos ) then
|
||
|
|
-- Snip everything before the Download part
|
||
|
|
strStatus = string.sub( strStatus, startPos )
|
||
|
|
|
||
|
|
-- Special case needed for workshop, snip the "' via Workshop" part
|
||
|
|
if ( string.EndsWith( strStatus, "via Workshop" ) ) then
|
||
|
|
strStatus = string.gsub( strStatus, "' via Workshop", "" )
|
||
|
|
strStatus = string.gsub( strStatus, "Downloading '", "" ) -- We need to handle the quote marks
|
||
|
|
end
|
||
|
|
|
||
|
|
local fileName = string.gsub( strStatus, "Downloading ", "" )
|
||
|
|
|
||
|
|
self:RunJavascript( "if ( window.DownloadingFile ) DownloadingFile( '" .. fileName:JavascriptSafe() .. "' )" )
|
||
|
|
|
||
|
|
return
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
self:RunJavascript( "if ( window.SetStatusChanged ) SetStatusChanged( '" .. strStatus:JavascriptSafe() .. "' )" )
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
--[[---------------------------------------------------------
|
||
|
|
|
||
|
|
-----------------------------------------------------------]]
|
||
|
|
function PANEL:CheckForStatusChanges()
|
||
|
|
|
||
|
|
local str = GetLoadStatus()
|
||
|
|
if ( !str ) then return end
|
||
|
|
|
||
|
|
str = string.Trim( str )
|
||
|
|
str = string.Trim( str, "\n" )
|
||
|
|
str = string.Trim( str, "\t" )
|
||
|
|
|
||
|
|
str = string.gsub( str, ".bz2", "" )
|
||
|
|
str = string.gsub( str, ".ztmp", "" )
|
||
|
|
str = string.gsub( str, "\\", "/" )
|
||
|
|
|
||
|
|
if ( self.OldStatus && self.OldStatus == str ) then return end
|
||
|
|
|
||
|
|
self.OldStatus = str
|
||
|
|
self:StatusChanged( str )
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:RefreshDownloadables()
|
||
|
|
|
||
|
|
self.Downloadables = GetDownloadables()
|
||
|
|
if ( !self.Downloadables ) then return end
|
||
|
|
|
||
|
|
local iDownloading = 0
|
||
|
|
local iFileCount = 0
|
||
|
|
for k, v in pairs( self.Downloadables ) do
|
||
|
|
|
||
|
|
v = string.gsub( v, ".bz2", "" )
|
||
|
|
v = string.gsub( v, ".ztmp", "" )
|
||
|
|
v = string.gsub( v, "\\", "/" )
|
||
|
|
|
||
|
|
iDownloading = iDownloading + self:FileNeedsDownload( v )
|
||
|
|
iFileCount = iFileCount + 1
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
if ( iDownloading == 0 ) then return end
|
||
|
|
|
||
|
|
self:RunJavascript( "if ( window.SetFilesNeeded ) SetFilesNeeded( " .. iDownloading .. ")" )
|
||
|
|
self:RunJavascript( "if ( window.SetFilesTotal ) SetFilesTotal( " .. iFileCount .. ")" )
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:FileNeedsDownload( filename )
|
||
|
|
|
||
|
|
local bExists = file.Exists( filename, "GAME" )
|
||
|
|
if ( bExists ) then return 0 end
|
||
|
|
|
||
|
|
return 1
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function PANEL:CheckDownloadTables()
|
||
|
|
|
||
|
|
local NumDownloadables = NumDownloadables()
|
||
|
|
if ( !NumDownloadables ) then return end
|
||
|
|
|
||
|
|
if ( self.NumDownloadables && NumDownloadables == self.NumDownloadables ) then return end
|
||
|
|
|
||
|
|
self.NumDownloadables = NumDownloadables
|
||
|
|
self:RefreshDownloadables()
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
local PanelType_Loading = vgui.RegisterTable( PANEL, "EditablePanel" )
|
||
|
|
|
||
|
|
local pnlLoading = nil
|
||
|
|
|
||
|
|
function GetLoadPanel()
|
||
|
|
|
||
|
|
if ( !IsValid( pnlLoading ) ) then
|
||
|
|
pnlLoading = vgui.CreateFromTable( PanelType_Loading )
|
||
|
|
end
|
||
|
|
|
||
|
|
return pnlLoading
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
function IsInLoading()
|
||
|
|
|
||
|
|
if ( !IsValid( pnlLoading ) || !IsValid( pnlLoading.HTML ) ) then
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
return true
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function GameDetails( servername, serverurl, mapname, maxplayers, steamid, gamemode )
|
||
|
|
|
||
|
|
if ( engine.IsPlayingDemo() ) then return end
|
||
|
|
|
||
|
|
g_ServerName = servername
|
||
|
|
g_MapName = mapname
|
||
|
|
g_ServerURL = serverurl
|
||
|
|
g_MaxPlayers = maxplayers
|
||
|
|
g_SteamID = steamid
|
||
|
|
g_GameMode = gamemode
|
||
|
|
|
||
|
|
MsgN( servername )
|
||
|
|
MsgN( serverurl )
|
||
|
|
MsgN( gamemode )
|
||
|
|
MsgN( mapname )
|
||
|
|
MsgN( maxplayers )
|
||
|
|
MsgN( steamid )
|
||
|
|
|
||
|
|
serverurl = serverurl:Replace( "%s", steamid )
|
||
|
|
serverurl = serverurl:Replace( "%m", mapname )
|
||
|
|
|
||
|
|
if ( maxplayers > 1 && GetConVar( "cl_enable_loadingurl" ):GetBool() && ( serverurl:StartsWith( "http" ) || serverurl:StartsWith( "asset://" ) ) ) then
|
||
|
|
pnlLoading:ShowURL( serverurl, true )
|
||
|
|
end
|
||
|
|
|
||
|
|
-- TODO: This should be pulled from the server
|
||
|
|
local niceGamemode = g_GameMode
|
||
|
|
for k, v in pairs( engine.GetGamemodes() ) do
|
||
|
|
if ( niceGamemode == v.name ) then
|
||
|
|
niceGamemode = v.title
|
||
|
|
break
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
pnlLoading.JavascriptRun = string.format( [[if ( window.GameDetails ) GameDetails( "%s", "%s", "%s", %i, "%s", "%s", %.2f, "%s", "%s" );]],
|
||
|
|
servername:JavascriptSafe(), serverurl:JavascriptSafe(), mapname:JavascriptSafe(), maxplayers, steamid:JavascriptSafe(), g_GameMode:JavascriptSafe(),
|
||
|
|
GetConVarNumber( "snd_musicvolume" ), GetConVarString( "gmod_language" ), niceGamemode:JavascriptSafe() )
|
||
|
|
|
||
|
|
end
|