本文整理汇总了C++中MSG_WriteString函数的典型用法代码示例。如果您正苦于以下问题:C++ MSG_WriteString函数的具体用法?C++ MSG_WriteString怎么用?C++ MSG_WriteString使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了MSG_WriteString函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: Host_Name_f
/*
======================
Host_Name_f
======================
*/
void Host_Name_f (void)
{
char newName[32];
if (Cmd_Argc () == 1)
{
Con_Printf ("\"name\" is \"%s\"\n", cl_name.string);
return;
}
if (Cmd_Argc () == 2)
q_strlcpy(newName, Cmd_Argv(1), sizeof(newName));
else
q_strlcpy(newName, Cmd_Args(), sizeof(newName));
newName[15] = 0; // client_t structure actually says name[32].
if (cmd_source == src_command)
{
if (Q_strcmp(cl_name.string, newName) == 0)
return;
Cvar_Set ("_cl_name", newName);
if (cls.state == ca_connected)
Cmd_ForwardToServer ();
return;
}
if (host_client->name[0] && strcmp(host_client->name, "unconnected") )
{
if (Q_strcmp(host_client->name, newName) != 0)
Con_Printf ("%s renamed to %s\n", host_client->name, newName);
}
Q_strcpy (host_client->name, newName);
host_client->edict->v.netname = PR_SetEngineString(host_client->name);
// send notification to all clients
MSG_WriteByte (&sv.reliable_datagram, svc_updatename);
MSG_WriteByte (&sv.reliable_datagram, host_client - svs.clients);
MSG_WriteString (&sv.reliable_datagram, host_client->name);
}
开发者ID:ACIIL,项目名称:Quakespasm-Rift,代码行数:44,代码来源:host_cmd.c
示例2: Cam_Lock
void Cam_Lock(int playernum)
{
char st[32];
if (Cmd_FindAlias("f_trackspectate"))
{
Cbuf_AddTextEx (&cbuf_main, "f_trackspectate\n");
}
if (cl_multiview.value && cls.mvdplayback)
return;
snprintf(st, sizeof (st), "ptrack %i", playernum);
if (cls.mvdplayback) {
memcpy(cl.stats, cl.players[playernum].stats, sizeof(cl.stats));
ideal_track = playernum;
}
last_lock = cls.realtime;
if (cls.mvdplayback == QTV_PLAYBACK)
{
// its not setinfo extension, but adding new extension just for this is stupid IMO
QTV_Cmd_Printf(QTV_EZQUAKE_EXT_SETINFO, st);
}
else
{
MSG_WriteByte (&cls.netchan.message, clc_stringcmd);
MSG_WriteString (&cls.netchan.message, st);
}
spec_track = playernum;
locked = false;
Sbar_Changed();
if (TP_NeedRefreshSkins())
TP_RefreshSkins();
}
开发者ID:eb,项目名称:ezquake-source,代码行数:38,代码来源:cl_cam.c
示例3: CL_Download_f
/*
===============
CL_Download_f
Request a download from the server
===============
*/
void CL_Download_f (void)
{
char filename[MAX_OSPATH];
if (Cmd_Argc() != 2) {
Com_Printf("Usage: download <filename>\n");
return;
}
Com_sprintf(filename, sizeof(filename), "%s", Cmd_Argv(1));
if (strstr (filename, ".."))
{
Com_Printf ("Refusing to download a path with ..\n");
return;
}
if (FS_LoadFile (filename, NULL) != -1)
{ // it exists, no need to download
Com_Printf("File already exists.\n");
return;
}
strcpy (cls.downloadname, filename);
Com_Printf ("Downloading %s\n", cls.downloadname);
// download to a temp name, and only rename
// to the real name when done, so if interrupted
// a runt file wont be left
COM_StripExtension (cls.downloadname, cls.downloadtempname);
strcat (cls.downloadtempname, ".tmp");
MSG_WriteByte (&cls.netchan.message, clc_stringcmd);
MSG_WriteString (&cls.netchan.message,
va("download %s", cls.downloadname));
cls.downloadnumber++;
}
开发者ID:qbism,项目名称:Quake2-colored-refsoft,代码行数:45,代码来源:cl_parse.c
示例4: MSG_BeginWriting
void CHelperManager_Encoder::SendMessage_Added_toPlayer (
playerCharacter_t* pHelper, char* name, int level, int job, int worldIdx )
{
MSG_BeginWriting ( &netMessage );
MSG_Clear( &netMessage );
{
MSG_WriteByte(&netMessage, EXTEND_SECOND);
MSG_WriteShort( &netMessage, HELPER_SYSTEM );
MSG_WriteShort( &netMessage, SC_SEND_ADD_toPlayer );
MSG_WriteByte ( &netMessage, level );
MSG_WriteByte ( &netMessage, job );
MSG_WriteByte ( &netMessage, worldIdx );
MSG_WriteString ( &netMessage, name );
if ( pHelper->ready )
{
NET_SendMessage ( &pHelper->sock, &netMessage );
}
}
MSG_EndWriting(&netMessage);
}
开发者ID:gthgame,项目名称:gth,代码行数:23,代码来源:CHelperManager_Encoder.cpp
示例5: SV_Modellist_f
/*
==================
SV_Modellist_f
==================
*/
static void SV_Modellist_f (void)
{
int i;
if (host_client->state != cs_connected)
{
Con_Printf ("modellist not valid -- already spawned\n");
return;
}
// handle the case of a level changing while a client was connecting
if ( atoi(Cmd_Argv(1)) != svs.spawncount )
{
Con_Printf ("%s from different level\n", __thisfunc__);
SV_New_f ();
return;
}
MSG_WriteByte (&host_client->netchan.message, svc_modellist);
for (i = 1; i < MAX_MODELS && sv.model_precache[i][0]; i++)
MSG_WriteString (&host_client->netchan.message, sv.model_precache[i]);
MSG_WriteByte (&host_client->netchan.message, 0);
}
开发者ID:crutchwalkfactory,项目名称:motocakerteam,代码行数:28,代码来源:sv_user.c
示例6: Host_Name_f
/*
======================
Host_Name_f
======================
*/
void Host_Name_f (void)
{
char *newName;
if (Cmd_Argc () == 1)
{
Con_Printf ("\"name\" is \"%s\"\n", cl_name.string);
return;
}
if (Cmd_Argc () == 2)
newName = Cmd_Argv(1);
else
newName = Cmd_Args();
newName[15] = 0;
if (cmd_source == src_command)
{
if (Q_strcmp(cl_name.string, newName) == 0)
return;
Cvar_Set ("_cl_name", newName);
if (cls.state == ca_connected)
Cmd_ForwardToServer ();
return;
}
if (host_client->name[0] && strcmp(host_client->name, "unconnected") )
if (Q_strcmp(host_client->name, newName) != 0)
Con_Printf ("%s renamed to %s\n", host_client->name, newName);
Q_strcpy (host_client->name, newName);
host_client->edict->v.netname = host_client->name - pr_strings;
// send notification to all clients
MSG_WriteByte (&sv.reliable_datagram, svc_updatename);
MSG_WriteByte (&sv.reliable_datagram, host_client - svs.clients);
MSG_WriteString (&sv.reliable_datagram, host_client->name);
}
开发者ID:DrLabman,项目名称:Vengeance-r2,代码行数:42,代码来源:host_cmd.c
示例7: Cam_Unlock
void Cam_Unlock(void)
{
if (Cmd_FindAlias("f_freeflyspectate"))
{
Cbuf_AddTextEx (&cbuf_main, "f_freeflyspectate\n");
}
if (!autocam)
{
return;
}
if (cls.mvdplayback == QTV_PLAYBACK)
{
// its not setinfo extension, but adding new extension just for this is stupid IMO
QTV_Cmd_Printf(QTV_EZQUAKE_EXT_SETINFO, "ptrack");
}
else
{
MSG_WriteByte (&cls.netchan.message, clc_stringcmd);
MSG_WriteString (&cls.netchan.message, "ptrack");
}
autocam = CAM_NONE;
locked = false;
Sbar_Changed();
if (cls.mvdplayback && cl.teamfortress)
{
V_TF_ClearGrenadeEffects ();
}
if (TP_NeedRefreshSkins())
{
TP_RefreshSkins();
}
}
开发者ID:eb,项目名称:ezquake-source,代码行数:37,代码来源:cl_cam.c
示例8: SV_FullClientUpdate
/*
===================
SV_FullClientUpdate
Writes all update values to a sizebuf
===================
*/
void SV_FullClientUpdate (client_t *client, sizebuf_t *buf)
{
int i;
char info[MAX_INFO_STRING];
i = client - svs.clients;
if (client->state == cs_free && sv_fastconnect.value)
return;
MSG_WriteByte (buf, svc_updatefrags);
MSG_WriteByte (buf, i);
MSG_WriteShort (buf, client->old_frags);
MSG_WriteByte (buf, svc_updateping);
MSG_WriteByte (buf, i);
MSG_WriteShort (buf, SV_CalcPing (client));
MSG_WriteByte (buf, svc_updatepl);
MSG_WriteByte (buf, i);
MSG_WriteByte (buf, client->lossage);
MSG_WriteByte (buf, svc_updateentertime);
MSG_WriteByte (buf, i);
MSG_WriteFloat (buf, svs.realtime - client->connection_started);
strcpy (info, client->userinfo);
Info_RemovePrefixedKeys (info, '_'); // server passwords, etc
Info_RemoveKey (info, "pmodel");
Info_RemoveKey (info, "emodel");
MSG_WriteByte (buf, svc_updateuserinfo);
MSG_WriteByte (buf, i);
MSG_WriteLong (buf, client->userid);
MSG_WriteString (buf, info);
}
开发者ID:matatk,项目名称:agrip,代码行数:43,代码来源:sv_main.c
示例9: _Datagram_SearchForHosts
static void _Datagram_SearchForHosts (qboolean xmit)
{
int ret;
int n;
int i;
struct qsockaddr readaddr;
struct qsockaddr myaddr;
int control;
dfunc.GetSocketAddr (dfunc.controlSock, &myaddr);
if (xmit)
{
SZ_Clear(&net_message);
// save space for the header, filled in later
MSG_WriteLong(&net_message, 0);
MSG_WriteByte(&net_message, CCREQ_SERVER_INFO);
MSG_WriteString(&net_message, "QUAKE");
MSG_WriteByte(&net_message, NET_PROTOCOL_VERSION);
*((int *)net_message.data) = BigLong(NETFLAG_CTL | (net_message.cursize & NETFLAG_LENGTH_MASK));
dfunc.Broadcast(dfunc.controlSock, net_message.data, net_message.cursize);
SZ_Clear(&net_message);
}
while ((ret = dfunc.Read (dfunc.controlSock, net_message.data, net_message.maxsize, &readaddr)) > 0)
{
if (ret < sizeof(int))
continue;
net_message.cursize = ret;
// don't answer our own query
if (dfunc.AddrCompare(&readaddr, &myaddr) >= 0)
continue;
// is the cache full?
if (hostCacheCount == HOSTCACHESIZE)
continue;
MSG_BeginReading ();
control = BigLong(*((int *)net_message.data));
MSG_ReadLong();
if (control == -1)
continue;
if ((control & (~NETFLAG_LENGTH_MASK)) != NETFLAG_CTL)
continue;
if ((control & NETFLAG_LENGTH_MASK) != ret)
continue;
if (MSG_ReadByte() != CCREP_SERVER_INFO)
continue;
dfunc.GetAddrFromName(MSG_ReadString(), &readaddr);
// search the cache for this server
for (n = 0; n < hostCacheCount; n++)
if (dfunc.AddrCompare(&readaddr, &hostcache[n].addr) == 0)
break;
// is it already there?
if (n < hostCacheCount)
continue;
// add it
hostCacheCount++;
Q_strcpy(hostcache[n].name, MSG_ReadString());
Q_strcpy(hostcache[n].map, MSG_ReadString());
hostcache[n].users = MSG_ReadByte();
hostcache[n].maxusers = MSG_ReadByte();
if (MSG_ReadByte() != NET_PROTOCOL_VERSION)
{
Q_strcpy(hostcache[n].cname, hostcache[n].name);
hostcache[n].cname[14] = 0;
Q_strcpy(hostcache[n].name, "*");
Q_strcat(hostcache[n].name, hostcache[n].cname);
}
Q_memcpy(&hostcache[n].addr, &readaddr, sizeof(struct qsockaddr));
hostcache[n].driver = net_driverlevel;
hostcache[n].ldriver = net_landriverlevel;
Q_strcpy(hostcache[n].cname, dfunc.AddrToString(&readaddr));
// check for a name conflict
for (i = 0; i < hostCacheCount; i++)
{
if (i == n)
continue;
if (Q_strcasecmp (hostcache[n].name, hostcache[i].name) == 0)
{
i = Q_strlen(hostcache[n].name);
if (i < 15 && hostcache[n].name[i-1] > '8')
{
hostcache[n].name[i] = '0';
hostcache[n].name[i+1] = 0;
}
else
hostcache[n].name[i-1]++;
i = -1;
}
}
}
}
开发者ID:Izhido,项目名称:qrevpak,代码行数:98,代码来源:net_dgrm.c
示例10: SV_New_f
/*
* SV_New_f
*
* Sends the first message from the server to a connected client.
* This will be sent on the initial connection and upon each server load.
*/
static void SV_New_f( client_t *client )
{
int playernum;
unsigned int numpure;
purelist_t *purefile;
edict_t *ent;
int sv_bitflags = 0;
Com_DPrintf( "New() from %s\n", client->name );
// if in CS_AWAITING we have sent the response packet the new once already,
// but client might have not got it so we send it again
if( client->state >= CS_SPAWNED )
{
Com_Printf( "New not valid -- already spawned\n" );
return;
}
//
// serverdata needs to go over for all types of servers
// to make sure the protocol is right, and to set the gamedir
//
SV_InitClientMessage( client, &tmpMessage, NULL, 0 );
// send the serverdata
MSG_WriteByte( &tmpMessage, svc_serverdata );
MSG_WriteLong( &tmpMessage, APP_PROTOCOL_VERSION );
MSG_WriteLong( &tmpMessage, svs.spawncount );
MSG_WriteShort( &tmpMessage, (unsigned short)svc.snapFrameTime );
MSG_WriteString( &tmpMessage, FS_BaseGameDirectory() );
MSG_WriteString( &tmpMessage, FS_GameDirectory() );
playernum = client - svs.clients;
MSG_WriteShort( &tmpMessage, playernum );
// send full levelname
MSG_WriteString( &tmpMessage, sv.mapname );
//
// game server
//
if( sv.state == ss_game )
{
// set up the entity for the client
ent = EDICT_NUM( playernum+1 );
ent->s.number = playernum+1;
client->edict = ent;
if( sv_pure->integer )
sv_bitflags |= SV_BITFLAGS_PURE;
if( client->reliable )
sv_bitflags |= SV_BITFLAGS_RELIABLE;
if( SV_Web_Running() )
{
const char *baseurl = SV_Web_UpstreamBaseUrl();
sv_bitflags |= SV_BITFLAGS_HTTP;
if( baseurl[0] )
sv_bitflags |= SV_BITFLAGS_HTTP_BASEURL;
}
MSG_WriteByte( &tmpMessage, sv_bitflags );
}
if( sv_bitflags & SV_BITFLAGS_HTTP )
{
if( sv_bitflags & SV_BITFLAGS_HTTP_BASEURL )
MSG_WriteString( &tmpMessage, sv_http_upstream_baseurl->string );
else
MSG_WriteShort( &tmpMessage, sv_http_port->integer ); // HTTP port number
}
// always write purelist
numpure = Com_CountPureListFiles( svs.purelist );
if( numpure > (short)0x7fff )
Com_Error( ERR_DROP, "Error: Too many pure files." );
MSG_WriteShort( &tmpMessage, numpure );
purefile = svs.purelist;
while( purefile )
{
MSG_WriteString( &tmpMessage, purefile->filename );
MSG_WriteLong( &tmpMessage, purefile->checksum );
purefile = purefile->next;
}
SV_ClientResetCommandBuffers( client );
SV_SendMessageToClient( client, &tmpMessage );
Netchan_PushAllFragments( &client->netchan );
// don't let it send reliable commands until we get the first configstring request
client->state = CS_CONNECTING;
}
开发者ID:codetwister,项目名称:qfusion,代码行数:99,代码来源:sv_client.c
示例11: PC_SetSummonsInfo
void CHelperManager_Encoder::SendMessage_RequestSummons(playerCharacter_t* pHelper,char* toName)
{
int idx=GTH_FindPCByName(toName);
if (0 <= idx)
{
playerCharacter_t* pTaker=gcpTools->GetPlayerRecordPointer(idx);
if(NULL == pTaker) return;
if( (playerCharacter_t::tagGonryunBattlePractice::MEMBERSHIP_LEADER
== pTaker->GonryunBattlePractice.MemberShip) ||
(playerCharacter_t::tagGonryunBattlePractice::MEMBERSHIP_OPENENT
== pTaker->GonryunBattlePractice.MemberShip)) return;
if((pTaker->worldIdx == tagGolryunBattle::Golryun_Battle_Map_Index) ||
(pTaker->worldIdx == DAN_BATTLEMAP_NO)) return;
if(BUSY_STATE_NONE != pTaker->busyState) return;
PC_SetSummonsInfo(pTaker, pHelper->name, pHelper->worldIdx, pHelper->position);
MSG_BeginWriting(&netMessage);
MSG_Clear( &netMessage );
{
MSG_WriteByte(&netMessage, EXTEND_SECOND);
MSG_WriteShort ( &netMessage, HELPER_SYSTEM );
MSG_WriteShort(&netMessage, SC_SPAWN_Req_toTaker);
MSG_WriteString(&netMessage, pHelper->name);
NET_SendMessage(&pTaker->sock, &netMessage);
}
MSG_EndWriting(&netMessage);
}
else
{
MSG_BeginWriting(&netMessage);
MSG_Clear( &netMessage );
{
MSG_WriteByte(&netMessage, EXTEND_SECOND);
MSG_WriteShort ( &netMessage, HELPER_SYSTEM );
MSG_WriteShort(&netMessage, SS_SPAWN_Req_fromServer);
MSG_WriteString(&netMessage, toName);
MSG_WriteString(&netMessage, pHelper->name);
MSG_WriteByte(&netMessage, pHelper->worldIdx);
MSG_WritePosition(&netMessage, pHelper->position);
if ( TRUE == g_config.isManager )
{
for (int serveridx=1; serveridx < MAX_MEMBER_SERVER; serveridx++)
{
if ( !g_memberServer[serveridx].active ) continue;
NET_SendUnreliableMessage(&g_memberServer[serveridx].sock, &netMessage);
}
}
else
{
MSG_WriteByte(&netMessage, g_config.gameServerNo);
NET_SendUnreliableMessage(&localSocket, &netMessage);
}
}
MSG_EndWriting(&netMessage);
}
}
开发者ID:gthgame,项目名称:gth,代码行数:69,代码来源:CHelperManager_Encoder.cpp
示例12: CL_WritePacket
/*
===================
CL_WritePacket
Create and send the command packet to the server
Including both the reliable commands and the usercmds
During normal gameplay, a client packet will contain something like:
4 sequence number
2 qport
4 serverid
4 acknowledged sequence number
4 clc.serverCommandSequence
<optional reliable commands>
1 clc_move or clc_moveNoDelta
1 command count
<count * usercmds>
===================
*/
void CL_WritePacket( void ) {
msg_t buf;
byte data[MAX_MSGLEN];
int i, j;
usercmd_t *cmd, *oldcmd;
usercmd_t nullcmd;
int packetNum;
int oldPacketNum;
int count, key;
// don't send anything if playing back a demo
if ( clc.demoplaying || cls.state == CA_CINEMATIC ) {
return;
}
Com_Memset( &nullcmd, 0, sizeof(nullcmd) );
oldcmd = &nullcmd;
MSG_Init( &buf, data, sizeof(data) );
MSG_Bitstream( &buf );
// write the current serverId so the server
// can tell if this is from the current gameState
MSG_WriteLong( &buf, cl.serverId );
// write the last message we received, which can
// be used for delta compression, and is also used
// to tell if we dropped a gamestate
MSG_WriteLong( &buf, clc.serverMessageSequence );
// write the last reliable message we received
MSG_WriteLong( &buf, clc.serverCommandSequence );
// write any unacknowledged clientCommands
for ( i = clc.reliableAcknowledge + 1 ; i <= clc.reliableSequence ; i++ ) {
MSG_WriteByte( &buf, clc_clientCommand );
MSG_WriteLong( &buf, i );
MSG_WriteString( &buf, clc.reliableCommands[ i & (MAX_RELIABLE_COMMANDS-1) ] );
}
// we want to send all the usercmds that were generated in the last
// few packet, so even if a couple packets are dropped in a row,
// all the cmds will make it to the server
if ( cl_packetdup->integer < 0 ) {
Cvar_Set( "cl_packetdup", "0" );
} else if ( cl_packetdup->integer > 5 ) {
Cvar_Set( "cl_packetdup", "5" );
}
oldPacketNum = (clc.netchan.outgoingSequence - 1 - cl_packetdup->integer) & PACKET_MASK;
count = cl.cmdNumber - cl.outPackets[ oldPacketNum ].p_cmdNumber;
if ( count > MAX_PACKET_USERCMDS ) {
count = MAX_PACKET_USERCMDS;
Com_Printf("MAX_PACKET_USERCMDS\n");
}
if ( count >= 1 ) {
if ( cl_showSend->integer ) {
Com_Printf( "(%i)", count );
}
// begin a client move command
if ( cl_nodelta->integer || !cl.snap.valid
|| clc.demowaiting
|| clc.serverMessageSequence != cl.snap.messageNum ) {
MSG_WriteByte (&buf, clc_moveNoDelta);
} else {
MSG_WriteByte (&buf, clc_move);
}
// write the command count
MSG_WriteByte( &buf, count );
// use the checksum feed in the key
key = clc.checksumFeed;
// also use the message acknowledge
key ^= clc.serverMessageSequence;
// also use the last acknowledged server command in the key
key ^= Com_HashKey(clc.serverCommands[ clc.serverCommandSequence & (MAX_RELIABLE_COMMANDS-1) ], 32);
// write all the commands, including the predicted command
//.........这里部分代码省略.........
开发者ID:Almightygir,项目名称:OpenJK,代码行数:101,代码来源:cl_input.cpp
示例13: SV_NextDownload_f
/*
* SV_NextDownload_f
*
* Responds to reliable nextdl packet with unreliable download packet
* If nextdl packet's offet information is negative, download will be stopped
*/
static void SV_NextDownload_f( client_t *client )
{
int blocksize;
int offset;
if( !client->download.name )
{
Com_Printf( "nextdl message for client with no download active, from: %s\n", client->name );
return;
}
if( Q_stricmp( client->download.name, Cmd_Argv( 1 ) ) )
{
Com_Printf( "nextdl message for wrong filename, from: %s\n", client->name );
return;
}
offset = atoi( Cmd_Argv( 2 ) );
if( offset > client->download.size )
{
Com_Printf( "nextdl message with too big offset, from: %s\n", client->name );
return;
}
if( offset == -1 )
{
Com_Printf( "Upload of %s to %s%s completed\n", client->download.name, client->name, S_COLOR_WHITE );
if( client->download.data )
{
FS_FreeBaseFile( client->download.data );
client->download.data = NULL;
}
Mem_ZoneFree( client->download.name );
client->download.name = NULL;
client->download.size = 0;
client->download.timeout = 0;
return;
}
if( offset < 0 )
{
Com_Printf( "Upload of %s to %s%s failed\n", client->download.name, client->name, S_COLOR_WHITE );
if( client->download.data )
{
FS_FreeBaseFile( client->download.data );
client->download.data = NULL;
}
Mem_ZoneFree( client->download.name );
client->download.name = NULL;
client->download.size = 0;
client->download.timeout = 0;
return;
}
if( !client->download.data )
{
Com_Printf( "Starting server upload of %s to %s\n", client->download.name, client->name );
FS_LoadBaseFile( client->download.name, (void **)&client->download.data, NULL, 0 );
if( !client->download.data )
{
Com_Printf( "Error loading %s for uploading\n", client->download.name );
Mem_ZoneFree( client->download.name );
client->download.name = NULL;
client->download.size = 0;
client->download.timeout = 0;
return;
}
}
SV_InitClientMessage( client, &tmpMessage, NULL, 0 );
SV_AddReliableCommandsToMessage( client, &tmpMessage );
blocksize = client->download.size - offset;
// jalfixme: adapt download to user rate setting and sv_maxrate setting.
if( blocksize > FRAGMENT_SIZE * 2 )
blocksize = FRAGMENT_SIZE * 2;
if( offset + blocksize > client->download.size )
blocksize = client->download.size - offset;
MSG_WriteByte( &tmpMessage, svc_download );
MSG_WriteString( &tmpMessage, client->download.name );
MSG_WriteLong( &tmpMessage, offset );
MSG_WriteLong( &tmpMessage, blocksize );
MSG_CopyData( &tmpMessage, client->download.data + offset, blocksize );
SV_SendMessageToClient( client, &tmpMessage );
client->download.timeout = svs.realtime + 10000;
}
开发者ID:codetwister,项目名称:qfusion,代码行数:96,代码来源:sv_client.c
示例14: CL_SendCmd
/*
=================
CL_SendCmd
=================
*/
void CL_SendCmd (void)
{
sizebuf_t buf;
byte data[128];
int i;
usercmd_t *cmd, *oldcmd;
usercmd_t nullcmd;
int checksumIndex;
// clear buffer
memset (&buf, 0, sizeof(buf));
// build a command even if not connected
// save this command off for prediction
i = cls.netchan.outgoing_sequence & (CMD_BACKUP-1);
cmd = &cl.cmds[i];
cl.cmd_time[i] = cls.realtime; // for netgraph ping calculation
*cmd = CL_CreateCmd ();
cl.cmd = *cmd;
if (cls.state == ca_disconnected || cls.state == ca_connecting)
return;
if (cls.state == ca_connected)
{
if (cls.netchan.message.cursize || curtime - cls.netchan.last_sent > 1000 )
Netchan_Transmit (&cls.netchan, 0, buf.data);
return;
}
// send a userinfo update if needed
if (userinfo_modified)
{
CL_FixUpGender();
userinfo_modified = false;
MSG_WriteByte (&cls.netchan.message, clc_userinfo);
MSG_WriteString (&cls.netchan.message, Cvar_Userinfo() );
}
SZ_Init (&buf, data, sizeof(data));
// Knightmare- removed this, put ESC-only substitute in keys.c
/*if (cmd->buttons && cl.cinematictime > 0 && !cl.attractloop
&& cls.realtime - cl.cinematictime > 1000)
{ // skip the rest of the cinematic
SCR_FinishCinematic ();
}*/
// begin a client move command
MSG_WriteByte (&buf, clc_move);
// save the position for a checksum byte
checksumIndex = buf.cursize;
MSG_WriteByte (&buf, 0);
// let the server know what the last frame we
// got was, so the next message can be delta compressed
if (cl_nodelta->value || !cl.frame.valid || cls.demowaiting)
MSG_WriteLong (&buf, -1); // no compression
else
MSG_WriteLong (&buf, cl.frame.serverframe);
// send this and the previous cmds in the message, so
// if the last packet was dropped, it can be recovered
i = (cls.netchan.outgoing_sequence-2) & (CMD_BACKUP-1);
cmd = &cl.cmds[i];
memset (&nullcmd, 0, sizeof(nullcmd));
MSG_WriteDeltaUsercmd (&buf, &nullcmd, cmd);
oldcmd = cmd;
i = (cls.netchan.outgoing_sequence-1) & (CMD_BACKUP-1);
cmd = &cl.cmds[i];
MSG_WriteDeltaUsercmd (&buf, oldcmd, cmd);
oldcmd = cmd;
i = (cls.netchan.outgoing_sequence) & (CMD_BACKUP-1);
cmd = &cl.cmds[i];
MSG_WriteDeltaUsercmd (&buf, oldcmd, cmd);
// calculate a checksum over the move commands
buf.data[checksumIndex] = COM_BlockSequenceCRCByte(
buf.data + checksumIndex + 1, buf.cursize - checksumIndex - 1,
cls.netchan.outgoing_sequence);
//
// deliver the message
//
Netchan_Transmit (&cls.netchan, buf.cursize, buf.data);
}
开发者ID:n1ckn4m3,项目名称:kmquake2megacoop,代码行数:97,代码来源:cl_input.c
示例15: SV_ServerRecord_f
/*
==============
SV_ServerRecord_f
Begins server demo recording. Every entity and every message will be
recorded, but no playerinfo will be stored. Primarily for demo merging.
==============
*/
static void SV_ServerRecord_f (void)
{
char name[MAX_OSPATH];
byte buf_data[32768];
sizebuf_t buf;
int len;
int i;
size_t size;
if (Cmd_Argc() != 2) {
Com_Printf ("serverrecord <demoname>\n");
return;
}
if (svs.demofile) {
Com_Printf ("Already recording.\n");
return;
}
if (sv.state != ss_game) {
Com_Printf ("You must be in a level to record.\n");
return;
}
//
// open the demo file
//
Com_sprintf (name, sizeof(name), "%s/demos/%s.dm2", FS_Gamedir(), Cmd_Argv(1));
FS_CreatePath(name);
svs.demofile = fopen (name, "wb");
if (!svs.demofile) {
Com_Printf ("ERROR: couldn't open.\n");
return;
}
Com_Printf ("recording to %s.\n", name);
// setup a buffer to catch all multicasts
SZ_Init (&svs.demo_multicast, svs.demo_multicast_buf, sizeof(svs.demo_multicast_buf));
//
// write a single giant fake message with all the startup info
//
SZ_Init (&buf, buf_data, sizeof(buf_data));
//
// serverdata needs to go over for all types of servers
// to make sure the protocol is right, and to set the gamedir
//
// send the serverdata
MSG_WriteByte (&buf, svc_serverdata);
MSG_WriteLong (&buf, PROTOCOL_VERSION_DEFAULT);
MSG_WriteLong (&buf, svs.spawncount);
// 2 means server demo
MSG_WriteByte (&buf, 2); // demos are always attract loops
MSG_WriteString (&buf, Cvar_VariableString ("gamedir"));
MSG_WriteShort (&buf, -1);
// send full levelname
MSG_WriteString (&buf, sv.configstrings[CS_NAME]);
for (i=0 ; i<MAX_CONFIGSTRINGS ; i++)
if (sv.configstrings[i][0])
{
MSG_WriteByte (&buf, svc_configstring);
MSG_WriteShort (&buf, i);
MSG_WriteString (&buf, sv.configstrings[i]);
}
// write it to the demo file
Com_DPrintf ("signon message length: %i\n", buf.cursize);
len = LittleLong (buf.cursize);
size = fwrite (&len, 4, 1, svs.demofile);
size = fwrite (buf.data, buf.cursize, 1, svs.demofile);
// the rest of the demo file will be individual frames
}
开发者ID:mattx86,项目名称:aprq2,代码行数:85,代码来源:sv_ccmds.c
示例16: CL_WritePacket
/*
===================
CL_WritePacket
Create and send the command packet to the server
Including both the reliable commands and the usercmds
During normal gameplay, a client packet will contain something like:
4 sequence number
2 qport
4 serverid
4 acknowledged sequence number
4 clc.serverCommandSequence
<optional reliable commands>
1 clc_move or clc_moveNoDelta
1 command count
<count * usercmds>
===================
*/
void CL_WritePacket( void ) {
msg_t buf;
byte data[MAX_MSGLEN];
int i, j;
usercmd_t *cmd, *oldcmd;
usercmd_t nullcmd;
int packetNum;
int oldPacketNum;
int count, key;
// don't send anything if playing back a demo
if ( clc.demoplaying || clc.state == CA_CINEMATIC ) {
return;
}
Com_Memset( &nullcmd, 0, sizeof(nullcmd) );
oldcmd = &nullcmd;
MSG_Init( &buf, data, sizeof(data) );
MSG_Bitstream( &buf );
// write the current serverId so the server
// can tell if this is from the current gameState
MSG_WriteLong( &buf, cl.serverId );
// write the last message we received, which can
// be used for delta compression, and is also used
// to tell if we dropped a gamestate
MSG_WriteLong( &buf, clc.serverMessageSequence );
// write the last reliable message we received
MSG_WriteLong( &buf, clc.serverCommandSequence );
// write any unacknowledged clientCommands
for ( i = clc.reliableAcknowledge + 1 ; i <= clc.reliableSequence ; i++ ) {
MSG_WriteByte( &buf, clc_clientCommand );
MSG_WriteLong( &buf, i );
MSG_WriteString( &buf, clc.reliableCommands[ i & (MAX_RELIABLE_COMMANDS-1) ] );
}
// we want to send all the usercmds that were generated in the last
// few packet, so even if a couple packets are dropped in a row,
// all the cmds will make it to the server
if ( cl_packetdup->integer < 0 ) {
Cvar_Set( "cl_packetdup", "0" );
} else if ( cl_packetdup->integer > 5 ) {
Cvar_Set( "cl_packetdup", "5" );
}
oldPacketNum = (clc.netchan.outgoingSequence - 1 - cl_packetdup->integer) & PACKET_MASK;
count = cl.cmdNumber - cl.outPackets[ oldPacketNum ].p_cmdNumber;
if ( count > MAX_PACKET_USERCMDS ) {
count = MAX_PACKET_USERCMDS;
Com_Printf("MAX_PACKET_USERCMDS\n");
}
#ifdef USE_VOIP
if (clc.voipOutgoingDataSize > 0)
{
if((clc.voipFlags & VOIP_SPATIAL) || Com_IsVoipTarget(clc.voipTargets, sizeof(clc.voipTargets), -1))
{
MSG_WriteByte (&buf, clc_voip);
MSG_WriteByte (&buf, clc.voipOutgoingGeneration);
MSG_WriteLong (&buf, clc.voipOutgoingSequence);
MSG_WriteByte (&buf, clc.voipOutgoingDataFrames);
MSG_WriteData (&buf, clc.voipTargets, sizeof(clc.voipTargets));
MSG_WriteByte(&buf, clc.voipFlags);
MSG_WriteShort (&buf, clc.voipOutgoingDataSize);
MSG_WriteData (&buf, clc.voipOutgoingData, clc.voipOutgoingDataSize);
// If we're recording a demo, we have to fake a server packet with
// this VoIP data so it gets to disk; the server doesn't send it
// back to us, and we might as well eliminate concerns about dropped
// and misordered packets here.
if(clc.demorecording && !clc.demowaiting)
{
const int voipSize = clc.voipOutgoingDataSize;
msg_t fakemsg;
byte fakedata[MAX_MSGLEN];
MSG_Init (&fakemsg, fakedata, sizeof (fakedata));
//.........这里部分代码省略.........
开发者ID:qrealka,项目名称:ioq3,代码行数:101,代码来源:cl_input.c
示例17: CL_QueueHTTPDownload
/*
===============
CL_QueueHTTPDownload
Called from the precache check to queue a download. Return value of
false will cause standard UDP downloading to be used instead.
===============
*/
qboolean CL_QueueHTTPDownload (const char *quakePath)
{
size_t len;
dlqueue_t *q;
qboolean needList;
// no http server (or we got booted)
if (!cls.downloadServer[0] || abortDownloads || thisMapAbort || !cl_http_downloads->value)
return false;
needList = false;
// first download queued, so we want the mod filelist
if (!cls.downloadQueue.next && cl_http_filelists->value)
needList = true;
q = &cls.downloadQueue;
while (q->next)
{
q = q->next;
//avoid sending duplicate requests
if (!strcmp (quakePath, q->quakePath))
return true;
}
// q->next = Z_TagMalloc (sizeof(*q), TAGMALLOC_CLIENT_DOWNLOAD);
q->next = Z_TagMalloc (sizeof(*q), 0);
q = q->next;
q->next = NULL;
q->state = DLQ_STATE_NOT_STARTED;
Q_strncpyz (q->quakePath, quakePath, sizeof(q->quakePath)-1);
if (needList)
{
//grab the filelist
CL_QueueHTTPDownload (va("%s.filelist", cl.gamedir));
//this is a nasty hack to let the server know what we're doing so admins don't
//get confused by a ton of people stuck in CNCT state. it's assumed the server
//is running r1q2 if we're even able to do http downloading so hopefully this
//won't spew an error msg.
// MSG_BeginWriting (clc_stringcmd);
// MSG_WriteString ("download http\n");
// MSG_EndWriting (&cls.netchan.message);
MSG_WriteByte (&cls.netchan.message, clc_stringcmd);
MSG_WriteString (&cls.netchan.message, "download http\n");
}
//special case for map file lists, i really wanted a server-push mechanism for this, but oh well
len = strlen (quakePath);
if (cl_http_filelists->value && len > 4 && !Q_stricmp ((char *)(quakePath + len - 4), ".bsp"))
{
char listPath[MAX_OSPATH];
char filePath[MAX_OSPATH];
Com_sprintf (filePath, sizeof(filePath), "%s/%s", cl.gamedir, quakePath);
COM_StripExtension (filePath, listPath);
// strncat (listPath, ".filelist");
Q_strncatz (listPath, ".filelist", sizeof(listPath));
CL_QueueHTTPDownload (listPath);
}
//if a download entry has made it this far, CL_FinishHTTPDownload is guaranteed to be called.
pendingCount++;
return true;
}
开发者ID:Kiln707,项目名称:KMQuake2,代码行数:80,代码来源:cl_http.c
示例18: SV_SendServerInfo
//
// SV_SendServerInfo
//
// Sends server info to a launcher
// TODO: Clean up and reinvent.
void SV_SendServerInfo()
{
size_t i;
SZ_Clear(&ml_message);
MSG_WriteLong(&ml_message, CHALLENGE);
MSG_WriteLong(&ml_message, SV_NewToken());
// if master wants a key to be presented, present it we will
if(MSG_BytesLeft() == 4)
MSG_WriteLong(&ml_message, MSG_ReadLong());
MSG_WriteString(&ml_message, (char *)hostname.cstring());
byte playersingame = 0;
for (i = 0; i < players.size(); ++i)
{
if (players[i].ingame())
playersingame++;
}
MSG_WriteByte(&ml_message, playersingame);
MSG_WriteByte(&ml_message, maxclients);
MSG_WriteString(&ml_message, level.mapname);
size_t numwads = wadnames.size();
if(numwads > 0xff)numwads = 0xff;
MSG_WriteByte(&ml_message, numwads - 1);
for (i = 1; i < numwads; ++i)
MSG_WriteString(&ml_message, wadnames[i].c_str());
MSG_WriteByte(&ml_message, (int)deathmatch);
MSG_WriteByte(&ml_message, (int)skill);
MSG_WriteByte(&ml_message, (int)teamplay);
MSG_WriteByte(&ml_message, (int)ctfmode);
for (i = 0; i < players.size(); ++i)
{
if (players[i].ingame())
{
MSG_WriteString(&ml_message, players[i].userinfo.netname);
MSG_WriteShort(&ml_message, players[i].fragcount);
MSG_WriteLong(&ml_message, players[i].ping);
if (teamplay || ctfmode)
MSG_WriteByte(&ml_message, players[i].userinfo.team);
else
MSG_WriteByte(&ml_message, TEAM_NONE);
}
}
for (i = 1; i < numwads; ++i)
MSG_WriteString(&ml_message, wadhashes[i].c_str());
MSG_WriteString(&ml_message, website.cstring());
if (ctfmode || teamplay)
{
MSG_WriteLong(&ml_message, scorelimit);
for(size_t i = 0; i < NUMTEAMS; i++)
{
MSG_WriteByte(&ml_message, TEAMenabled[i]);
if (TEAMenabled[i])
MSG_WriteLong(&ml_message, TEAMpoints[i]);
}
}
MSG_WriteShort(&ml_message, VERSION);
//bond===========================
MSG_WriteString(&ml_message, (char *)email.cstring());
int timeleft = (int)(timelimit - level.time/(TICRATE*60));
if (timeleft<0) timeleft=0;
MSG_WriteShort(&ml_message,(int)timelimit);
MSG_WriteShort(&ml_message,timeleft);
MSG_WriteShort(&ml_message,(int)fraglimit);
MSG_WriteByte(&ml_message,(BOOL)itemsrespawn);
MSG_WriteByte(&ml_message,(BOOL)weaponstay);
MSG_WriteByte(&ml_message,(BOOL)friendlyfire);
MSG_WriteByte(&ml_message,(BOOL)allowexit);
MSG_WriteByte(&ml_message,(BOOL)infiniteammo);
MSG_WriteByte(&ml_message,(BOOL)nomonsters);
MSG_WriteByte(&ml_message,(BOOL)monstersrespawn);
MSG_WriteByte(&ml_message,(BOOL)fastmonsters);
MSG_WriteByte(&ml_message,(BOOL)allowjump);
MSG_WriteByte(&ml_message,(BOOL)allowfreelook);
//.........这里部分代码省略.........
开发者ID:JohnnyonFlame,项目名称:odamex,代码行数:101,代码来源:sv_master.cpp
示例19: CL_Record_f
/*
====================
CL_Record_f
record <demoname>
Begins recording a demo from the current position
====================
*/
void CL_Record_f (void)
{
char name[MAX_OSPATH];
char buf_data[MAX_MSGLEN];
sizebuf_t buf;
int i;
int len;
entity_state_t *ent;
entity_state_t nullstate;
if (Cmd_Argc() != 2)
{
Com_Printf ("record <demoname>\n");
return;
}
if (cls.demorecording)
{
Com_Printf ("Already recording.\n");
return;
}
if (cls.state != ca_active)
{
Com_Printf ("You must be in a level to record.\n");
return;
}
//
// open the demo file
//
Com_sprintf (name, sizeof(name), "%s/demos/%s.dm2", FS_Gamedir(), Cmd_Argv(1));
Com_Printf ("recording to %s.\n", name);
FS_CreatePath (name);
cls.demofile = fopen (name, "wb");
if (!cls.demofile)
{
Com_Printf ("ERROR: couldn't open.\n");
return;
}
cls.demorecording = true;
// don't start saving messages until a non-delta compressed message is received
cls.demowaiting = true;
//
// write out messages to hold the startup information
//
SZ_Init (&buf, buf_data, sizeof(buf_data));
// send the serverdata
MSG_WriteByte (&buf, svc_serverdata);
MSG_WriteLong (&buf, PROTOCOL_VERSION);
MSG_WriteLong (&buf, 0x10000 + cl.servercount);
MSG_WriteByte (&buf, 1); // demos are always attract loops
MSG_WriteString (&buf, cl.gamedir);
MSG_WriteShort (&buf, cl.playernum);
MSG_WriteString (&buf, cl.configstrings[CS_NAME]);
// configstrings
for (i=0 ; i<MAX_CONFIGSTRINGS ; i++)
{
if (cl.configstrings[i][0])
{
if (buf.cursize + strlen (cl.configstrings[i]) + 32 > buf.maxsize)
{ // write it out
len = LittleLong (buf.cursize);
fwrite (&len, 4, 1, cls.demofile);
fwrite (buf.data, buf.cursize, 1, cls.demofile);
buf.cursize = 0;
}
MSG_WriteByte (&buf, svc_configstring);
MSG_WriteShort (&buf, i);
MSG_WriteString (&buf, cl.configstrings[i]);
}
}
// baselines
memset (&nullstate, 0, sizeof(nullstate));
for (i=0; i<MAX_EDICTS ; i++)
{
ent = &cl_entities[i].baseline;
if (!ent->modelindex)
continue;
if (buf.cursize + 64 > buf.maxsize)
{ // write it out
//.........这里部分代码省略.........
开发者ID:jacqueskrige,项目名称:uqe-quake2,代码行数:101,代码来源:cl_main.c
|
请发表评论