Files
FC1/CryGame/XNetwork.cpp
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

201 lines
4.0 KiB
C++

//////////////////////////////////////////////////////////////////////////
//
// Game Source Code
//
// File: XNetwork.cpp
// Description: Network stuffs implementation.
//
// History:
// - August 6, 2001: Created by Alberto Demichelis
//
//////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "XNetwork.h"
#include "Game.h"
//////////////////////////////////////////////////////////////////////////////////////////////
// SXServerInfos implementation.
//////////////////////////////////////////////////////////////////////////
SXServerInfos::SXServerInfos()
{
strName = "@UnknownServer";
strMap = "@UnknownMap";
strGameType = "@UnknownGameType";
strMod = "@UnknownMod";
nPlayers = 0;
nMaxPlayers = 0;
nPort = DEFAULT_SERVERPORT;
nPing = 0;
nComputerType = 0;
nServerFlags = 0;
}
//////////////////////////////////////////////////////////////////////////
bool SXServerInfos::Read(const string &szInfoString)
{
if (szInfoString.empty() || szInfoString[0] != 'S')
{
return false;
}
// SFileVersion Version;
const char *pBuf = szInfoString.c_str()+1; // skip the 'S'
// extract the port
nPort = *((int *)pBuf); pBuf+=4;
nComputerType = *pBuf++;
VersionInfo.Set(pBuf); pBuf += strlen(pBuf)+1;
strName = pBuf; pBuf += strName.size()+1;
strMod = pBuf; pBuf += strMod.size()+1;
strGameType = pBuf; pBuf += strGameType.size()+1;
strMap = pBuf; pBuf += strMap.size()+1;
nPlayers = *pBuf++;
nMaxPlayers = *pBuf++;
nServerFlags = 0;
if (*pBuf++)
nServerFlags |= SXServerInfos::FLAG_PASSWORD;
if (*pBuf++)
nServerFlags |= SXServerInfos::FLAG_CHEATS;
if (*pBuf++)
nServerFlags |= SXServerInfos::FLAG_NET;
if (*pBuf++)
nServerFlags |= SXServerInfos::FLAG_PUNKBUSTER;
return true;
}
//////////////////////////////////////////////////////////////////////////
// SXGameContext implementation.
//////////////////////////////////////////////////////////////////////////
SXGameContext::SXGameContext()
{
strMapFolder = "NoMapCtx"; // <<FIXME>> Use a better name for the final version...
bForceNonDevMode=false;
ucServerInfoVersion=SERVERINFO_FORMAT_VERSION;
bInternetServer=false;
// HI:CPUType
#ifdef AMD64
nComputerType=1; // AMD64
#else
nComputerType=0; // IntelCompatible
#endif
nComputerType<<=4;
// LO:OSType
#ifdef LIMUX
nComputerType|=1; // Linux
#else
nComputerType|=0; // Windows
#endif
}
const char *SXGameContext::GetCPUTarget() const
{
switch(nComputerType>>4)
{
case 0: return "IntelCompatible";
case 1: return "AMD64";
}
return 0;
}
const char *SXGameContext::GetOSTarget() const
{
switch(nComputerType&0xf)
{
case 0: return "Windows";
case 1: return "Linux";
}
return 0;
}
//////////////////////////////////////////////////////////////////////////
bool SXGameContext::Write(CStream &stm)
{
if(!stm.Write(ucServerInfoVersion))
return false;
if(!stm.Write(strMapFolder))
return false;
if(!stm.Write(strMod))
return false;
if(!stm.Write(strGameType))
return false;
if(!stm.Write((unsigned int)dwNetworkVersion))
return false;
if(!stm.Write(strMission))
return false;
if(!stm.Write(wLevelDataCheckSum))
return false;
if(!stm.Write(bForceNonDevMode))
return false;
if(!stm.Write(bInternetServer))
return false;
if(!stm.Write(nComputerType))
return false;
return true;
}
bool SXGameContext::IsVersionOk() const
{
return dwNetworkVersion==NETWORK_FORMAT_VERSION && ucServerInfoVersion==(unsigned char)SERVERINFO_FORMAT_VERSION;
}
//////////////////////////////////////////////////////////////////////////
bool SXGameContext::Read(CStream &stm)
{
if(!stm.Read(ucServerInfoVersion))
return false;
if(!stm.Read(strMapFolder))
return false;
if(!stm.Read(strMod))
return false;
if(!stm.Read(strGameType))
return false;
if(!stm.Read((unsigned int&)dwNetworkVersion))
return false;
if(!stm.Read(strMission))
return false;
if(!stm.Read(wLevelDataCheckSum))
return false;
if(!stm.Read(bForceNonDevMode))
return false;
if(!stm.Read(bInternetServer))
return false;
if(!stm.Read(nComputerType))
return false;
return true;
}