if Engine.GetCurrentMap() ~= "core_frontend" then return end function IsServerBrowserEnabled() return true end DataSources.LobbyServer = { prepare = function ( controller, list, filter ) list.numElementsInList = list.vCount list.controller = controller list.serverBrowserRootModel = Engine.CreateModel( Engine.GetGlobalModel(), "serverBrowser" ) local serverListCountModel = Engine.GetModel( list.serverBrowserRootModel, "serverListCount" ) if serverListCountModel then list.serverCount = Engine.GetModelValue( serverListCountModel ) else list.serverCount = 0 end list.servers = {} local serversModel = Engine.CreateModel( list.serverBrowserRootModel, "servers" ) for i = 1, list.numElementsInList, 1 do list.servers[i] = {} list.servers[i].root = Engine.CreateModel( serversModel, "server_" .. i ) list.servers[i].model = Engine.CreateModel( list.servers[i].root, "model" ) end list.updateModels = function ( controller, list, offset ) local serverInfo = Engine.SteamServerBrowser_GetServerInfo( offset ) if serverInfo then local SetModelValue = function ( model, key, value ) local model = Engine.CreateModel( model, key ) if model then Engine.SetModelValue( model, value ) end end local elementIndex = offset % list.numElementsInList + 1 local serverModel = list.servers[elementIndex].model SetModelValue( serverModel, "serverIndex", serverInfo.serverIndex ) SetModelValue( serverModel, "connectAddr", serverInfo.connectAddr ) SetModelValue( serverModel, "ping", serverInfo.ping ) SetModelValue( serverModel, "modName", serverInfo.modName ) SetModelValue( serverModel, "mapName", serverInfo.map ) SetModelValue( serverModel, "desc", serverInfo.desc ) -- Changed the client count to be the actual player count local clientCount = serverInfo.playerCount - serverInfo.botCount SetModelValue( serverModel, "clientCount", clientCount ) SetModelValue( serverModel, "maxClients", serverInfo.maxPlayers ) SetModelValue( serverModel, "passwordProtected", serverInfo.password ) SetModelValue( serverModel, "secure", serverInfo.secure ) SetModelValue( serverModel, "name", serverInfo.name ) SetModelValue( serverModel, "gameType", serverInfo.gametype ) SetModelValue( serverModel, "dedicated", serverInfo.dedicated ) SetModelValue( serverModel, "ranked", serverInfo.ranked ) SetModelValue( serverModel, "hardcore", serverInfo.hardcore ) -- Added the bot count SetModelValue( serverModel, "botCount", serverInfo.botCount ) return serverModel else return nil end end if list.serverListUpdateSubscription then list:removeSubscription( list.serverListUpdateSubscription ) end local serverListUpdateModel = Engine.CreateModel( list.serverBrowserRootModel, "serverListCount" ) list.serverListUpdateSubscription = list:subscribeToModel( serverListUpdateModel, function ( model ) list:updateDataSource( false, false ) end, false ) if list.serverListSortTypeSubscription then list:removeSubscription( list.serverListSortTypeSubscription ) end local serverListSortTypeModel = Engine.CreateModel( list.serverBrowserRootModel, "serverListSortType" ) list.serverListSortTypeSubscription = list:subscribeToModel( serverListSortTypeModel, function ( model ) list:updateDataSource( false, false ) end, false ) end, getCount = function ( list ) return list.serverCount end, getItem = function ( controller, list, index ) local offset = index - 1 return list.updateModels( controller, list, offset ) end, cleanup = function ( list ) if list.serverBrowserRootModel then Engine.UnsubscribeAndFreeModel( list.serverBrowserRootModel ) list.serverBrowserRootModel = nil end end } CoD.ServerBrowserRowInternal.new = function ( menu, controller ) local self = LUI.UIHorizontalList.new( { left = 0, top = 0, right = 0, bottom = 0, leftAnchor = true, topAnchor = true, rightAnchor = true, bottomAnchor = true, spacing = 2 } ) self:setAlignment( LUI.Alignment.Left ) if PreLoadFunc then PreLoadFunc( self, controller ) end self:setUseStencil( false ) self:setClass( CoD.ServerBrowserRowInternal ) self.id = "ServerBrowserRowInternal" self.soundSet = "default" self:setLeftRight( true, false, 0, 700 ) self:setTopBottom( true, false, 0, 22 ) self:makeFocusable() self.onlyChildrenFocusable = true self.anyChildUsesUpdateState = true local passwordFlag = CoD.ServerBrowserFlag.new( menu, controller ) passwordFlag:setLeftRight( true, false, 0, 28 ) passwordFlag:setTopBottom( true, true, 0, 0 ) passwordFlag.icon:setImage( RegisterImage( "uie_t7_icon_serverbrowser_protected" ) ) passwordFlag:linkToElementModel( self, nil, false, function ( model ) passwordFlag:setModel( model, controller ) end ) passwordFlag:mergeStateConditions( { { stateName = "FlagOn", condition = function ( menu, element, event ) return IsSelfModelValueTrue( element, controller, "passwordProtected" ) end } } ) passwordFlag:linkToElementModel( passwordFlag, "passwordProtected", true, function ( model ) menu:updateElementState( passwordFlag, { name = "model_validation", menu = menu, modelValue = Engine.GetModelValue( model ), modelName = "passwordProtected" } ) end ) self:addElement( passwordFlag ) self.passwordFlag = passwordFlag local dedicatedFlag = CoD.ServerBrowserFlag.new( menu, controller ) dedicatedFlag:setLeftRight( true, false, 30, 58 ) dedicatedFlag:setTopBottom( true, true, 0, 0 ) dedicatedFlag.icon:setImage( RegisterImage( "uie_t7_icon_serverbrowser_dedicated" ) ) dedicatedFlag:linkToElementModel( self, nil, false, function ( model ) dedicatedFlag:setModel( model, controller ) end ) dedicatedFlag:mergeStateConditions( { { stateName = "FlagOn", condition = function ( menu, element, event ) return IsSelfModelValueTrue( element, controller, "dedicated" ) end } } ) dedicatedFlag:linkToElementModel( dedicatedFlag, "dedicated", true, function ( model ) menu:updateElementState( dedicatedFlag, { name = "model_validation", menu = menu, modelValue = Engine.GetModelValue( model ), modelName = "dedicated" } ) end ) self:addElement( dedicatedFlag ) self.dedicatedFlag = dedicatedFlag local rankedFlag = CoD.ServerBrowserFlag.new( menu, controller ) rankedFlag:setLeftRight( true, false, 60, 88 ) rankedFlag:setTopBottom( true, true, 0, 0 ) rankedFlag.icon:setImage( RegisterImage( "uie_t7_icon_serverbrowser_ranked" ) ) rankedFlag:linkToElementModel( self, nil, false, function ( model ) rankedFlag:setModel( model, controller ) end ) rankedFlag:mergeStateConditions( { { stateName = "FlagOn", condition = function ( menu, element, event ) return IsSelfModelValueTrue( element, controller, "ranked" ) end } } ) rankedFlag:linkToElementModel( rankedFlag, "ranked", true, function ( model ) menu:updateElementState( rankedFlag, { name = "model_validation", menu = menu, modelValue = Engine.GetModelValue( model ), modelName = "ranked" } ) end ) self:addElement( rankedFlag ) self.rankedFlag = rankedFlag local name = CoD.horizontalScrollingTextBox_18pt.new( menu, controller ) name:setLeftRight( true, false, 90, 330 ) name:setTopBottom( true, false, 2, 20 ) name.textBox:setTTF( "fonts/default.ttf" ) name.textBox:setAlignment( Enum.LUIAlignment.LUI_ALIGNMENT_LEFT ) name:linkToElementModel( self, "name", true, function ( model ) local _name = Engine.GetModelValue( model ) if _name then name.textBox:setText( Engine.Localize( _name ) ) end end ) self:addElement( name ) self.name = name local spacer = LUI.UIFrame.new( menu, controller, 0, 0, false ) spacer:setLeftRight( true, false, 332, 339 ) spacer:setTopBottom( true, false, 0, 22 ) spacer:setAlpha( 0 ) self:addElement( spacer ) self.spacer = spacer local map = CoD.horizontalScrollingTextBox_18pt.new( menu, controller ) map:setLeftRight( true, false, 341, 446 ) map:setTopBottom( true, false, 2, 20 ) map.textBox:setTTF( "fonts/default.ttf" ) map.textBox:setAlignment( Enum.LUIAlignment.LUI_ALIGNMENT_LEFT ) map:linkToElementModel( self, "mapName", true, function ( model ) local mapName = Engine.GetModelValue( model ) if mapName then map.textBox:setText( MapNameToLocalizedMapName( mapName ) ) end end ) self:addElement( map ) self.map = map local hardcoreFlag = CoD.ServerBrowserFlag.new( menu, controller ) hardcoreFlag:setLeftRight( true, false, 448, 470 ) hardcoreFlag:setTopBottom( true, true, 0, 0 ) hardcoreFlag.icon:setImage( RegisterImage( "uie_t7_icon_serverbrowser_skull" ) ) hardcoreFlag:linkToElementModel( self, nil, false, function ( model ) hardcoreFlag:setModel( model, controller ) end ) hardcoreFlag:mergeStateConditions( { { stateName = "FlagOn", condition = function ( menu, element, event ) return IsSelfModelValueTrue( element, controller, "hardcore" ) end } } ) hardcoreFlag:linkToElementModel( hardcoreFlag, "hardcore", true, function ( model ) menu:updateElementState( hardcoreFlag, { name = "model_validation", menu = menu, modelValue = Engine.GetModelValue( model ), modelName = "hardcore" } ) end ) self:addElement( hardcoreFlag ) self.hardcoreFlag = hardcoreFlag local gametype = LUI.UIText.new() gametype:setLeftRight( true, false, 472, 576 ) gametype:setTopBottom( true, false, 2, 20 ) gametype:setTTF( "fonts/RefrigeratorDeluxe-Regular.ttf" ) gametype:setAlignment( Enum.LUIAlignment.LUI_ALIGNMENT_LEFT ) gametype:setAlignment( Enum.LUIAlignment.LUI_ALIGNMENT_TOP ) gametype:linkToElementModel( self, "gameType", true, function ( model ) local gameType = Engine.GetModelValue( model ) if gameType then gametype:setText( Engine.Localize( GetGameTypeDisplayString( gameType ) ) ) end end ) self:addElement( gametype ) self.gametype = gametype local playerCount = LUI.UIText.new() playerCount:setLeftRight( true, false, 593, 613 ) playerCount:setTopBottom( true, false, 2, 20 ) playerCount:setTTF( "fonts/RefrigeratorDeluxe-Regular.ttf" ) playerCount:setAlignment( Enum.LUIAlignment.LUI_ALIGNMENT_RIGHT ) playerCount:setAlignment( Enum.LUIAlignment.LUI_ALIGNMENT_TOP ) playerCount:linkToElementModel( self, "clientCount", true, function ( model ) local clientCount = Engine.GetModelValue( model ) if clientCount then playerCount:setText( Engine.Localize( clientCount ) ) end end ) self:addElement( playerCount ) self.playerCount = playerCount local slash = LUI.UIText.new() slash:setLeftRight( true, false, 615, 624 ) slash:setTopBottom( true, false, 2, 20 ) slash:setText( Engine.Localize( "/" ) ) slash:setTTF( "fonts/RefrigeratorDeluxe-Regular.ttf" ) slash:setAlignment( Enum.LUIAlignment.LUI_ALIGNMENT_LEFT ) slash:setAlignment( Enum.LUIAlignment.LUI_ALIGNMENT_TOP ) self:addElement( slash ) self.slash = slash local maxPlayers = LUI.UIText.new() maxPlayers:setLeftRight( true, false, 626, 645 ) maxPlayers:setTopBottom( true, false, 2, 20 ) maxPlayers:setTTF( "fonts/RefrigeratorDeluxe-Regular.ttf" ) maxPlayers:setAlignment( Enum.LUIAlignment.LUI_ALIGNMENT_LEFT ) maxPlayers:setAlignment( Enum.LUIAlignment.LUI_ALIGNMENT_TOP ) maxPlayers:linkToElementModel( self, "maxClients", true, function ( model ) local maxClients = Engine.GetModelValue( model ) if maxClients then maxPlayers:setText( Engine.Localize( maxClients ) ) end end ) self:addElement( maxPlayers ) self.maxPlayers = maxPlayers local botCount = LUI.UIText.new() botCount:setLeftRight( true, false, 637, 659 ) botCount:setTopBottom( true, false, 2, 20 ) botCount:setTTF( "fonts/RefrigeratorDeluxe-Regular.ttf" ) botCount:setAlignment( Enum.LUIAlignment.LUI_ALIGNMENT_LEFT ) botCount:setAlignment( Enum.LUIAlignment.LUI_ALIGNMENT_TOP ) botCount:linkToElementModel( self, "botCount", true, function ( model ) local _botCount = Engine.GetModelValue( model ) if _botCount then botCount:setText( "[".. Engine.Localize( _botCount ) .."]" ) end end ) self:addElement( botCount ) self.botCount = botCount local ping = LUI.UIText.new() ping:setLeftRight( true, false, 661, 699.37 ) ping:setTopBottom( true, false, 2, 20 ) ping:setTTF( "fonts/RefrigeratorDeluxe-Regular.ttf" ) ping:setAlignment( Enum.LUIAlignment.LUI_ALIGNMENT_CENTER ) ping:setAlignment( Enum.LUIAlignment.LUI_ALIGNMENT_TOP ) ping:linkToElementModel( self, "ping", true, function ( model ) local _ping = Engine.GetModelValue( model ) if _ping then ping:setText( Engine.Localize( _ping ) ) end end ) self:addElement( ping ) self.ping = ping spacer.id = "spacer" self:registerEventHandler( "gain_focus", function ( self, event ) if self.m_focusable and self.spacer:processEvent( event ) then return true else return LUI.UIElement.gainFocus( self, event ) end end ) LUI.OverrideFunction_CallOriginalSecond( self, "close", function ( element ) element.passwordFlag:close() element.dedicatedFlag:close() element.rankedFlag:close() element.name:close() element.map:close() element.hardcoreFlag:close() element.gametype:close() element.playerCount:close() element.maxPlayers:close() element.ping:close() end ) if PostLoadFunc then PostLoadFunc( self, controller, menu ) end return self end