home *** CD-ROM | disk | FTP | other *** search
/ Enter 2005 March / ENTER.ISO / files / fwp-0.0.6-win32-installer.exe / ConnectToServerMenu.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2004-12-25  |  8.3 KB  |  255 lines

  1. #include "ConnectToServerMenu.h"
  2.  
  3. #include "GuiInfo.h"
  4. #include "Gui.h"
  5.  
  6. #include "TextureHandler.h"
  7. #include "version.h"
  8. #include "Display.h"
  9. #include "Renderer.h"
  10. #include "Game.h"
  11. #include "log.h"
  12. #include "Network.h"
  13.  
  14.  
  15.  
  16. static void CB_CTSM_backButton(){
  17.     Gui::connectToServerMenu->close();
  18. }
  19. static void CB_CTSM_connectButton(){
  20.     Gui::connectToServerMenu->applySettings();
  21.  
  22.     Game::info.cvar.game_clientGame->setVal(true);
  23.  
  24.     Game::init();
  25. }
  26. static void CB_CTSM_getServerInfoButton(){
  27.     Gui::connectToServerMenu->getServerinfo();
  28. }
  29.  
  30. //static const char* testItems[] = {"penner","arsch","wichser"};
  31. //static int numTestItems = 3;
  32.  
  33. ConnectToServerMenu::ConnectToServerMenu():Menu("ConnectToServerMenu"){
  34.     backgroundTexture = TextureHandler::getTexture("gui/menu/main_menu_background.jpg");
  35.  
  36.     TextButton* backButton=new TextButton(40, 100, 120, 25, "< back");
  37.     backButton->setCallbackFunction(&CB_CTSM_backButton);
  38.     addMenuItem(backButton);
  39. //    backButton->deactivate();
  40.  
  41.     TextButton* connectButton=new TextButton(640, 100, 120, 25, "connect >");
  42.     connectButton->setCallbackFunction(&CB_CTSM_connectButton);
  43.     addMenuItem(connectButton);
  44. //    backButton->deactivate();
  45.  
  46.     TextButton* getServerInfoButton = new TextButton(300, 100, 200, 25, "get serverinfo");
  47.     getServerInfoButton->setCallbackFunction(&CB_CTSM_getServerInfoButton);
  48.     addMenuItem(getServerInfoButton);
  49.  
  50.  
  51.     serverHostNameTextfield = new Textfield(40, 450, 1, CON_MAX_STRING_LENGTH, "server hostname: ");
  52.     addMenuItem(serverHostNameTextfield);
  53.  
  54.     portToggleButtonNumItems = 65536;
  55.     portToggleButtonItems = new char*[portToggleButtonNumItems];
  56.     for(int i=0; i<portToggleButtonNumItems; i++){
  57.         char buff[256];
  58.         sprintf(buff, "%i", i);
  59.         portToggleButtonItems[i] = newString( buff );
  60.     }
  61.     portToggleButton = new ToggleButton(40, 430, (const char**)portToggleButtonItems, portToggleButtonNumItems, "server port: ");
  62.     addMenuItem( portToggleButton );
  63.  
  64.     localPortTextfield = new Textfield(40, 410, 1, 5, "local port: ");
  65.     addMenuItem(localPortTextfield);
  66.     localPortTextfield->deactivate();
  67.  
  68.  
  69.  
  70.  
  71.     serverinfo = NULL;
  72.     strcpy(lastServerinfo_hostName, Network::info.var.server_name);
  73. ///    getServerInfo();
  74.  
  75.     allowConsole=true;
  76. }
  77.  
  78. ConnectToServerMenu::~ConnectToServerMenu(){
  79.     if(backgroundTexture!=NULL)
  80.         TextureHandler::releaseTexture(backgroundTexture);
  81.  
  82.     if(serverinfo != NULL){
  83.         delete serverinfo;
  84.     }
  85.  
  86.     int i;
  87.  
  88.     for(i=0;i<portToggleButtonNumItems;i++){
  89.         delete[] portToggleButtonItems[i];
  90.     }
  91.     delete[] portToggleButtonItems;
  92. }
  93.  
  94. bool ConnectToServerMenu::open(){
  95.     updateSettings();
  96.  
  97.     opened=true;
  98.     mainLoop();    // waits until menu is closed again
  99.     return true;
  100. }
  101.  
  102. void ConnectToServerMenu::drawBackground(){
  103.     glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
  104.     Renderer::drawTexturedQuad(0, 0, DISPLAY_VSCREEN_WIDTH, DISPLAY_VSCREEN_HEIGHT, backgroundTexture);
  105.  
  106.     Renderer::drawQuad(30, 90, 770, 570, Gui::info.var.menu_normalColor, Gui::info.var.menu_backgroundColor);
  107.  
  108.     glColor4fv(Gui::info.var.menu_normalColor);
  109.     drawScaledAndAlignedString(400, 500, 0.8f, 0.8f, Gui::info.var.menu_bigFont, TEXT_ALIGN_CENTER,
  110.         "< CONNECT TO SERVER >");
  111.  
  112.  
  113.     glColor4fv(Gui::info.var.menu_normalColor);
  114.     drawScaledAndAlignedFormatString(DISPLAY_VSCREEN_WIDTH, 0, 0.8f, 0.8f, Gui::info.var.menu_smallFont, TEXT_ALIGN_RIGHT,
  115.         "FIGHT WIN PREVAIL v%s (%s)   %s ", FWP_VERSION_STRING, FWP_OS_STRING, FWP_COPYRIGHT_NOTE);
  116.  
  117.     drawServerinfo();
  118. }
  119.  
  120. void ConnectToServerMenu::drawServerinfo(){
  121.     int y = 300;
  122.  
  123.     glColor4fv(Gui::info.var.menu_normalColor);
  124.  
  125. //    drawFormatString(40, y, Gui::info.var.menu_smallFont, "serverinfo for '%s':", lastServerinfo_hostName);
  126.     drawFormatString(40, y, Gui::info.var.menu_smallFont, "serverinfo for '%s':", serverHostNameTextfield->getText());
  127.     y-=20;
  128.  
  129.     if( !streq(serverHostNameTextfield->getText(), lastServerinfo_hostName) ){
  130.         glColor4fv(Gui::info.var.menu_normalColor);
  131.         drawFormatString(50, y, Gui::info.var.menu_smallFont, "< CLICK THE 'GET SERVERINFO'-BUTTON BELOW >");
  132.         return;
  133.     }
  134.     if(serverinfo == NULL){
  135.         glColor4fv(Gui::info.var.menu_normalColor);
  136.         drawFormatString(50, y, Gui::info.var.menu_smallFont, "< NOT AVAILABLE >");
  137.         return;
  138.     }
  139.     if(serverinfo->protocolVersion != NETWORK_PROTOCOL_VERSION){
  140.         glColor4fv(Gui::info.var.menu_normalColor);
  141.         drawFormatString(50, y, Gui::info.var.menu_smallFont, "< WRONG PROTOCOL VERSION >");
  142.         return;
  143.     }
  144.  
  145.     drawFormatString(50, y, Gui::info.var.menu_smallFont, "name:          %s", serverinfo->name);
  146.     y-=20;
  147.     drawFormatString(50, y, Gui::info.var.menu_smallFont, "description:   %s", serverinfo->description);
  148.     y-=20;
  149.     drawFormatString(50, y, Gui::info.var.menu_smallFont, "arena:         %s", serverinfo->arena);
  150.     y-=20;
  151.     drawFormatString(50, y, Gui::info.var.menu_smallFont, "gamemode:      %s", Game::getModeName(serverinfo->gamemode));
  152.     y-=20;
  153.     drawFormatString(50, y, Gui::info.var.menu_smallFont, "players:       %i/%i", serverinfo->numClients, serverinfo->maxClients);
  154.     y-=20;
  155.     if( serverinfo->optionFlags & PACKET_OPTION_FLAG_GAME_USE_ARENA_CYCLE )
  156.         drawString(50, y, Gui::info.var.menu_smallFont, "arenacycle:    enabled");
  157.     else
  158.         drawString(50, y, Gui::info.var.menu_smallFont, "arenacycle:    disabled");
  159.  
  160.     y-=20;
  161.     if( serverinfo->optionFlags & PACKET_OPTION_FLAG_GAME_ENABLE_FRIENDLY_FIRE )
  162.         drawString(50, y, Gui::info.var.menu_smallFont, "friendly fire: enabled");
  163.     else
  164.         drawString(50, y, Gui::info.var.menu_smallFont, "friendly fire: disabled");
  165.     y-=20;
  166. }
  167.  
  168. bool ConnectToServerMenu::getServerinfo(){
  169.     if(serverinfo != NULL){
  170.         delete serverinfo;
  171.         serverinfo = NULL;
  172.     }
  173.  
  174.     strcpy(lastServerinfo_hostName, serverHostNameTextfield->getText());
  175.     int serverPort = portToggleButton->getIndex();//Network::info.cvar.network_server_port->getVal();
  176.  
  177.     // resolve host
  178.     IPaddress ipAddress;
  179.     if(SDLNet_ResolveHost(&ipAddress, lastServerinfo_hostName, serverPort) == -1){
  180.         error("(in ConnectToServerMenu::getServerinfo()): Unknown host: '%s'.\n\n", lastServerinfo_hostName);
  181.         return false;
  182.     }
  183.     
  184.     // open local port
  185.     UDPsocket socket = SDLNet_UDP_Open(Network::info.var.client_port);
  186.     if(socket == NULL){
  187.         error("(in ConnectToServerMenu::getServerinfo()): SDLNet_UDP_Open() failed: %s.\n\n", SDLNet_GetError());
  188.         return false;
  189.     }
  190.  
  191.     // send serverInfoRequest
  192.     serverinfoRequestPacket_t sir;
  193.     sir.protocolVersion = NETWORK_PROTOCOL_VERSION;
  194.     UDPpacket* p = PacketHandler::wrapPacket(PACKET_TYPE_SERVERINFO_REQUEST, ipAddress, &sir, sizeof(sir));
  195.     if(p == NULL){
  196.         error("(in ConnectToServerMenu::getServerInfo()): Couldn't alloc packet.\n\n");
  197.         SDLNet_UDP_Close(socket);
  198.         return false;
  199.     }
  200.  
  201.     if( !Network::sendPacket(socket, p) ){
  202.         error("(in ConnectToServerMenu::getServerInfo()): Couldn't send packet.\n\n");
  203.         SDLNet_FreePacket(p);
  204.         SDLNet_UDP_Close(socket);
  205.         return false;
  206.     }
  207.     SDLNet_FreePacket(p);
  208.  
  209.     log("Serverinfo request send to %s:%i. Waiting for reply...\n", Network::info.var.server_ip, serverPort);
  210.  
  211.     SDL_Delay(2000);
  212.  
  213.     // receive answer
  214.     UDPpacket* answer = NULL;
  215.     do{
  216.         answer = Network::receivePacket(socket);
  217.         if( answer != NULL ){
  218. //            log("EMPFANG!!\n");
  219.             if(answer->data[1] == PACKET_TYPE_SERVERINFO){
  220.                 log("Received serverInfo from server.\n");
  221.  
  222.                 serverinfo = new serverinfoPacket_t;
  223.                 PacketHandler::unwrapAndFreePacket(answer, serverinfo, sizeof(serverinfoPacket_t));
  224.                 SDLNet_UDP_Close(socket);
  225.                 
  226.                 return true;
  227.             }
  228.             SDLNet_FreePacket(answer);
  229.         }else{
  230. //            log("NIX DA!\n");
  231.         }
  232.     }while( answer != NULL );
  233.  
  234.  
  235.  
  236.     SDLNet_UDP_Close(socket);
  237.     error("(in ConnectToServerMenu::getServerinfo()): No answer from %s:%i. Giving up.\n", lastServerinfo_hostName, Network::info.var.server_port);
  238.     return false;
  239. }
  240.  
  241.  
  242. void ConnectToServerMenu::applySettings(){
  243.     Network::info.cvar.network_server_hostName->setValStr(serverHostNameTextfield->getText());
  244.     Network::info.cvar.network_server_port->setVal( portToggleButton->getIndex() );
  245.     Network::info.cvar.network_client_port->setValStr(localPortTextfield->getText());
  246. }
  247.  
  248. void ConnectToServerMenu::updateSettings(){
  249.     char buff[CON_MAX_STRING_LENGTH];
  250.  
  251.     serverHostNameTextfield->setText(Network::info.cvar.network_server_hostName->getVal());
  252.     portToggleButton->setIndex( Network::info.cvar.network_server_port->getVal() );
  253.     localPortTextfield->setText(Network::info.cvar.network_client_port->getValStr(buff));
  254. }
  255.