246 lines
7.5 KiB
C
246 lines
7.5 KiB
C
//////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Game Source Code
|
|
//
|
|
// File: XNetwork.h
|
|
// Description: Network stuffs.
|
|
//
|
|
// History:
|
|
// - August 6, 2001: Created by Alberto Demichelis
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef GAME_XNETWORK_H
|
|
#define GAME_XNETWORK_H
|
|
#if _MSC_VER > 1000
|
|
# pragma once
|
|
#endif
|
|
|
|
#include "IPAddress.h" // CIPAddress
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Server to client messages
|
|
|
|
typedef unsigned char XSERVERMSG;
|
|
|
|
#define XSERVERMSG_UPDATEENTITY ((XSERVERMSG)(0))
|
|
#define XSERVERMSG_ADDENTITY ((XSERVERMSG)(1))
|
|
#define XSERVERMSG_REMOVEENTITY ((XSERVERMSG)(2))
|
|
#define XSERVERMSG_TIMESTAMP ((XSERVERMSG)(3))
|
|
#define XSERVERMSG_TEXT ((XSERVERMSG)(4))
|
|
#define XSERVERMSG_SETPLAYERSCORE ((XSERVERMSG)(5))
|
|
#define XSERVERMSG_SETENTITYSTATE ((XSERVERMSG)(6))
|
|
//#define XSERVERMSG_OBITUARY ((XSERVERMSG)(7))
|
|
#define XSERVERMSG_SETTEAMSCORE ((XSERVERMSG)(8))
|
|
#define XSERVERMSG_SETTEAMFLAGS ((XSERVERMSG)(9))
|
|
#define XSERVERMSG_SETPLAYER ((XSERVERMSG)(10))
|
|
#define XSERVERMSG_CLIENTSTRING ((XSERVERMSG)(11))
|
|
#define XSERVERMSG_CMD ((XSERVERMSG)(12))
|
|
#define XSERVERMSG_SETTEAM ((XSERVERMSG)(13))
|
|
#define XSERVERMSG_ADDTEAM ((XSERVERMSG)(14))
|
|
#define XSERVERMSG_REMOVETEAM ((XSERVERMSG)(15))
|
|
#define XSERVERMSG_SETENTITYNAME ((XSERVERMSG)(16))
|
|
#define XSERVERMSG_BINDENTITY ((XSERVERMSG)(17))
|
|
#define XSERVERMSG_SCOREBOARD ((XSERVERMSG)(18))
|
|
#define XSERVERMSG_SETGAMESTATE ((XSERVERMSG)(19))
|
|
#define XSERVERMSG_TEAMS ((XSERVERMSG)(20))
|
|
#define XSERVERMSG_SYNCVAR ((XSERVERMSG)(21))
|
|
#define XSERVERMSG_EVENTSCHEDULE ((XSERVERMSG)(22))
|
|
#define XSERVERMSG_UNIDENTIFIED ((XSERVERMSG)(23)) // 23 is not used as message
|
|
#define XSERVERMSG_REQUESTSCRIPTHASH ((XSERVERMSG)(24))
|
|
#define XSERVERMSG_AISTATE ((XSERVERMSG)(25))
|
|
|
|
#define XSERVERMSG_RESERVED_DONOT_USE1 ((XSERVERMSG)(250))
|
|
#define XSERVERMSG_RESERVED_DONOT_USE2 ((XSERVERMSG)(251))
|
|
#define XSERVERMSG_RESERVED_DONOT_USE3 ((XSERVERMSG)(252))
|
|
#define XSERVERMSG_RESERVED_DONOT_USE4 ((XSERVERMSG)(253))
|
|
#define XSERVERMSG_RESERVED_DONOT_USE5 ((XSERVERMSG)(254))
|
|
#define XSERVERMSG_RESERVED_DONOT_USE6 ((XSERVERMSG)(255))
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Client to server messages
|
|
|
|
typedef unsigned char XCLIENTMSG;
|
|
|
|
#define XCLIENTMSG_UNKNOWN ((XCLIENTMSG)(0))
|
|
#define XCLIENTMSG_PLAYERPROCESSINGCMD ((XCLIENTMSG)(1))
|
|
#define XCLIENTMSG_TEXT ((XCLIENTMSG)(2))
|
|
#define XCLIENTMSG_JOINTEAMREQUEST ((XCLIENTMSG)(3))
|
|
#define XCLIENTMSG_CALLVOTE ((XCLIENTMSG)(4))
|
|
#define XCLIENTMSG_VOTE ((XCLIENTMSG)(5))
|
|
#define XCLIENTMSG_KILL ((XCLIENTMSG)(6))
|
|
#define XCLIENTMSG_NAME ((XCLIENTMSG)(7))
|
|
#define XCLIENTMSG_CMD ((XCLIENTMSG)(8))
|
|
#define XCLIENTMSG_RATE ((XCLIENTMSG)(9))
|
|
#define XCLIENTMSG_ENTSOFFSYNC ((XCLIENTMSG)(10))
|
|
#define XCLIENTMSG_RETURNSCRIPTHASH ((XCLIENTMSG)(11))
|
|
#define XCLIENTMSG_AISTATE ((XCLIENTMSG)(12))
|
|
#define XCLIENTMSG_UNIDENTIFIED XSERVERMSG_UNIDENTIFIED // 23 is not used as message
|
|
|
|
#define XCLIENTMSG_RESERVED_DONOT_USE1 ((XCLIENTMSG)(250))
|
|
#define XCLIENTMSG_RESERVED_DONOT_USE2 ((XCLIENTMSG)(251))
|
|
#define XCLIENTMSG_RESERVED_DONOT_USE3 ((XCLIENTMSG)(252))
|
|
#define XCLIENTMSG_RESERVED_DONOT_USE4 ((XCLIENTMSG)(253))
|
|
#define XCLIENTMSG_RESERVED_DONOT_USE5 ((XCLIENTMSG)(254))
|
|
#define XCLIENTMSG_RESERVED_DONOT_USE6 ((XCLIENTMSG)(255))
|
|
|
|
|
|
////////////////////////////////////////////////////
|
|
//CLIENT COMMAND
|
|
////////////////////////////////////////////////////
|
|
#define SEND_ONE 1
|
|
#define SEND_MANY 2
|
|
#define SEND_TEAM 3
|
|
|
|
//<<>>list here the commands ids
|
|
//#define CMD_DONT_SEND_ME 0x00
|
|
#define CMD_SAY 0x01
|
|
#define CMD_SAY_TEAM 0x02
|
|
#define CMD_SAY_ONE 0x03
|
|
|
|
#define DEFAULT_TEXT_LIFETIME 7.5f
|
|
|
|
struct TextMessage
|
|
{
|
|
//! constructor
|
|
TextMessage()
|
|
{
|
|
fLifeTime=DEFAULT_TEXT_LIFETIME;
|
|
}
|
|
|
|
BYTE cMessageType; //!<
|
|
unsigned short uiSender; //!<
|
|
unsigned short uiTarget; //!<
|
|
float fLifeTime; //!<
|
|
// CStream stmPayload;
|
|
string m_sText; //!<
|
|
|
|
//!
|
|
bool Write(CStream &stm)
|
|
{
|
|
stm.Write(cMessageType);
|
|
stm.Write(uiSender);
|
|
stm.Write(uiTarget);
|
|
if(fLifeTime==DEFAULT_TEXT_LIFETIME)
|
|
{
|
|
stm.Write(false);
|
|
}
|
|
else
|
|
{
|
|
stm.Write(true);
|
|
unsigned char temp;
|
|
temp = (unsigned char) (fLifeTime * 10.0f);
|
|
stm.Write(temp);
|
|
}
|
|
return stm.Write(m_sText);
|
|
// stm.Write((unsigned short)stmPayload.GetSize());
|
|
// return stm.Write(stmPayload);
|
|
}
|
|
|
|
//!
|
|
bool Read(CStream &stm)
|
|
{
|
|
// unsigned short usSize;
|
|
bool b;
|
|
|
|
if(!stm.Read(cMessageType))
|
|
return false;
|
|
if(!stm.Read(uiSender))
|
|
return false;
|
|
if(!stm.Read(uiTarget))
|
|
return false;
|
|
if(!stm.Read(b))
|
|
return false;
|
|
|
|
if(!b)
|
|
{
|
|
fLifeTime=DEFAULT_TEXT_LIFETIME;
|
|
}
|
|
else
|
|
{
|
|
unsigned char temp;
|
|
temp = (unsigned char) (fLifeTime * 10.0f);
|
|
stm.Read(temp);
|
|
fLifeTime = temp / 10.0f;
|
|
}
|
|
return stm.Read(m_sText);
|
|
// stm.Read(usSize);
|
|
// stmPayload.SetSize(usSize);
|
|
// return stm.ReadBits(stmPayload.GetPtr(), usSize);
|
|
}
|
|
};
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Utility classes
|
|
|
|
///////////////////////////////////////////////
|
|
// Infos about the server
|
|
struct SXServerInfos
|
|
{
|
|
enum Flags
|
|
{
|
|
FLAG_PASSWORD = 1 << 0,
|
|
FLAG_CHEATS = 1 << 1,
|
|
FLAG_NET = 1 << 2,
|
|
FLAG_PUNKBUSTER = 1 << 3,
|
|
};
|
|
|
|
string strName; //!< e.g. "Jack's Server"
|
|
string strMap; //!< e.g. "MP_Airstrip"
|
|
string strGameType; //!< e.g. "ASSAULT", "FFA", "TDM"
|
|
string strMod; //!< e.g. "FarCry", "Counterstrike" current TCM(Total Conversion Mod), specified with -MOD ...
|
|
BYTE nPlayers; //!< current player count
|
|
BYTE nMaxPlayers; //!< max player count
|
|
WORD nPort; //!<
|
|
WORD nPing; //!<
|
|
// DWORD dwGameVersion; //!< still used?
|
|
CIPAddress IP; //!<
|
|
BYTE nComputerType; //!< reserved, currently not used (CPU: AMD64,Intel OS:Linux,Win)
|
|
int nServerFlags; //!< Flags with special info about server.
|
|
SFileVersion VersionInfo; //!<
|
|
|
|
//! constructor
|
|
SXServerInfos();
|
|
virtual ~SXServerInfos() {};
|
|
|
|
bool Read(const string &szServerInfoString);
|
|
};
|
|
|
|
|
|
|
|
///////////////////////////////////////////////
|
|
// Game context (sent to the client when connecting to a server)
|
|
struct SXGameContext
|
|
{
|
|
unsigned char ucServerInfoVersion; //!< SERVERINFO_FORMAT_VERSION (needed to prevent connects from old clients)
|
|
string strMapFolder; //!<
|
|
string strMod; //!< e.g. "FarCry", "Counterstrike" current TCM(Total Conversion Mod), specified with -MOD ...
|
|
string strGameType; //!< e.g. "ASSAULT", "FFA", "TDM"
|
|
string strMission; //!<
|
|
DWORD dwNetworkVersion; //!< NETWORK_FORMAT_VERSION
|
|
WORD wLevelDataCheckSum; //!<
|
|
bool bForceNonDevMode; //!< client is forced not to use the Devmode
|
|
bool bInternetServer; //!< true=requires UBI login, false=LAN
|
|
BYTE nComputerType; //!< HI:CPUType, LO:OSType
|
|
|
|
//! constructor
|
|
SXGameContext();
|
|
|
|
//!
|
|
bool Write(class CStream &stm);
|
|
//!
|
|
bool Read(class CStream &stm);
|
|
//!
|
|
bool IsVersionOk() const;
|
|
//! \return 0 if unknown, zero terminated string otherwise
|
|
const char *GetCPUTarget() const;
|
|
//! \return 0 if unknown, zero terminated string otherwise
|
|
const char *GetOSTarget() const;
|
|
};
|
|
|
|
#endif // GAME_XNETWORK_H
|