Skip to content

Instantly share code, notes, and snippets.

@samuelmaddock
Last active February 6, 2017 00:25
Show Gist options
  • Save samuelmaddock/bb2f643ac95dcc6a56e9 to your computer and use it in GitHub Desktop.
Save samuelmaddock/bb2f643ac95dcc6a56e9 to your computer and use it in GitHub Desktop.
Garry's Mod Loading Screen - Disable Audio; overwrite "garrysmod\lua\menu\loading.lua", set to read-only
--=============================================================================--
--
-- This file has been modified to remove any audio that plays on loading screens.
-- https://gist.github.com/samuelmaddock/bb2f643ac95dcc6a56e9
--
--=============================================================================--
g_ServerName = ""
g_MapName = ""
g_ServerURL = ""
g_MaxPlayers = ""
g_SteamID = ""
local DefaultLoadingUrlConVar = CreateConVar( "gm_loadingurl_default", GetDefaultLoadingHTML(), FCVAR_ARCHIVE )
local LoadingAudioConVar = CreateConVar( "gm_loadingurl_audio", "0", FCVAR_ARCHIVE )
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.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
-- MsgN( self.JavascriptRun )
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( DefaultLoadingUrlConVar:GetString() )
self.NumDownloadables = 0
end
--[[---------------------------------------------------------
-----------------------------------------------------------]]
function PANEL:OnDeactivate()
if ( IsValid( self.HTML ) ) then self.HTML:Remove() end
self.LoadedURL = nil
self.NumDownloadables = 0
end
--[[---------------------------------------------------------
-----------------------------------------------------------]]
function PANEL:Think()
self:CheckForStatusChanges()
self:CheckDownloadTables()
end
--[[---------------------------------------------------------
-----------------------------------------------------------]]
function PANEL:StatusChanged( strStatus )
if ( string.find( strStatus, "Downloading " ) ) then
local Filename = string.gsub( strStatus, "Downloading ", "" )
Filename = string.gsub( Filename, "'", "\\'" )
self:RunJavascript( "if ( window.DownloadingFile ) DownloadingFile( '" .. Filename .. "' )" );
return end
strStatus = string.gsub( strStatus, "'", "\\'" )
self:RunJavascript( "if ( window.SetStatusChanged ) SetStatusChanged( '" .. strStatus .. "' )" );
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 iReturn = 0
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 UpdateLoadPanel( strJavascript )
if ( !pnlLoading ) then return end
pnlLoading:RunJavascript( strJavascript )
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 ) then
local url = #serverurl and serverurl or DefaultLoadingUrlConVar:GetString()
pnlLoading:ShowURL( url, true )
end
local gameDetailsJs = string.format( "if ( window.GameDetails ) GameDetails( \"%s\", \"%s\", \"%s\", %i, \"%s\", \"%s\" );",
servername:JavascriptSafe(), serverurl:JavascriptSafe(),
mapname:JavascriptSafe(), maxplayers, steamid:JavascriptSafe(),
g_GameMode:JavascriptSafe() )
if not LoadingAudioConVar:GetBool() then
local audioJs = [[
(function () {
var elem;
var audioElems = document.querySelectorAll('embed, object, audio, video, iframe, frame');
for (var i = 0; i < audioElems.length; i++) {
elem = audioElems[i];
elem.parentNode.removeChild(elem);
}
if (audioElems.length) {
console.log('[LOADINGSCREEN] Removed ' + audioElems.length + ' elements.');
}
}());]]
-- Run JavaScript immediately in hope that it removes the element before it
-- loads
pnlLoading:RunJavascript(audioJs)
-- otherwise, run it when the loading screen is done loading
gameDetailsJs = gameDetailsJs .. audioJs
-- TODO: if an OnDOMReady callback is ever added to DHTML, use that for
-- running the JavaScript
end
pnlLoading.JavascriptRun = gameDetailsJs
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment