home *** CD-ROM | disk | FTP | other *** search
- #include "ConnectToServerMenu.h"
-
- #include "GuiInfo.h"
- #include "Gui.h"
-
- #include "TextureHandler.h"
- #include "version.h"
- #include "Display.h"
- #include "Renderer.h"
- #include "Game.h"
- #include "log.h"
- #include "Network.h"
-
-
-
- static void CB_CTSM_backButton(){
- Gui::connectToServerMenu->close();
- }
- static void CB_CTSM_connectButton(){
- Gui::connectToServerMenu->applySettings();
-
- Game::info.cvar.game_clientGame->setVal(true);
-
- Game::init();
- }
- static void CB_CTSM_getServerInfoButton(){
- Gui::connectToServerMenu->getServerinfo();
- }
-
- //static const char* testItems[] = {"penner","arsch","wichser"};
- //static int numTestItems = 3;
-
- ConnectToServerMenu::ConnectToServerMenu():Menu("ConnectToServerMenu"){
- backgroundTexture = TextureHandler::getTexture("gui/menu/main_menu_background.jpg");
-
- TextButton* backButton=new TextButton(40, 100, 120, 25, "< back");
- backButton->setCallbackFunction(&CB_CTSM_backButton);
- addMenuItem(backButton);
- // backButton->deactivate();
-
- TextButton* connectButton=new TextButton(640, 100, 120, 25, "connect >");
- connectButton->setCallbackFunction(&CB_CTSM_connectButton);
- addMenuItem(connectButton);
- // backButton->deactivate();
-
- TextButton* getServerInfoButton = new TextButton(300, 100, 200, 25, "get serverinfo");
- getServerInfoButton->setCallbackFunction(&CB_CTSM_getServerInfoButton);
- addMenuItem(getServerInfoButton);
-
-
- serverHostNameTextfield = new Textfield(40, 450, 1, CON_MAX_STRING_LENGTH, "server hostname: ");
- addMenuItem(serverHostNameTextfield);
-
- portToggleButtonNumItems = 65536;
- portToggleButtonItems = new char*[portToggleButtonNumItems];
- for(int i=0; i<portToggleButtonNumItems; i++){
- char buff[256];
- sprintf(buff, "%i", i);
- portToggleButtonItems[i] = newString( buff );
- }
- portToggleButton = new ToggleButton(40, 430, (const char**)portToggleButtonItems, portToggleButtonNumItems, "server port: ");
- addMenuItem( portToggleButton );
-
- localPortTextfield = new Textfield(40, 410, 1, 5, "local port: ");
- addMenuItem(localPortTextfield);
- localPortTextfield->deactivate();
-
-
-
-
- serverinfo = NULL;
- strcpy(lastServerinfo_hostName, Network::info.var.server_name);
- /// getServerInfo();
-
- allowConsole=true;
- }
-
- ConnectToServerMenu::~ConnectToServerMenu(){
- if(backgroundTexture!=NULL)
- TextureHandler::releaseTexture(backgroundTexture);
-
- if(serverinfo != NULL){
- delete serverinfo;
- }
-
- int i;
-
- for(i=0;i<portToggleButtonNumItems;i++){
- delete[] portToggleButtonItems[i];
- }
- delete[] portToggleButtonItems;
- }
-
- bool ConnectToServerMenu::open(){
- updateSettings();
-
- opened=true;
- mainLoop(); // waits until menu is closed again
- return true;
- }
-
- void ConnectToServerMenu::drawBackground(){
- glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- Renderer::drawTexturedQuad(0, 0, DISPLAY_VSCREEN_WIDTH, DISPLAY_VSCREEN_HEIGHT, backgroundTexture);
-
- Renderer::drawQuad(30, 90, 770, 570, Gui::info.var.menu_normalColor, Gui::info.var.menu_backgroundColor);
-
- glColor4fv(Gui::info.var.menu_normalColor);
- drawScaledAndAlignedString(400, 500, 0.8f, 0.8f, Gui::info.var.menu_bigFont, TEXT_ALIGN_CENTER,
- "< CONNECT TO SERVER >");
-
-
- glColor4fv(Gui::info.var.menu_normalColor);
- drawScaledAndAlignedFormatString(DISPLAY_VSCREEN_WIDTH, 0, 0.8f, 0.8f, Gui::info.var.menu_smallFont, TEXT_ALIGN_RIGHT,
- "FIGHT WIN PREVAIL v%s (%s) %s ", FWP_VERSION_STRING, FWP_OS_STRING, FWP_COPYRIGHT_NOTE);
-
- drawServerinfo();
- }
-
- void ConnectToServerMenu::drawServerinfo(){
- int y = 300;
-
- glColor4fv(Gui::info.var.menu_normalColor);
-
- // drawFormatString(40, y, Gui::info.var.menu_smallFont, "serverinfo for '%s':", lastServerinfo_hostName);
- drawFormatString(40, y, Gui::info.var.menu_smallFont, "serverinfo for '%s':", serverHostNameTextfield->getText());
- y-=20;
-
- if( !streq(serverHostNameTextfield->getText(), lastServerinfo_hostName) ){
- glColor4fv(Gui::info.var.menu_normalColor);
- drawFormatString(50, y, Gui::info.var.menu_smallFont, "< CLICK THE 'GET SERVERINFO'-BUTTON BELOW >");
- return;
- }
- if(serverinfo == NULL){
- glColor4fv(Gui::info.var.menu_normalColor);
- drawFormatString(50, y, Gui::info.var.menu_smallFont, "< NOT AVAILABLE >");
- return;
- }
- if(serverinfo->protocolVersion != NETWORK_PROTOCOL_VERSION){
- glColor4fv(Gui::info.var.menu_normalColor);
- drawFormatString(50, y, Gui::info.var.menu_smallFont, "< WRONG PROTOCOL VERSION >");
- return;
- }
-
- drawFormatString(50, y, Gui::info.var.menu_smallFont, "name: %s", serverinfo->name);
- y-=20;
- drawFormatString(50, y, Gui::info.var.menu_smallFont, "description: %s", serverinfo->description);
- y-=20;
- drawFormatString(50, y, Gui::info.var.menu_smallFont, "arena: %s", serverinfo->arena);
- y-=20;
- drawFormatString(50, y, Gui::info.var.menu_smallFont, "gamemode: %s", Game::getModeName(serverinfo->gamemode));
- y-=20;
- drawFormatString(50, y, Gui::info.var.menu_smallFont, "players: %i/%i", serverinfo->numClients, serverinfo->maxClients);
- y-=20;
- if( serverinfo->optionFlags & PACKET_OPTION_FLAG_GAME_USE_ARENA_CYCLE )
- drawString(50, y, Gui::info.var.menu_smallFont, "arenacycle: enabled");
- else
- drawString(50, y, Gui::info.var.menu_smallFont, "arenacycle: disabled");
-
- y-=20;
- if( serverinfo->optionFlags & PACKET_OPTION_FLAG_GAME_ENABLE_FRIENDLY_FIRE )
- drawString(50, y, Gui::info.var.menu_smallFont, "friendly fire: enabled");
- else
- drawString(50, y, Gui::info.var.menu_smallFont, "friendly fire: disabled");
- y-=20;
- }
-
- bool ConnectToServerMenu::getServerinfo(){
- if(serverinfo != NULL){
- delete serverinfo;
- serverinfo = NULL;
- }
-
- strcpy(lastServerinfo_hostName, serverHostNameTextfield->getText());
- int serverPort = portToggleButton->getIndex();//Network::info.cvar.network_server_port->getVal();
-
- // resolve host
- IPaddress ipAddress;
- if(SDLNet_ResolveHost(&ipAddress, lastServerinfo_hostName, serverPort) == -1){
- error("(in ConnectToServerMenu::getServerinfo()): Unknown host: '%s'.\n\n", lastServerinfo_hostName);
- return false;
- }
-
- // open local port
- UDPsocket socket = SDLNet_UDP_Open(Network::info.var.client_port);
- if(socket == NULL){
- error("(in ConnectToServerMenu::getServerinfo()): SDLNet_UDP_Open() failed: %s.\n\n", SDLNet_GetError());
- return false;
- }
-
- // send serverInfoRequest
- serverinfoRequestPacket_t sir;
- sir.protocolVersion = NETWORK_PROTOCOL_VERSION;
- UDPpacket* p = PacketHandler::wrapPacket(PACKET_TYPE_SERVERINFO_REQUEST, ipAddress, &sir, sizeof(sir));
- if(p == NULL){
- error("(in ConnectToServerMenu::getServerInfo()): Couldn't alloc packet.\n\n");
- SDLNet_UDP_Close(socket);
- return false;
- }
-
- if( !Network::sendPacket(socket, p) ){
- error("(in ConnectToServerMenu::getServerInfo()): Couldn't send packet.\n\n");
- SDLNet_FreePacket(p);
- SDLNet_UDP_Close(socket);
- return false;
- }
- SDLNet_FreePacket(p);
-
- log("Serverinfo request send to %s:%i. Waiting for reply...\n", Network::info.var.server_ip, serverPort);
-
- SDL_Delay(2000);
-
- // receive answer
- UDPpacket* answer = NULL;
- do{
- answer = Network::receivePacket(socket);
- if( answer != NULL ){
- // log("EMPFANG!!\n");
- if(answer->data[1] == PACKET_TYPE_SERVERINFO){
- log("Received serverInfo from server.\n");
-
- serverinfo = new serverinfoPacket_t;
- PacketHandler::unwrapAndFreePacket(answer, serverinfo, sizeof(serverinfoPacket_t));
- SDLNet_UDP_Close(socket);
-
- return true;
- }
- SDLNet_FreePacket(answer);
- }else{
- // log("NIX DA!\n");
- }
- }while( answer != NULL );
-
-
-
- SDLNet_UDP_Close(socket);
- error("(in ConnectToServerMenu::getServerinfo()): No answer from %s:%i. Giving up.\n", lastServerinfo_hostName, Network::info.var.server_port);
- return false;
- }
-
-
- void ConnectToServerMenu::applySettings(){
- Network::info.cvar.network_server_hostName->setValStr(serverHostNameTextfield->getText());
- Network::info.cvar.network_server_port->setVal( portToggleButton->getIndex() );
- Network::info.cvar.network_client_port->setValStr(localPortTextfield->getText());
- }
-
- void ConnectToServerMenu::updateSettings(){
- char buff[CON_MAX_STRING_LENGTH];
-
- serverHostNameTextfield->setText(Network::info.cvar.network_server_hostName->getVal());
- portToggleButton->setIndex( Network::info.cvar.network_server_port->getVal() );
- localPortTextfield->setText(Network::info.cvar.network_client_port->getValStr(buff));
- }
-