2010-05-09 23:23:13 +02:00
// ==============================================================
// This file is part of Glest (www.glest.org)
//
// Copyright (C) 2010- by Titus Tscharntke
//
// You can redistribute this code and/or modify it under
// the terms of the GNU General Public License as published
// by the Free Software Foundation; either version 2 of the
// License, or (at your option) any later version
// ==============================================================
# include "menu_state_masterserver.h"
# include "renderer.h"
# include "sound_renderer.h"
# include "core_data.h"
# include "config.h"
# include "menu_state_connected_game.h"
2010-05-15 20:40:58 +02:00
# include "menu_state_custom_game.h"
2010-05-09 23:23:13 +02:00
# include "menu_state_root.h"
# include "metrics.h"
# include "network_manager.h"
# include "network_message.h"
# include "auto_test.h"
# include "socket.h"
# include "masterserver_info.h"
2010-05-11 07:39:00 +02:00
# include <curl/curl.h>
2010-05-09 23:23:13 +02:00
# include "leak_dumper.h"
namespace Glest { namespace Game {
2010-05-16 05:31:12 +02:00
DisplayMessageFunction MenuStateMasterserver : : pCB_DisplayMessage = NULL ;
2010-05-09 23:23:13 +02:00
// =====================================================
// class ServerLine
// =====================================================
2010-09-09 23:07:39 +02:00
ServerLine : : ServerLine ( MasterServerInfo * mServerInfo , int lineIndex , const char * containerName ) {
2010-05-09 23:23:13 +02:00
Lang & lang = Lang : : getInstance ( ) ;
index = lineIndex ;
int lineOffset = 25 * lineIndex ;
masterServerInfo = mServerInfo ;
2010-05-13 02:42:49 +02:00
int i = 10 ;
2010-05-09 23:23:13 +02:00
int startOffset = 650 ;
//general info:
i + = 10 ;
2010-09-09 08:42:39 +02:00
glestVersionLabel . registerGraphicComponent ( containerName , " glestVersionLabel " + intToStr ( lineIndex ) ) ;
2010-05-09 23:23:13 +02:00
glestVersionLabel . init ( i , startOffset - lineOffset ) ;
glestVersionLabel . setText ( masterServerInfo - > getGlestVersion ( ) ) ;
i + = 80 ;
2010-09-09 08:42:39 +02:00
platformLabel . registerGraphicComponent ( containerName , " platformLabel " + intToStr ( lineIndex ) ) ;
2010-05-09 23:23:13 +02:00
platformLabel . init ( i , startOffset - lineOffset ) ;
platformLabel . setText ( masterServerInfo - > getPlatform ( ) ) ;
i + = 50 ;
2010-09-09 08:42:39 +02:00
binaryCompileDateLabel . registerGraphicComponent ( containerName , " binaryCompileDateLabel " + intToStr ( lineIndex ) ) ;
2010-05-09 23:23:13 +02:00
binaryCompileDateLabel . init ( i , startOffset - lineOffset ) ;
binaryCompileDateLabel . setText ( masterServerInfo - > getBinaryCompileDate ( ) ) ;
//game info:
2010-05-13 02:42:49 +02:00
i + = 130 ;
2010-09-09 08:42:39 +02:00
serverTitleLabel . registerGraphicComponent ( containerName , " serverTitleLabel " + intToStr ( lineIndex ) ) ;
2010-05-09 23:23:13 +02:00
serverTitleLabel . init ( i , startOffset - lineOffset ) ;
serverTitleLabel . setText ( masterServerInfo - > getServerTitle ( ) ) ;
2010-05-13 02:42:49 +02:00
i + = 160 ;
2010-09-09 08:42:39 +02:00
ipAddressLabel . registerGraphicComponent ( containerName , " ipAddressLabel " + intToStr ( lineIndex ) ) ;
2010-05-09 23:23:13 +02:00
ipAddressLabel . init ( i , startOffset - lineOffset ) ;
ipAddressLabel . setText ( masterServerInfo - > getIpAddress ( ) ) ;
//game setup info:
2010-05-15 20:40:58 +02:00
i + = 100 ;
2010-09-09 08:42:39 +02:00
techLabel . registerGraphicComponent ( containerName , " techLabel " + intToStr ( lineIndex ) ) ;
2010-05-09 23:23:13 +02:00
techLabel . init ( i , startOffset - lineOffset ) ;
techLabel . setText ( masterServerInfo - > getTech ( ) ) ;
i + = 100 ;
2010-09-09 08:42:39 +02:00
mapLabel . registerGraphicComponent ( containerName , " mapLabel " + intToStr ( lineIndex ) ) ;
2010-05-09 23:23:13 +02:00
mapLabel . init ( i , startOffset - lineOffset ) ;
mapLabel . setText ( masterServerInfo - > getMap ( ) ) ;
i + = 100 ;
2010-09-09 08:42:39 +02:00
tilesetLabel . registerGraphicComponent ( containerName , " tilesetLabel " + intToStr ( lineIndex ) ) ;
2010-05-09 23:23:13 +02:00
tilesetLabel . init ( i , startOffset - lineOffset ) ;
tilesetLabel . setText ( masterServerInfo - > getTileset ( ) ) ;
i + = 100 ;
2010-09-09 08:42:39 +02:00
activeSlotsLabel . registerGraphicComponent ( containerName , " activeSlotsLabel " + intToStr ( lineIndex ) ) ;
2010-05-09 23:23:13 +02:00
activeSlotsLabel . init ( i , startOffset - lineOffset ) ;
activeSlotsLabel . setText ( intToStr ( masterServerInfo - > getActiveSlots ( ) ) + " / " + intToStr ( masterServerInfo - > getNetworkSlots ( ) ) + " / " + intToStr ( masterServerInfo - > getConnectedClients ( ) ) ) ;
2010-07-03 12:06:31 +02:00
i + = 50 ;
2010-09-09 08:42:39 +02:00
externalConnectPort . registerGraphicComponent ( containerName , " externalConnectPort " + intToStr ( lineIndex ) ) ;
2010-07-03 12:06:31 +02:00
externalConnectPort . init ( i , startOffset - lineOffset ) ;
externalConnectPort . setText ( intToStr ( masterServerInfo - > getExternalConnectPort ( ) ) ) ;
2010-05-09 23:23:13 +02:00
i + = 50 ;
2010-09-09 08:42:39 +02:00
selectButton . registerGraphicComponent ( containerName , " selectButton " + intToStr ( lineIndex ) ) ;
2010-05-09 23:23:13 +02:00
selectButton . init ( i , startOffset - lineOffset , 30 ) ;
selectButton . setText ( " > " ) ;
2010-09-09 08:42:39 +02:00
if ( glestVersionString ! = masterServerInfo - > getGlestVersion ( ) ) {
2010-05-20 01:23:42 +02:00
selectButton . setEnabled ( false ) ;
selectButton . setEditable ( false ) ;
}
2010-09-09 08:42:39 +02:00
GraphicComponent : : applyAllCustomProperties ( containerName ) ;
2010-05-09 23:23:13 +02:00
}
ServerLine : : ~ ServerLine ( ) {
delete masterServerInfo ;
}
bool ServerLine : : buttonMouseClick ( int x , int y ) {
return selectButton . mouseClick ( x , y ) ;
}
bool ServerLine : : buttonMouseMove ( int x , int y ) {
return selectButton . mouseMove ( x , y ) ;
}
void ServerLine : : render ( ) {
Renderer & renderer = Renderer : : getInstance ( ) ;
renderer . renderButton ( & selectButton ) ;
//general info:
renderer . renderLabel ( & glestVersionLabel ) ;
renderer . renderLabel ( & platformLabel ) ;
renderer . renderLabel ( & binaryCompileDateLabel ) ;
//game info:
renderer . renderLabel ( & serverTitleLabel ) ;
renderer . renderLabel ( & ipAddressLabel ) ;
//game setup info:
renderer . renderLabel ( & techLabel ) ;
renderer . renderLabel ( & mapLabel ) ;
renderer . renderLabel ( & tilesetLabel ) ;
2010-07-03 12:06:31 +02:00
renderer . renderLabel ( & activeSlotsLabel ) ;
renderer . renderLabel ( & externalConnectPort ) ;
2010-05-09 23:23:13 +02:00
}
// =====================================================
// class MenuStateMasterserver
// =====================================================
MenuStateMasterserver : : MenuStateMasterserver ( Program * program , MainMenu * mainMenu ) :
2010-05-16 18:40:21 +02:00
MenuState ( program , mainMenu , " masterserver " )
2010-05-09 23:23:13 +02:00
{
2010-09-09 23:07:39 +02:00
containerName = " MasterServer " ;
2010-06-18 01:24:15 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-05-09 23:23:13 +02:00
Lang & lang = Lang : : getInstance ( ) ;
2010-05-15 20:40:58 +02:00
autoRefreshTime = 0 ;
2010-05-16 18:40:21 +02:00
playServerFoundSound = false ;
2010-09-09 08:42:39 +02:00
mainMessageBox . registerGraphicComponent ( containerName , " mainMessageBox " ) ;
2010-05-09 23:23:13 +02:00
mainMessageBox . init ( lang . get ( " Ok " ) ) ;
mainMessageBox . setEnabled ( false ) ;
mainMessageBoxState = 0 ;
2010-05-17 01:03:22 +02:00
lastRefreshTimer = time ( NULL ) ;
2010-05-09 23:23:13 +02:00
// header
2010-09-09 08:42:39 +02:00
labelTitle . registerGraphicComponent ( containerName , " labelTitle " ) ;
2010-05-09 23:23:13 +02:00
labelTitle . init ( 330 , 700 ) ;
2010-05-13 09:22:33 +02:00
labelTitle . setText ( lang . get ( " AvailableServers " ) ) ;
2010-05-09 23:23:13 +02:00
2010-05-15 20:49:45 +02:00
if ( Config : : getInstance ( ) . getString ( " Masterserver " , " " ) = = " " ) {
labelTitle . setText ( " *** " + lang . get ( " AvailableServers " ) ) ;
}
2010-05-15 20:40:58 +02:00
// bottom
2010-06-25 01:29:30 +02:00
int buttonPos = 130 ;
2010-09-09 08:42:39 +02:00
labelChatUrl . registerGraphicComponent ( containerName , " labelChatUrl " ) ;
2010-09-04 01:54:11 +02:00
labelChatUrl . init ( 150 , buttonPos - 50 ) ;
2010-06-25 01:29:30 +02:00
labelChatUrl . setFont ( CoreData : : getInstance ( ) . getMenuFontBig ( ) ) ;
labelChatUrl . setText ( lang . get ( " NoServerVisitChat " ) + " : http://webchat.freenode.net/?channels=glest " ) ;
2010-09-09 08:42:39 +02:00
buttonReturn . registerGraphicComponent ( containerName , " buttonReturn " ) ;
2010-06-25 01:29:30 +02:00
buttonReturn . init ( 50 , buttonPos , 150 ) ;
2010-09-09 08:42:39 +02:00
buttonCreateGame . registerGraphicComponent ( containerName , " buttonCreateGame " ) ;
2010-06-25 01:29:30 +02:00
buttonCreateGame . init ( 300 , buttonPos , 150 ) ;
2010-09-09 08:42:39 +02:00
buttonRefresh . registerGraphicComponent ( containerName , " buttonRefresh " ) ;
2010-06-25 01:29:30 +02:00
buttonRefresh . init ( 550 , buttonPos , 150 ) ;
2010-05-09 23:23:13 +02:00
2010-05-13 09:22:33 +02:00
buttonRefresh . setText ( lang . get ( " RefreshList " ) ) ;
2010-05-09 23:23:13 +02:00
buttonReturn . setText ( lang . get ( " Return " ) ) ;
2010-05-15 20:40:58 +02:00
buttonCreateGame . setText ( lang . get ( " CustomGame " ) ) ;
labelAutoRefresh . setText ( lang . get ( " AutoRefreshRate " ) ) ;
2010-09-09 08:42:39 +02:00
labelAutoRefresh . registerGraphicComponent ( containerName , " labelAutoRefresh " ) ;
2010-06-25 01:29:30 +02:00
labelAutoRefresh . init ( 800 , buttonPos + 30 ) ;
2010-09-09 08:42:39 +02:00
listBoxAutoRefresh . registerGraphicComponent ( containerName , " listBoxAutoRefresh " ) ;
2010-06-25 01:29:30 +02:00
listBoxAutoRefresh . init ( 800 , buttonPos ) ;
2010-05-16 18:40:21 +02:00
listBoxAutoRefresh . pushBackItem ( lang . get ( " Off " ) ) ;
listBoxAutoRefresh . pushBackItem ( " 10 s " ) ;
listBoxAutoRefresh . pushBackItem ( " 20 s " ) ;
listBoxAutoRefresh . pushBackItem ( " 30 s " ) ;
2010-06-24 03:23:18 +02:00
listBoxAutoRefresh . setSelectedItemIndex ( 1 ) ;
2010-06-24 13:30:54 +02:00
autoRefreshTime = 10 * listBoxAutoRefresh . getSelectedItemIndex ( ) ;
2010-05-09 23:23:13 +02:00
2010-06-18 01:24:15 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-05-09 23:23:13 +02:00
NetworkManager : : getInstance ( ) . end ( ) ;
NetworkManager : : getInstance ( ) . init ( nrClient ) ;
2010-05-13 08:43:56 +02:00
//updateServerInfo();
2010-09-04 01:54:11 +02:00
// write hint to console:
Config & configKeys = Config : : getInstance ( std : : pair < ConfigType , ConfigType > ( cfgMainKeys , cfgUserKeys ) ) ;
console . addLine ( lang . get ( " To switch off music press " ) + " - \" " + configKeys . getCharKey ( " ToggleMusic " ) + " \" " ) ;
2010-05-13 08:43:56 +02:00
2010-09-09 08:42:39 +02:00
GraphicComponent : : applyAllCustomProperties ( containerName ) ;
2010-05-13 08:43:56 +02:00
needUpdateFromServer = true ;
updateFromMasterserverThread = new SimpleTaskThread ( this , 0 , 100 ) ;
2010-06-18 20:47:20 +02:00
updateFromMasterserverThread - > setUniqueID ( __FILE__ ) ;
2010-05-13 08:43:56 +02:00
updateFromMasterserverThread - > start ( ) ;
2010-06-18 01:24:15 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-05-09 23:23:13 +02:00
}
MenuStateMasterserver : : ~ MenuStateMasterserver ( ) {
2010-06-18 01:24:15 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-06-18 20:47:20 +02:00
if ( updateFromMasterserverThread ! = NULL ) {
MutexSafeWrapper safeMutex ( & masterServerThreadAccessor ) ;
needUpdateFromServer = false ;
safeMutex . ReleaseLock ( ) ;
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
//BaseThread::shutdownAndWait(updateFromMasterserverThread);
delete updateFromMasterserverThread ;
updateFromMasterserverThread = NULL ;
}
2010-06-18 01:24:15 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-05-13 09:24:59 +02:00
2010-06-18 20:47:20 +02:00
clearServerLines ( ) ;
2010-06-11 05:17:38 +02:00
2010-06-23 16:49:20 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] END \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-05-09 23:23:13 +02:00
}
void MenuStateMasterserver : : clearServerLines ( ) {
while ( ! serverLines . empty ( ) ) {
delete serverLines . back ( ) ;
serverLines . pop_back ( ) ;
}
}
void MenuStateMasterserver : : mouseClick ( int x , int y , MouseButton mouseButton ) {
2010-06-18 01:24:15 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-05-09 23:23:13 +02:00
CoreData & coreData = CoreData : : getInstance ( ) ;
SoundRenderer & soundRenderer = SoundRenderer : : getInstance ( ) ;
if ( mainMessageBox . getEnabled ( ) ) {
int button = 1 ;
if ( mainMessageBox . mouseClick ( x , y , button ) )
2010-09-04 01:54:11 +02:00
{
2010-05-09 23:23:13 +02:00
soundRenderer . playFx ( coreData . getClickSoundA ( ) ) ;
if ( button = = 1 )
{
mainMessageBox . setEnabled ( false ) ;
}
}
}
else if ( buttonRefresh . mouseClick ( x , y ) ) {
2010-06-18 01:24:15 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-06-11 05:17:38 +02:00
MutexSafeWrapper safeMutex ( & masterServerThreadAccessor ) ;
2010-05-09 23:23:13 +02:00
soundRenderer . playFx ( coreData . getClickSoundB ( ) ) ;
2010-05-13 08:43:56 +02:00
//updateServerInfo();
needUpdateFromServer = true ;
2010-06-18 01:24:15 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-05-09 23:23:13 +02:00
}
else if ( buttonReturn . mouseClick ( x , y ) ) {
2010-06-18 01:24:15 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-06-11 05:17:38 +02:00
MutexSafeWrapper safeMutex ( & masterServerThreadAccessor ) ;
2010-05-09 23:23:13 +02:00
soundRenderer . playFx ( coreData . getClickSoundB ( ) ) ;
2010-05-13 09:24:59 +02:00
2010-06-18 19:09:42 +02:00
//BaseThread::shutdownAndWait(updateFromMasterserverThread);
2010-06-18 01:24:15 +02:00
delete updateFromMasterserverThread ;
updateFromMasterserverThread = NULL ;
2010-06-11 05:17:38 +02:00
safeMutex . ReleaseLock ( ) ;
2010-06-18 01:24:15 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-05-09 23:23:13 +02:00
mainMenu - > setState ( new MenuStateRoot ( program , mainMenu ) ) ;
2010-06-18 01:24:15 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-05-09 23:23:13 +02:00
}
2010-05-15 20:40:58 +02:00
else if ( buttonCreateGame . mouseClick ( x , y ) ) {
2010-06-18 01:24:15 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-06-11 05:17:38 +02:00
MutexSafeWrapper safeMutex ( & masterServerThreadAccessor ) ;
2010-05-15 20:40:58 +02:00
soundRenderer . playFx ( coreData . getClickSoundB ( ) ) ;
2010-06-18 01:24:15 +02:00
needUpdateFromServer = false ;
2010-06-23 16:49:20 +02:00
safeMutex . ReleaseLock ( ) ;
2010-06-29 08:50:35 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-06-18 19:09:42 +02:00
//BaseThread::shutdownAndWait(updateFromMasterserverThread);
2010-06-18 01:24:15 +02:00
delete updateFromMasterserverThread ;
updateFromMasterserverThread = NULL ;
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-05-16 18:40:21 +02:00
mainMenu - > setState ( new MenuStateCustomGame ( program , mainMenu , true , true ) ) ;
2010-06-18 01:24:15 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-05-15 20:40:58 +02:00
}
else if ( listBoxAutoRefresh . mouseClick ( x , y ) ) {
2010-06-11 05:17:38 +02:00
MutexSafeWrapper safeMutex ( & masterServerThreadAccessor ) ;
2010-05-15 20:40:58 +02:00
soundRenderer . playFx ( coreData . getClickSoundA ( ) ) ;
autoRefreshTime = 10 * listBoxAutoRefresh . getSelectedItemIndex ( ) ;
}
2010-06-11 05:17:38 +02:00
else {
MutexSafeWrapper safeMutex ( & masterServerThreadAccessor ) ;
2010-05-09 23:23:13 +02:00
for ( int i = 0 ; i < serverLines . size ( ) ; + + i ) {
2010-06-18 20:47:20 +02:00
if ( serverLines [ i ] - > buttonMouseClick ( x , y ) ) {
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
2010-05-09 23:23:13 +02:00
soundRenderer . playFx ( coreData . getClickSoundB ( ) ) ;
2010-06-11 05:17:38 +02:00
string connectServerIP = serverLines [ i ] - > getMasterServerInfo ( ) - > getIpAddress ( ) ;
2010-07-03 12:06:31 +02:00
int connectServerPort = serverLines [ i ] - > getMasterServerInfo ( ) - > getExternalConnectPort ( ) ;
connectToServer ( connectServerIP , connectServerPort ) ;
2010-06-18 20:47:20 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
safeMutex . ReleaseLock ( ) ;
BaseThread : : shutdownAndWait ( updateFromMasterserverThread ) ;
delete updateFromMasterserverThread ;
updateFromMasterserverThread = NULL ;
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s Line: %d] \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ;
mainMenu - > setState ( new MenuStateConnectedGame ( program , mainMenu , jmMasterserver ) ) ;
2010-05-09 23:23:13 +02:00
break ;
}
}
}
}
void MenuStateMasterserver : : mouseMove ( int x , int y , const MouseState * ms ) {
2010-06-11 05:17:38 +02:00
MutexSafeWrapper safeMutex ( & masterServerThreadAccessor ) ;
2010-05-09 23:23:13 +02:00
if ( mainMessageBox . getEnabled ( ) ) {
mainMessageBox . mouseMove ( x , y ) ;
}
buttonRefresh . mouseMove ( x , y ) ;
buttonReturn . mouseMove ( x , y ) ;
2010-05-15 20:40:58 +02:00
buttonCreateGame . mouseMove ( x , y ) ;
listBoxAutoRefresh . mouseMove ( x , y ) ;
2010-05-09 23:23:13 +02:00
for ( int i = 0 ; i < serverLines . size ( ) ; + + i ) {
serverLines [ i ] - > buttonMouseMove ( x , y ) ;
}
}
void MenuStateMasterserver : : render ( ) {
Renderer & renderer = Renderer : : getInstance ( ) ;
2010-06-11 05:17:38 +02:00
MutexSafeWrapper safeMutex ( & masterServerThreadAccessor ) ;
2010-05-09 23:23:13 +02:00
if ( mainMessageBox . getEnabled ( ) ) {
renderer . renderMessageBox ( & mainMessageBox ) ;
}
else
{
renderer . renderButton ( & buttonRefresh ) ;
renderer . renderButton ( & buttonReturn ) ;
renderer . renderLabel ( & labelTitle ) ;
2010-05-15 20:40:58 +02:00
renderer . renderLabel ( & labelAutoRefresh ) ;
2010-06-25 01:29:30 +02:00
renderer . renderLabel ( & labelChatUrl ) ;
2010-05-15 20:40:58 +02:00
renderer . renderButton ( & buttonCreateGame ) ;
renderer . renderListBox ( & listBoxAutoRefresh ) ;
2010-09-04 01:54:11 +02:00
// render console
renderer . renderConsole ( & console , false , false ) ;
2010-05-15 20:40:58 +02:00
2010-05-09 23:23:13 +02:00
for ( int i = 0 ; i < serverLines . size ( ) ; + + i ) {
serverLines [ i ] - > render ( ) ;
}
2010-07-08 10:29:51 +02:00
}
if ( program ! = NULL ) program - > renderProgramMsgBox ( ) ;
2010-05-09 23:23:13 +02:00
}
void MenuStateMasterserver : : update ( ) {
2010-06-11 05:17:38 +02:00
MutexSafeWrapper safeMutex ( & masterServerThreadAccessor ) ;
2010-05-16 05:31:12 +02:00
if ( autoRefreshTime ! = 0 & & difftime ( time ( NULL ) , lastRefreshTimer ) > = autoRefreshTime ) {
2010-06-18 01:24:15 +02:00
needUpdateFromServer = true ;
lastRefreshTimer = time ( NULL ) ;
2010-05-16 05:31:12 +02:00
}
2010-05-16 18:40:21 +02:00
if ( playServerFoundSound )
{
SoundRenderer : : getInstance ( ) . playFx ( CoreData : : getInstance ( ) . getAttentionSound ( ) ) ;
2010-09-04 01:54:11 +02:00
//switch on music again!!
Config & config = Config : : getInstance ( ) ;
float configVolume = ( config . getInt ( " SoundVolumeMusic " ) / 100.f ) ;
CoreData : : getInstance ( ) . getMenuMusic ( ) - > setVolume ( configVolume ) ;
2010-05-16 18:40:21 +02:00
playServerFoundSound = false ;
}
2010-09-04 01:54:11 +02:00
console . update ( ) ;
2010-05-16 05:31:12 +02:00
if ( threadedErrorMsg ! = " " ) {
std : : string sError = threadedErrorMsg ;
threadedErrorMsg = " " ;
if ( pCB_DisplayMessage ! = NULL ) {
pCB_DisplayMessage ( sError . c_str ( ) , false ) ;
2010-05-15 20:40:58 +02:00
}
2010-05-16 05:31:12 +02:00
else {
throw runtime_error ( sError . c_str ( ) ) ;
}
}
2010-05-09 23:23:13 +02:00
}
2010-05-13 08:43:56 +02:00
void MenuStateMasterserver : : simpleTask ( ) {
2010-06-18 20:47:20 +02:00
if ( updateFromMasterserverThread = = NULL | |
updateFromMasterserverThread - > getQuitStatus ( ) = = true ) {
return ;
}
2010-06-11 05:17:38 +02:00
MutexSafeWrapper safeMutex ( & masterServerThreadAccessor ) ;
2010-06-26 10:04:11 +02:00
bool needUpdate = needUpdateFromServer ;
safeMutex . ReleaseLock ( ) ;
if ( needUpdate = = true ) {
2010-05-13 08:43:56 +02:00
updateServerInfo ( ) ;
}
}
2010-05-11 07:39:00 +02:00
void MenuStateMasterserver : : updateServerInfo ( ) {
2010-05-15 20:49:45 +02:00
try {
2010-05-16 18:40:21 +02:00
2010-06-26 10:04:11 +02:00
if ( updateFromMasterserverThread = = NULL | |
updateFromMasterserverThread - > getQuitStatus ( ) = = true ) {
return ;
}
MutexSafeWrapper safeMutex ( & masterServerThreadAccessor ) ;
needUpdateFromServer = false ;
2010-05-16 18:40:21 +02:00
int numberOfOldServerLines = serverLines . size ( ) ;
2010-05-15 20:49:45 +02:00
clearServerLines ( ) ;
2010-06-26 10:04:11 +02:00
safeMutex . ReleaseLock ( true ) ;
2010-05-16 18:40:21 +02:00
2010-05-15 20:49:45 +02:00
if ( Config : : getInstance ( ) . getString ( " Masterserver " , " " ) ! = " " ) {
2010-06-26 10:04:11 +02:00
std : : string serverInfo = SystemFlags : : getHTTP ( Config : : getInstance ( ) . getString ( " Masterserver " ) + " showServersForGlest.php " ) ;
if ( serverInfo ! = " " ) {
std : : vector < std : : string > serverList ;
Tokenize ( serverInfo , serverList , " \n " ) ;
for ( int i = 0 ; i < serverList . size ( ) ; i + + ) {
string & server = serverList [ i ] ;
std : : vector < std : : string > serverEntities ;
Tokenize ( server , serverEntities , " | " ) ;
2010-07-03 12:06:31 +02:00
const int MIN_FIELDS_EXPECTED = 12 ;
2010-06-26 10:04:11 +02:00
if ( serverEntities . size ( ) > = MIN_FIELDS_EXPECTED ) {
Lang & lang = Lang : : getInstance ( ) ;
labelTitle . setText ( lang . get ( " AvailableServers " ) ) ;
if ( Config : : getInstance ( ) . getString ( " Masterserver " , " " ) = = " " ) {
labelTitle . setText ( " *** " + lang . get ( " AvailableServers " ) ) ;
}
MasterServerInfo * masterServerInfo = new MasterServerInfo ( ) ;
//general info:
masterServerInfo - > setGlestVersion ( serverEntities [ 0 ] ) ;
masterServerInfo - > setPlatform ( serverEntities [ 1 ] ) ;
masterServerInfo - > setBinaryCompileDate ( serverEntities [ 2 ] ) ;
//game info:
masterServerInfo - > setServerTitle ( serverEntities [ 3 ] ) ;
masterServerInfo - > setIpAddress ( serverEntities [ 4 ] ) ;
//game setup info:
masterServerInfo - > setTech ( serverEntities [ 5 ] ) ;
masterServerInfo - > setMap ( serverEntities [ 6 ] ) ;
masterServerInfo - > setTileset ( serverEntities [ 7 ] ) ;
masterServerInfo - > setActiveSlots ( strToInt ( serverEntities [ 8 ] ) ) ;
masterServerInfo - > setNetworkSlots ( strToInt ( serverEntities [ 9 ] ) ) ;
masterServerInfo - > setConnectedClients ( strToInt ( serverEntities [ 10 ] ) ) ;
2010-07-03 12:06:31 +02:00
masterServerInfo - > setExternalConnectPort ( strToInt ( serverEntities [ 11 ] ) ) ;
2010-06-26 10:04:11 +02:00
//printf("Getting Ping time for host %s\n",masterServerInfo->getIpAddress().c_str());
2010-07-03 11:14:58 +02:00
//float pingTime = Socket::getAveragePingMS(masterServerInfo->getIpAddress().c_str(),1);
2010-06-26 10:04:11 +02:00
//printf("Ping time = %f\n",pingTime);
char szBuf [ 1024 ] = " " ;
2010-07-03 11:14:58 +02:00
//sprintf(szBuf,"%s, %.2fms",masterServerInfo->getServerTitle().c_str(),pingTime);
sprintf ( szBuf , " %s " , masterServerInfo - > getServerTitle ( ) . c_str ( ) ) ;
2010-06-26 10:04:11 +02:00
masterServerInfo - > setServerTitle ( szBuf ) ;
if ( updateFromMasterserverThread = = NULL | |
updateFromMasterserverThread - > getQuitStatus ( ) = = true ) {
return ;
}
safeMutex . Lock ( ) ;
2010-09-09 23:07:39 +02:00
serverLines . push_back ( new ServerLine ( masterServerInfo , i , containerName ) ) ;
2010-06-26 10:04:11 +02:00
safeMutex . ReleaseLock ( true ) ;
}
else {
Lang & lang = Lang : : getInstance ( ) ;
labelTitle . setText ( " *** " + lang . get ( " AvailableServers " ) + " [ " + serverInfo + " ] " ) ;
}
2010-05-15 20:49:45 +02:00
}
}
2010-05-11 07:39:00 +02:00
}
2010-06-26 10:04:11 +02:00
if ( updateFromMasterserverThread = = NULL | |
updateFromMasterserverThread - > getQuitStatus ( ) = = true ) {
return ;
}
2010-05-16 18:40:21 +02:00
2010-06-26 10:04:11 +02:00
safeMutex . Lock ( ) ;
if ( serverLines . size ( ) > numberOfOldServerLines ) {
2010-05-16 18:40:21 +02:00
playServerFoundSound = true ;
}
2010-06-26 10:04:11 +02:00
safeMutex . ReleaseLock ( true ) ;
2010-05-15 20:49:45 +02:00
}
catch ( const exception & e ) {
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s] Line: %d, error [%s] \n " , __FILE__ , __FUNCTION__ , __LINE__ , e . what ( ) ) ;
2010-05-16 05:31:12 +02:00
threadedErrorMsg = e . what ( ) ;
2010-05-15 20:49:45 +02:00
}
2010-05-09 23:23:13 +02:00
}
2010-07-03 12:06:31 +02:00
bool MenuStateMasterserver : : connectToServer ( string ipString , int port )
2010-05-09 23:23:13 +02:00
{
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s] START ipString='%s' \n " , __FILE__ , __FUNCTION__ , ipString . c_str ( ) ) ;
ClientInterface * clientInterface = NetworkManager : : getInstance ( ) . getClientInterface ( ) ;
Config & config = Config : : getInstance ( ) ;
Ip serverIp ( ipString ) ;
2010-07-03 12:06:31 +02:00
//int serverPort = Config::getInstance().getInt("ServerPort",intToStr(GameConstants::serverPort).c_str());
int serverPort = port ;
2010-05-17 22:41:18 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s] try to connect to [%s] serverPort = %d \n " , __FILE__ , __FUNCTION__ , serverIp . getString ( ) . c_str ( ) , serverPort ) ;
clientInterface - > connect ( serverIp , serverPort ) ;
2010-07-03 12:06:31 +02:00
if ( clientInterface - > isConnected ( ) = = false ) {
2010-05-09 23:23:13 +02:00
NetworkManager : : getInstance ( ) . end ( ) ;
NetworkManager : : getInstance ( ) . init ( nrClient ) ;
mainMessageBoxState = 1 ;
Lang & lang = Lang : : getInstance ( ) ;
showMessageBox ( lang . get ( " Couldnt connect " ) , lang . get ( " Connection failed " ) , false ) ;
2010-06-18 20:47:20 +02:00
return false ;
2010-05-09 23:23:13 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s] connection failed \n " , __FILE__ , __FUNCTION__ ) ;
}
2010-07-03 12:06:31 +02:00
else {
2010-06-18 20:47:20 +02:00
SystemFlags : : OutputDebug ( SystemFlags : : debugSystem , " In [%s::%s] connected to [%s] \n " , __FILE__ , __FUNCTION__ , serverIp . getString ( ) . c_str ( ) ) ;
2010-05-09 23:23:13 +02:00
//save server ip
//config.setString("ServerIp", serverIp.getString());
//config.save();
2010-06-11 05:17:38 +02:00
2010-06-18 20:47:20 +02:00
return true ;
2010-05-09 23:23:13 +02:00
}
}
void MenuStateMasterserver : : showMessageBox ( const string & text , const string & header , bool toggle ) {
if ( ! toggle ) {
mainMessageBox . setEnabled ( false ) ;
}
if ( ! mainMessageBox . getEnabled ( ) ) {
mainMessageBox . setText ( text ) ;
mainMessageBox . setHeader ( header ) ;
mainMessageBox . setEnabled ( true ) ;
}
else {
mainMessageBox . setEnabled ( false ) ;
}
}
2010-09-04 01:54:11 +02:00
void MenuStateMasterserver : : keyDown ( char key ) {
Config & configKeys = Config : : getInstance ( std : : pair < ConfigType , ConfigType > ( cfgMainKeys , cfgUserKeys ) ) ;
if ( key = = configKeys . getCharKey ( " ToggleMusic " ) ) {
Config & config = Config : : getInstance ( ) ;
Lang & lang = Lang : : getInstance ( ) ;
float configVolume = ( config . getInt ( " SoundVolumeMusic " ) / 100.f ) ;
float currentVolume = CoreData : : getInstance ( ) . getMenuMusic ( ) - > getVolume ( ) ;
if ( currentVolume > 0 ) {
CoreData : : getInstance ( ) . getMenuMusic ( ) - > setVolume ( 0.f ) ;
console . addLine ( lang . get ( " GameMusic " ) + " " + lang . get ( " Off " ) ) ;
}
else {
CoreData : : getInstance ( ) . getMenuMusic ( ) - > setVolume ( configVolume ) ;
//If the config says zero, use the default music volume
//gameMusic->setVolume(configVolume ? configVolume : 0.9);
console . addLine ( lang . get ( " GameMusic " ) ) ;
}
}
2010-09-09 23:07:39 +02:00
else if ( key = = configKeys . getCharKey ( " SaveGUILayout " ) ) {
bool saved = GraphicComponent : : saveAllCustomProperties ( containerName ) ;
Lang & lang = Lang : : getInstance ( ) ;
console . addLine ( lang . get ( " GUILayoutSaved " ) + " [ " + ( saved ? lang . get ( " Yes " ) : lang . get ( " No " ) ) + " ] " ) ;
}
2010-09-04 01:54:11 +02:00
}
//CoreData::getInstance().getMenuMusic()->setVolume(strToInt(listBoxVolumeMusic.getSelectedItem())/100.f);
2010-05-09 23:23:13 +02:00
} } //end namespace