bool C4PlayerList::Remove(C4Player *pPlr, bool fDisconnect, bool fNoCalls) { if (!pPlr) return false; // inform script if (!fNoCalls) ::Game.GRBroadcast(PSF_RemovePlayer, &C4AulParSet(C4VInt(pPlr->Number), C4VInt(pPlr->Team))); // Transfer ownership of other objects to team members if (!fNoCalls) pPlr->NotifyOwnedObjects(); // NET2: update player info list if (pPlr->ID) { C4PlayerInfo *pInfo = Game.PlayerInfos.GetPlayerInfoByID(pPlr->ID); if (pInfo) { pInfo->SetRemoved(); if (fDisconnect) pInfo->SetDisconnected(); } // if player wasn't evaluated, store round results anyway if (!pPlr->Evaluated) Game.RoundResults.EvaluatePlayer(pPlr); } C4Player *pPrev=First; while (pPrev && pPrev->Next!=pPlr) pPrev=pPrev->Next; if (pPrev) pPrev->Next=pPlr->Next; else First=pPlr->Next; // Remove eliminated crew if (!fNoCalls) pPlr->RemoveCrewObjects(); // Clear object info pointers pPlr->CrewInfoList.DetachFromObjects(); // Clear viewports ::Viewports.CloseViewport(pPlr->Number, fNoCalls); // Check fullscreen viewports FullScreen.ViewportCheck(); // Remove player delete pPlr; // Validate object owners ::Objects.ValidateOwners(); // Update console Console.UpdateMenus(); return true; }