// Copyright (C) 2007 Id Software, Inc. // #include "../precompiled.h" #pragma hdrstop #if defined( _DEBUG ) && !defined( ID_REDIRECT_NEWDELETE ) #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #include "SDNetProperties.h" #include "../../sdnet/SDNet.h" #include "../../sdnet/SDNetUser.h" #include "../../sdnet/SDNetAccount.h" #include "../../sdnet/SDNetFriend.h" #include "../../sdnet/SDNetMessage.h" #include "../../sdnet/SDNetMessageHistory.h" #include "../../sdnet/SDNetFriendsManager.h" #include "../../sdnet/SDNetTeamManager.h" #include "../../sdnet/SDNetSession.h" #include "../../sdnet/SDNetProfile.h" #include "../proficiency/StatsTracker.h" #include "../guis/UserInterfaceLocal.h" #include "../guis/UserInterfaceManager.h" #include "../guis/UIList.h" #include "../../decllib/declLocStr.h" /* ================ sdNetProperties::GetFunction ================ */ sdUIFunctionInstance* sdNetProperties::GetFunction( const char* name ) { return gameLocal.GetSDNet().GetFunction( name ); } /* ================ sdNetProperties::GetProperty ================ */ sdProperties::sdProperty* sdNetProperties::GetProperty( const char* name ) { return properties.GetProperty( name, sdProperties::PT_INVALID, false ); } /* ============ sdNetProperties::GetProperty ============ */ sdProperties::sdProperty* sdNetProperties::GetProperty( const char* name, sdProperties::ePropertyType type ) { sdProperties::sdProperty* prop = properties.GetProperty( name, sdProperties::PT_INVALID, false ); if ( prop != NULL && prop->GetValueType() != type && type != sdProperties::PT_INVALID ) { gameLocal.Error( "sdNetProperties::GetProperty: type mismatch for property '%s'", name ); } return prop; } /* ================ sdNetProperties::Init ================ */ SD_UI_PUSH_CLASS_TAG( sdNetProperties ) void sdNetProperties::Init() { properties.RegisterProperty( "state", state ); properties.RegisterProperty( "disconnectReason", disconnectReason ); properties.RegisterProperty( "disconnectString", disconnectString ); properties.RegisterProperty( "connectFailed", connectFailed ); properties.RegisterProperty( "serverRefreshComplete", serverRefreshComplete ); properties.RegisterProperty( "hotServersRefreshComplete", hotServersRefreshComplete ); properties.RegisterProperty( "findingServers", findingServers ); #if !defined( SD_DEMO_BUILD ) properties.RegisterProperty( "initializingTeams", initializingTeams ); properties.RegisterProperty( "initializingFriends", initializingFriends ); #endif /* !SD_DEMO_BUILD */ properties.RegisterProperty( "hasActiveUser", hasActiveUser ); properties.RegisterProperty( "activeUserState", activeUserState ); properties.RegisterProperty( "activeUsername", activeUsername ); #if !defined( SD_DEMO_BUILD ) properties.RegisterProperty( "accountUsername", accountUsername ); #endif /* !SD_DEMO_BUILD */ properties.RegisterProperty( "taskActive", taskActive ); properties.RegisterProperty( "taskErrorCode", taskErrorCode ); properties.RegisterProperty( "taskResultMessage", taskResultMessage ); properties.RegisterProperty( "numAvailableDWServers", numAvailableDWServers ); properties.RegisterProperty( "numAvailableLANServers", numAvailableLANServers ); properties.RegisterProperty( "numAvailableHistoryServers", numAvailableHistoryServers ); properties.RegisterProperty( "numAvailableFavoritesServers",numAvailableFavoritesServers ); #if !defined( SD_DEMO_BUILD ) properties.RegisterProperty( "numAvailableRepeaters", numAvailableRepeaters ); properties.RegisterProperty( "numAvailableLANRepeaters", numAvailableLANRepeaters ); #endif /* !SD_DEMO_BUILD */ #if !defined( SD_DEMO_BUILD ) properties.RegisterProperty( "numPendingClanInvites", numPendingClanInvites ); properties.RegisterProperty( "numFriends", numFriends ); properties.RegisterProperty( "numOnlineFriends", numOnlineFriends ); properties.RegisterProperty( "numClanmates", numClanmates ); properties.RegisterProperty( "numOnlineClanmates", numOnlineClanmates ); properties.RegisterProperty( "statsRequestState", statsRequestState ); properties.RegisterProperty( "teamName", teamName ); properties.RegisterProperty( "teamMemberStatus", teamMemberStatus ); properties.RegisterProperty( "hasAccount", hasAccount ); #endif /* !SD_DEMO_BUILD */ properties.RegisterProperty( "notificationText", notificationText ); properties.RegisterProperty( "notifyExpireTime", notifyExpireTime ); #if !defined( SD_DEMO_BUILD ) properties.RegisterProperty( "hasPendingFriendEvents", hasPendingFriendEvents ); properties.RegisterProperty( "hasPendingTeamEvents", hasPendingTeamEvents ); properties.RegisterProperty( "steamActive", steamActive ); properties.RegisterProperty( "storedLicenseCode", storedLicenseCode ); properties.RegisterProperty( "storedLicenseCodeChecksum", storedLicenseCodeChecksum ); #endif /* !SD_DEMO_BUILD */ uiManager->RegisterListEnumerationCallback( "sdnetUsers", CreateUserList ); uiManager->RegisterListEnumerationCallback( "sdnetServers", CreateServerList ); uiManager->RegisterListEnumerationCallback( "sdnetHotServers", CreateHotServerList ); uiManager->RegisterListEnumerationCallback( "sdnetServerClients", CreateServerClientsList ); uiManager->RegisterListEnumerationCallback( "sdnetUpdateServer", UpdateServer ); #if !defined( SD_DEMO_BUILD ) uiManager->RegisterListEnumerationCallback( "sdnetFriends", CreateFriendsList ); uiManager->RegisterListEnumerationCallback( "sdnetTeam", CreateTeamList ); uiManager->RegisterListEnumerationCallback( "sdnetTeamInvites", CreateTeamInvitesList ); uiManager->RegisterListEnumerationCallback( "sdnetAchievements", CreateAchievementsList ); uiManager->RegisterListEnumerationCallback( "sdnetAchievementTasks", CreateAchievementTasksList ); uiManager->RegisterListEnumerationCallback( "sdnetMessageHistory", CreateMessageHistoryList ); uiManager->RegisterListEnumerationCallback( "sdnetRetrievedUserNames", CreateRetrievedUserNameList ); #endif /* !SD_DEMO_BUILD */ #define SDNET_DEFINE( definition, enumeration ) sdDeclGUI::AddDefine( va( #definition " %i", enumeration ) ); SD_UI_PUSH_GROUP_TAG( "Service State" ) SD_UI_ENUM_TAG( SS_DISABLED, "Network service is disabled." ) SDNET_DEFINE( SS_DISABLED, sdNetService::SS_DISABLED ); SD_UI_ENUM_TAG( SS_INITIALIZED, "Network service is initialized." ) SDNET_DEFINE( SS_INITIALIZED, sdNetService::SS_INITIALIZED ); SD_UI_ENUM_TAG( SS_CONNECTING, "Connecting to demonware." ) SDNET_DEFINE( SS_CONNECTING, sdNetService::SS_CONNECTING ); SD_UI_ENUM_TAG( SS_ONLINE, "Conntected to demonware." ) SDNET_DEFINE( SS_ONLINE, sdNetService::SS_ONLINE ); SD_UI_POP_GROUP_TAG SD_UI_PUSH_GROUP_TAG( "User State" ) SD_UI_ENUM_TAG( US_INACTIVE, "No active user." ) SDNET_DEFINE( US_INACTIVE, sdNetUser::US_INACTIVE ); SD_UI_ENUM_TAG( US_ACTIVE, "User is active but not online." ) SDNET_DEFINE( US_ACTIVE, sdNetUser::US_ACTIVE ); SD_UI_ENUM_TAG( US_ONLINE, "User is online." ) SDNET_DEFINE( US_ONLINE, sdNetUser::US_ONLINE ); SD_UI_POP_GROUP_TAG SD_UI_PUSH_GROUP_TAG( "Block State" ) #if !defined( SD_DEMO_BUILD ) SD_UI_ENUM_TAG( BS_NO_BLOCK, "Friend not blocked." ) SDNET_DEFINE( BS_NO_BLOCK, sdNetFriend::BS_NO_BLOCK ); SD_UI_ENUM_TAG( BS_FULL_BLOCK, "Friend blocked from messages and invites." ) SDNET_DEFINE( BS_FULL_BLOCK, sdNetFriend::BS_FULL_BLOCK ); SD_UI_ENUM_TAG( BS_INVITES_BLOCK, "Friend blocked from invites." ) SDNET_DEFINE( BS_INVITES_BLOCK, sdNetFriend::BS_INVITES_BLOCK ); #endif /* !SD_DEMO_BUILD */ SD_UI_POP_GROUP_TAG SD_UI_PUSH_GROUP_TAG( "Find Server Source." ) SD_UI_ENUM_TAG( FS_LAN, "Searching LAN." ) SDNET_DEFINE( FS_LAN, sdNetManager::FS_LAN ) SD_UI_ENUM_TAG( FS_INTERNET, "Searching internet." ) SDNET_DEFINE( FS_INTERNET, sdNetManager::FS_INTERNET ) #if !defined( SD_DEMO_BUILD ) && !defined( SD_DEMO_BUILD_CONSTRUCTION ) SD_UI_ENUM_TAG( FS_LAN_REPEATER, "Searching LAN repeaters." ) SDNET_DEFINE( FS_LAN_REPEATER, sdNetManager::FS_LAN_REPEATER ) SD_UI_ENUM_TAG( FS_INTERNET_REPEATER, "Searching internet repeaters." ) SDNET_DEFINE( FS_INTERNET_REPEATER, sdNetManager::FS_INTERNET_REPEATER ) #endif /* !SD_DEMO_BUILD && !SD_DEMO_BUILD_CONSTRUCTION */ SD_UI_ENUM_TAG( FS_HISTORY, "Searching history." ) SDNET_DEFINE( FS_HISTORY, sdNetManager::FS_HISTORY ) SD_UI_ENUM_TAG( FS_CURRENT, "Searching current selection" ) SDNET_DEFINE( FS_CURRENT, sdNetManager::FS_CURRENT ) SD_UI_ENUM_TAG( FS_FAVORITES, "Searching favorites" ) SDNET_DEFINE( FS_FAVORITES, sdNetManager::FS_FAVORITES ) SD_UI_POP_GROUP_TAG SD_UI_PUSH_GROUP_TAG( "Server Filter State" ) SD_UI_ENUM_TAG( SFS_MIN, "Search filter min value." ) SDNET_DEFINE( SFS_MIN, sdNetManager::SFS_MIN ) SD_UI_ENUM_TAG( SFS_DONTCARE, "Don't care about filtering for this item." ) SDNET_DEFINE( SFS_DONTCARE, sdNetManager::SFS_DONTCARE ) SD_UI_ENUM_TAG( SFS_HIDE, "Hide servers which filter by this item." ) SDNET_DEFINE( SFS_HIDE, sdNetManager::SFS_HIDE ) SD_UI_ENUM_TAG( SFS_SHOWONLY, "Only show servers that filter by this item." ) SDNET_DEFINE( SFS_SHOWONLY, sdNetManager::SFS_SHOWONLY ) SD_UI_ENUM_TAG( SFS_MAX, "Search filter max value." ) SDNET_DEFINE( SFS_MAX, sdNetManager::SFS_MAX ) SD_UI_POP_GROUP_TAG SD_UI_PUSH_GROUP_TAG( "Server Filter Opcode" ) SD_UI_ENUM_TAG( SFO_EQUAL, "Filtering opcode for item." ) SDNET_DEFINE( SFO_EQUAL, sdNetManager::SFO_EQUAL ) SD_UI_ENUM_TAG( SFO_NOT_EQUAL, "Filtering opcode for item." ) SDNET_DEFINE( SFO_NOT_EQUAL, sdNetManager::SFO_NOT_EQUAL ) SD_UI_ENUM_TAG( SFO_LESS, "Filtering opcode for item." ) SDNET_DEFINE( SFO_LESS, sdNetManager::SFO_LESS ) SD_UI_ENUM_TAG( SFO_GREATER, "Filtering opcode for item." ) SDNET_DEFINE( SFO_GREATER, sdNetManager::SFO_GREATER ) SD_UI_ENUM_TAG( SFO_CONTAINS, "Filtering opcode for item." ) SDNET_DEFINE( SFO_CONTAINS, sdNetManager::SFO_CONTAINS ) SD_UI_ENUM_TAG( SFO_NOT_CONTAINS, "Filtering opcode for item." ) SDNET_DEFINE( SFO_NOT_CONTAINS, sdNetManager::SFO_NOT_CONTAINS ) SD_UI_ENUM_TAG( SFO_NOOP, "Filtering opcode for item." ) SDNET_DEFINE( SFO_NOOP, sdNetManager::SFO_NOOP ) SD_UI_POP_GROUP_TAG SD_UI_PUSH_GROUP_TAG( "Server Filter Result" ) SD_UI_ENUM_TAG( SFR_OR, "OR opcode." ) SDNET_DEFINE( SFR_OR, sdNetManager::SFR_OR ) SD_UI_ENUM_TAG( SFR_AND, "AND opcode." ) SDNET_DEFINE( SFR_AND, sdNetManager::SFR_AND ) SD_UI_POP_GROUP_TAG SD_UI_PUSH_GROUP_TAG( "Server Filter" ) SD_UI_ENUM_TAG( SF_PASSWORDED, "Server is passworded filter." ) SDNET_DEFINE( SF_PASSWORDED, sdNetManager::SF_PASSWORDED ) SD_UI_ENUM_TAG( SF_PUNKBUSTER, "Server has punkbuster filter." ) SDNET_DEFINE( SF_PUNKBUSTER, sdNetManager::SF_PUNKBUSTER ) SD_UI_ENUM_TAG( SF_FRIENDLYFIRE, "Server has friendly fire filter." ) SDNET_DEFINE( SF_FRIENDLYFIRE, sdNetManager::SF_FRIENDLYFIRE ) SD_UI_ENUM_TAG( SF_AUTOBALANCE, "Server has auto balancing of teams filter." ) SDNET_DEFINE( SF_AUTOBALANCE, sdNetManager::SF_AUTOBALANCE ) SD_UI_ENUM_TAG( SF_EMPTY, "Server is empty filter." ) SDNET_DEFINE( SF_EMPTY, sdNetManager::SF_EMPTY ) SD_UI_ENUM_TAG( SF_FULL, "Server is full filter." ) SDNET_DEFINE( SF_FULL, sdNetManager::SF_FULL ) SD_UI_ENUM_TAG( SF_PING, "Server ping filter." ) SDNET_DEFINE( SF_PING, sdNetManager::SF_PING ) // SD_UI_ENUM_TAG( SF_BOTS, "Server has bots filter." ) // SDNET_DEFINE( SF_BOTS, sdNetManager::SF_BOTS ) SD_UI_ENUM_TAG( SF_MAXBOTS, "Maximum bot count filter." ) SDNET_DEFINE( SF_MAXBOTS, sdNetManager::SF_MAXBOTS ) SD_UI_ENUM_TAG( SF_MODS, "Server has mods filter." ) SDNET_DEFINE( SF_MODS, sdNetManager::SF_MODS ) SD_UI_ENUM_TAG( SF_PURE, "Server is pure filter." ) SDNET_DEFINE( SF_PURE, sdNetManager::SF_PURE ) SD_UI_ENUM_TAG( SF_LATEJOIN, "Server has late join filter." ) SDNET_DEFINE( SF_LATEJOIN, sdNetManager::SF_LATEJOIN ) SD_UI_ENUM_TAG( SF_FAVORITE, "Server is in favorites filter." ) SDNET_DEFINE( SF_FAVORITE, sdNetManager::SF_FAVORITE ) #if !defined( SD_DEMO_BUILD ) && !defined( SD_DEMO_BUILD_CONSTRUCTION ) SD_UI_ENUM_TAG( SF_RANKED, "Server is ranked filter." ) SDNET_DEFINE( SF_RANKED, sdNetManager::SF_RANKED ) SD_UI_ENUM_TAG( SF_FRIENDS, "Server has friends playing on it filter." ) SDNET_DEFINE( SF_FRIENDS, sdNetManager::SF_FRIENDS ) #endif /* !SD_DEMO_BUILD && !SD_DEMO_BUILD_CONSTRUCTION */ SD_UI_ENUM_TAG( SF_PLAYERCOUNT, "Server player count filter." ) SDNET_DEFINE( SF_PLAYERCOUNT, sdNetManager::SF_PLAYERCOUNT ) SD_UI_POP_GROUP_TAG SD_UI_PUSH_GROUP_TAG( "Clan Member Status" ) #if !defined( SD_DEMO_BUILD ) SD_UI_ENUM_TAG( MS_ADMIN, "Member is an admin." ) SDNET_DEFINE( MS_ADMIN, sdNetTeamMember::MS_ADMIN ) SD_UI_ENUM_TAG( MS_MEMBER, "Member is a regular member." ) SDNET_DEFINE( MS_MEMBER, sdNetTeamMember::MS_MEMBER ) SD_UI_ENUM_TAG( MS_OWNER, "Member is an owner." ) SDNET_DEFINE( MS_OWNER, sdNetTeamMember::MS_OWNER ) #endif /* !SD_DEMO_BUILD */ SD_UI_POP_GROUP_TAG SD_UI_PUSH_GROUP_TAG( "Player Stat" ) SD_UI_ENUM_TAG( PS_NAME, "For getting player name." ) SDNET_DEFINE( PS_NAME, sdNetManager::PS_NAME ) SD_UI_ENUM_TAG( PS_XP, "For getting player XP." ) SDNET_DEFINE( PS_XP, sdNetManager::PS_XP ) SD_UI_ENUM_TAG( PS_RANK, "For getting player rank." ) SDNET_DEFINE( PS_RANK, sdNetManager::PS_RANK ) SD_UI_ENUM_TAG( PS_TEAM, "For getting player team." ) SDNET_DEFINE( PS_TEAM, sdNetManager::PS_TEAM ) SD_UI_POP_GROUP_TAG SD_UI_PUSH_GROUP_TAG( "Player Reward" ) SD_UI_ENUM_TAG( PR_MOST_XP, "Player with most XP." ) SDNET_DEFINE( PR_MOST_XP, sdNetManager::PR_MOST_XP ) SD_UI_ENUM_TAG( PR_LEAST_XP, "Player with least XP." ) SDNET_DEFINE( PR_LEAST_XP, sdNetManager::PR_LEAST_XP ) SD_UI_ENUM_TAG( PR_BEST_SOLDIER, "Best soldier reward." ) SDNET_DEFINE( PR_BEST_SOLDIER, sdNetManager::PR_BEST_SOLDIER ) SD_UI_ENUM_TAG( PR_BEST_MEDIC, "Best medic reward." ) SDNET_DEFINE( PR_BEST_MEDIC, sdNetManager::PR_BEST_MEDIC ) SD_UI_ENUM_TAG( PR_BEST_ENGINEER, "Best engineer reward." ) SDNET_DEFINE( PR_BEST_ENGINEER, sdNetManager::PR_BEST_ENGINEER ) SD_UI_ENUM_TAG( PR_BEST_FIELDOPS, "Best field ops reward." ) SDNET_DEFINE( PR_BEST_FIELDOPS, sdNetManager::PR_BEST_FIELDOPS ) SD_UI_ENUM_TAG( PR_BEST_COVERTOPS, "Best covert ops reward." ) SDNET_DEFINE( PR_BEST_COVERTOPS, sdNetManager::PR_BEST_COVERTOPS ) SD_UI_ENUM_TAG( PR_BEST_LIGHTWEAPONS, "Best light weapons reward." ) SDNET_DEFINE( PR_BEST_LIGHTWEAPONS, sdNetManager::PR_BEST_LIGHTWEAPONS ) SD_UI_ENUM_TAG( PR_BEST_BATTLESENSE, "Best battlesense reward." ) SDNET_DEFINE( PR_BEST_BATTLESENSE, sdNetManager::PR_BEST_BATTLESENSE ) SD_UI_ENUM_TAG( PR_BEST_VEHICLE, "Best vehicle reward." ) SDNET_DEFINE( PR_BEST_VEHICLE, sdNetManager::PR_BEST_VEHICLE ) SD_UI_ENUM_TAG( PR_ACCURACY_HIGH, "Highest accuracy reward." ) SDNET_DEFINE( PR_ACCURACY_HIGH, sdNetManager::PR_ACCURACY_HIGH ) SD_UI_ENUM_TAG( PR_MOST_OBJECTIVES, "Most objectives completed reward." ) SDNET_DEFINE( PR_MOST_OBJECTIVES, sdNetManager::PR_MOST_OBJECTIVES ) SD_UI_ENUM_TAG( PR_PROFICIENCY, "Most upgrades reward." ) SDNET_DEFINE( PR_PROFICIENCY, sdNetManager::PR_PROFICIENCY ) SD_UI_ENUM_TAG( PR_MOST_KILLS, "Most kills reward." ) SDNET_DEFINE( PR_MOST_KILLS, sdNetManager::PR_MOST_KILLS ) SD_UI_ENUM_TAG( PR_MOST_DAMAGE, "Most damage reward." ) SDNET_DEFINE( PR_MOST_DAMAGE, sdNetManager::PR_MOST_DAMAGE ) SD_UI_ENUM_TAG( PR_MOST_TEAMKILLS, "Most teamkills reward." ) SDNET_DEFINE( PR_MOST_TEAMKILLS, sdNetManager::PR_MOST_TEAMKILLS ) SD_UI_POP_GROUP_TAG SD_UI_PUSH_GROUP_TAG( "Find Server Mode" ) SD_UI_ENUM_TAG( FSM_NEW, "Getting new list of servers." ) SDNET_DEFINE( FSM_NEW, sdNetManager::FSM_NEW ) SD_UI_ENUM_TAG( FSM_REFRESH, "Refresing current list of servers." ) SDNET_DEFINE( FSM_REFRESH, sdNetManager::FSM_REFRESH ) SD_UI_POP_GROUP_TAG SD_UI_PUSH_GROUP_TAG( "Browser Column" ) SD_UI_ENUM_TAG( BC_IP, "IP column." ) SDNET_DEFINE( BC_IP, sdNetManager::BC_IP ) SD_UI_ENUM_TAG( BC_FAVORITE, "Favorites column." ) SDNET_DEFINE( BC_FAVORITE, sdNetManager::BC_FAVORITE ) SD_UI_ENUM_TAG( BC_PASSWORD, "Password column." ) SDNET_DEFINE( BC_PASSWORD, sdNetManager::BC_PASSWORD ) SD_UI_ENUM_TAG( BC_RANKED, "Ranked column." ) SDNET_DEFINE( BC_RANKED, sdNetManager::BC_RANKED ) SD_UI_ENUM_TAG( BC_NAME, "Server name column." ) SDNET_DEFINE( BC_NAME, sdNetManager::BC_NAME ) SD_UI_ENUM_TAG( BC_MAP, "Server map column." ) SDNET_DEFINE( BC_MAP, sdNetManager::BC_MAP ) SD_UI_ENUM_TAG( BC_GAMETYPE_ICON, "Gametype icon column." ) SDNET_DEFINE( BC_GAMETYPE_ICON, sdNetManager::BC_GAMETYPE_ICON ) SD_UI_ENUM_TAG( BC_GAMETYPE, "Gametype column." ) SDNET_DEFINE( BC_GAMETYPE, sdNetManager::BC_GAMETYPE ) SD_UI_ENUM_TAG( BC_TIMELEFT, "Time left on map column." ) SDNET_DEFINE( BC_TIMELEFT, sdNetManager::BC_TIMELEFT ) SD_UI_ENUM_TAG( BC_PLAYERS, "Players on server column." ) SDNET_DEFINE( BC_PLAYERS, sdNetManager::BC_PLAYERS ) SD_UI_ENUM_TAG( BC_PING, "Server ping column." ) SDNET_DEFINE( BC_PING, sdNetManager::BC_PING ) #undef SDNET_DEFINE #define SDNET_DEFINE( enumeration ) sdDeclGUI::AddDefine( va( #enumeration " %i", enumeration ) ); SD_UI_POP_GROUP_TAG SD_UI_PUSH_GROUP_TAG( "SDNet Error Codes" ) SD_UI_ENUM_TAG( SDNET_NO_ERROR, "No error." ) SDNET_DEFINE( SDNET_NO_ERROR ) SD_UI_ENUM_TAG( SDNET_UNKNOWN_ERROR, "Unknown error occured." ) SDNET_DEFINE( SDNET_UNKNOWN_ERROR ) SD_UI_ENUM_TAG( SDNET_BAD_PARAMETERS, "Bad parameters." ) SDNET_DEFINE( SDNET_BAD_PARAMETERS ) SD_UI_ENUM_TAG( SDNET_CANCELLED, "Cancelled." ) SDNET_DEFINE( SDNET_CANCELLED ) SD_UI_POP_GROUP_TAG SD_UI_PUSH_GROUP_TAG( "Friend Context Action" ) SD_UI_ENUM_TAG( FCA_NONE, "No friend context action." ) SDNET_DEFINE( FCA_NONE ) SD_UI_ENUM_TAG( FCA_RESPOND_TO_PROPOSAL, "Respond to invitation proposal." ) SDNET_DEFINE( FCA_RESPOND_TO_PROPOSAL ) SD_UI_ENUM_TAG( FCA_SEND_IM, "Send instant message to friend." ) SDNET_DEFINE( FCA_SEND_IM ) SD_UI_ENUM_TAG( FCA_READ_IM, "Read instant message from friend." ) SDNET_DEFINE( FCA_READ_IM ) SD_UI_ENUM_TAG( FCA_RESPOND_TO_INVITE, "Respond to invite." ) SDNET_DEFINE( FCA_RESPOND_TO_INVITE ) SD_UI_ENUM_TAG( FCA_BLOCKED, "You have been blocked." ) SDNET_DEFINE( FCA_BLOCKED ) SD_UI_ENUM_TAG( FCA_UNBLOCKED, "You have been unblocked." ) SDNET_DEFINE( FCA_UNBLOCKED ) SD_UI_ENUM_TAG( FCA_SESSION_INVITE, "You have been invited to a game." ) SDNET_DEFINE( FCA_SESSION_INVITE ) SD_UI_POP_GROUP_TAG SD_UI_PUSH_GROUP_TAG( "Clan Context Action" ) SD_UI_ENUM_TAG( TCA_NONE, "No clan context action." ) SDNET_DEFINE( TCA_NONE ) SD_UI_ENUM_TAG( TCA_SEND_IM, "Send instant message to clan member." ) SDNET_DEFINE( TCA_SEND_IM ) SD_UI_ENUM_TAG( TCA_READ_IM, "Read instant message from clan member." ) SDNET_DEFINE( TCA_READ_IM ) SD_UI_ENUM_TAG( TCA_NOTIFY_OWNER, "Notify clan member of promotion to owner." ) SDNET_DEFINE( TCA_NOTIFY_OWNER ) SD_UI_ENUM_TAG( TCA_NOTIFY_ADMIN, "Notify clan member of promotion to admin." ) SDNET_DEFINE( TCA_NOTIFY_ADMIN ) SD_UI_ENUM_TAG( TCA_SESSION_INVITE, "Invite a clan member to a game." ) SDNET_DEFINE( TCA_SESSION_INVITE ) SD_UI_POP_GROUP_TAG SD_UI_PUSH_GROUP_TAG( "Username Validation" ) SD_UI_ENUM_TAG( UV_VALID, "Username valid. Used during the creation of an account." ) SDNET_DEFINE( UV_VALID ) SD_UI_ENUM_TAG( UV_DUPLICATE_NAME, "Username already registered. Used during the creation of an account." ) SDNET_DEFINE( UV_DUPLICATE_NAME ) SD_UI_ENUM_TAG( UV_EMPTY_NAME, "Tried registering empty name. Used during the creation of an account." ) SDNET_DEFINE( UV_EMPTY_NAME ) SD_UI_ENUM_TAG( UV_INVALID_NAME, "Used during the creation of an account." ) SDNET_DEFINE( UV_INVALID_NAME ) SD_UI_POP_GROUP_TAG SD_UI_PUSH_GROUP_TAG( "Email Validation" ) SD_UI_ENUM_TAG( EV_VALID, "Valid email address. Used during the creation of an account." ) SDNET_DEFINE( EV_VALID ) SD_UI_ENUM_TAG( EV_EMPTY_MAIL, "Empty email address supplied. Used during the creation of an account." ) SDNET_DEFINE( EV_EMPTY_MAIL ) SD_UI_ENUM_TAG( EV_INVALID_MAIL, "Invalid email address supplied. Used during the creation of an account." ) SDNET_DEFINE( EV_INVALID_MAIL ) SD_UI_ENUM_TAG( EV_CONFIRM_MISMATCH, "Confirmation mismatch of email address. Used during the creation of an account." ) SDNET_DEFINE( EV_CONFIRM_MISMATCH ) SD_UI_POP_GROUP_TAG SD_UI_PUSH_GROUP_TAG( "Stats Request State" ) SD_UI_ENUM_TAG( SR_EMPTY, "No current stats request." ) SDNET_DEFINE( SR_EMPTY ); SD_UI_ENUM_TAG( SR_REQUESTING, "Currently requesting stats." ) SDNET_DEFINE( SR_REQUESTING ); SD_UI_ENUM_TAG( SR_COMPLETED, "Completed stats request." ) SDNET_DEFINE( SR_COMPLETED ); SD_UI_ENUM_TAG( SR_FAILED, "Failed requesting stats." ) SDNET_DEFINE( SR_FAILED ); SD_UI_POP_GROUP_TAG SD_UI_PUSH_GROUP_TAG( "Message History Source" ) SD_UI_ENUM_TAG( MHS_FRIEND, "A friend message." ) SDNET_DEFINE( MHS_FRIEND ); SD_UI_ENUM_TAG( MHS_TEAM, "A clan message." ) SDNET_DEFINE( MHS_TEAM ); SD_UI_POP_GROUP_TAG #undef SDNET_DEFINE notifyExpireTime = 0.0f; nextNotifyTime = 0; #if !defined( SD_DEMO_BUILD ) nextUserUpdate = 0; #endif /* !SD_DEMO_BUILD */ connectFailed = 0.0f; #if !defined( SD_DEMO_BUILD ) steamActive = networkService->IsSteamActive(); if( steamActive ) { idStr fullCode = networkService->GetStoredLicenseCode(); idStrList code; idSplitStringIntoList( code, fullCode.c_str(), " " ); if( code.Num() == 2 && code[ 0 ].Length() == 16 && code[ 1 ].Length() == 2 ) { storedLicenseCode = code[ 0 ]; storedLicenseCodeChecksum = code[ 1 ]; } } #endif /* !SD_DEMO_BUILD */ } SD_UI_POP_CLASS_TAG /* ================ sdNetProperties::Shutdown ================ */ void sdNetProperties::Shutdown() { properties.Clear(); } idCVar gui_notificationTime( "gui_notificationTime", "8", CVAR_FLOAT | CVAR_ARCHIVE | CVAR_PROFILE, "length of time a user notification is on screen, in seconds" ); idCVar gui_notificationPause( "gui_notificationPause", "5", CVAR_FLOAT | CVAR_ARCHIVE | CVAR_PROFILE, "length of time between successive notifications, in seconds" ); /* ================ sdNetProperties::UpdateProperties ================ */ void sdNetProperties::UpdateProperties() { sdNetUser* activeUser = networkService->GetActiveUser(); int now = uiManager->GetLastNonGameTime(); if ( activeUser ) { hasActiveUser = true; activeUserState = activeUser->GetState(); activeUsername = activeUser->GetUsername(); const sdNetAccount& account = activeUser->GetAccount(); #if !defined( SD_DEMO_BUILD ) accountUsername = account.GetUsername(); hasAccount = accountUsername.GetValue().IsEmpty() == false; if( now >= nextUserUpdate ) { // update friend info { sdScopedLock< true > lock( networkService->GetFriendsManager().GetLock() ); const sdNetFriendsList& friends = networkService->GetFriendsManager().GetFriendsList(); numFriends = friends.Num(); if( networkService->GetFriendsManager().GetPendingFriendsList().Num() > 0 ) { hasPendingFriendEvents = 1.0f; } else { int i; for( i = 0; i < friends.Num(); i++ ) { if( friends[ i ]->GetMessageQueue().GetMessages() != NULL ) { hasPendingFriendEvents = 1.0f; break; } } if( i >= friends.Num() ) { hasPendingFriendEvents = 0.0f; } } int numOnline = 0; for( int i = 0; i < friends.Num(); i++ ) { if( friends[ i ]->GetState() == sdNetFriend::OS_ONLINE ) { numOnline++; } } numOnlineFriends = numOnline; } // update team info { sdScopedLock< true > lock( networkService->GetTeamManager().GetLock() ); const sdNetTeamMemberList& members = networkService->GetTeamManager().GetMemberList(); numClanmates = members.Num() > 1 ? ( members.Num() - 1 ) : 0; // don't include yourself if( networkService->GetTeamManager().GetPendingInvitesList().Num() > 0 ) { hasPendingTeamEvents = 1.0f; } else { int i; for( i = 0; i < members.Num(); i++ ) { // skip yourself if( idStr::Icmp( members[ i ]->GetUsername(), activeUser->GetUsername() ) == 0 ) { continue; } if( members[ i ]->GetMessageQueue().GetMessages() != NULL ) { hasPendingTeamEvents = 1.0f; break; } } if( i >= members.Num() ) { hasPendingTeamEvents = 0.0f; } } int numOnline = 0; for( int i = 0; i < members.Num(); i++ ) { // skip yourself if( idStr::Icmp( members[ i ]->GetUsername(), activeUser->GetUsername() ) == 0 ) { continue; } if( members[ i ]->GetState() == sdNetTeamMember::OS_ONLINE ) { numOnline++; } } numOnlineClanmates = numOnline; } nextUserUpdate = now + 1000; } #endif /* !SD_DEMO_BUILD */ } else { hasActiveUser = 0.0f; #if !defined( SD_DEMO_BUILD ) hasAccount = 0.0f; numFriends = 0.0f; hasPendingTeamEvents = 0.0f; hasPendingFriendEvents = 0.0f; #endif /* !SD_DEMO_BUILD */ activeUserState = sdNetUser::US_INACTIVE; } disconnectReason = networkService->GetDisconnectReason(); switch( networkService->GetDisconnectReason() ) { case sdNetService::DR_CONNECTION_RESET: disconnectString = declHolder.declLocStrType.LocalFind( "guis/mainmenu/sdnetdisconnected" )->Index(); break; case sdNetService::DR_DUPLICATE_AUTH: disconnectString = declHolder.declLocStrType.LocalFind( "guis/mainmenu/sdnetotheruserauthed" )->Index(); break; default: disconnectString = -1; break; } state = networkService->GetState(); #if !defined( SD_DEMO_BUILD ) statsRequestState = sdGlobalStatsTracker::GetInstance().GetLocalStatsRequestState(); #endif /* !SD_DEMO_BUILD */ serverRefreshComplete = 0.0f; // hotServersRefreshComplete = 0.0f; systemNotifications = gameLocal.GetSystemNotifications(); if( activeUser != NULL ) { int numNotifications = notificationSystem->GetNumNotifications(); #if !defined( SD_DEMO_BUILD ) for( int i = 0; i < numNotifications; i++ ) { const notification_t* notification = notificationSystem->GetNotification( i ); switch( notification->id ) { case NID_SDNET_FRIEND_STATE_CHANGED: { friendStateChangedNotifications.Alloc() = *notification_cast< const sdnetFriendStateChangedNotification_t >( notification ); break; } case NID_SDNET_TEAM_MEMBER_STATE_CHANGED: { teamMemberStateChangedNotifications.Alloc() = *notification_cast< const sdnetTeamMemberStateChangedNotification_t >( notification ); break; } case NID_SDNET_TEAM_DISSOLVED: { teamDissolvedNotifications.Alloc() = *notification_cast< const sdnetTeamDissolvedNotification_t >( notification ); break; } case NID_SDNET_FRIEND_IM: { friendIMNotifications.Alloc() = *notification_cast< const sdnetFriendIMNotification_t >( notification ); break; } case NID_SDNET_TEAM_INVITE: { teamInviteNotifications.Alloc() = *notification_cast< const sdnetTeamInviteNotification_t >( notification ); break; } case NID_SDNET_TEAM_MEMBER_IM: { teamMemberIMNotifications.Alloc() = *notification_cast< const sdnetTeamMemberIMNotification_t >( notification ); break; } case NID_SDNET_FRIEND_SESSION_INVITE: { friendSessionInviteNotifications.Alloc() = *notification_cast< const sdnetFriendSessionInviteNotification_t >( notification ); break; } case NID_SDNET_TEAM_MEMBER_SESSION_INVITE: { teamMemberSessionInviteNotifications.Alloc() = *notification_cast< const sdnetTeamMemberSessionInviteNotification_t >( notification ); break; } case NID_SDNET_TEAM_KICK: { teamKickNotifications.Alloc() = *notification_cast< const sdnetTeamKickNotification_t >( notification ); break; } default: gameLocal.Warning( "sdNetProperties::UpdateProperties: unknown notification type '%i'", notification->id ); } } #endif /* !SD_DEMO_BUILD */ } int totalPause = SEC2MS( gui_notificationPause.GetFloat() + gui_notificationTime.GetFloat() ); // System text notifications if( now >= nextNotifyTime || nextNotifyTime == 0 ) { for( int i = 0; i < systemNotifications.Num(); i++ ) { notifyExpireTime = now + SEC2MS( gui_notificationTime.GetFloat() ); nextNotifyTime = now + totalPause; notificationText = systemNotifications[ i ]; systemNotifications.RemoveIndex( 0 ); break; } } #if !defined( SD_DEMO_BUILD ) // Friend session invite if( activeUser == NULL ) { friendSessionInviteNotifications.Clear(); } if( now >= nextNotifyTime || nextNotifyTime == 0 ) { for( int i = 0; i < friendSessionInviteNotifications.Num(); i++ ) { notifyExpireTime = now + SEC2MS( gui_notificationTime.GetFloat() ); nextNotifyTime = now + totalPause; idWStrList args( 1 ); args.Append( va( L"%hs", friendSessionInviteNotifications[ i ].username ) ); notificationText = common->LocalizeText( "guis/mainmenu/notify/friendsessioninvite", args ); friendSessionInviteNotifications.RemoveIndex( 0 ); break; } } // Team invite if( activeUser == NULL ) { teamInviteNotifications.Clear(); } if( now >= nextNotifyTime || nextNotifyTime == 0 ) { for( int i = 0; i < teamInviteNotifications.Num(); i++ ) { notifyExpireTime = now + SEC2MS( gui_notificationTime.GetFloat() ); nextNotifyTime = now + totalPause; idWStrList args( 1 ); args.Append( va( L"%hs", teamInviteNotifications[ i ].team ) ); notificationText = common->LocalizeText( "guis/mainmenu/notify/teaminvite", args ); teamInviteNotifications.RemoveIndex( 0 ); break; } } // Team session invite if( activeUser == NULL ) { teamMemberSessionInviteNotifications.Clear(); } if( now >= nextNotifyTime || nextNotifyTime == 0 ) { for( int i = 0; i < teamMemberSessionInviteNotifications.Num(); i++ ) { notifyExpireTime = now + SEC2MS( gui_notificationTime.GetFloat() ); nextNotifyTime = now + totalPause; idWStrList args( 2 ); args.Append( va( L"%hs", teamMemberSessionInviteNotifications[ i ].username ) ); args.Append( va( L"%hs", teamMemberSessionInviteNotifications[ i ].team ) ); notificationText = common->LocalizeText( "guis/mainmenu/notify/teamsessioninvite", args ); teamMemberSessionInviteNotifications.RemoveIndex( 0 ); break; } } // Team dissolved if( activeUser == NULL ) { teamDissolvedNotifications.Clear(); } if( now >= nextNotifyTime || nextNotifyTime == 0 ) { for( int i = 0; i < teamDissolvedNotifications.Num(); i++ ) { notifyExpireTime = now + SEC2MS( gui_notificationTime.GetFloat() ); nextNotifyTime = now + totalPause; idWStrList args( 1 ); args.Append( va( L"%hs", teamDissolvedNotifications[ i ].team ) ); notificationText = common->LocalizeText( "guis/mainmenu/notify/teamdissolved", args ); teamDissolvedNotifications.RemoveIndex( 0 ); break; } } // Team kick if( activeUser == NULL ) { teamKickNotifications.Clear(); } if( now >= nextNotifyTime || nextNotifyTime == 0 ) { for( int i = 0; i < teamKickNotifications.Num(); i++ ) { notifyExpireTime = now + SEC2MS( gui_notificationTime.GetFloat() ); nextNotifyTime = now + totalPause; idWStrList args( 1 ); args.Append( va( L"%hs", teamKickNotifications[ i ].team ) ); notificationText = common->LocalizeText( "guis/mainmenu/notify/kickedfromteam", args ); teamKickNotifications.RemoveIndex( 0 ); break; } } // Friend IM if( activeUser == NULL ) { friendIMNotifications.Clear(); } if( now >= nextNotifyTime || nextNotifyTime == 0 ) { if( friendIMNotifications.Num() >= 3 ) { notifyExpireTime = now + SEC2MS( gui_notificationTime.GetFloat() ); nextNotifyTime = now + totalPause; idWStrList args( 1 ); args.Append( va( L"%i", friendIMNotifications.Num() ) ); notificationText = common->LocalizeText( "guis/mainmenu/notify/multiple/friendims", args ); friendIMNotifications.Clear(); } else { for( int i = 0; i < friendIMNotifications.Num(); i++ ) { notifyExpireTime = now + SEC2MS( gui_notificationTime.GetFloat() ); nextNotifyTime = now + totalPause; idWStrList args( 1 ); args.Append( va( L"%hs", friendIMNotifications[ i ].username ) ); notificationText = common->LocalizeText( "guis/mainmenu/notify/friendim", args ); friendIMNotifications.RemoveIndex( 0 ); break; } } } // Teammate IM if( activeUser == NULL ) { teamMemberIMNotifications.Clear(); } if( now >= nextNotifyTime || nextNotifyTime == 0 ) { if( teamMemberIMNotifications.Num() >= 3 ) { notifyExpireTime = now + SEC2MS( gui_notificationTime.GetFloat() ); nextNotifyTime = now + totalPause; idWStrList args( 1 ); args.Append( va( L"%i", teamMemberIMNotifications.Num() ) ); notificationText = common->LocalizeText( "guis/mainmenu/notify/multiple/teamims", args ); teamMemberIMNotifications.Clear(); } else { for( int i = 0; i < teamMemberIMNotifications.Num(); i++ ) { notifyExpireTime = now + SEC2MS( gui_notificationTime.GetFloat() ); nextNotifyTime = now + totalPause; idWStrList args( 1 ); args.Append( va( L"%hs", teamMemberIMNotifications[ i ].username ) ); notificationText = common->LocalizeText( "guis/mainmenu/notify/teamim", args ); teamMemberIMNotifications.RemoveIndex( 0 ); break; } } } // Teammate on/offline if( activeUser == NULL ) { teamMemberStateChangedNotifications.Clear(); } if( now >= nextNotifyTime || nextNotifyTime == 0 ) { int numOnline = 0; for( int i = 0; i < teamMemberStateChangedNotifications.Num(); i++ ) { if( teamMemberStateChangedNotifications[ i ].state != sdNetTeamMember::OS_ONLINE ) { continue; } numOnline++; } if( numOnline >= 3 ) { notifyExpireTime = now + SEC2MS( gui_notificationTime.GetFloat() ); nextNotifyTime = now + totalPause; idWStrList args( 1 ); args.Append( va( L"%i", teamMemberStateChangedNotifications.Num() ) ); notificationText = common->LocalizeText( "guis/mainmenu/notify/multiple/teammembersonline", args ); for( int i = teamMemberStateChangedNotifications.Num() - 1; i >= 0; i-- ) { if( teamMemberStateChangedNotifications[ i ].state == sdNetTeamMember::OS_ONLINE ) { teamMemberStateChangedNotifications.RemoveIndex( i ); } } } else { for( int i = 0; i < teamMemberStateChangedNotifications.Num(); i++ ) { if( teamMemberStateChangedNotifications[ i ].state != sdNetTeamMember::OS_ONLINE ) { continue; } notifyExpireTime = now + SEC2MS( gui_notificationTime.GetFloat() ); nextNotifyTime = now + totalPause; idWStrList args( 1 ); args.Append( va( L"%hs", teamMemberStateChangedNotifications[ i ].username ) ); notificationText = common->LocalizeText( "guis/mainmenu/notify/teammemberonline", args ); teamMemberStateChangedNotifications.RemoveIndex( 0 ); break; } } } // Friend on/offline if( activeUser == NULL ) { friendStateChangedNotifications.Clear(); } if( now >= nextNotifyTime || nextNotifyTime == 0 ) { int numOnline = 0; for( int i = 0; i < friendStateChangedNotifications.Num(); i++ ) { if( friendStateChangedNotifications[ i ].state == sdNetFriend::OS_ONLINE ) { numOnline++; } } if( numOnline >= 3 ) { notifyExpireTime = now + SEC2MS( gui_notificationTime.GetFloat() ); nextNotifyTime = now + totalPause; idWStrList args( 1 ); args.Append( va( L"%i", friendStateChangedNotifications.Num() ) ); notificationText = common->LocalizeText( "guis/mainmenu/notify/multiple/friendsonline", args ); for( int i = friendStateChangedNotifications.Num() - 1; i >= 0; i-- ) { if( friendStateChangedNotifications[ i ].state == sdNetFriend::OS_ONLINE ) { friendStateChangedNotifications.RemoveIndex( i ); } } } else { for( int i = 0; i < friendStateChangedNotifications.Num(); i++ ) { if( friendStateChangedNotifications[ i ].state != sdNetFriend::OS_ONLINE ) { continue; } notifyExpireTime = now + SEC2MS( gui_notificationTime.GetFloat() ); nextNotifyTime = now + totalPause; idWStrList args( 1 ); args.Append( va( L"%hs", friendStateChangedNotifications[ i ].username ) ); notificationText = common->LocalizeText( "guis/mainmenu/notify/friendonline", args ); friendStateChangedNotifications.RemoveIndex( 0 ); break; } } } #endif /* !SD_DEMO_BUILD */ } /* ================ sdNetProperties::SetTaskActive ================ */ void sdNetProperties::SetTaskActive( bool active ) { taskActive = active; } /* ================ sdNetProperties::SetTaskResult ================ */ void sdNetProperties::SetTaskResult( sdNetErrorCode_e errorCode, const sdDeclLocStr* resultMessage ) { taskErrorCode = errorCode; taskResultMessage = resultMessage->Index(); } /* ============ sdNetProperties::CreateUserList ============ */ void sdNetProperties::CreateUserList( sdUIList* list ) { sdUIList::ClearItems( list ); int toSelect = -1; for ( int i = 0; i < networkService->NumUsers(); i++ ) { sdNetUser* user = networkService->GetUser( i ); int defaultUser = user->GetProfile().GetProperties().GetBool( "default", "0" ) ? 1 : 0; #if !defined( SD_DEMO_BUILD ) const sdNetAccount& account = user->GetAccount(); bool hasAccount = account.GetUsername()[ 0 ] != '\0'; sdUIList::InsertItem( list, va( L"%hs\t%i\t%hs\t%i", user->GetRawUsername(), hasAccount ? "friends/online" : "friends/offline", hasAccount ? 1 : 0, user->GetUsername(), defaultUser ), -1, 0 ); #else sdUIList::InsertItem( list, va( L"%hs\t%i\t%hs\t%i", user->GetRawUsername(), "friends/online", 1, user->GetUsername(), defaultUser ), -1, 0 ); #endif /* !SD_DEMO_BUILD */ } } /* ============ sdNetProperties::CreateServerList ============ */ void sdNetProperties::CreateServerList( sdUIList* list ) { int iMode; list->GetUI()->PopScriptVar( iMode ); int iSource; list->GetUI()->PopScriptVar( iSource ); bool flagOffline; list->GetUI()->PopScriptVar( flagOffline ); sdNetManager::findServerSource_e source; if( !sdIntToContinuousEnum< sdNetManager::findServerSource_e >( iSource, sdNetManager::FS_MIN, sdNetManager::FS_MAX, source ) ) { gameLocal.Error( "CreateServerList: source '%i' out of range", iSource ); return; } sdNetManager::findServerMode_e mode; if( !sdIntToContinuousEnum< sdNetManager::findServerMode_e >( iMode, sdNetManager::FSM_MIN, sdNetManager::FSM_MAX, mode ) ) { gameLocal.Error( "CreateServerList: mode '%i' out of range", iMode ); return; } gameLocal.GetSDNet().CreateServerList( list, source, mode, flagOffline ); } /* ============ sdNetProperties::CreateHotServerList ============ */ void sdNetProperties::CreateHotServerList( sdUIList* list ) { int iSource; list->GetUI()->PopScriptVar( iSource ); sdNetManager::findServerSource_e source; if( !sdIntToContinuousEnum< sdNetManager::findServerSource_e >( iSource, sdNetManager::FS_MIN, sdNetManager::FS_MAX, source ) ) { gameLocal.Error( "CreateServerList: source '%i' out of range", iSource ); return; } gameLocal.GetSDNet().CreateHotServerList( list, source ); } /* ============ sdNetProperties::UpdateServer ============ */ void sdNetProperties::UpdateServer( sdUIList* list ) { int iSource; list->GetUI()->PopScriptVar( iSource ); sdNetManager::findServerSource_e source; if( !sdIntToContinuousEnum< sdNetManager::findServerSource_e >( iSource, sdNetManager::FS_MIN, sdNetManager::FS_MAX, source ) ) { gameLocal.Error( "CreateServerList: source '%i' out of range", iSource ); return; } idStr sessionName; list->GetUI()->PopScriptVar( sessionName ); gameLocal.GetSDNet().UpdateServer( *list, sessionName, source ); } /* ============ sdNetProperties::CreateServerClientsList ============ */ void sdNetProperties::CreateServerClientsList( sdUIList* list ) { sdUIList::ClearItems( list ); float fIndex; list->GetUI()->PopScriptVar( fIndex ); float fSource; list->GetUI()->PopScriptVar( fSource ); const sdNetSession* session = gameLocal.GetSDNet().GetSession( fSource, idMath::Ftoi( fIndex ) ); if( session == NULL ) { return; } idWStr cleaned; for( int i = 0; i < MAX_CLIENTS; i++ ) { const sdNetSession::sessionClientInfo_t& client = session->GetClientInfo( i ); if( !client.connected ) { continue; } cleaned = va( L"%hs", client.nickname ); sdUIList::CleanUserInput( cleaned ); int index = sdUIList::InsertItem( list, va( L"%hs\t%ls\t%d", client.isBot ? "1" : "0", cleaned.c_str(), client.ping ), -1, 0 ); } } #if !defined( SD_DEMO_BUILD ) /* ============ sdNetProperties::CreateFriendsList ============ */ void sdNetProperties::CreateFriendsList( sdUIList* list ) { sdUIList::ClearItems( list ); sdScopedLock< true > friendsLock( networkService->GetFriendsManager().GetLock() ); const sdNetFriendsList& blockedFriends = networkService->GetFriendsManager().GetBlockedList(); const sdNetFriendsList& friends = networkService->GetFriendsManager().GetFriendsList(); for( int i = 0; i < friends.Num(); i++ ) { const sdNetFriend* mate = friends[ i ]; const char* string = "guis/mainmenu/offline"; const char* material = "friends/offline"; statusPriority_e status = SP_OFFLINE; if( mate->GetState() == sdNetFriend::OS_ONLINE ) { sdNetClientId id; mate->GetNetClientId( id ); const idDict* profile = networkService->GetProfileProperties( id ); const char* server = ( profile == NULL ) ? "0.0.0.0:0" : profile->GetString( "currentServer", "0.0.0.0:0" ); if( idStr::Cmp( server, "0.0.0.0:0" ) == 0 ) { material = "friends/online"; string = "guis/mainmenu/friends/online"; status = SP_ONLINE; } else { material = "friends/onserver"; string = "guis/mainmenu/friends/onserver"; status = SP_ONSERVER; } } if( networkService->GetFriendsManager().FindFriend( blockedFriends, mate->GetUsername() ) ) { material = "friends/blocked"; string = "guis/mainmenu/friends/blocked"; status = SP_BLOCKED; } idListGranularityOne< sdNetMessage* > messages; mate->GetMessageQueue().GetMessagesOfType( messages, sdNetMessage::MT_IM ); if( !messages.Empty() ) { material = "friends/newmessage"; string = "guis/mainmenu/friends/newmessage"; status = SP_NEW_MESSAGE; } else { const sdNetMessage* message = mate->GetMessageQueue().GetMessages(); if( message != NULL ) { switch( message->GetType() ) { case sdNetMessage::MT_SESSION_INVITE: material = "friends/newevent"; string = "guis/mainmenu/friends/serverinvite"; status = SP_NEW_MESSAGE; break; case sdNetMessage::MT_BLOCKED: // FALL THROUGH material = "friends/newevent"; string = "guis/mainmenu/friends/blockedby"; status = SP_NEW_MESSAGE; break; case sdNetMessage::MT_UNBLOCKED: material = "friends/newevent"; string = "guis/mainmenu/friends/unblockedby"; status = SP_NEW_MESSAGE; break; } } } sdUIList::InsertItem( list, va( L"%i\t%hs\t", string, material, static_cast< int >( status ), mate->GetUsername() ), 0, 0 ); } const sdNetFriendsList& pendingFriends = networkService->GetFriendsManager().GetPendingFriendsList(); for( int i = 0; i < pendingFriends.Num(); i++ ) { const sdNetFriend* mate = pendingFriends[ i ]; sdUIList::InsertItem( list, va( L"%i\t%hs", static_cast< int >( SP_PENDING ), mate->GetUsername() ), 0, 0 ); } const sdNetFriendsList& invitedFriends = networkService->GetFriendsManager().GetInvitedFriendsList(); for( int i = 0; i < invitedFriends.Num(); i++ ) { const sdNetFriend* mate = invitedFriends[ i ]; sdUIList::InsertItem( list, va( L"%i\t%hs", static_cast< int >( SP_INVITED ), mate->GetUsername() ), 0, 0 ); } // Debug if( g_debugPlayerList.GetInteger() ) { int i; for( i = 0; i < 5 && i < g_debugPlayerList.GetInteger(); i++ ) { sdUIList::InsertItem( list, va( L"%i\tFriend %i", static_cast< int >( SP_ONLINE ), i ), 0, 0 ); } for( ; i < 10 && i < g_debugPlayerList.GetInteger(); i++ ) { sdUIList::InsertItem( list, va( L"%i\tFriend %i", static_cast< int >( SP_NEW_MESSAGE ), i ), 0, 0 ); } for( ; i < 15 && i < g_debugPlayerList.GetInteger(); i++ ) { sdUIList::InsertItem( list, va( L"%i\tFriend %i", static_cast< int >( SP_BLOCKED ), i ), 0, 0 ); } for( ; i < 20 && i < g_debugPlayerList.GetInteger(); i++ ) { sdUIList::InsertItem( list, va( L"%i\tFriend %i", static_cast< int >( SP_ONSERVER ), i ), 0, 0 ); } } } /* ============ sdNetProperties::CreateTeamList ============ */ void sdNetProperties::CreateTeamList( sdUIList* list ) { sdUIList::ClearItems( list ); sdNetUser* activeUser = networkService->GetActiveUser(); if( activeUser == NULL ) { return; } sdScopedLock< true > teamLock( networkService->GetTeamManager().GetLock() ); sdScopedLock< true > friendLock( networkService->GetFriendsManager().GetLock() ); const sdNetFriendsList& blockedFriends = networkService->GetFriendsManager().GetBlockedList(); const sdNetTeamMemberList& members = networkService->GetTeamManager().GetMemberList(); for( int i = 0; i < members.Num(); i++ ) { const sdNetTeamMember* mate = members[ i ]; // skip yourself if( idStr::Icmp( mate->GetUsername(), activeUser->GetUsername() ) == 0 ) { continue; } statusPriority_e status = SP_OFFLINE; teamLevel_e teamLevel = TL_USER; const char* string = "guis/mainmenu/friends/offline"; const char* material = "friends/offline"; if( mate->GetState() == sdNetTeamMember::OS_ONLINE ) { sdNetClientId id; mate->GetNetClientId( id ); const idDict* profile = networkService->GetProfileProperties( id ); const char* server = ( profile == NULL ) ? "0.0.0.0:0" : profile->GetString( "currentServer", "0.0.0.0:0" ); if( idStr::Cmp( server, "0.0.0.0:0" ) == 0 ) { material = "friends/online"; string = "guis/mainmenu/friends/online"; status = SP_ONLINE; } else { material = "friends/onserver"; string = "guis/mainmenu/friends/onserver"; status = SP_ONSERVER; } } if( networkService->GetFriendsManager().FindFriend( blockedFriends, mate->GetUsername() ) ) { string = "guis/mainmenu/friends/blocked"; material = "friends/blocked"; status = SP_BLOCKED; } idListGranularityOne< sdNetMessage* > messages; mate->GetMessageQueue().GetMessagesOfType( messages, sdNetMessage::MT_IM ); if( !messages.Empty() ) { string = "guis/mainmenu/friends/newmessage"; material = "friends/newmessage"; status = SP_NEW_MESSAGE; } else { const sdNetMessage* message = mate->GetMessageQueue().GetMessages(); if( message != NULL ) { switch( message->GetType() ) { case sdNetMessage::MT_SESSION_INVITE: string = "guis/mainmenu/friends/serverinvite"; material = "friends/newevent"; status = SP_NEW_MESSAGE; break; case sdNetMessage::MT_MEMBERSHIP_PROMOTION_TO_ADMIN: // FALL THROUGH case sdNetMessage::MT_MEMBERSHIP_PROMOTION_TO_OWNER: string = "guis/mainmenu/friends/promotion"; material = "friends/newevent"; status = SP_NEW_MESSAGE; break; } } } const char* teamStatusMaterial = "teams/member"; switch( mate->GetMemberStatus() ) { case sdNetTeamMember::MS_ADMIN: teamStatusMaterial = "teams/admin"; teamLevel = TL_ADMIN; break; case sdNetTeamMember::MS_OWNER: teamStatusMaterial = "teams/owner"; teamLevel = TL_OWNER; break; } sdUIList::InsertItem( list, va( L"%i\t%%i\t%hs\t0", string, material, static_cast< int >( status ), teamStatusMaterial, static_cast< int >( teamLevel ), mate->GetUsername() ), 0, 0 ); } const sdNetTeamMemberList& pending = networkService->GetTeamManager().GetPendingMemberList(); for( int i = 0; i < pending.Num(); i++ ) { const sdNetTeamMember* mate = pending[ i ]; sdUIList::InsertItem( list, va( L"%i\t%i\t%hs\t1", static_cast< int >( SP_PENDING ), static_cast< int >( TL_PENDING ), mate->GetUsername() ), 0, 0 ); } // Debug if( g_debugPlayerList.GetInteger() ) { int i; for( i = 0; i < 5 && i < g_debugPlayerList.GetInteger(); i++ ) { sdUIList::InsertItem( list, va( L"%i\t%i\tFriend %i", static_cast< int >( SP_ONLINE ), static_cast< int >( TL_USER ), i ), 0, 0 ); } for( ; i < 10 && i < g_debugPlayerList.GetInteger(); i++ ) { sdUIList::InsertItem( list, va( L"%i\t%i\tFriend %i", static_cast< int >( SP_NEW_MESSAGE ), static_cast< int >( TL_ADMIN ), i ), 0, 0 ); } sdUIList::InsertItem( list, va( L"%i\t%i\tFriend %i", static_cast< int >( SP_NEW_MESSAGE ), static_cast< int >( TL_OWNER ), i ), 0, 0 ); } } /* ============ sdNetProperties::CreateTeamInvitesList ============ */ void sdNetProperties::CreateTeamInvitesList( sdUIList* list ) { sdUIList::ClearItems( list ); sdScopedLock< true > lock( networkService->GetTeamManager().GetLock() ); const sdNetTeamMemberList& members = networkService->GetTeamManager().GetPendingInvitesList(); for( int i = 0; i < members.Num(); i++ ) { const sdNetTeamMember* mate = members[ i ]; const sdNetMessage* message = mate->GetMessageQueue().GetMessages(); if( message == NULL || message->GetType() != sdNetMessage::MT_MEMBERSHIP_PROPOSAL ) { continue; } const sdNetTeamInvite& teamInvite = reinterpret_cast< const sdNetTeamInvite& >( *message->GetData() ); sdUIList::InsertItem( list, va( L"%hs\t%hs", teamInvite.text, mate->GetUsername() ), 0, 0 ); } } /* ============ sdNetProperties::CreateAchievementsList ============ */ void sdNetProperties::CreateAchievementsList( sdUIList* list ) { sdUIList::ClearItems( list ); idStr playerCategory; list->GetUI()->PopScriptVar( playerCategory ); gameLocal.rankInfo.CreateData( sdGlobalStatsTracker::GetInstance().GetLocalStatsHash(), sdGlobalStatsTracker::GetInstance().GetLocalStats(), gameLocal.rankScratchInfo ); idWStr matStr; const idList< sdPersistentRankInfo::sdBadge >& badges = gameLocal.rankInfo.GetBadges(); for( int i = 0; i < badges.Num(); i++ ) { const sdPersistentRankInfo::sdBadge& badge = badges[ i ]; if( badge.category.Icmp( playerCategory.c_str() ) != 0 ) { continue; } const wchar_t* complete = gameLocal.rankScratchInfo.badges[ i ].complete ? L"" : L"desat_"; matStr = va( L"guis/assets/icons/achieve_%ls%hs_rank%i", complete, badge.category.c_str(), badge.level ); const wchar_t* matName = va( L"%ls\t%hs\t%i", matStr.c_str(), matStr.c_str(), badge.category.c_str(), badge.level ); sdUIList::InsertItem( list, matName, -1, 0 ); } } /* ============ sdNetProperties::CreateAchievementTasksList ============ */ void sdNetProperties::CreateAchievementTasksList( sdUIList* list ) { sdUIList::ClearItems( list ); idStr category; list->GetUI()->PopScriptVar( category ); int level; list->GetUI()->PopScriptVar( level ); gameLocal.rankInfo.CreateData( sdGlobalStatsTracker::GetInstance().GetLocalStatsHash(), sdGlobalStatsTracker::GetInstance().GetLocalStats(), gameLocal.rankScratchInfo ); const idList< sdPersistentRankInfo::sdBadge >& badges = gameLocal.rankInfo.GetBadges(); for( int i = 0; i < badges.Num(); i++ ) { const sdPersistentRankInfo::sdBadge& badge = badges[ i ]; if( badge.category.Icmp( category.c_str() ) != 0 || badge.level != level ) { continue; } const sdPersistentRankInfo::sdRankInstance::sdBadge& dataBadge = gameLocal.rankScratchInfo.badges[ i ]; for( int j = 0; j < badge.tasks.Num(); j++ ) { float value = idMath::ClampFloat( 0.0f, dataBadge.taskValues[ j ].max, idMath::Floor( dataBadge.taskValues[ j ].value ) ); float percent = dataBadge.taskValues[ j ].value / dataBadge.taskValues[ j ].max; sdUIList::InsertItem( list, va( L"\t%f\t%hs\t%0.f/%0.f", badge.tasks[ j ].text.c_str(), percent, dataBadge.complete ? "1" : "0", value, dataBadge.taskValues[ j ].max ), -1, 0 ); } } } /* ============ sdNetProperties::CreateMessageHistoryList ============ */ void sdNetProperties::CreateMessageHistoryList( sdUIList* list ) { assert( networkService->GetActiveUser() != NULL ); sdUIList::ClearItems( list ); int iSource; list->GetUI()->PopScriptVar( iSource ); idStr name; list->GetUI()->PopScriptVar( name ); messageHistorySource_e source; if( !sdIntToContinuousEnum< messageHistorySource_e >( iSource, MHS_MIN, MHS_MAX, source ) ) { gameLocal.Warning( "CreateMessageHistoryList: unknown source '%i'\n", iSource ); return; } idStr rawUserName; sdNetMessageHistory* history = GetMessageHistory( source, name, rawUserName ); if( history != NULL ) { idStr filename; GenerateMessageHistoryFileName( networkService->GetActiveUser()->GetRawUsername(), rawUserName.c_str(), filename ); if( history->Load( filename ) ) { idWStr timeFormat; sysTime_t time; for( int i = 0; i < history->GetNumEntries(); i++ ) { const messageHistoryEntry_t& entry = history->GetEntry( i ); sys->SecondsToTime( entry.timeStamp, time, true ); FormatTimeStamp( time, timeFormat ); sdUIList::InsertItem( list, va( L"^3%ls^0\n%ls", timeFormat.c_str(), entry.message.c_str() ), -1, 0 ); } } } } /* ============ sdNetProperties::GenerateMessageHistoryFileName ============ */ void sdNetProperties::GenerateMessageHistoryFileName( const char* currentUser, const char* friendName, idStr& path ) { path = va( "%s/logs/%s.messageStore", currentUser, friendName ); } /* ============ sdNetProperties::GetMessageHistory ============ */ sdNetMessageHistory* sdNetProperties::GetMessageHistory( messageHistorySource_e source, const char* username, idStr& friendRawUserName ) { friendRawUserName = ""; sdNetMessageHistory* history = NULL; if( source == MHS_FRIEND ) { const sdNetFriendsList& friends = networkService->GetFriendsManager().GetFriendsList(); sdNetFriend* mate = networkService->GetFriendsManager().FindFriend( friends, username ); if( mate != NULL ) { history = &mate->GetHistory(); sdNetUser::MakeRawUsername( mate->GetUsername(), friendRawUserName ); } } else if( source == MHS_TEAM ) { const sdNetTeamMemberList& members = networkService->GetTeamManager().GetMemberList(); sdNetTeamMember* mate = networkService->GetTeamManager().FindMember( members, username ); if( mate != NULL ) { history = &mate->GetHistory(); sdNetUser::MakeRawUsername( mate->GetUsername(), friendRawUserName ); } } return history; } #endif /* !SD_DEMO_BUILD */ /* ============ sdNetProperties::FormatTimeStamp ============ */ void sdNetProperties::FormatTimeStamp( const sysTime_t& time, idWStr& str ) { str = L""; // ensure we always return to the default locale try { sys->SetSystemLocale(); sysTime_t now; sys->RealTime( &now ); if( now.tm_yday == time.tm_yday && now.tm_year == time.tm_year ) { // Today idWStrList args( 1 ); args.Append( va( L"%hs", sys->TimeToSystemStr( time ) ) ); str = common->LocalizeText( "guis/today", args ).c_str(); } else { str = va( L"%hs", sys->TimeAndDateToSystemStr( time ) ); } sys->SetDefaultLocale(); } catch( ... ) { sys->SetDefaultLocale(); throw; } } /* ============ sdNetProperties::CreateRetrievedUserNameList ============ */ #if !defined( SD_DEMO_BUILD ) void sdNetProperties::CreateRetrievedUserNameList( sdUIList* list ) { gameLocal.GetSDNet().CreateRetrievedUserNameList( list ); } #endif /* !SD_DEMO_BUILD */