40 dwColor = dwOriginalColor = 0xffffffff;
43 iID = idSavegamePlayer = idTeam = 0;
44 iInGameNumber = iInGameJoinFrame = iInGamePartFrame = -1;
45 sLeagueAccount =
""; iLeagueScore=iLeagueRank=0;
46 iLeagueProjectedGain = -1;
49 iLeaguePerformance = 0;
50 sLeagueProgressData.
Clear();
74 if (!
Reloc.
Open(Grp, szFilename))
return false;
78 if (!C4P.
Load(Grp))
return false;
82 this->szFilename = szFilename;
83 dwColor = dwOriginalColor = 0xff000000 | (C4P.
PrefColorDw & 0xffffff);
84 dwAlternateColor = 0xff000000 | (C4P.
PrefColor2Dw & 0xffffff);
94 if (!pRes)
return false;
110 this->dwColor = dwOriginalColor = 0xff000000 | (dwColor & 0xffffff);
111 dwAlternateColor = 0;
113 idExtraData = idExtra;
114 this->dwFlags |= dwFlags;
122 if (pRes)
return pRes->
getFile();
152 sResult.
Ref(sLeagueAccount);
235 iInGameNumber = iInGameJoinFrame = -1;
240 iInGamePartFrame = -1;
276 szFilename = szToFilename;
305 LogF(
"Error: Could not add resource %d for player %s! Player file too large to load?", (
int) ResCore.
getID(), (
const char *)
GetFilename());
325 if (!pSavegameInfo)
return false;
326 iID = pSavegameInfo->
GetID();
328 dwColor = pSavegameInfo->
GetColor();
329 idTeam = pSavegameInfo->
GetTeam();
336 iInGameNumber = iNumber;
351 bool fSuccess =
false;
355 bool fIncompleteRes =
false;
358 fIncompleteRes =
true;
359 size_t iBigIconSize=0;
375 if (szJoinFilenames || pAddInfo)
379 dwFlags |= CIF_Developer;
387 dwFlags |= CIF_AddPlayers;
390 dwFlags |= CIF_Initial;
392 if ((iPlayerCapacity = (szJoinFilenames ?
SModuleCount(szJoinFilenames) : 0) + !!pAddInfo))
398 for (int32_t i=0; i<iPlayerCapacity; ++i)
405 ppPlayers[iPlayerCount++] = pNewInfo;
417 ppPlayers[iPlayerCount++] = pAddInfo;
425 iClientID = rCopy.iClientID;
426 if ((iPlayerCount = rCopy.iPlayerCount))
429 ppPlayers =
new C4PlayerInfo *[iPlayerCapacity = rCopy.iPlayerCapacity];
430 int32_t i = iPlayerCount;
431 C4PlayerInfo **ppCurrPlrInfo = ppPlayers, **ppSrcPlrInfo = rCopy.ppPlayers;
432 while (i--) *ppCurrPlrInfo++ =
new C4PlayerInfo(**ppSrcPlrInfo++);
441 dwFlags = rCopy.dwFlags;
448 iClientID = rCopy.iClientID;
449 if ((iPlayerCount = rCopy.iPlayerCount))
452 ppPlayers =
new C4PlayerInfo *[iPlayerCapacity = rCopy.iPlayerCapacity];
453 int32_t i = iPlayerCount;
454 C4PlayerInfo **ppCurrPlrInfo = ppPlayers, **ppSrcPlrInfo = rCopy.ppPlayers;
455 while (i--) *ppCurrPlrInfo++ =
new C4PlayerInfo(**ppSrcPlrInfo++);
464 dwFlags = rCopy.dwFlags;
472 int32_t i = iPlayerCount;
C4PlayerInfo **ppCurrPlrInfo = ppPlayers;
473 while (i--)
delete *ppCurrPlrInfo++;
475 delete [] ppPlayers; ppPlayers =
nullptr;
477 iPlayerCount = iPlayerCapacity = 0;
485 if (!rFrom.iPlayerCount)
return;
490 if (iPlayerCount + rFrom.iPlayerCount > iPlayerCapacity)
491 GrowList(rFrom.iPlayerCount);
493 memcpy(ppPlayers + iPlayerCount, rFrom.ppPlayers, rFrom.iPlayerCount *
sizeof(
C4PlayerInfo *));
494 iPlayerCount += rFrom.iPlayerCount;
495 rFrom.iPlayerCount = rFrom.iPlayerCapacity = 0;
496 delete [] rFrom.ppPlayers; rFrom.ppPlayers =
nullptr;
501 if (ppPlayers)
delete [] ppPlayers;
502 ppPlayers = rFrom.ppPlayers; rFrom.ppPlayers =
nullptr;
503 iPlayerCount = rFrom.iPlayerCount; rFrom.iPlayerCount = 0;
504 iPlayerCapacity = rFrom.iPlayerCapacity; rFrom.iPlayerCapacity = 0;
511 if (iPlayerCount == iPlayerCapacity) GrowList(4);
513 ppPlayers[iPlayerCount++] = pAddInfo;
519 if (iAtIndex<0 || iAtIndex>=iPlayerCount)
return;
521 delete ppPlayers[iAtIndex];
523 ppPlayers[iAtIndex] = ppPlayers[--iPlayerCount];
529 int32_t i = 0;
C4PlayerInfo **ppCurrPlrInfo = ppPlayers;
530 while (i < iPlayerCount)
532 if ((*ppCurrPlrInfo)->GetID() == idPlr)
537 ++ppCurrPlrInfo; ++i;
543 void C4ClientPlayerInfos::GrowList(
size_t iByVal)
550 memcpy(ppNewInfo, ppPlayers, iPlayerCount *
sizeof(
C4PlayerInfo *));
554 ppPlayers = ppNewInfo;
561 int32_t i = iPlayerCount;
C4PlayerInfo **ppCurrPlrInfo = ppPlayers;
562 while (i--)
if ((*ppCurrPlrInfo++)->GetFlags() | dwFlag)
571 if (iIndex<0 || iIndex>=iPlayerCount)
return nullptr;
573 return ppPlayers[iIndex];
579 for (int32_t iCheck=0; iCheck<iPlayerCount; ++iCheck)
593 int32_t i = iPlayerCount;
C4PlayerInfo **ppCurrPlrInfo = ppPlayers;
596 if ((*ppCurrPlrInfo)->GetID() ==
id)
return *ppCurrPlrInfo;
605 int32_t i = iPlayerCount;
C4PlayerInfo **ppCurrPlrInfo = ppPlayers;
609 if ((pRes = (*ppCurrPlrInfo)->GetRes()))
612 if ((*ppCurrPlrInfo)->IsUsingPlayerFile())
613 return *ppCurrPlrInfo;
622 int32_t i = iPlayerCount;
C4PlayerInfo **ppCurrPlrInfo = ppPlayers;
623 while (i--)
if (!(*ppCurrPlrInfo++)->HasJoined())
return true;
631 int32_t i = iPlayerCount; int32_t cnt=0;
C4PlayerInfo **ppCurrPlrInfo = ppPlayers;
632 while (i--)
if ((*ppCurrPlrInfo++)->IsJoined()) ++cnt;
639 if (deserializing)
Clear();
645 {
"AddPlayers", CIF_AddPlayers },
646 {
"Updated", CIF_Updated },
647 {
"Initial", CIF_Initial },
648 {
"Developer", CIF_Developer },
654 pComp->
Value(mkNamingCountAdapt<int32_t>(iPlayerCount,
"Player"));
655 if (iPlayerCount < 0 || iPlayerCount >
C4MaxPlayer)
656 { pComp->
excCorrupt(
"player count out of range");
return; }
658 if (deserializing && iPlayerCount > iPlayerCapacity)
660 GrowList(iPlayerCount - iPlayerCapacity);
661 ZeroMem(ppPlayers,
sizeof(*ppPlayers) * iPlayerCount);
666 mkPtrAdaptNoNull<C4PlayerInfo>(*ppPlayers);
672 int32_t i = iPlayerCount;
C4PlayerInfo **ppCurrPlrInfo = ppPlayers;
673 while (i--) (*ppCurrPlrInfo++)->LoadResource();
682 ppClients(nullptr), iLastPlayerID(rCpy.iLastPlayerID)
689 int32_t i = iClientCount;
697 iClientCount = rCpy.iClientCount;
698 iClientCapacity = rCpy.iClientCapacity;
699 iLastPlayerID = rCpy.iLastPlayerID;
704 int32_t i = iClientCount;
716 while (i--)
delete *ppInfo++;
718 delete [] ppClients; ppClients =
nullptr;
719 iClientCount = iClientCapacity = 0;
724 void C4PlayerInfoList::GrowList(
size_t iByVal)
735 ppClients = ppNewInfo;
789 int32_t idSavegameID;
bool fHasForcedColor =
false;
DWORD dwForceClr;
794 fHasForcedColor =
true;
803 fHasForcedColor =
true;
807 if (fHasForcedColor && (dwForceClr != pInfo->
GetColor()))
813 if ((pInfo->
GetColor() & 0xff000000u) != 0xff000000u)
837 if (!pPlrInfo->
GetID())
848 pPlrInfo->
SetID(++iLastPlayerID);
878 int32_t idTeam = pPlrInfo->
GetTeam();
886 assert(pNewClientInfo);
895 delete pNewClientInfo;
903 int32_t idTeam = pInfo->
GetTeam();
914 (*ppExistingInfo)->GrabMergeFrom(*pNewClientInfo);
916 delete pNewClientInfo;
918 return pNewClientInfo = *ppExistingInfo;
921 delete *ppExistingInfo;
922 return *ppExistingInfo = pNewClientInfo;
927 if (iClientCount >= iClientCapacity) GrowList(4);
928 ppClients[iClientCount++] = pNewClientInfo;
930 return pNewClientInfo;
936 for (int32_t i=0; i<iClientCount; ++i)
if (ppClients[i]->GetClientID() == iClientID)
return ppClients+i;
945 for (int32_t i=0; i<iClientCount; ++i)
955 for (int32_t i=0; i<iClientCount; ++i)
970 for (int32_t i = 0; i<iClientCount; ++i)
985 for (int32_t i=0; i<iClientCount; ++i)
1004 for (int32_t i=0; i<iClientCount; ++i)
1026 for (int32_t i=0; i<iClientCount; ++i)
1029 if (iAtClientID != -1 && pClient->
GetClientID() != iAtClientID)
continue;
1051 for (int32_t i=0; i<iClientCount; ++i)
1054 while ((pInfo = ppClients[i]->GetPlayerInfo(j++)))
1067 for (int32_t i=0; i<iClientCount; ++i)
1070 while ((pInfo = ppClients[i]->GetPlayerInfo(j++)))
1071 if (pInfo->
GetID() ==
id)
return pInfo;
1081 for (int32_t i=0; i<iClientCount; ++i)
1084 while ((pInfo = ppClients[i]->GetPlayerInfo(j++)))
1085 if (pInfo->
GetID() ==
id)
return ppClients[i];
1094 assert(
id); assert(pidClient);
1096 for (int32_t i=0; i<iClientCount; ++i)
1099 while ((pInfo = ppClients[i]->GetPlayerInfo(j++)))
1100 if (pInfo->
GetID() ==
id)
1115 for (int32_t i=0; i<iClientCount; ++i)
1118 while ((pInfo = ppClients[i]->GetPlayerInfo(j++)))
1129 for (int32_t i=0; i<iClientCount; ++i)
1132 while ((pInfo = ppClients[i]->GetPlayerInfo(j++)))
1133 if (pInfo->
GetID() >
id)
1134 if (!pSmallest || pSmallest->
GetID()>pInfo->
GetID())
1144 for (int32_t i=0; i<iClientCount; ++i)
1147 while ((pInfo = ppClients[i]->GetPlayerInfo(j++)))
1160 for (
int iMatchLvl = mlMatchStart; iMatchLvl <= mlMatchEnd; ++iMatchLvl)
1162 for (int32_t i=0; i<iClientCount; ++i)
1165 while ((pInfo = ppClients[i]->GetPlayerInfo(j++)))
1169 case PML_PlrFileName:
1194 while ((pRestoreClient = rRestoreInfoList.
GetIndexedInfo(iClient++)))
1197 while ((pRestoreInfo = pRestoreClient->
GetPlayerInfo(iInfo++)))
1201 return pRestoreInfo;
1212 if (!pCnfo1 || !pCnfo2)
return false;
1242 if (!CompileFromBuf_LogWarn<StdCompilerINIRead>(
1255 if (!iClientCount)
return true;
1260 StdStrBuf Buf = DecompileToBuf<StdCompilerINIWrite>(
1263 hGroup.
Add(szToFile, Buf,
false,
true);
1282 pLocalInfo =
AddInfo(pLocalInfo);
1298 if (!ppkLocal)
return false;
1299 pkLocal = *ppkLocal;
1302 while ((pInfo = pkLocal->GetPlayerInfo(i++)))
1314 const char *szPlrName = pInfo->
GetName();
if (!szPlrName) szPlrName=
"???";
1342 LogF(
"Warning: User player %s takes over script player %s!", pRejoinInfo->
GetName(), pInfo->
GetName());
1347 LogF(
"Error restoring savegame script players: No host player infos to add to!");
1353 pHostInfo->
AddInfo(pRejoinInfo);
1370 int32_t iNumGrabbed = 0, i;
1374 for (
int eMatchingLevel = 0; eMatchingLevel <= PML_Any; ++eMatchingLevel)
1375 for (int32_t i=0; i<iClientCount; ++i)
1381 if ((pSavegameInfo = rSavegamePlayers.
FindSavegameResumePlayerInfo(pInfo, (MatchingLevel)eMatchingLevel, (MatchingLevel)eMatchingLevel)))
1384 if (eMatchingLevel > PML_PlrName)
1396 for (i=0; i<iClientCount; ++i)
1412 assert(!
"Invalid savegame association");
1423 int32_t iCountRemaining = rSavegamePlayers.
GetPlayerCount() - iNumGrabbed;
1424 if (iCountRemaining)
1431 *
this = rSavegamePlayers;
1453 for (int32_t i=0; i<iClientCount; ++i)
1466 const char *szCurrPlrFile;
1471 sFilenameInRecord.
Format(
"Recreate-%d.ocp", pInfo->
GetID());
1472 szCurrPlrFile = sFilenameInRecord.
getData();
1476 const char *szPlrName = pInfo->
GetName();
if (!szPlrName) szPlrName =
"???";
1477 if (!szCurrPlrFile || !*szCurrPlrFile)
1527 for (int32_t i=0; i<iClientCount; ++i)
1536 const char *szAtClientName;
1540 szAtClientName =
"Replay";
1546 szAtClientName =
"Local";
1553 szAtClientName = pClient->
getName();
1571 if (szFilename && pJoinRes && pJoinRes->
isLoading())
1573 const char *szName = pInfo->
GetName();
1579 if (!szFilename || !*szFilename)
1584 const char *szPlrName = pInfo->
GetName();
if (!szPlrName) szPlrName =
"???";
1591 szFilename =
nullptr;
1598 sFilenameInRecord.
Format(
"Recreate-%d.ocp", pInfo->
GetID());
1602 ::Players.
Join(szFilename,
false, idAtClient, szAtClientName, pInfo, numbers);
1636 *
this = rFromPlayers;
1645 bool fKeepInfo =
false;
1653 fKeepInfo = fSaveUserPlrs;
1654 if (fSetUserPlrRefToLocalGroup)
1661 const char *szName = pGameClient ? pGameClient->
getName() :
"Unknown";
1669 sNewName.
Replace(
"%",
"%25", 0);
1670 for (
int ch = 128; ch < 256; ++ch)
1672 const char* hexChars =
"0123456789abcdef";
1673 char old[] = { char(ch), 0 };
1674 char safe[] = {
'%',
'x',
'x', 0 };
1675 safe[1] = hexChars[ch / 16];
1676 safe[2] = hexChars[ch % 16];
1677 sNewName.
Replace(old, safe, 0);
1688 if (fSetScriptPlrRefToLocalGroup)
1735 if (deserializing)
Clear();
1737 if (!deserializing && pComp->
hasNaming() && iLastPlayerID == 0 && iClientCount == 0)
1742 int32_t iTemp = iClientCount;
1743 pComp->
Value(mkNamingCountAdapt<int32_t>(iTemp,
"Client"));
1745 { pComp->
excCorrupt(
"client count out of range");
return; }
1749 if (iTemp > iClientCapacity) GrowList(iTemp - iClientCapacity);
1750 iClientCount = iTemp;
1751 ZeroMem(ppClients,
sizeof(*ppClients) * iClientCount);
1756 mkArrayAdaptMap(ppClients, iClientCount, mkPtrAdaptNoNull<C4ClientPlayerInfos>),
1759 mkPtrAdaptNoNull<C4ClientPlayerInfos>(*ppClients);
1766 for (int32_t i=0; i<iClientCount; ++i)
1769 while ((pInfo = ppClients[i]->GetPlayerInfo(j++)))
1785 for (int32_t i=0; i<iClientCount; ++i)
1788 while ((pInfo = ppClients[i]->GetPlayerInfo(j++)))
1790 iLastPlayerID = std::max<int32_t>(pInfo->
GetID(), iLastPlayerID);
const int32_t C4ClientIDUnknown
const char * LoadResStr(const char *id)
bool Log(const char *szMessage)
bool LogF(const char *strMessage,...)
const int C4NetResRetrieveTimeout
const int32_t C4NetResMaxBigicon
const int32_t C4MaxPlayer
const int32_t C4MaxClient
const char * SSearch(const char *szString, const char *szIndex)
bool SGetModule(const char *szList, int iIndex, char *sTarget, int iSize)
bool SEqualNoCase(const char *szStr1, const char *szStr2, int iLen)
int SModuleCount(const char *szList)
std::enable_if< std::is_pod< T >::value >::type ZeroMem(T *lpMem, size_t dwSize)
StdBitfieldAdapt< T > mkBitfieldAdapt(T &rVal, const StdBitfieldEntry< T > *pNames)
StdArrayAdapt< T, M > mkArrayAdaptMap(T *pArray, int iSize, M &&map)
StdIntPackAdapt< T > mkIntPackAdapt(T &rVal)
StdParameterAdapt< T, P > mkParAdapt(T &&rObj, P &&rPar)
StdNamingAdapt< T > mkNamingAdapt(T &&rValue, const char *szName)
StdStrBuf FormatString(const char *szFmt,...)
bool EraseItem(const char *szItemName)
char * GetFilename(char *szPath)
const char * getName() const
C4Client * getClientByID(int32_t iID) const
void RemoveInfo(int32_t idPlr)
void CompileFunc(StdCompiler *pComp)
void AddInfo(C4PlayerInfo *pAddInfo)
C4ClientPlayerInfos & operator=(const C4ClientPlayerInfos &rCopy)
int32_t GetClientID() const
C4PlayerInfo * GetPlayerInfoByID(int32_t id) const
C4ClientPlayerInfos(const char *szJoinFilenames=nullptr, bool fAdd=false, C4PlayerInfo *pAddInfo=nullptr)
void RemoveIndexedInfo(int32_t iAtIndex)
void GrabMergeFrom(C4ClientPlayerInfos &rFrom)
C4PlayerInfo * GetPlayerInfo(int32_t iIndex) const
int32_t GetPlayerCount() const
int32_t GetJoinedPlayerCount() const
bool HasUnjoinedPlayers() const
int32_t GetFlaggedPlayerCount(DWORD dwFlag) const
C4PlayerInfo * GetPlayerInfoByRes(int32_t idResID) const
const char * GetRegistrationData(const char *field)
const char * AtTempPath(const char *filename)
int32_t HideMsgPlrTakeOver
void Add(C4PacketType eType, C4ControlPacket *pCtrl)
bool Load(C4Group &hGroup, const char *szName, int iWdt, int iHgt, bool fNoErrIfNotFound, int iFlags)
bool ShowMessageModal(const char *szMessage, const char *szCaption, DWORD dwButtons, Icons icoIcon, int32_t *piConfigDontShowAgainSetting=nullptr)
bool RecAddFile(const char *szLocalFilename, const char *szAddAs)
void DoInput(C4PacketType eCtrlType, C4ControlPacket *pPkt, C4ControlDeliveryType eDelivery)
char PlayerFilenames[20 *_MAX_PATH_LEN]
C4PlayerInfoList & PlayerInfos
C4PlayerInfoList & RestorePlayerInfos
C4GameParameters & Parameters
bool DeleteEntry(const char *filename, bool do_recycle=false)
bool Extract(const char *files, const char *destination=nullptr, const char *exclude=nullptr)
bool AccessEntry(const char *wildcard, size_t *size=nullptr, char *filename=nullptr, bool needs_to_be_a_group=false)
bool Add(const char *filename, const char *entry_name)
bool LoadEntryString(const char *entry_name, StdStrBuf *buffer)
bool FindEntry(const char *wildcard, StdStrBuf *filename=nullptr, size_t *size=nullptr)
bool Open(const char *group_name, bool do_create=false)
void ReplaceStrings(StdStrBuf &rBuf)
C4Network2Players Players
C4Network2ResList ResList
C4Network2Res::Ref RetrieveRes(const C4Network2ResCore &Core, int32_t iTimeout, const char *szResName, bool fWaitForCore=false)
void RequestPlayerInfoUpdate(const class C4ClientPlayerInfos &rRequest)
const char * getFile() const
const C4Network2ResCore & getCore() const
C4Network2Res::Ref getRefRes(int32_t iResID)
C4Network2Res::Ref AddByGroup(C4Group *pGrp, bool fTemp, C4Network2ResType eType, int32_t iResID=-1, const char *szResName=nullptr, bool fAllowUnloadable=false)
C4Network2Res::Ref AddByCore(const C4Network2ResCore &Core, bool fLoad=true)
void CompileFunc(StdCompiler *pComp) override
void CompileFunc(StdCompiler *pComp) override
bool Load(C4Group &hGroup)
char PrefName[C4MaxName+1]
bool LoadFromLocalFile(const char *szFilename)
void CompileFunc(StdCompiler *pComp)
uint32_t GetOriginalColor() const
StdStrBuf GetLobbyName() const
uint32_t GetColor() const
bool SetSavegameResume(C4PlayerInfo *pSavegameInfo)
bool LoadBigIcon(C4FacetSurface &fctTarget)
void SetJoined(int32_t iNumber)
void SetID(int32_t iToID)
void ResetLeagueProjectedGain()
bool HasJoinIssued() const
void SetAssociatedSavegamePlayer(int32_t aidSavegamePlayer)
bool IsScenarioSaveDesired() const
int32_t GetAssociatedSavegamePlayerID() const
void SetColor(DWORD dwUseClr)
@ PIF_SavegameTakeoverFlags
@ PIF_JoinedForSavegameOnly
uint32_t GetLobbyColor() const
void SetFilename(const char *szToFilename)
const char * GetLocalJoinFilename() const
const char * GetName() const
int32_t GetInGameNumber() const
void SetToScenarioFilename(const char *szScenFilename)
bool HasJoinPending() const
C4PlayerType GetType() const
C4Network2Res * GetRes() const
bool SetAsScriptPlayer(const char *szName, uint32_t dwColor, uint32_t dwFlags, C4ID idExtra)
bool IsLeagueProjectedGainValid() const
const char * GetFilename() const
StdStrBuf GetActivePlayerNames(bool fCountInvisible, int32_t iAtClientID=-1) const
C4ClientPlayerInfos * GetInfoByClientID(int32_t iClientID) const
int32_t GetJoinIssuedPlayerCount() const
C4ClientPlayerInfos * GetIndexedInfo(int32_t iIndex) const
bool SetAsRestoreInfos(C4PlayerInfoList &rFromPlayers, bool fSaveUserPlrs, bool fSaveScriptPlrs, bool fSetUserPlrRefToLocalGroup, bool fSetScriptPlrRefToLocalGroup)
C4PlayerInfo * GetPlayerInfoByIndex(int32_t index) const
bool RecreatePlayers(C4ValueNumbers *)
bool Load(C4Group &hGroup, const char *szFromFile, class C4LangStringTable *pLang=nullptr)
void AssignTeams(C4ClientPlayerInfos *pNewClientInfo, bool fByHost)
int32_t GetJoinPendingPlayerCount() const
int32_t GetActiveScriptPlayerCount(bool fCountSavegameResumes, bool fCountInvisible) const
void RecheckAutoGeneratedTeams()
int32_t GetFreePlayerSlotCount()
C4PlayerInfo * GetPlayerInfoBySavegameID(int32_t id) const
int32_t GetStartupCount()
bool Save(C4Group &hGroup, const char *szToFile)
C4PlayerInfo * GetNextPlayerInfoByID(int32_t id) const
C4PlayerInfo * FindUnassociatedRestoreInfo(const C4PlayerInfoList &rRestoreInfoList)
void CreateRestoreInfosForJoinedScriptPlayers(C4PlayerInfoList &rSavegamePlayers)
void RemoveUnassociatedPlayers(C4PlayerInfoList &rSavegamePlayers)
C4PlayerInfo * GetActivePlayerInfoByName(const char *szName)
bool DoPlayerInfoUpdate(C4ClientPlayerInfos *pUpdate)
bool HasSameTeamPlayers(int32_t iClient1, int32_t iClient2) const
bool LocalJoinUnjoinedPlayersInQueue()
int32_t GetActivePlayerCount(bool fCountInvisible) const
void RemoveInfo(C4ClientPlayerInfos **ppRemoveInfo)
bool RecreatePlayerFiles()
void ResolvePlayerAttributeConflicts(C4ClientPlayerInfos *pSecPacket)
C4PlayerInfoList & operator=(const C4PlayerInfoList &rCpy)
C4ClientPlayerInfos * GetClientInfoByPlayerID(int32_t id) const
void UpdatePlayerAttributes()
bool RestoreSavegameInfos(C4PlayerInfoList &rSavegamePlayers)
C4PlayerInfo * GetPlayerInfoByID(int32_t id) const
int32_t GetInfoCount() const
C4ClientPlayerInfos * AddInfo(C4ClientPlayerInfos *pNewClientInfo)
void CompileFunc(StdCompiler *pComp)
bool DoLocalNonNetworkPlayerJoin(const char *szPlayerFile)
C4ClientPlayerInfos ** GetInfoPtrByClientID(int32_t iClientID) const
void ResetLeagueProjectedGain(bool fSetUpdated)
C4PlayerInfo * FindSavegameResumePlayerInfo(const C4PlayerInfo *pMatchInfo, MatchingLevel mlMatchStart, MatchingLevel mlMatchEnd) const
int32_t GetPlayerCount() const
bool DoLocalNonNetworkPlayerInfoUpdate(C4ClientPlayerInfos *pUpdate)
bool AssignPlayerIDs(C4ClientPlayerInfos *pNewClientInfo)
C4Player * Join(const char *szFilename, bool fScenarioInit, int iAtClient, const char *szAtClientName, class C4PlayerInfo *pInfo, C4ValueNumbers *)
bool RemoveUnjoined(int32_t iPlayer)
bool Open(C4Group &group, const char *filename) const
uint32_t GetColor() const
bool IsMultiTeams() const
C4Team * GetTeamByID(int32_t iID) const
bool IsTeamColors() const
TeamDist GetTeamDist() const
bool RecheckPlayerInfoTeams(C4PlayerInfo &rNewJoin, bool fByHost)
C4Team * GetGenerateTeamByID(int32_t iID)
void excCorrupt(const char *szMessage,...)
void Value(const T &rStruct)
virtual bool isDeserializer()
int Replace(const char *szOld, const char *szNew, size_t iStartSearch=0)
void Ref(const char *pnData)
const char * getData() const
void Append(const char *pnData, size_t iChars)
void Format(const char *szFmt,...) GNUC_FORMAT_ATTRIBUTE_O
void CopyValidated(const char *szFromVal)