Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

201 lines
6.6 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose: The menu that allows a player to start a game
  4. //
  5. // $Revision: $
  6. // $NoKeywords: $
  7. //===========================================================================//
  8. #include "menumanager.h"
  9. #include "basemenu.h"
  10. #include "vgui_controls/listpanel.h"
  11. #include "vgui_controls/textentry.h"
  12. #include "vgui_controls/Button.h"
  13. #include "tier1/KeyValues.h"
  14. #include "networkmanager.h"
  15. #include "legion.h"
  16. #include "inetworkmessagelistener.h"
  17. #include "networkmessages.h"
  18. #include "tier2/tier2.h"
  19. //-----------------------------------------------------------------------------
  20. // Constructor, destructor
  21. //-----------------------------------------------------------------------------
  22. class CHostGameMenu : public CBaseMenu, public INetworkMessageListener
  23. {
  24. DECLARE_CLASS_SIMPLE( CHostGameMenu, CBaseMenu );
  25. public:
  26. CHostGameMenu( vgui::Panel *pParent, const char *pPanelName );
  27. virtual ~CHostGameMenu();
  28. // Called when a particular network message occurs
  29. virtual void OnNetworkMessage( NetworkMessageRoute_t route, INetworkMessage *pNetworkMessage );
  30. virtual void OnCommand( const char *pCommand );
  31. MESSAGE_FUNC( OnTextNewLine, "TextNewLine" );
  32. private:
  33. vgui::ListPanel *m_pPlayerList;
  34. vgui::TextEntry *m_pServerIP;
  35. vgui::TextEntry *m_pServerName;
  36. vgui::TextEntry *m_pChatLog;
  37. vgui::TextEntry *m_pChatEntry;
  38. vgui::TextEntry *m_pPlayerName;
  39. vgui::Button *m_pStartGame;
  40. };
  41. //-----------------------------------------------------------------------------
  42. // Hooks the menu into the menu system
  43. //-----------------------------------------------------------------------------
  44. REGISTER_MENU( "HostGameMenu", CHostGameMenu );
  45. //-----------------------------------------------------------------------------
  46. // Sort by player name
  47. //-----------------------------------------------------------------------------
  48. static int __cdecl PlayerNameSortFunc( vgui::ListPanel *pPanel, const vgui::ListPanelItem &item1, const vgui::ListPanelItem &item2 )
  49. {
  50. const char *string1 = item1.kv->GetString("player");
  51. const char *string2 = item2.kv->GetString("player");
  52. return stricmp( string1, string2 );
  53. }
  54. //-----------------------------------------------------------------------------
  55. // Constructor, destructor
  56. //-----------------------------------------------------------------------------
  57. CHostGameMenu::CHostGameMenu( vgui::Panel *pParent, const char *pPanelName ) :
  58. BaseClass( pParent, pPanelName )
  59. {
  60. m_pPlayerList = new vgui::ListPanel( this, "PlayerList" );
  61. m_pPlayerList->AddColumnHeader( 0, "color", "Color", 52, 0 );
  62. m_pPlayerList->AddColumnHeader( 1, "player", "Player Name", 128, 0 );
  63. m_pPlayerList->SetSelectIndividualCells( false );
  64. m_pPlayerList->SetEmptyListText( "No Players" );
  65. m_pPlayerList->SetDragEnabled( false );
  66. m_pPlayerList->AddActionSignalTarget( this );
  67. m_pPlayerList->SetSortFunc( 0, PlayerNameSortFunc );
  68. m_pPlayerList->SetSortFunc( 1, PlayerNameSortFunc );
  69. m_pPlayerList->SetSortColumn( 1 );
  70. m_pServerIP = new vgui::TextEntry( this, "ServerIP" );
  71. m_pServerName = new vgui::TextEntry( this, "ServerName" );
  72. m_pPlayerName = new vgui::TextEntry( this, "PlayerName" );
  73. m_pPlayerName->SetMultiline( false );
  74. m_pChatLog = new vgui::TextEntry( this, "ChatLog" );
  75. m_pChatLog->SetMultiline( true );
  76. m_pChatLog->SetVerticalScrollbar( true );
  77. m_pChatEntry = new vgui::TextEntry( this, "ChatEntry" );
  78. m_pChatEntry->AddActionSignalTarget( this );
  79. m_pChatEntry->SetMultiline( false );
  80. m_pChatEntry->SendNewLine( true );
  81. m_pStartGame = new vgui::Button( this, "StartGame", "Start Game", this );
  82. LoadControlSettings( "resource/hostgamemenu.res", "GAME" );
  83. m_pPlayerName->SetText( "Unnamed" );
  84. if ( !g_pNetworkManager->HostGame() )
  85. {
  86. m_pStartGame->SetEnabled( false );
  87. return;
  88. }
  89. m_pServerIP->SetText( g_pNetworkSystem->GetLocalAddress() );
  90. m_pServerName->SetText( g_pNetworkSystem->GetLocalHostName() );
  91. g_pNetworkManager->AddListener( NETWORK_MESSAGE_SERVER_TO_CLIENT, LEGION_NETMESSAGE_GROUP, CHAT_MESSAGE, this );
  92. g_pNetworkManager->AddListener( NETWORK_MESSAGE_CLIENT_TO_SERVER, LEGION_NETMESSAGE_GROUP, CHAT_MESSAGE, this );
  93. }
  94. CHostGameMenu::~CHostGameMenu()
  95. {
  96. g_pNetworkManager->RemoveListener( NETWORK_MESSAGE_SERVER_TO_CLIENT, LEGION_NETMESSAGE_GROUP, CHAT_MESSAGE, this );
  97. g_pNetworkManager->RemoveListener( NETWORK_MESSAGE_CLIENT_TO_SERVER, LEGION_NETMESSAGE_GROUP, CHAT_MESSAGE, this );
  98. }
  99. //-----------------------------------------------------------------------------
  100. // Called when a particular network message occurs
  101. //-----------------------------------------------------------------------------
  102. void CHostGameMenu::OnNetworkMessage( NetworkMessageRoute_t route, INetworkMessage *pNetworkMessage )
  103. {
  104. if ( route == NETWORK_MESSAGE_SERVER_TO_CLIENT )
  105. {
  106. CNetworkMessage_Chat *pChatMsg = static_cast<CNetworkMessage_Chat*>( pNetworkMessage );
  107. m_pChatLog->InsertString( pChatMsg->m_Message.Get() );
  108. m_pChatLog->InsertChar( '\n' );
  109. }
  110. else
  111. {
  112. // If this message was received from an client, broadcast it to all other clients
  113. g_pNetworkManager->BroadcastServerToClientMessage( pNetworkMessage );
  114. }
  115. }
  116. //-----------------------------------------------------------------------------
  117. // Called when the enter key is hit in the chat entry window
  118. //-----------------------------------------------------------------------------
  119. void CHostGameMenu::OnTextNewLine()
  120. {
  121. CNetworkMessage_Chat msg;
  122. int nLen = m_pChatEntry->GetTextLength();
  123. if ( nLen > 0 )
  124. {
  125. char *pText = (char*)_alloca( (nLen+1) * sizeof(char) );
  126. m_pChatEntry->GetText( pText, nLen+1 );
  127. m_pChatEntry->SetText( "" );
  128. int nLenName = m_pPlayerName->GetTextLength();
  129. char *pName = (char*)_alloca( (nLenName+8) * sizeof(char) );
  130. if ( nLenName == 0 )
  131. {
  132. nLenName = 7;
  133. Q_strcpy( pName, "unnamed" );
  134. }
  135. else
  136. {
  137. m_pPlayerName->GetText( pName, nLenName+1 );
  138. }
  139. int nTotalLen = nLen + nLenName;
  140. msg.m_Message.SetLength( nTotalLen + 3 );
  141. Q_snprintf( msg.m_Message.Get(), nTotalLen+3, "[%s] %s", pName, pText );
  142. g_pNetworkManager->PostClientToServerMessage( &msg );
  143. }
  144. }
  145. //-----------------------------------------------------------------------------
  146. // Called when the enter key is hit in the chat entry window
  147. //-----------------------------------------------------------------------------
  148. void CHostGameMenu::OnCommand( const char *pCommand )
  149. {
  150. if ( !Q_stricmp( pCommand, "CancelHostGame" ) )
  151. {
  152. g_pNetworkManager->StopHostingGame();
  153. g_pMenuManager->PopMenu();
  154. return;
  155. }
  156. if ( !Q_stricmp( pCommand, "StartGame" ) )
  157. {
  158. IGameManager::StartNewLevel();
  159. g_pMenuManager->PopAllMenus();
  160. return;
  161. }
  162. BaseClass::OnCommand( pCommand );
  163. }