void C4Network2Players::JoinUnjoinedPlayersInControlQueue(C4ClientPlayerInfos *pNewPacket) { // only host may join any players to the queue assert(::Network.isHost()); // check all players int i=0; C4PlayerInfo *pInfo; while ((pInfo = pNewPacket->GetPlayerInfo(i++))) // not yet joined and no savegame assignment? if (!pInfo->HasJoinIssued()) if (!pInfo->GetAssociatedSavegamePlayerID()) { // join will be marked when queue is executed (C4Player::Join) // but better mark join now already to prevent permanent sending overkill pInfo->SetJoinIssued(); // do so! C4Network2Res *pPlrRes = pInfo->GetRes(); C4Network2Client *pClient = ::Network.Clients.GetClientByID(pNewPacket->GetClientID()); if (!pPlrRes || (!pClient && pNewPacket->GetClientID() != ::Control.ClientID())) if (pInfo->GetType() != C4PT_Script) { // failure: Non-script players must have a res to join from! const char *szPlrName = pInfo->GetName(); if (!szPlrName) szPlrName="???"; LogF("Network: C4Network2Players::JoinUnjoinedPlayersInControlQueue failed to join player %s!", szPlrName); continue; } if (pPlrRes) { // join with resource Game.Input.Add(CID_JoinPlr, new C4ControlJoinPlayer(pPlrRes->getFile(), pNewPacket->GetClientID(), pInfo->GetID(), pPlrRes->getCore())); } else { // join without resource (script player) Game.Input.Add(CID_JoinPlr, new C4ControlJoinPlayer(NULL, pNewPacket->GetClientID(), pInfo->GetID())); } } }