void WriteUserInfo(FArchive &arc, userinfo_t &info) { TMapIterator<FName, FBaseCVar *> it(info); TMap<FName, FBaseCVar *>::Pair *pair; FName name; UCVarValue val; int i; while (it.NextPair(pair)) { name = pair->Key; arc << name; switch (name.GetIndex()) { case NAME_Skin: arc.WriteString(skins[info.GetSkin()].name); break; case NAME_PlayerClass: i = info.GetPlayerClassNum(); arc.WriteString(i == -1 ? "Random" : PlayerClasses[i].Type->Meta.GetMetaString(APMETA_DisplayName)); break; default: val = pair->Value->GetGenericRep(CVAR_String); arc.WriteString(val.String); break; } } name = NAME_None; arc << name; }
// // P_ArchivePlayers // void P_SerializePlayers (FArchive &arc, bool skipload) { BYTE numPlayers, numPlayersNow; int i; // Count the number of players present right now. for (numPlayersNow = 0, i = 0; i < MAXPLAYERS; ++i) { if (playeringame[i]) { ++numPlayersNow; } } if (arc.IsStoring()) { // Record the number of players in this save. arc << numPlayersNow; // Record each player's name, followed by their data. for (i = 0; i < MAXPLAYERS; ++i) { if (playeringame[i]) { arc.WriteString (players[i].userinfo.GetName()); players[i].Serialize (arc); } } } else { arc << numPlayers; // If there is only one player in the game, they go to the // first player present, no matter what their name. if (numPlayers == 1) { ReadOnePlayer (arc, skipload); } else { ReadMultiplePlayers (arc, numPlayers, numPlayersNow, skipload); } if (!skipload && numPlayersNow > numPlayers) { SpawnExtraPlayers (); } // Redo pitch limits, since the spawned player has them at 0. players[consoleplayer].SendPitchLimits(); } }