// // IntQryBuildInformation() // // Protocol building routine, the passed parameter is the enquirer version static void IntQryBuildInformation(const DWORD &EqProtocolVersion, const DWORD &EqTime) { std::vector<CvarField_t> Cvars; // bond - time MSG_WriteLong(&ml_message, EqTime); // The servers real protocol version // bond - real protocol MSG_WriteLong(&ml_message, PROTOCOL_VERSION); // Built revision of server MSG_WriteLong(&ml_message, last_revision); cvar_t *var = GetFirstCvar(); // Count our cvars and add them while (var) { if (var->flags() & CVAR_SERVERINFO) { CvarField.Name = var->name(); CvarField.Value = var->cstring(); Cvars.push_back(CvarField); } var = var->GetNext(); } // Cvar count MSG_WriteByte(&ml_message, (BYTE)Cvars.size()); // Write cvars for (size_t i = 0; i < Cvars.size(); ++i) { MSG_WriteString(&ml_message, Cvars[i].Name.c_str()); MSG_WriteString(&ml_message, Cvars[i].Value.c_str()); } MSG_WriteString(&ml_message, (strlen(join_password.cstring()) ? MD5SUM(join_password.cstring()).c_str() : "")); MSG_WriteString(&ml_message, level.mapname); int timeleft = (int)(sv_timelimit - level.time/(TICRATE*60)); if (timeleft < 0) timeleft = 0; MSG_WriteShort(&ml_message, timeleft); // Team data MSG_WriteByte(&ml_message, 2); // Blue MSG_WriteString(&ml_message, "Blue"); MSG_WriteLong(&ml_message, 0x000000FF); MSG_WriteShort(&ml_message, (short)TEAMpoints[it_blueflag]); MSG_WriteString(&ml_message, "Red"); MSG_WriteLong(&ml_message, 0x00FF0000); MSG_WriteShort(&ml_message, (short)TEAMpoints[it_redflag]); // TODO: When real dynamic teams are implemented //byte TeamCount = (byte)sv_teamsinplay; //MSG_WriteByte(&ml_message, TeamCount); //for (byte i = 0; i < TeamCount; ++i) //{ // TODO - Figure out where the info resides //MSG_WriteString(&ml_message, ""); //MSG_WriteLong(&ml_message, 0); //MSG_WriteShort(&ml_message, TEAMpoints[i]); //} // Patch files MSG_WriteByte(&ml_message, patchfiles.size()); for (size_t i = 0; i < patchfiles.size(); ++i) { MSG_WriteString(&ml_message, patchfiles[i].c_str()); } // Wad files MSG_WriteByte(&ml_message, wadnames.size()); for (size_t i = 0; i < wadnames.size(); ++i) { MSG_WriteString(&ml_message, wadnames[i].c_str()); MSG_WriteString(&ml_message, wadhashes[i].c_str()); } MSG_WriteByte(&ml_message, players.size()); // Player info for (size_t i = 0; i < players.size(); ++i) { MSG_WriteString(&ml_message, players[i].userinfo.netname); MSG_WriteByte(&ml_message, players[i].userinfo.team); MSG_WriteShort(&ml_message, players[i].ping); int timeingame = (time(NULL) - players[i].JoinTime)/60; if (timeingame < 0) timeingame = 0; MSG_WriteShort(&ml_message, timeingame); // FIXME - Treat non-players (downloaders/others) as spectators too for // now bool spectator; spectator = (players[i].spectator || ((players[i].playerstate != PST_LIVE) && (players[i].playerstate != PST_DEAD) && (players[i].playerstate != PST_REBORN))); MSG_WriteBool(&ml_message, spectator); MSG_WriteShort(&ml_message, players[i].fragcount); MSG_WriteShort(&ml_message, players[i].killcount); MSG_WriteShort(&ml_message, players[i].deathcount); } }
void NetDemo::writeConnectionSequence(buf_t *netbuffer) { // The packet sequence id MSG_WriteLong (netbuffer, 0); // Server sends our player id and digest MSG_WriteMarker (netbuffer, svc_consoleplayer); MSG_WriteByte (netbuffer, consoleplayer().id); MSG_WriteString (netbuffer, digest.c_str()); // our userinfo MSG_WriteMarker (netbuffer, svc_userinfo); MSG_WriteByte (netbuffer, consoleplayer().id); MSG_WriteString (netbuffer, consoleplayer().userinfo.netname); MSG_WriteByte (netbuffer, consoleplayer().userinfo.team); MSG_WriteLong (netbuffer, consoleplayer().userinfo.gender); MSG_WriteLong (netbuffer, consoleplayer().userinfo.color); MSG_WriteString (netbuffer, skins[consoleplayer().userinfo.skin].name); MSG_WriteShort (netbuffer, consoleplayer().GameTime); // Server sends its settings MSG_WriteMarker (netbuffer, svc_serversettings); cvar_t *var = GetFirstCvar(); while (var) { if (var->flags() & CVAR_SERVERINFO) { MSG_WriteByte (netbuffer, 1); MSG_WriteString (netbuffer, var->name()); MSG_WriteString (netbuffer, var->cstring()); } var = var->GetNext(); } MSG_WriteByte (netbuffer, 2); // end of server settings marker // Server tells everyone if we're a spectator MSG_WriteMarker (netbuffer, svc_spectate); MSG_WriteByte (netbuffer, consoleplayer().id); MSG_WriteByte (netbuffer, consoleplayer().spectator); // Server sends map name MSG_WriteMarker (netbuffer, svc_loadmap); MSG_WriteString (netbuffer, level.mapname); // Server spawns the player MSG_WriteMarker (netbuffer, svc_spawnplayer); MSG_WriteByte (netbuffer, consoleplayer().id); if (consoleplayer().mo) { MSG_WriteShort (netbuffer, consoleplayer().mo->netid); MSG_WriteLong (netbuffer, consoleplayer().mo->angle); MSG_WriteLong (netbuffer, consoleplayer().mo->x); MSG_WriteLong (netbuffer, consoleplayer().mo->y); MSG_WriteLong (netbuffer, consoleplayer().mo->z); } else { // The client hasn't yet received his own position from the server // This happens with cl_autorecord // Just fake a position for now MSG_WriteShort (netbuffer, MAXSHORT); MSG_WriteLong (netbuffer, 0); MSG_WriteLong (netbuffer, 0); MSG_WriteLong (netbuffer, 0); MSG_WriteLong (netbuffer, 0); } }
void NetDemo::writeConnectionSequence(buf_t *netbuffer) { // The packet sequence id MSG_WriteLong (netbuffer, 0); // Server sends our player id and digest MSG_WriteMarker (netbuffer, svc_consoleplayer); MSG_WriteByte (netbuffer, consoleplayer().id); MSG_WriteString (netbuffer, digest.c_str()); // our userinfo MSG_WriteMarker (netbuffer, svc_userinfo); MSG_WriteByte (netbuffer, consoleplayer().id); MSG_WriteString (netbuffer, consoleplayer().userinfo.netname.c_str()); MSG_WriteByte (netbuffer, consoleplayer().userinfo.team); MSG_WriteLong (netbuffer, consoleplayer().userinfo.gender); MSG_WriteLong (netbuffer, consoleplayer().userinfo.color); MSG_WriteString (netbuffer, ""); // [SL] place holder for deprecated skins MSG_WriteShort (netbuffer, consoleplayer().GameTime); // Server sends its settings MSG_WriteMarker (netbuffer, svc_serversettings); cvar_t *var = GetFirstCvar(); while (var) { if (var->flags() & CVAR_SERVERINFO) { MSG_WriteByte (netbuffer, 1); MSG_WriteString (netbuffer, var->name()); MSG_WriteString (netbuffer, var->cstring()); } var = var->GetNext(); } MSG_WriteByte (netbuffer, 2); // end of server settings marker // Server tells everyone if we're a spectator MSG_WriteMarker (netbuffer, svc_spectate); MSG_WriteByte (netbuffer, consoleplayer().id); MSG_WriteByte (netbuffer, consoleplayer().spectator); // Server sends wads & map name MSG_WriteMarker (netbuffer, svc_loadmap); // send list of wads (skip over wadnames[0] == odamex.wad) MSG_WriteByte(netbuffer, MIN<size_t>(wadfiles.size() - 1, 255)); for (size_t i = 1; i < MIN<size_t>(wadfiles.size(), 256); i++) { MSG_WriteString(netbuffer, D_CleanseFileName(wadfiles[i], "wad").c_str()); MSG_WriteString(netbuffer, wadhashes[i].c_str()); } // send list of DEH/BEX patches MSG_WriteByte(netbuffer, MIN<size_t>(patchfiles.size(), 255)); for (size_t i = 0; i < MIN<size_t>(patchfiles.size(), 255); i++) { MSG_WriteString(netbuffer, D_CleanseFileName(patchfiles[i]).c_str()); MSG_WriteString(netbuffer, patchfiles[i].c_str()); } MSG_WriteString(netbuffer, level.mapname); // Server spawns the player MSG_WriteMarker (netbuffer, svc_spawnplayer); MSG_WriteByte (netbuffer, consoleplayer().id); if (consoleplayer().mo) { MSG_WriteShort (netbuffer, consoleplayer().mo->netid); MSG_WriteLong (netbuffer, consoleplayer().mo->angle); MSG_WriteLong (netbuffer, consoleplayer().mo->x); MSG_WriteLong (netbuffer, consoleplayer().mo->y); MSG_WriteLong (netbuffer, consoleplayer().mo->z); } else { // The client hasn't yet received his own position from the server // This happens with cl_autorecord // Just fake a position for now MSG_WriteShort (netbuffer, MAXSHORT); MSG_WriteLong (netbuffer, 0); MSG_WriteLong (netbuffer, 0); MSG_WriteLong (netbuffer, 0); MSG_WriteLong (netbuffer, 0); } }