mirror of
https://github.com/Facepunch/sbox-public.git
synced 2026-04-19 13:59:22 -04:00
161 lines
4.8 KiB
C#
161 lines
4.8 KiB
C#
using Sandbox;
|
|
|
|
public static class MenuHelpers
|
|
{
|
|
public static string SANDBOX_IDENT => "facepunch.sandbox";
|
|
|
|
public static MenuPanel OpenFriendMenu( Panel source, Friend friend )
|
|
{
|
|
var menu = MenuPanel.Open( source );
|
|
|
|
menu.AddOption( "contact_page", "View Profile", () => Game.Overlay.ShowPlayer( (long)friend.Id ) );
|
|
|
|
if ( !friend.IsFriend && !friend.IsMe )
|
|
{
|
|
menu.AddOption( "person_add", "Send Friend Request", friend.OpenAddFriendOverlay );
|
|
}
|
|
|
|
Friend Me = new Friend( Game.SteamId );
|
|
string ConnectString = friend.GetRichPresence( "connect" );
|
|
bool IsInGame = !string.IsNullOrEmpty( ConnectString );
|
|
bool InSameGame = IsInGame && ConnectString == Me.GetRichPresence( "connect" );
|
|
bool CanJoinGame = !string.IsNullOrEmpty( ConnectString );
|
|
|
|
if ( CanJoinGame && !InSameGame )
|
|
{
|
|
menu.AddOption( "sports_esports", "Join Game", () => MenuUtility.JoinFriendGame( friend ) );
|
|
}
|
|
|
|
return menu;
|
|
}
|
|
|
|
public static void OpenPackageMenu( Panel source, Package package, bool multiplayerOverride = false )
|
|
{
|
|
if ( package.TypeName == "game" )
|
|
OpenGameMenu( source, package, multiplayerOverride );
|
|
else if ( package.TypeName == "map" )
|
|
OpenMapMenu( source, package );
|
|
else
|
|
Log.Info( $"Unknown package type: {package.TypeName}" );
|
|
}
|
|
|
|
static void OpenGameMenu( Panel source, Package package, bool multiplayerOverride = false )
|
|
{
|
|
var menu = MenuPanel.Open( source );
|
|
|
|
menu.AddOption( "play_arrow", "Open Game", () => LaunchGame( package.FullIdent ) );
|
|
|
|
if ( package.Tags.Contains( "maplaunch" ) )
|
|
{
|
|
menu.AddOption( "folder", "Open With Map..", () =>
|
|
{
|
|
Game.Overlay.ShowPackageSelector( $"type:map sort:trending target:{package.FullIdent}", ( p ) => MenuUtility.OpenGameWithMap( package.FullIdent, p.FullIdent ) );
|
|
} );
|
|
}
|
|
|
|
var maxPlayers = package.GetMeta<int>( "MaxPlayers", 1 );
|
|
|
|
if ( multiplayerOverride || package.Tags.Contains( "multiplayer" ) || maxPlayers > 1 )
|
|
{
|
|
menu.AddSpacer();
|
|
menu.AddOption( "list", "View servers", () =>
|
|
{
|
|
Game.Overlay.ShowServerList( new Sandbox.Modals.ServerListConfig( package.FullIdent ) );
|
|
} );
|
|
}
|
|
|
|
menu.AddSpacer();
|
|
menu.AddOption( "corporate_fare", $"View Creator", () => Game.Overlay.ShowOrganizationModal( package.Org ) );
|
|
menu.AddOption( "star", "Rate Game", () => Game.Overlay.ShowReviewModal( package ) );
|
|
}
|
|
|
|
static void OpenMapMenu( Panel source, Package package )
|
|
{
|
|
var menu = MenuPanel.Open( source );
|
|
|
|
async void OnPackageSelected( Package package )
|
|
{
|
|
LaunchArguments.Map = null;
|
|
|
|
var filters = new Dictionary<string, string>
|
|
{
|
|
{ "game", SANDBOX_IDENT },
|
|
{ "map", package.FullIdent },
|
|
};
|
|
|
|
var lobbies = await Networking.QueryLobbies( filters );
|
|
|
|
foreach ( var lobby in lobbies ) // TODO - order by most attractive
|
|
{
|
|
if ( lobby.IsFull ) continue;
|
|
|
|
if ( await Networking.TryConnectSteamId( lobby.LobbyId ) )
|
|
return;
|
|
}
|
|
|
|
CreateGameWithMap( SANDBOX_IDENT, package );
|
|
}
|
|
|
|
void ViewGameList( Package package )
|
|
{
|
|
Game.Overlay.ShowServerList( new Sandbox.Modals.ServerListConfig( null, package.FullIdent ) );
|
|
}
|
|
|
|
menu.AddOption( "play_arrow", "Join existing session", () => OnPackageSelected( package ) );
|
|
menu.AddOption( "playlist_add", "Create own game", () => CreateGameWithMap( SANDBOX_IDENT, package ) );
|
|
|
|
menu.AddSpacer();
|
|
|
|
menu.AddOption( "list", "View servers", () => ViewGameList( package ) );
|
|
|
|
// menu.AddOption( "folder", "Launch With Map..", OnLaunchWithMap );
|
|
|
|
menu.AddSpacer();
|
|
menu.AddOption( "info", $"View Map Details", () => Game.Overlay.ShowPackageModal( package.FullIdent ) );
|
|
menu.AddOption( "corporate_fare", $"View Creator", () => Game.Overlay.ShowOrganizationModal( package.Org ) );
|
|
menu.AddOption( "star", "Rate Map", () => Game.Overlay.ShowReviewModal( package ) );
|
|
}
|
|
|
|
public static async void LoadMap( Package package )
|
|
{
|
|
LaunchArguments.Map = null;
|
|
|
|
var filters = new Dictionary<string, string>
|
|
{
|
|
{ "game", SANDBOX_IDENT },
|
|
{ "map", package.FullIdent },
|
|
};
|
|
|
|
var lobbies = await Networking.QueryLobbies( filters );
|
|
|
|
foreach ( var lobby in lobbies ) // TODO - order by most attractive
|
|
{
|
|
if ( lobby.IsFull ) continue;
|
|
|
|
if ( await Networking.TryConnectSteamId( lobby.LobbyId ) )
|
|
return;
|
|
}
|
|
|
|
CreateGameWithMap( SANDBOX_IDENT, package );
|
|
}
|
|
|
|
public static void CreateGameWithMap( string gameIdent, Package mapPackage )
|
|
{
|
|
LaunchArguments.Map = mapPackage.FullIdent;
|
|
MenuUtility.OpenGame( gameIdent, false );
|
|
}
|
|
|
|
public static void LaunchGame( string gameIdent, bool allowLaunchOverride = true )
|
|
{
|
|
// alex: in VR we don't show modals properly (this needs some thought as to how we're going to do it)
|
|
// so for the purposes of being able to play tech jam games, we'll just launch games directly
|
|
if ( Application.IsVR )
|
|
{
|
|
MenuUtility.OpenGame( gameIdent, true );
|
|
return;
|
|
}
|
|
|
|
Game.Overlay.ShowGameModal( gameIdent );
|
|
}
|
|
}
|