/* ** Command & Conquer Generals(tm) ** Copyright 2025 Electronic Arts Inc. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . */ //////////////////////////////////////////////////////////////////////////////// // // // (c) 2001-2003 Electronic Arts Inc. // // // //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////// // FILE: WOLBuddyOverlay.cpp // Author: Chris Huybregts, November 2001 // Description: Lan Lobby Menu /////////////////////////////////////////////////////////////////////////////////////// // INCLUDES /////////////////////////////////////////////////////////////////////////////////////// #include "PreRTS.h" // This must go first in EVERY cpp file int the GameEngine #include "Common/AudioEventRTS.h" #include "Common/PlayerList.h" #include "Common/Player.h" #include "GameClient/GameText.h" #include "GameClient/WindowLayout.h" #include "GameClient/Gadget.h" #include "GameClient/Shell.h" #include "GameClient/KeyDefs.h" #include "GameClient/GameWindowManager.h" #include "GameClient/GadgetListBox.h" #include "GameClient/GadgetPushButton.h" #include "GameClient/GadgetStaticText.h" #include "GameClient/GadgetTextEntry.h" #include "GameClient/GadgetRadioButton.h" #include "GameClient/Display.h" #include "GameNetwork/GameSpyOverlay.h" #include "GameNetwork/GameSpy/PeerDefs.h" #include "GameNetwork/GameSpy/BuddyDefs.h" #include "GameNetwork/GameSpy/BuddyThread.h" #include "GameNetwork/GameSpy/LobbyUtils.h" #include "GameNetwork/GameSpy/PersistentStorageDefs.h" #include "GameNetwork/GameSpy/PersistentStorageThread.h" #include "GameNetwork/GameSpy/ThreadUtils.h" // PRIVATE DATA /////////////////////////////////////////////////////////////////////////////////// #ifdef _INTERNAL // for occasional debugging... //#pragma optimize("", off) //#pragma MESSAGE("************************************** WARNING, optimization disabled for debugging purposes") #endif // window ids ------------------------------------------------------------------------------ static NameKeyType parentID = NAMEKEY_INVALID; static NameKeyType buttonHideID = NAMEKEY_INVALID; static NameKeyType buttonAddBuddyID = NAMEKEY_INVALID; static NameKeyType buttonDeleteBuddyID = NAMEKEY_INVALID; static NameKeyType textEntryID = NAMEKEY_INVALID; static NameKeyType listboxBuddyID = NAMEKEY_INVALID; static NameKeyType listboxChatID = NAMEKEY_INVALID; static NameKeyType buttonAcceptBuddyID = NAMEKEY_INVALID; static NameKeyType buttonDenyBuddyID = NAMEKEY_INVALID; static NameKeyType radioButtonBuddiesID = NAMEKEY_INVALID; static NameKeyType radioButtonIgnoreID = NAMEKEY_INVALID; static NameKeyType parentBuddiesID = NAMEKEY_INVALID; static NameKeyType parentIgnoreID = NAMEKEY_INVALID; static NameKeyType listboxIgnoreID = NAMEKEY_INVALID; static NameKeyType buttonNotificationID = NAMEKEY_INVALID; // Window Pointers ------------------------------------------------------------------------ static GameWindow *parent = NULL; static GameWindow *buttonHide = NULL; static GameWindow *buttonAddBuddy = NULL; static GameWindow *buttonDeleteBuddy = NULL; static GameWindow *textEntry = NULL; static GameWindow *listboxBuddy = NULL; static GameWindow *listboxChat = NULL; static GameWindow *buttonAcceptBuddy = NULL; static GameWindow *buttonDenyBuddy = NULL; static GameWindow *radioButtonBuddies = NULL; static GameWindow *radioButtonIgnore = NULL; static GameWindow *parentBuddies = NULL; static GameWindow *parentIgnore = NULL; static GameWindow *listboxIgnore = NULL; static Bool isOverlayActive = false; void insertChat( BuddyMessage msg ); // RightClick pointers --------------------------------------------------------------------- static GameWindow *rcMenu = NULL; static WindowLayout *noticeLayout = NULL; static UnsignedInt noticeExpires = 0; enum { NOTIFICATION_EXPIRES = 3000 }; void setUnignoreText( WindowLayout *layout, AsciiString nick, GPProfile id); void refreshIgnoreList( void ); void showNotificationBox( AsciiString nick, UnicodeString message); void deleteNotificationBox( void ); static Bool lastNotificationWasStatus = FALSE; static Int numOnlineInNotification = 0; class BuddyControls { public: BuddyControls(void ); GameWindow *listboxChat; NameKeyType listboxChatID; GameWindow *listboxBuddies; NameKeyType listboxBuddiesID; GameWindow *textEntryEdit; NameKeyType textEntryEditID; Bool isInit; }; static BuddyControls buddyControls; BuddyControls::BuddyControls( void ) { listboxChat = NULL; listboxChatID = NAMEKEY_INVALID; listboxBuddies = NULL; listboxBuddiesID = NAMEKEY_INVALID; textEntryEdit = NULL; textEntryEditID = NAMEKEY_INVALID; isInit = FALSE; } // At this point I don't give a damn about how good this way is. I'm doing it anyway. enum { BUDDY_RESETALL_CRAP = -1, BUDDY_WINDOW_BUDDIES = 0, BUDDY_WINDOW_DIPLOMACY, BUDDY_WINDOW_WELCOME_SCREEN, }; void InitBuddyControls(Int type) { if(!TheGameSpyInfo) { buddyControls.textEntryEditID = NAMEKEY_INVALID; buddyControls.textEntryEdit = NULL; buddyControls.listboxBuddiesID = NAMEKEY_INVALID; buddyControls.listboxChatID = NAMEKEY_INVALID; buddyControls.listboxBuddies = NULL; buddyControls.listboxChat = NULL; buddyControls.isInit = FALSE; return; } switch (type) { case BUDDY_RESETALL_CRAP: buddyControls.textEntryEditID = NAMEKEY_INVALID; buddyControls.textEntryEdit = NULL; buddyControls.listboxBuddiesID = NAMEKEY_INVALID; buddyControls.listboxChatID = NAMEKEY_INVALID; buddyControls.listboxBuddies = NULL; buddyControls.listboxChat = NULL; buddyControls.isInit = FALSE; break; case BUDDY_WINDOW_BUDDIES: buddyControls.textEntryEditID = TheNameKeyGenerator->nameToKey( AsciiString( "WOLBuddyOverlay.wnd:TextEntryChat" ) ); buddyControls.textEntryEdit = TheWindowManager->winGetWindowFromId(NULL, buddyControls.textEntryEditID); buddyControls.listboxBuddiesID = TheNameKeyGenerator->nameToKey( AsciiString( "WOLBuddyOverlay.wnd:ListboxBuddies" ) ); buddyControls.listboxChatID = TheNameKeyGenerator->nameToKey( AsciiString( "WOLBuddyOverlay.wnd:ListboxBuddyChat" ) ); buddyControls.listboxBuddies = TheWindowManager->winGetWindowFromId( NULL, buddyControls.listboxBuddiesID ); buddyControls.listboxChat = TheWindowManager->winGetWindowFromId( NULL, buddyControls.listboxChatID); GadgetTextEntrySetText(buddyControls.textEntryEdit, UnicodeString.TheEmptyString); buddyControls.isInit = TRUE; break; case BUDDY_WINDOW_DIPLOMACY: buddyControls.textEntryEditID = TheNameKeyGenerator->nameToKey( AsciiString( "Diplomacy.wnd:TextEntryChat" ) ); buddyControls.textEntryEdit = TheWindowManager->winGetWindowFromId(NULL, buddyControls.textEntryEditID); buddyControls.listboxBuddiesID = TheNameKeyGenerator->nameToKey( AsciiString( "Diplomacy.wnd:ListboxBuddies" ) ); buddyControls.listboxChatID = TheNameKeyGenerator->nameToKey( AsciiString( "Diplomacy.wnd:ListboxBuddyChat" ) ); buddyControls.listboxBuddies = TheWindowManager->winGetWindowFromId( NULL, buddyControls.listboxBuddiesID ); buddyControls.listboxChat = TheWindowManager->winGetWindowFromId( NULL, buddyControls.listboxChatID); GadgetTextEntrySetText(buddyControls.textEntryEdit, UnicodeString.TheEmptyString); buddyControls.isInit = TRUE; break; case BUDDY_WINDOW_WELCOME_SCREEN: break; default: DEBUG_ASSERTCRASH(FALSE, ("Well, you really shouldn't have gotten here, if you really care about GUI Bugs, search for this string, you you don't care, call chris (who probably doesn't care either")); } } WindowMsgHandledType BuddyControlSystem( GameWindow *window, UnsignedInt msg, WindowMsgData mData1, WindowMsgData mData2) { if(!TheGameSpyInfo || TheGameSpyInfo->getLocalProfileID() == 0 || !buddyControls.isInit) { return MSG_IGNORED; } switch( msg ) { case GLM_RIGHT_CLICKED: { GameWindow *control = (GameWindow *)mData1; Int controlID = control->winGetWindowId(); if( controlID == buddyControls.listboxBuddiesID ) { RightClickStruct *rc = (RightClickStruct *)mData2; WindowLayout *rcLayout; if(rc->pos < 0) break; GPProfile profileID = (GPProfile)GadgetListBoxGetItemData(control, rc->pos, 0); RCItemType itemType = (RCItemType)(Int)GadgetListBoxGetItemData(control, rc->pos, 1); UnicodeString nick = GadgetListBoxGetText(control, rc->pos); GadgetListBoxSetSelected(control, rc->pos); if (itemType == ITEM_BUDDY) rcLayout = TheWindowManager->winCreateLayout(AsciiString("Menus/RCBuddiesMenu.wnd")); else if (itemType == ITEM_REQUEST) rcLayout = TheWindowManager->winCreateLayout(AsciiString("Menus/RCBuddyRequestMenu.wnd")); else rcLayout = TheWindowManager->winCreateLayout(AsciiString("Menus/RCNonBuddiesMenu.wnd")); rcMenu = rcLayout->getFirstWindow(); rcMenu->winGetLayout()->runInit(); rcMenu->winBringToTop(); rcMenu->winHide(FALSE); ICoord2D rcSize, rcPos; rcMenu->winGetSize(&rcSize.x, &rcSize.y); rcPos.x = rc->mouseX; rcPos.y = rc->mouseY; if(rc->mouseX + rcSize.x > TheDisplay->getWidth()) rcPos.x = TheDisplay->getWidth() - rcSize.x; if(rc->mouseY + rcSize.y > TheDisplay->getHeight()) rcPos.y = TheDisplay->getHeight() - rcSize.y; rcMenu->winSetPosition(rcPos.x, rcPos.y); GameSpyRCMenuData *rcData = NEW GameSpyRCMenuData; rcData->m_id = profileID; rcData->m_nick.translate(nick); rcData->m_itemType = itemType; setUnignoreText(rcLayout, rcData->m_nick, rcData->m_id); rcMenu->winSetUserData((void *)rcData); TheWindowManager->winSetLoneWindow(rcMenu); } else return MSG_IGNORED; break; } case GEM_EDIT_DONE: { GameWindow *control = (GameWindow *)mData1; Int controlID = control->winGetWindowId(); if(controlID != buddyControls.textEntryEditID) return MSG_IGNORED; // see if someone's selected Int selected = -1; GadgetListBoxGetSelected(buddyControls.listboxBuddies, &selected); if (selected >= 0) { GPProfile selectedProfile = (GPProfile)GadgetListBoxGetItemData(buddyControls.listboxBuddies, selected); BuddyInfoMap *m = TheGameSpyInfo->getBuddyMap(); BuddyInfoMap::iterator recipIt = m->find(selectedProfile); if (recipIt == m->end()) break; DEBUG_LOG(("Trying to send a buddy message to %d.\n", selectedProfile)); if (TheGameSpyGame && TheGameSpyGame->isInGame() && TheGameSpyGame->isGameInProgress() && !ThePlayerList->getLocalPlayer()->isPlayerActive()) { DEBUG_LOG(("I'm dead - gotta look for cheats.\n")); for (Int i=0; igetGameSpySlot(i)->getProfileID())); if (TheGameSpyGame->getGameSpySlot(i)->getProfileID() == selectedProfile) { // can't send to someone in our game if we're dead/observing. security breach and all that. no seances for you. if (buddyControls.listboxChat) { GadgetListBoxAddEntryText( buddyControls.listboxChat, TheGameText->fetch("Buddy:CantTalkToIngameBuddy"), GameSpyColor[GSCOLOR_DEFAULT], -1, -1 ); } return MSG_HANDLED; } } } // read the user's input and clear the entry box UnicodeString txtInput; txtInput.set(GadgetTextEntryGetText( buddyControls.textEntryEdit )); GadgetTextEntrySetText(buddyControls.textEntryEdit, UnicodeString::TheEmptyString); txtInput.trim(); if (!txtInput.isEmpty()) { // Send the message BuddyRequest req; req.buddyRequestType = BuddyRequest::BUDDYREQUEST_MESSAGE; wcsncpy(req.arg.message.text, txtInput.str(), MAX_BUDDY_CHAT_LEN); req.arg.message.text[MAX_BUDDY_CHAT_LEN-1] = 0; req.arg.message.recipient = selectedProfile; TheGameSpyBuddyMessageQueue->addRequest(req); // save message for future incarnations of the buddy window BuddyMessageList *messages = TheGameSpyInfo->getBuddyMessages(); BuddyMessage message; message.m_timestamp = time(NULL); message.m_senderID = TheGameSpyInfo->getLocalProfileID(); message.m_senderNick = TheGameSpyInfo->getLocalBaseName(); message.m_recipientID = selectedProfile; message.m_recipientNick = recipIt->second.m_name; message.m_message = UnicodeString(req.arg.message.text); messages->push_back(message); // put message on screen insertChat(message); } } else { // nobody selected. Prompt the user. if (buddyControls.listboxChat) { GadgetListBoxAddEntryText( buddyControls.listboxChat, TheGameText->fetch("Buddy:SelectBuddyToChat"), GameSpyColor[GSCOLOR_DEFAULT], -1, -1 ); } } break; } default: return MSG_IGNORED; } return MSG_HANDLED; } static void insertChat( BuddyMessage msg ) { if (buddyControls.listboxChat) { BuddyInfoMap *m = TheGameSpyInfo->getBuddyMap(); BuddyInfoMap::iterator senderIt = m->find(msg.m_senderID); BuddyInfoMap::iterator recipientIt = m->find(msg.m_recipientID); Bool localSender = (msg.m_senderID == TheGameSpyInfo->getLocalProfileID()); UnicodeString s; //UnicodeString timeStr = UnicodeString(_wctime( (const time_t *)&msg.m_timestamp )); UnicodeString timeStr; if (localSender /*&& recipientIt != m->end()*/) { s.format(L"[%hs -> %hs] %s", TheGameSpyInfo->getLocalBaseName().str(), msg.m_recipientNick.str(), msg.m_message.str()); Int index = GadgetListBoxAddEntryText( buddyControls.listboxChat, s, GameSpyColor[GSCOLOR_PLAYER_SELF], -1, -1 ); GadgetListBoxAddEntryText( buddyControls.listboxChat, timeStr, GameSpyColor[GSCOLOR_PLAYER_SELF], index, 1); } else if (!localSender /*&& senderIt != m->end()*/) { if (!msg.m_senderID) { s = msg.m_message; Int index = GadgetListBoxAddEntryText( buddyControls.listboxChat, s, GameSpyColor[GSCOLOR_DEFAULT], -1, -1 ); GadgetListBoxAddEntryText( buddyControls.listboxChat, timeStr, GameSpyColor[GSCOLOR_DEFAULT], index, 1); } else { s.format(L"[%hs] %s", msg.m_senderNick.str(), msg.m_message.str()); Int index = GadgetListBoxAddEntryText( buddyControls.listboxChat, s, GameSpyColor[GSCOLOR_PLAYER_BUDDY], -1, -1 ); GadgetListBoxAddEntryText( buddyControls.listboxChat, timeStr, GameSpyColor[GSCOLOR_PLAYER_BUDDY], index, 1); } } } } void updateBuddyInfo( void ) { if (!TheGameSpyBuddyMessageQueue->isConnected()) { GadgetListBoxReset(buddyControls.listboxBuddies); return; } if (!buddyControls.isInit) return; int selected; GPProfile selectedProfile = 0; int visiblePos = GadgetListBoxGetTopVisibleEntry(buddyControls.listboxBuddies); GadgetListBoxGetSelected(buddyControls.listboxBuddies, &selected); if (selected >= 0) selectedProfile = (GPProfile)GadgetListBoxGetItemData(buddyControls.listboxBuddies, selected); selected = -1; GadgetListBoxReset(buddyControls.listboxBuddies); // Add buddies BuddyInfoMap *buddies = TheGameSpyInfo->getBuddyMap(); BuddyInfoMap::iterator bIt; for (bIt = buddies->begin(); bIt != buddies->end(); ++bIt) { BuddyInfo info = bIt->second; GPProfile profileID = bIt->first; // insert name into box UnicodeString formatStr; formatStr.translate(info.m_name.str());//, info.m_status, info.m_statusString.str(), info.m_locationString.str()); Color nameColor = (TheGameSpyInfo->isSavedIgnored(profileID)) ? GameSpyColor[GSCOLOR_PLAYER_IGNORED] : GameSpyColor[GSCOLOR_PLAYER_BUDDY]; int index = GadgetListBoxAddEntryText(buddyControls.listboxBuddies, formatStr, nameColor, -1, -1); // insert status into box AsciiString marker; marker.format("Buddy:%ls", info.m_statusString.str()); if (!info.m_statusString.compareNoCase(L"Offline") || !info.m_statusString.compareNoCase(L"Online") || !info.m_statusString.compareNoCase(L"Matching")) { formatStr = TheGameText->fetch(marker); } else if (!info.m_statusString.compareNoCase(L"Staging") || !info.m_statusString.compareNoCase(L"Loading") || !info.m_statusString.compareNoCase(L"Playing")) { formatStr.format(TheGameText->fetch(marker), info.m_locationString.str()); } else if (!info.m_statusString.compareNoCase(L"Chatting")) { UnicodeString roomName; GroupRoomMap::iterator gIt = TheGameSpyInfo->getGroupRoomList()->find( _wtoi(info.m_locationString.str()) ); if (gIt != TheGameSpyInfo->getGroupRoomList()->end()) { AsciiString s; s.format("GUI:%s", gIt->second.m_name.str()); roomName = TheGameText->fetch(s); } formatStr.format(TheGameText->fetch(marker), roomName.str()); } else { formatStr = info.m_statusString; } GadgetListBoxAddEntryText(buddyControls.listboxBuddies, formatStr, GameSpyColor[GSCOLOR_DEFAULT], index, 1); GadgetListBoxSetItemData(buddyControls.listboxBuddies, (void *)(profileID), index, 0 ); GadgetListBoxSetItemData(buddyControls.listboxBuddies, (void *)(ITEM_BUDDY), index, 1 ); if (profileID == selectedProfile) selected = index; } // add requests buddies = TheGameSpyInfo->getBuddyRequestMap(); for (bIt = buddies->begin(); bIt != buddies->end(); ++bIt) { BuddyInfo info = bIt->second; GPProfile profileID = bIt->first; // insert name into box UnicodeString formatStr; formatStr.translate(info.m_name.str()); int index = GadgetListBoxAddEntryText(buddyControls.listboxBuddies, formatStr, GameSpyColor[GSCOLOR_DEFAULT], -1, -1); GadgetListBoxSetItemData(buddyControls.listboxBuddies, (void *)(profileID), index, 0 ); // insert status into box formatStr = TheGameText->fetch("GUI:BuddyAddReq"); GadgetListBoxAddEntryText(buddyControls.listboxBuddies, formatStr, GameSpyColor[GSCOLOR_DEFAULT], index, 1); GadgetListBoxSetItemData(buddyControls.listboxBuddies, (void *)(ITEM_REQUEST), index, 1 ); if (profileID == selectedProfile) selected = index; } // select the same guy if (selected >= 0) { GadgetListBoxSetSelected(buddyControls.listboxBuddies, selected); } // view the same spot GadgetListBoxSetTopVisibleEntry(buddyControls.listboxBuddies, visiblePos); } void HandleBuddyResponses( void ) { if (TheGameSpyBuddyMessageQueue) { BuddyResponse resp; if (TheGameSpyBuddyMessageQueue->getResponse( resp )) { switch (resp.buddyResponseType) { case BuddyResponse::BUDDYRESPONSE_LOGIN: { deleteNotificationBox(); } break; case BuddyResponse::BUDDYRESPONSE_DISCONNECT: { lastNotificationWasStatus = FALSE; numOnlineInNotification = 0; showNotificationBox(AsciiString::TheEmptyString, TheGameText->fetch("Buddy:MessageDisconnected")); } break; case BuddyResponse::BUDDYRESPONSE_MESSAGE: { if ( !wcscmp(resp.arg.message.text, L"I have authorized your request to add me to your list") ) break; if (TheGameSpyInfo->isSavedIgnored(resp.profile)) { //DEBUG_CRASH(("Player is ignored!\n")); break; // no buddy messages from ignored people } // save message for future incarnations of the buddy window BuddyMessageList *messages = TheGameSpyInfo->getBuddyMessages(); BuddyMessage message; message.m_timestamp = resp.arg.message.date; message.m_senderID = resp.profile; message.m_recipientID = TheGameSpyInfo->getLocalProfileID(); message.m_recipientNick = TheGameSpyInfo->getLocalBaseName(); message.m_message = resp.arg.message.text; // insert status into box BuddyInfoMap *m = TheGameSpyInfo->getBuddyMap(); BuddyInfoMap::iterator senderIt = m->find(message.m_senderID); AsciiString nick; if (senderIt != m->end()) nick = senderIt->second.m_name.str(); else nick = resp.arg.message.nick; message.m_senderNick = nick; messages->push_back(message); DEBUG_LOG(("Inserting buddy chat from '%s'/'%s'\n", nick.str(), resp.arg.message.nick)); // put message on screen insertChat(message); // play audio notification AudioEventRTS buddyMsgAudio("GUIMessageReceived"); if( TheAudio ) { TheAudio->addAudioEvent( &buddyMsgAudio ); } // end if UnicodeString snippet = message.m_message; while (snippet.getLength() > 11) { snippet.removeLastChar(); } UnicodeString s; s.format(TheGameText->fetch("Buddy:MessageNotification"), nick.str(), snippet.str()); lastNotificationWasStatus = FALSE; numOnlineInNotification = 0; showNotificationBox(AsciiString::TheEmptyString, s); } break; case BuddyResponse::BUDDYRESPONSE_REQUEST: { // save request for future incarnations of the buddy window BuddyInfoMap *m = TheGameSpyInfo->getBuddyRequestMap(); BuddyInfo info; info.m_countryCode = resp.arg.request.countrycode; info.m_email = resp.arg.request.email; info.m_name = resp.arg.request.nick; info.m_id = resp.profile; info.m_status = (GPEnum)0; info.m_statusString = resp.arg.request.text; (*m)[resp.profile] = info; // TODO: put request on screen updateBuddyInfo(); // insert status into box lastNotificationWasStatus = FALSE; numOnlineInNotification = 0; showNotificationBox(info.m_name, TheGameText->fetch("Buddy:AddNotification")); } break; case BuddyResponse::BUDDYRESPONSE_STATUS: { BuddyInfoMap *m = TheGameSpyInfo->getBuddyMap(); BuddyInfoMap::const_iterator bit = m->find(resp.profile); Bool seenPreviously = FALSE; GPEnum oldStatus = GP_OFFLINE; GPEnum newStatus = resp.arg.status.status; if (bit != m->end()) { seenPreviously = TRUE; oldStatus = (*m)[resp.profile].m_status; } BuddyInfo info; info.m_countryCode = resp.arg.status.countrycode; info.m_email = resp.arg.status.email; info.m_name = resp.arg.status.nick; info.m_id = resp.profile; info.m_status = newStatus; info.m_statusString = UnicodeString(MultiByteToWideCharSingleLine(resp.arg.status.statusString).c_str()); info.m_locationString = UnicodeString(MultiByteToWideCharSingleLine(resp.arg.status.location).c_str()); (*m)[resp.profile] = info; updateBuddyInfo(); PopulateLobbyPlayerListbox(); RefreshGameListBoxes(); if ( (newStatus == GP_OFFLINE && seenPreviously) || (newStatus == GP_ONLINE && (oldStatus == GP_OFFLINE || !seenPreviously)) ) //if (!info.m_statusString.compareNoCase(L"Offline") || //!info.m_statusString.compareNoCase(L"Online")) { // insert status into box AsciiString marker; marker.format("Buddy:%lsNotification", info.m_statusString.str()); lastNotificationWasStatus = TRUE; if (newStatus != GP_OFFLINE) ++numOnlineInNotification; showNotificationBox(info.m_name, TheGameText->fetch(marker)); } else if( newStatus == GP_RECV_GAME_INVITE && !seenPreviously) { lastNotificationWasStatus = TRUE; if (newStatus != GP_OFFLINE) ++numOnlineInNotification; showNotificationBox(info.m_name, TheGameText->fetch("Buddy:OnlineNotification")); } } break; } } } else { DEBUG_CRASH(("No buddy message queue!\n")); } if(noticeLayout && timeGetTime() > noticeExpires) { deleteNotificationBox(); } } void showNotificationBox( AsciiString nick, UnicodeString message) { // if(!GameSpyIsOverlayOpen(GSOVERLAY_BUDDY)) // return; if( !noticeLayout ) noticeLayout = TheWindowManager->winCreateLayout( "Menus/PopupBuddyListNotification.wnd" ); noticeLayout->hide( FALSE ); if (buttonNotificationID == NAMEKEY_INVALID) { buttonNotificationID = TheNameKeyGenerator->nameToKey("PopupBuddyListNotification.wnd:ButtonNotification"); } GameWindow *win = TheWindowManager->winGetWindowFromId(NULL,buttonNotificationID); if(!win) { deleteNotificationBox(); return; } if (lastNotificationWasStatus && numOnlineInNotification > 1) { message = TheGameText->fetch("Buddy:MultipleOnlineNotification"); } if (nick.isNotEmpty()) message.format(message, nick.str()); GadgetButtonSetText(win, message); //GadgetStaticTextSetText(win, message); noticeExpires = timeGetTime() + NOTIFICATION_EXPIRES; noticeLayout->bringForward(); AudioEventRTS buttonClick("GUICommunicatorIncoming"); if( TheAudio ) { TheAudio->addAudioEvent( &buttonClick ); } // end if } void deleteNotificationBox( void ) { lastNotificationWasStatus = FALSE; numOnlineInNotification = 0; if(noticeLayout) { noticeLayout->destroyWindows(); noticeLayout->deleteInstance(); noticeLayout = NULL; } } void PopulateOldBuddyMessages(void) { // show previous messages BuddyMessageList *messages = TheGameSpyInfo->getBuddyMessages(); for (BuddyMessageList::iterator mIt = messages->begin(); mIt != messages->end(); ++mIt) { BuddyMessage message = *mIt; insertChat(message); } } //------------------------------------------------------------------------------------------------- /** Initialize the WOL Buddy Overlay */ //------------------------------------------------------------------------------------------------- void WOLBuddyOverlayInit( WindowLayout *layout, void *userData ) { parentID = TheNameKeyGenerator->nameToKey( AsciiString( "WOLBuddyOverlay.wnd:BuddyMenuParent" ) ); buttonHideID = TheNameKeyGenerator->nameToKey( AsciiString( "WOLBuddyOverlay.wnd:ButtonHide" ) ); buttonAddBuddyID = TheNameKeyGenerator->nameToKey( AsciiString( "WOLBuddyOverlay.wnd:ButtonAdd" ) ); buttonDeleteBuddyID = TheNameKeyGenerator->nameToKey( AsciiString( "WOLBuddyOverlay.wnd:ButtonDelete" ) ); //textEntryID = TheNameKeyGenerator->nameToKey( AsciiString( "WOLBuddyOverlay.wnd:TextEntryChat" ) ); //listboxBuddyID = TheNameKeyGenerator->nameToKey( AsciiString( "WOLBuddyOverlay.wnd:ListboxBuddies" ) ); //listboxChatID = TheNameKeyGenerator->nameToKey( AsciiString( "WOLBuddyOverlay.wnd:ListboxBuddyChat" ) ); buttonAcceptBuddyID = TheNameKeyGenerator->nameToKey( AsciiString( "WOLBuddyOverlay.wnd:ButtonYes" ) ); buttonDenyBuddyID = TheNameKeyGenerator->nameToKey( AsciiString( "WOLBuddyOverlay.wnd:ButtonNo" ) ); radioButtonBuddiesID = TheNameKeyGenerator->nameToKey( AsciiString( "WOLBuddyOverlay.wnd:RadioButtonBuddies" ) ); radioButtonIgnoreID = TheNameKeyGenerator->nameToKey( AsciiString( "WOLBuddyOverlay.wnd:RadioButtonIgnore" ) ); parentBuddiesID = TheNameKeyGenerator->nameToKey( AsciiString( "WOLBuddyOverlay.wnd:BuddiesParent" ) ); parentIgnoreID = TheNameKeyGenerator->nameToKey( AsciiString( "WOLBuddyOverlay.wnd:IgnoreParent" ) ); listboxIgnoreID = TheNameKeyGenerator->nameToKey( AsciiString( "WOLBuddyOverlay.wnd:ListboxIgnore" ) ); parent = TheWindowManager->winGetWindowFromId( NULL, parentID ); buttonHide = TheWindowManager->winGetWindowFromId( parent, buttonHideID); buttonAddBuddy = TheWindowManager->winGetWindowFromId( parent, buttonAddBuddyID); buttonDeleteBuddy = TheWindowManager->winGetWindowFromId( parent, buttonDeleteBuddyID); // textEntry = TheWindowManager->winGetWindowFromId( parent, textEntryID); //listboxBuddy = TheWindowManager->winGetWindowFromId( parent, listboxBuddyID); //listboxChat = TheWindowManager->winGetWindowFromId( parent, listboxChatID); buttonAcceptBuddy = TheWindowManager->winGetWindowFromId( parent, buttonAcceptBuddyID); buttonDenyBuddy = TheWindowManager->winGetWindowFromId( parent, buttonDenyBuddyID); radioButtonBuddies = TheWindowManager->winGetWindowFromId( parent, radioButtonBuddiesID); radioButtonIgnore = TheWindowManager->winGetWindowFromId( parent, radioButtonIgnoreID); parentBuddies = TheWindowManager->winGetWindowFromId( parent, parentBuddiesID); parentIgnore = TheWindowManager->winGetWindowFromId( parent, parentIgnoreID); listboxIgnore = TheWindowManager->winGetWindowFromId( parent, listboxIgnoreID); InitBuddyControls(BUDDY_WINDOW_BUDDIES); GadgetRadioSetSelection(radioButtonBuddies,FALSE); parentBuddies->winHide(FALSE); parentIgnore->winHide(TRUE); //GadgetTextEntrySetText(textEntry, UnicodeString.TheEmptyString); PopulateOldBuddyMessages(); // Show Menu layout->hide( FALSE ); // Set Keyboard to Main Parent TheWindowManager->winSetFocus( parent ); isOverlayActive = true; updateBuddyInfo(); } // WOLBuddyOverlayInit //------------------------------------------------------------------------------------------------- /** WOL Buddy Overlay shutdown method */ //------------------------------------------------------------------------------------------------- void WOLBuddyOverlayShutdown( WindowLayout *layout, void *userData ) { listboxIgnore = NULL; // hide menu layout->hide( TRUE ); // our shutdown is complete //TheShell->shutdownComplete( layout ); isOverlayActive = false; InitBuddyControls(BUDDY_RESETALL_CRAP); } // WOLBuddyOverlayShutdown //------------------------------------------------------------------------------------------------- /** WOL Buddy Overlay update method */ //------------------------------------------------------------------------------------------------- void WOLBuddyOverlayUpdate( WindowLayout * layout, void *userData) { if (!TheGameSpyBuddyMessageQueue || !TheGameSpyBuddyMessageQueue->isConnected()) GameSpyCloseOverlay(GSOVERLAY_BUDDY); }// WOLBuddyOverlayUpdate //------------------------------------------------------------------------------------------------- /** WOL Buddy Overlay input callback */ //------------------------------------------------------------------------------------------------- WindowMsgHandledType WOLBuddyOverlayInput( GameWindow *window, UnsignedInt msg, WindowMsgData mData1, WindowMsgData mData2 ) { switch( msg ) { // -------------------------------------------------------------------------------------------- case GWM_CHAR: { UnsignedByte key = mData1; UnsignedByte state = mData2; switch( key ) { // ---------------------------------------------------------------------------------------- case KEY_ESC: { // // send a simulated selected event to the parent window of the // back/exit button // if( BitTest( state, KEY_STATE_UP ) ) { TheWindowManager->winSendSystemMsg( window, GBM_SELECTED, (WindowMsgData)buttonHide, buttonHideID ); } // end if // don't let key fall through anywhere else return MSG_HANDLED; } // end escape } // end switch( key ) } // end char } // end switch( msg ) return MSG_IGNORED; }// WOLBuddyOverlayInput //------------------------------------------------------------------------------------------------- /** WOL Buddy Overlay window system callback */ //------------------------------------------------------------------------------------------------- WindowMsgHandledType WOLBuddyOverlaySystem( GameWindow *window, UnsignedInt msg, WindowMsgData mData1, WindowMsgData mData2 ) { UnicodeString txtInput; if(BuddyControlSystem(window, msg, mData1, mData2) == MSG_HANDLED) { return MSG_HANDLED; } switch( msg ) { case GWM_CREATE: { break; } // case GWM_DESTROY: case GWM_DESTROY: { break; } // case GWM_DESTROY: case GWM_INPUT_FOCUS: { // if we're givin the opportunity to take the keyboard focus we must say we want it if( mData1 == TRUE ) *(Bool *)mData2 = TRUE; return MSG_HANDLED; }//case GWM_INPUT_FOCUS: case GLM_RIGHT_CLICKED: { GameWindow *control = (GameWindow *)mData1; Int controlID = control->winGetWindowId(); if( controlID == listboxIgnoreID ) { RightClickStruct *rc = (RightClickStruct *)mData2; WindowLayout *rcLayout; if(rc->pos < 0) break; Bool isBuddy = false, isRequest = false; GPProfile profileID = (GPProfile)GadgetListBoxGetItemData(control, rc->pos); UnicodeString nick = GadgetListBoxGetText(control, rc->pos); BuddyInfoMap *buddies = TheGameSpyInfo->getBuddyMap(); BuddyInfoMap::iterator bIt; bIt = buddies->find(profileID); if (bIt != buddies->end()) { isBuddy = true; } else { buddies = TheGameSpyInfo->getBuddyRequestMap(); bIt = buddies->find(profileID); if (bIt != buddies->end()) { isRequest = true; } else { // neither buddy nor request //break; } } GadgetListBoxSetSelected(control, rc->pos); if (isBuddy) rcLayout = TheWindowManager->winCreateLayout(AsciiString("Menus/RCBuddiesMenu.wnd")); else if (isRequest) rcLayout = TheWindowManager->winCreateLayout(AsciiString("Menus/RCBuddyRequestMenu.wnd")); else rcLayout = TheWindowManager->winCreateLayout(AsciiString("Menus/RCNonBuddiesMenu.wnd")); rcMenu = rcLayout->getFirstWindow(); rcMenu->winGetLayout()->runInit(); rcMenu->winBringToTop(); rcMenu->winHide(FALSE); rcMenu->winSetPosition(rc->mouseX, rc->mouseY); GameSpyRCMenuData *rcData = NEW GameSpyRCMenuData; rcData->m_id = profileID; rcData->m_nick.translate(nick); rcData->m_itemType = (isBuddy)?ITEM_BUDDY:((isRequest)?ITEM_REQUEST:ITEM_NONBUDDY); setUnignoreText(rcLayout, rcData->m_nick, rcData->m_id); rcMenu->winSetUserData((void *)rcData); TheWindowManager->winSetLoneWindow(rcMenu); } break; } case GBM_SELECTED: { GameWindow *control = (GameWindow *)mData1; Int controlID = control->winGetWindowId(); if (controlID == buttonHideID) { GameSpyCloseOverlay( GSOVERLAY_BUDDY ); } else if (controlID == radioButtonBuddiesID) { parentBuddies->winHide(FALSE); parentIgnore->winHide(TRUE); } else if (controlID == radioButtonIgnoreID) { parentBuddies->winHide(TRUE); parentIgnore->winHide(FALSE); refreshIgnoreList(); } else if (controlID == buttonAddBuddyID) { /* UnicodeString uName = GadgetTextEntryGetText(textEntry); AsciiString aName; aName.translate(uName); if (!aName.isEmpty()) { TheWOLBuddyList->requestBuddyAdd(aName); } GadgetTextEntrySetText(textEntry, UnicodeString::TheEmptyString); */ } else if (controlID == buttonDeleteBuddyID) { /* int selected; AsciiString selectedName = AsciiString::TheEmptyString; GadgetListBoxGetSelected(listbox, &selected); if (selected >= 0) selectedName = TheNameKeyGenerator->keyToName((NameKeyType)(int)GadgetListBoxGetItemData(listbox, selected)); if (!selectedName.isEmpty()) { TheWOLBuddyList->requestBuddyDelete(selectedName); } */ } break; }// case GBM_SELECTED: case GLM_DOUBLE_CLICKED: { /* GameWindow *control = (GameWindow *)mData1; Int controlID = control->winGetWindowId(); if( controlID == listboxBuddyID ) { int rowSelected = mData2; if (rowSelected >= 0) { UnicodeString buddyName; GameWindow *listboxWindow = TheWindowManager->winGetWindowFromId( parent, listboxBuddyID ); // get text of buddy name buddyName = GadgetListBoxGetText( listboxWindow, rowSelected,0 ); GPProfile buddyID = (GPProfile)GadgetListBoxGetItemData( listboxWindow, rowSelected, 0 ); Int index = -1; gpGetBuddyIndex(TheGPConnection, buddyID, &index); if (index >= 0) { GPBuddyStatus status; gpGetBuddyStatus(TheGPConnection, rowSelected, &status); UnicodeString string; string.format(L"To join %s in %hs:", buddyName.str(), status.locationString); GameSpyAddText(string, GSCOLOR_DEFAULT); if (status.status == GP_CHATTING) { AsciiString location = status.locationString; AsciiString val; location.nextToken(&val, "/"); location.nextToken(&val, "/"); location.nextToken(&val, "/"); string.format(L" ???"); if (!val.isEmpty()) { Int groupRoom = atoi(val.str()); if (TheGameSpyChat->getCurrentGroupRoomID() == groupRoom) { // already there string.format(L" nothing"); GameSpyAddText(string, GSCOLOR_DEFAULT); } else { GroupRoomMap *rooms = TheGameSpyChat->getGroupRooms(); if (rooms) { Bool needToJoin = true; GroupRoomMap::iterator it = rooms->find(groupRoom); if (it != rooms->end()) { // he's in a different room if (TheGameSpyChat->getCurrentGroupRoomID()) { string.format(L" leave group room"); GameSpyAddText(string, GSCOLOR_DEFAULT); TheGameSpyChat->leaveRoom(GroupRoom); } else if (TheGameSpyGame->isInGame()) { if (TheGameSpyGame->isGameInProgress()) { string.format(L" can't leave game in progress"); GameSpyAddText(string, GSCOLOR_DEFAULT); needToJoin = false; } else { string.format(L" leave game setup"); GameSpyAddText(string, GSCOLOR_DEFAULT); TheGameSpyChat->leaveRoom(StagingRoom); TheGameSpyGame->leaveGame(); } } if (needToJoin) { string.format(L" join lobby %d", groupRoom); TheGameSpyChat->joinGroupRoom(groupRoom); GameSpyAddText(string, GSCOLOR_DEFAULT); } } } } } } } else { DEBUG_CRASH(("No buddy associated with that ProfileID")); GameSpyUpdateBuddyOverlay(); } } } */ break; } default: return MSG_IGNORED; }//Switch return MSG_HANDLED; }// WOLBuddyOverlaySystem WindowMsgHandledType PopupBuddyNotificationSystem( GameWindow *window, UnsignedInt msg, WindowMsgData mData1, WindowMsgData mData2 ) { switch( msg ) { case GWM_CREATE: { break; } // case GWM_DESTROY: case GWM_DESTROY: { break; } // case GWM_DESTROY: case GBM_SELECTED: { GameWindow *control = (GameWindow *)mData1; Int controlID = control->winGetWindowId(); if (controlID == buttonNotificationID) { GameSpyOpenOverlay( GSOVERLAY_BUDDY ); } break; } default: return MSG_IGNORED; }//Switch return MSG_HANDLED; }// PopupBuddyNotificationSystem /* static NameKeyType buttonAcceptBuddyID = NAMEKEY_INVALID; static NameKeyType buttonDenyBuddyID = NAMEKEY_INVALID; */ static NameKeyType buttonAddID = NAMEKEY_INVALID; static NameKeyType buttonDeleteID = NAMEKEY_INVALID; static NameKeyType buttonPlayID = NAMEKEY_INVALID; static NameKeyType buttonIgnoreID = NAMEKEY_INVALID; static NameKeyType buttonStatsID = NAMEKEY_INVALID; // Window Pointers ------------------------------------------------------------------------ //static GameWindow *rCparent = NULL; //------------------------------------------------------------------------------------------------- /** WOL Buddy Overlay Right Click menu callbacks */ //------------------------------------------------------------------------------------------------- void WOLBuddyOverlayRCMenuInit( WindowLayout *layout, void *userData ) { AsciiString controlName; controlName.format("%s:ButtonAdd",layout->getFilename().str()+6); buttonAddID = TheNameKeyGenerator->nameToKey( controlName ); controlName.format("%s:ButtonDelete",layout->getFilename().str()+6); buttonDeleteID = TheNameKeyGenerator->nameToKey( controlName ); controlName.format("%s:ButtonPlay",layout->getFilename().str()+6); buttonPlayID = TheNameKeyGenerator->nameToKey( controlName ); controlName.format("%s:ButtonIgnore",layout->getFilename().str()+6); buttonIgnoreID = TheNameKeyGenerator->nameToKey( controlName ); controlName.format("%s:ButtonStats",layout->getFilename().str()+6); buttonStatsID = TheNameKeyGenerator->nameToKey( controlName ); } static void closeRightClickMenu(GameWindow *win) { if(win) { WindowLayout *winLay = win->winGetLayout(); if(!winLay) return; winLay->destroyWindows(); winLay->deleteInstance(); winLay = NULL; } } void RequestBuddyAdd(Int profileID, AsciiString nick) { // request to add a buddy BuddyRequest req; req.buddyRequestType = BuddyRequest::BUDDYREQUEST_ADDBUDDY; req.arg.addbuddy.id = profileID; UnicodeString buddyAddstr; buddyAddstr = TheGameText->fetch("GUI:BuddyAddReq"); wcsncpy(req.arg.addbuddy.text, buddyAddstr.str(), MAX_BUDDY_CHAT_LEN); req.arg.addbuddy.text[MAX_BUDDY_CHAT_LEN-1] = 0; TheGameSpyBuddyMessageQueue->addRequest(req); UnicodeString s; Bool exists = TRUE; s.format(TheGameText->fetch("Buddy:InviteSent", &exists)); if (!exists) { // no string yet. don't display. return; } // save message for future incarnations of the buddy window BuddyMessageList *messages = TheGameSpyInfo->getBuddyMessages(); BuddyMessage message; message.m_timestamp = time(NULL); message.m_senderID = 0; message.m_senderNick = ""; message.m_recipientID = TheGameSpyInfo->getLocalProfileID(); message.m_recipientNick = TheGameSpyInfo->getLocalBaseName(); message.m_message.format(TheGameText->fetch("Buddy:InviteSentToPlayer"), nick.str()); // insert status into box messages->push_back(message); DEBUG_LOG(("Inserting buddy add request\n")); // put message on screen insertChat(message); // play audio notification AudioEventRTS buddyMsgAudio("GUIMessageReceived"); if( TheAudio ) { TheAudio->addAudioEvent( &buddyMsgAudio ); } // end if lastNotificationWasStatus = FALSE; numOnlineInNotification = 0; showNotificationBox(AsciiString::TheEmptyString, s); } WindowMsgHandledType WOLBuddyOverlayRCMenuSystem( GameWindow *window, UnsignedInt msg, WindowMsgData mData1, WindowMsgData mData2 ) { switch( msg ) { case GWM_CREATE: { break; } // case GWM_DESTROY: case GWM_DESTROY: { rcMenu = NULL; break; } // case GWM_DESTROY: case GGM_CLOSE: { closeRightClickMenu(window); //rcMenu = NULL; break; } case GBM_SELECTED: { GameWindow *control = (GameWindow *)mData1; Int controlID = control->winGetWindowId(); GameSpyRCMenuData *rcData = (GameSpyRCMenuData*)window->winGetUserData(); if(!rcData) break; DEBUG_ASSERTCRASH(rcData, ("WOLBuddyOverlayRCMenuSystem GBM_SELECTED:: we're attempting to read the GameSpyRCMenuData from the window, but the data's not there")); GPProfile profileID = rcData->m_id; AsciiString nick = rcData->m_nick; Bool isBuddy = false, isRequest = false; Bool isGameSpyUser = profileID > 0; if (rcData->m_itemType == ITEM_BUDDY) isBuddy = TRUE; else if (rcData->m_itemType == ITEM_REQUEST) isRequest = TRUE; if(rcData) { delete rcData; rcData = NULL; } window->winSetUserData(NULL); //DEBUG_ASSERTCRASH(profileID > 0, ("Bad profile ID in user data!")); if( controlID == buttonAddID ) { if(!isGameSpyUser) break; DEBUG_LOG(("ButtonAdd was pushed\n")); if (isRequest) { // ok the request BuddyRequest req; req.buddyRequestType = BuddyRequest::BUDDYREQUEST_OKADD; req.arg.profile.id = profileID; TheGameSpyBuddyMessageQueue->addRequest(req); BuddyInfoMap *m = TheGameSpyInfo->getBuddyRequestMap(); m->erase( profileID ); // DONT CHECK IN UNTIL MATT HAS REVIEWED // if the profile ID is not from a buddy and we're okaying his request, then // request to add him to our list automatically CLH 2-18-03 if(!TheGameSpyInfo->isBuddy(profileID)) { RequestBuddyAdd(profileID, nick); } updateBuddyInfo(); } else if (!isBuddy) { RequestBuddyAdd(profileID, nick); } } else if( controlID == buttonDeleteID ) { if(!isGameSpyUser) break; if (isBuddy) { // delete the buddy BuddyRequest req; req.buddyRequestType = BuddyRequest::BUDDYREQUEST_DELBUDDY; req.arg.profile.id = profileID; TheGameSpyBuddyMessageQueue->addRequest(req); } else { // delete the request BuddyRequest req; req.buddyRequestType = BuddyRequest::BUDDYREQUEST_DENYADD; req.arg.profile.id = profileID; TheGameSpyBuddyMessageQueue->addRequest(req); BuddyInfoMap *m = TheGameSpyInfo->getBuddyRequestMap(); m->erase( profileID ); } BuddyInfoMap *buddies = (isBuddy)?TheGameSpyInfo->getBuddyMap():TheGameSpyInfo->getBuddyRequestMap(); buddies->erase(profileID); updateBuddyInfo(); DEBUG_LOG(("ButtonDelete was pushed\n")); PopulateLobbyPlayerListbox(); } else if( controlID == buttonPlayID ) { DEBUG_LOG(("buttonPlayID was pushed\n")); } else if( controlID == buttonIgnoreID ) { DEBUG_LOG(("%s is isGameSpyUser %d", nick.str(), isGameSpyUser)); if( isGameSpyUser ) { if(TheGameSpyInfo->isSavedIgnored(profileID)) { TheGameSpyInfo->removeFromSavedIgnoreList(profileID); } else { TheGameSpyInfo->addToSavedIgnoreList(profileID, nick); } } else { if(TheGameSpyInfo->isIgnored(nick)) { TheGameSpyInfo->removeFromIgnoreList(nick); } else { TheGameSpyInfo->addToIgnoreList(nick); } } updateBuddyInfo(); refreshIgnoreList(); // repopulate our player listboxes now PopulateLobbyPlayerListbox(); } else if( controlID == buttonStatsID ) { DEBUG_LOG(("buttonStatsID was pushed\n")); GameSpyCloseOverlay(GSOVERLAY_PLAYERINFO); SetLookAtPlayer(profileID,nick ); GameSpyOpenOverlay(GSOVERLAY_PLAYERINFO); PSRequest req; req.requestType = PSRequest::PSREQUEST_READPLAYERSTATS; req.player.id = profileID; TheGameSpyPSMessageQueue->addRequest(req); } closeRightClickMenu(window); break; } default: return MSG_IGNORED; }//Switch return MSG_HANDLED; } void setUnignoreText( WindowLayout *layout, AsciiString nick, GPProfile id) { AsciiString controlName; controlName.format("%s:ButtonIgnore",layout->getFilename().str()+6); NameKeyType ID = TheNameKeyGenerator->nameToKey( controlName ); GameWindow *win = TheWindowManager->winGetWindowFromId(layout->getFirstWindow(), ID); if(win) { if(TheGameSpyInfo->isSavedIgnored(id) || TheGameSpyInfo->isIgnored(nick)) GadgetButtonSetText(win, TheGameText->fetch("GUI:Unignore")); } } void refreshIgnoreList( void ) { SavedIgnoreMap tempMap; tempMap = TheGameSpyInfo->returnSavedIgnoreList(); SavedIgnoreMap::iterator it = tempMap.begin(); GadgetListBoxReset(listboxIgnore); while(it != tempMap.end()) { UnicodeString name; name.translate(it->second); Int pos = GadgetListBoxAddEntryText(listboxIgnore, name, GameMakeColor(255,100,100,255),-1); GadgetListBoxSetItemData(listboxIgnore, (void *)it->first,pos ); ++it; } IgnoreList tempList; tempList = TheGameSpyInfo->returnIgnoreList(); IgnoreList::iterator iListIt = tempList.begin(); while( iListIt != tempList.end()) { AsciiString aName = *iListIt; UnicodeString name; name.translate(aName); Int pos = GadgetListBoxAddEntryText(listboxIgnore, name, GameMakeColor(255,100,100,255),-1); GadgetListBoxSetItemData(listboxIgnore, 0,pos ); ++iListIt; } // // GPProfile profileID = 0; // PlayerInfoMap::iterator it = TheGameSpyInfo->getPlayerInfoMap()->find(aName); // if (it != TheGameSpyInfo->getPlayerInfoMap()->end()) // profileID = it->second.m_profileID; }