C4Client *C4ClientList::getClientByName(const char *szName) const { for (C4Client *pClient = pFirst; pClient; pClient = pClient->pNext) if (SEqual(pClient->getName(), szName)) return pClient; return NULL; }
bool C4StartupNetListEntry::KeywordMatch(const char *szMatch) { // only finished references if (!pRef) return false; if(SSearchNoCase(pRef->getTitle(),szMatch)) return true; C4Client *pHost = pRef->Parameters.Clients.getHost(); if(pHost && SSearchNoCase(pHost->getName(),szMatch)) return true; if(SSearchNoCase(pRef->getComment(),szMatch)) return true; return false; }
void C4StartupNetListEntry::SetReference(C4Network2Reference *pRef) { // safety: clear previous ClearRef(); // set info this->pRef = pRef; int32_t iIcon = pRef->getIcon(); if (!Inside<int32_t>(iIcon, 0, C4StartupScenSel_IconCount-1)) iIcon = C4StartupScenSel_DefaultIcon_Scenario; pIcon->SetFacet(C4Startup::Get()->Graphics.fctScenSelIcons.GetPhase(iIcon)); pIcon->SetAnimated(false, 0); pIcon->SetBounds(rctIconSmall); int32_t iPlrCnt = pRef->isEditor() ? pRef->Parameters.PlayerInfos.GetActivePlayerCount(false) : pRef->Parameters.Clients.getClientCnt(); C4Client *pHost = pRef->Parameters.Clients.getHost(); sInfoText[0].Format(LoadResStr("IDS_NET_REFONCLIENT"), pRef->getTitle(), pHost ? pHost->getName() : "unknown"); if (pRef->isEditor()) { sInfoText[1].Format(LoadResStr("IDS_NET_INFOEDITOR"), (int)iPlrCnt, StdStrBuf(pRef->getGameStatus().getDescription(), true).getData()); } else { sInfoText[1].Format(LoadResStr("IDS_NET_INFOPLRSGOALDESC"), (int)iPlrCnt, (int)pRef->Parameters.MaxPlayers, pRef->getGameGoalString().getData(), StdStrBuf(pRef->getGameStatus().getDescription(), true).getData()); } if (pRef->getTime() > 0) { StdStrBuf strDuration; strDuration.Format("%02d:%02d:%02d", pRef->getTime()/3600, (pRef->getTime() % 3600) / 60, pRef->getTime() % 60); sInfoText[1].Append(" - "); sInfoText[1].Append(strDuration); } sInfoText[2].Format(LoadResStr("IDS_DESC_VERSION"), pRef->getGameVersion().GetString().getData()); sInfoText[3].Format("%s: %s", LoadResStr("IDS_CTL_COMMENT"), pRef->getComment()); StdStrBuf sAddress; for (int i=0; i<pRef->getAddrCnt(); ++i) { if (i) sAddress.Append(", "); sAddress.Append(pRef->getAddr(i).toString()); } // editor reference if (pRef->isEditor()) AddStatusIcon(C4GUI::Ico_Editor, LoadResStr("IDS_CNS_CONSOLE")); // password if (pRef->isPasswordNeeded()) AddStatusIcon(C4GUI::Ico_Ex_LockedFrontal, LoadResStr("IDS_NET_INFOPASSWORD")); // league if (pRef->Parameters.isLeague()) AddStatusIcon(C4GUI::Ico_Ex_League, pRef->Parameters.getLeague()); // lobby active if (pRef->getGameStatus().isLobbyActive()) AddStatusIcon(C4GUI::Ico_Lobby, LoadResStr("IDS_DESC_EXPECTING")); // game running if (pRef->getGameStatus().isPastLobby()) AddStatusIcon(C4GUI::Ico_GameRunning, LoadResStr("IDS_NET_INFOINPROGR")); // runtime join if (pRef->isJoinAllowed() && pRef->getGameStatus().isPastLobby()) // A little workaround to determine RuntimeJoin... AddStatusIcon(C4GUI::Ico_RuntimeJoin, LoadResStr("IDS_NET_RUNTIMEJOINFREE")); // official server if (pRef->isOfficialServer() && !Config.Network.UseAlternateServer) // Offical server icon is only displayed if references are obtained from official league server { fIsImportant = true; AddStatusIcon(C4GUI::Ico_OfficialServer, LoadResStr("IDS_NET_OFFICIALSERVER")); } // list participating player/client names if (pRef->isEditor()) { sInfoText[4].Format("%s%s", LoadResStr("IDS_DESC_CLIENTS"), iPlrCnt ? pRef->Parameters.Clients.GetAllClientNames().getData() : LoadResStr("IDS_CTL_NONE")); } else { sInfoText[4].Format("%s: %s", LoadResStr("IDS_CTL_PLAYER"), iPlrCnt ? pRef->Parameters.PlayerInfos.GetActivePlayerNames(false).getData() : LoadResStr("IDS_CTL_NONE")); } // disabled if join is not possible for some reason C4GameVersion verThis; if (!pRef->isJoinAllowed() || !(pRef->getGameVersion() == verThis)) { fIsEnabled = false; } // store sort order iSortOrder = pRef->getSortOrder(); // all references expire after a while SetTimeout(TT_Reference); UpdateSmallState(); UpdateText(); }