Skip to content

Commit

Permalink
Net: Revised handshake and player info
Browse files Browse the repository at this point in the history
These packets were using struct-based data,
which is a no-no. Now they rely on the Reader
and Writer.

Also fixed a problem with the Writer's typecheck,
where it was assuming that checks for a zero-size
operation needed the type marker (they don't).
  • Loading branch information
skyjake committed Aug 19, 2011
1 parent 1a70fcd commit cb6f33a
Show file tree
Hide file tree
Showing 9 changed files with 122 additions and 87 deletions.
9 changes: 5 additions & 4 deletions doomsday/engine/portable/include/net_main.h
Expand Up @@ -236,18 +236,21 @@ typedef struct {
int viewConsole;
} client_t;

/*
// Packets.
typedef struct {
byte version;
unsigned short playerMask; // 16 players.
byte yourConsole; // Which one's you?
int gameTime;
} handshake_packet_t;

*/
/*
typedef struct {
byte console;
char name[PLAYERNAMELEN];
} playerinfo_packet_t;
*/

//---------------------------------------------------------------------------
// Variables
Expand Down Expand Up @@ -277,17 +280,15 @@ void Net_DestroyArrays(void);
void Net_SendPacket(int to_player, int type, const void *data, size_t length);
boolean Net_GetPacket(void);
void Net_SendBuffer(int to_player, int sp_flags);
void Net_SendPlayerInfo(int srcPlrNum, int destPlrNum);
void Net_InitGame(void);
void Net_StartGame(void);
void Net_StopGame(void);
void Net_BuildLocalCommands(timespan_t time);
void Net_SendCommands(void);
void Net_SendPing(int player, int count);
void Net_PingResponse(void);
void Net_ShowPingSummary(int player);
void Net_ShowChatMessage(void);
int Net_TimeDelta(byte now, byte then);
int Net_GetTicCmd(void *cmd, int player);
void Net_Update(void);
void Net_Ticker(timespan_t time);
void Net_Drawer(void);
Expand Down
1 change: 0 additions & 1 deletion doomsday/engine/portable/include/sv_def.h
Expand Up @@ -55,7 +55,6 @@ void Sv_PlayerLeaves(unsigned int nodeID);
void Sv_Handshake(int playernum, boolean newplayer);
void Sv_GetPackets(void);
void Sv_SendText(int to, int conFlags, char* text);
//void Sv_FixLocalAngles(boolean clearFixAnglesFlag);
void Sv_Ticker(timespan_t ticLength);
int Sv_Latency(byte cmdTime);
void Sv_Kick(int who);
Expand Down
69 changes: 39 additions & 30 deletions doomsday/engine/portable/src/cl_main.c
Expand Up @@ -146,41 +146,38 @@ void Cl_SendHello(void)
Net_SendBuffer(0, 0);
}

void Cl_AnswerHandshake(handshake_packet_t* pShake)
void Cl_AnswerHandshake(void)
{
int i;
handshake_packet_t shake;

// Copy the data to a buffer of our own.
memcpy(&shake, pShake, sizeof(shake));
shake.playerMask = USHORT(shake.playerMask);
shake.gameTime = LONG(shake.gameTime);
byte remoteVersion = Reader_ReadByte(msgReader);
byte myConsole = Reader_ReadByte(msgReader);
uint playersInGame = Reader_ReadUInt32(msgReader);
float remoteGameTime = Reader_ReadFloat(msgReader);
int i;

// Immediately send an acknowledgement.
// Immediately send an acknowledgement. This lets the server evaluate
// an approximate ping time.
Msg_Begin(PCL_ACK_SHAKE);
Msg_End();
Net_SendBuffer(0, 0);

// Check the version number.
if(shake.version != SV_VERSION)
if(remoteVersion != SV_VERSION)
{
Con_Message("Cl_AnswerHandshake: Version conflict! (you:%i, server:%i)\n",
SV_VERSION, shake.version);
SV_VERSION, remoteVersion);
Con_Execute(CMDS_DDAY, "net disconnect", false, false);
Demo_StopPlayback();
Con_Open(true);
return;
}

// Update time and player ingame status.
gameTime = shake.gameTime / 100.0;
gameTime = remoteGameTime;
for(i = 0; i < DDMAXPLAYERS; ++i)
{
ddPlayers[i].shared.inGame = (shake.playerMask & (1 << i)) != 0;
ddPlayers[i].shared.inGame = (playersInGame & (1 << i)) != 0;
}
consolePlayer = displayPlayer = shake.yourConsole;
//clients[consolePlayer].numTics = 0;
//clients[consolePlayer].firstTic = 0;
consolePlayer = displayPlayer = myConsole;

isClient = true;
isServer = false;
Expand All @@ -197,8 +194,8 @@ void Cl_AnswerHandshake(handshake_packet_t* pShake)
gameReady = false;
Cl_InitFrame();

Con_Printf("Cl_AnswerHandshake: myConsole:%i, gameTime:%i.\n",
shake.yourConsole, shake.gameTime);
Con_Message("Cl_AnswerHandshake: myConsole:%i, remoteGameTime:%i.\n",
myConsole, remoteGameTime);

/**
* Tell the game that we have arrived. The map will be changed when the
Expand All @@ -216,30 +213,38 @@ void Cl_AnswerHandshake(handshake_packet_t* pShake)
Con_Executef(CMDS_DDAY, true, "setcon %i", consolePlayer);
}

void Cl_HandlePlayerInfo(playerinfo_packet_t* info)
void Cl_HandlePlayerInfo(void)
{
player_t* plr;
boolean present;
player_t* plr;
boolean present;
byte console = Reader_ReadByte(msgReader);
size_t len = Reader_ReadUInt16(msgReader);
char name[PLAYERNAMELEN];

Con_Printf("Cl_HandlePlayerInfo: console:%i name:%s\n", info->console,
info->name);
len = MIN_OF(PLAYERNAMELEN - 1, len);
memset(name, 0, sizeof(name));
Reader_Read(msgReader, name, len);

#ifdef _DEBUG
Con_Message("Cl_HandlePlayerInfo: console:%i name:%s\n", console, name);
#endif

// Is the console number valid?
if(info->console >= DDMAXPLAYERS)
if(console >= DDMAXPLAYERS)
return;

plr = &ddPlayers[info->console];
plr = &ddPlayers[console];
present = plr->shared.inGame;
plr->shared.inGame = true;

strcpy(clients[info->console].name, info->name);
strcpy(clients[console].name, name);

if(!present)
{
// This is a new player! Let the game know about this.
gx.NetPlayerEvent(info->console, DDPE_ARRIVAL, 0);
gx.NetPlayerEvent(console, DDPE_ARRIVAL, 0);

Smoother_Clear(clients[info->console].smoother);
Smoother_Clear(clients[console].smoother);
}
}

Expand Down Expand Up @@ -295,8 +300,12 @@ void Cl_GetPackets(void)
default:
handled = false;
}

if(handled)
{
Msg_EndRead();
continue; // Get the next packet.
}
}

// How about the rest?
Expand Down Expand Up @@ -324,11 +333,11 @@ void Cl_GetPackets(void)
break;

case PSV_HANDSHAKE:
Cl_AnswerHandshake((handshake_packet_t *) netBuffer.msg.data);
Cl_AnswerHandshake();
break;

case PKT_PLAYER_INFO:
Cl_HandlePlayerInfo((playerinfo_packet_t *) netBuffer.msg.data);
Cl_HandlePlayerInfo();
break;

case PSV_PLAYER_EXIT:
Expand Down
6 changes: 0 additions & 6 deletions doomsday/engine/portable/src/dd_loop.c
Expand Up @@ -471,10 +471,4 @@ void DD_RunTics(void)
// Various global variables are used for counting time.
DD_AdvanceTime(ticLength);
}

// Clients send commands periodically, not on every frame.
if(!isClient)
{
Net_SendCommands();
}
}
38 changes: 26 additions & 12 deletions doomsday/engine/portable/src/net_main.c
Expand Up @@ -313,6 +313,26 @@ Smoother* Net_PlayerSmoother(int player)
return clients[player].smoother;
}

void Net_SendPlayerInfo(int srcPlrNum, int destPlrNum)
{
size_t nameLen;

assert(srcPlrNum >= 0 && srcPlrNum < DDMAXPLAYERS);
nameLen = strlen(clients[srcPlrNum].name);

#ifdef _DEBUG
Con_Message("Net_SendPlayerInfo: src=%i dest=%i name=%s\n",
srcPlrNum, destPlrNum, clients[srcPlrNum].name);
#endif

Msg_Begin(PKT_PLAYER_INFO);
Writer_WriteByte(msgWriter, srcPlrNum);
Writer_WriteUInt16(msgWriter, nameLen);
Writer_Write(msgWriter, clients[srcPlrNum].name, nameLen);
Msg_End();
Net_SendBuffer(destPlrNum, 0);
}

/**
* This is the public interface of the message sender.
*/
Expand Down Expand Up @@ -1086,24 +1106,18 @@ D_CMD(Kick)
}

D_CMD(SetName)
{
playerinfo_packet_t info;

{
Con_SetString("net-name", argv[1], false);
if(!netGame)
return true;

// In netgames, a notification is sent to other players.
memset(&info, 0, sizeof(info));
info.console = consolePlayer;
strncpy(info.name, argv[1], PLAYERNAMELEN - 1);
// The server does not have a name.
if(!isClient) return false;

// Serverplayers can update their name right away.
if(!isClient)
strcpy(clients[consolePlayer].name, info.name);
memset(clients[consolePlayer].name, 0, sizeof(clients[consolePlayer].name));
strncpy(clients[consolePlayer].name, argv[1], PLAYERNAMELEN - 1);

Net_SendPacket(DDSP_CONFIRM | (isClient ? consolePlayer : DDSP_ALL_PLAYERS),
PKT_PLAYER_INFO, &info, sizeof(info));
Net_SendPlayerInfo(consolePlayer, 0);
return true;
}

Expand Down
2 changes: 1 addition & 1 deletion doomsday/engine/portable/src/reader.c
Expand Up @@ -45,7 +45,7 @@ static boolean Reader_Check(const Reader* reader, size_t len)
{
#ifdef DENG_WRITER_TYPECHECK
// One byte for the code.
len++;
if(len) len++;
#endif

if(!reader || !reader->data) return false;
Expand Down
4 changes: 2 additions & 2 deletions doomsday/engine/portable/src/sv_frame.c
Expand Up @@ -351,7 +351,7 @@ void Sv_WriteMobjDelta(const void* deltaPtr)
}

if(df & MDF_HEALTH)
Writer_WriteUInt32(msgWriter, d->health);
Writer_WriteInt32(msgWriter, d->health);

if(df & MDF_RADIUS)
Writer_WriteFloat(msgWriter, d->radius);
Expand Down Expand Up @@ -390,7 +390,7 @@ void Sv_WritePlayerDelta(const void* deltaPtr)
Writer_WriteByte(msgWriter, df & 0xff);

if(df & PDF_MOBJ)
Writer_WriteInt16(msgWriter, d->mobj);
Writer_WriteUInt16(msgWriter, d->mobj);
if(df & PDF_FORWARDMOVE)
Writer_WriteByte(msgWriter, d->forwardMove);
if(df & PDF_SIDEMOVE)
Expand Down

0 comments on commit cb6f33a

Please sign in to comment.