void C4Network2ClientListBox::ClientListItem::Update() { // update wait label if (pPing) { int iWait = ::Control.Network.ClientPerfStat(iClientID); pPing->SetText(FormatString("%d ms", iWait).getData()); pPing->SetColor(C4RGB( Clamp(255-Abs(iWait)*5, 0, 255), Clamp(255-iWait*5, 0, 255), Clamp(255+iWait*5, 0, 255))); } // update activation status const C4Client *pClient = GetClient(); if (!pClient) return; bool fIsActive = pClient->isActivated(); if (fIsActive != fShownActive) { fShownActive = fIsActive; if (!pClient->isHost()) pStatusIcon->SetIcon(fIsActive ? C4GUI::Ico_Client : C4GUI::Ico_ObserverClient); if (pActivateBtn) { pActivateBtn->SetIcon(fIsActive ? C4GUI::Ico_Active : C4GUI::Ico_Inactive); pActivateBtn->SetToolTip(LoadResStrNoAmp(fIsActive ? "IDS_NET_DEACTIVATECLIENT" : "IDS_NET_ACTIVATECLIENT")); } } // update players in tooltip StdStrBuf sCltPlrs(Game.PlayerInfos.GetActivePlayerNames(false, iClientID)); pName->SetToolTip(sCltPlrs.getData()); // update icon: Network status C4GUI::Icons icoStatus = C4GUI::Ico_UnknownClient; C4Network2Client *pClt = pClient->getNetClient(); if (pClt) { switch (pClt->getStatus()) { case NCS_Joining: // waiting for join data case NCS_Chasing: // client is behind (status not acknowledged, isn't waited for) case NCS_NotReady: // client is behind (status not acknowledged) icoStatus = C4GUI::Ico_Loading; break; case NCS_Ready: // client acknowledged network status icoStatus = C4GUI::Ico_Ready; break; case NCS_Remove: // client is to be removed icoStatus = C4GUI::Ico_Kick; break; default: // whatever assert(false); icoStatus = C4GUI::Ico_Loading; break; } } // sound icon? if (last_sound_time) { time_t dt = time(nullptr) - last_sound_time; if (dt >= SoundIconShowTime) { // stop showing sound icon last_sound_time = 0; } else { // time not up yet: show sound icon icoStatus = C4GUI::Ico_Sound; } } // network OK - control ready? if (!pForDlg->IsStartup() && (icoStatus == C4GUI::Ico_Ready)) { if (!::Control.Network.ClientReady(iClientID, ::Control.ControlTick)) { // control not ready icoStatus = C4GUI::Ico_NetWait; } } // set new icon pStatusIcon->SetIcon(icoStatus); }