示例#1
0
/*
* TV_Relay_BuildClientFrameSnap
*/
void TV_Relay_BuildClientFrameSnap( relay_t *relay, client_t *client ) {
	edict_t *clent;
	entity_state_t backup_state = { 0 };
	entity_shared_t backup_shared = { 0 };

	// pretend client occupies our slot on real server
	clent = client->edict;
	if( relay->playernum >= 0 ) {
		client->edict = EDICT_NUM( relay, relay->playernum + 1 );

		backup_state = client->edict->s;
		client->edict->s = clent->s;
		client->edict->s.number = relay->playernum + 1;

		backup_shared = client->edict->r;
		client->edict->r = clent->r;
		if( client->mv ) {
			client->edict->r.client->ps.POVnum = relay->playernum + 1;
		}
	} else {
		if( client->mv ) {
			client->edict = NULL;
		} else {
			assert( client->edict != NULL );
			if( !client->edict ) {
				return;
			}
		}
	}

	SNAP_BuildClientFrameSnap( relay->cms, &relay->gi, relay->framenum, relay->realtime,
							   client, relay->module_export->GetGameState( relay->module ),
							   &relay->client_entities,
							   true, tv_mempool );

	if( relay->playernum >= 0 ) {
		client->edict->s = backup_state;
		client->edict->r = backup_shared;
	}
	client->edict = clent;
}
示例#2
0
/*
* SV_BuildClientFrameSnap
*/
void SV_BuildClientFrameSnap( client_t *client )
{
	vec_t *skyorg = NULL, origin[3];

	if( sv.configstrings[CS_SKYBOX][0] != '\0' )
	{
		int noents = 0;
		float f1 = 0, f2 = 0;

		if( sscanf( sv.configstrings[CS_SKYBOX], "%f %f %f %f %f %i", &origin[0], &origin[1], &origin[2], &f1, &f2, &noents ) >= 3 )
		{
			if( !noents )
				skyorg = origin;
		}
	}

	svs.fatvis.skyorg = skyorg;		// HACK HACK HACK
	SNAP_BuildClientFrameSnap( svs.cms, &sv.gi, sv.framenum, svs.gametime,
		&svs.fatvis, client, ge->GetGameState(), 
		&svs.client_entities,
		false, sv_mempool );
	svs.fatvis.skyorg = NULL;
}
示例#3
0
/*
* TV_Relay_BuildClientFrameSnap
*/
void TV_Relay_BuildClientFrameSnap( relay_t *relay, client_t *client )
{
	edict_t *clent;
	entity_state_t backup_state = { 0 };
	entity_shared_t backup_shared = { 0 };
	vec_t *skyorg = NULL, origin[3];

	if( relay->configstrings[CS_SKYBOX][0] != '\0' )
	{
		int noents = 0;
		float f1 = 0, f2 = 0;

		if( sscanf( relay->configstrings[CS_SKYBOX], "%f %f %f %f %f %i", &origin[0], &origin[1], &origin[2], &f1, &f2, &noents ) >= 3 )
		{
			if( !noents )
				skyorg = origin;
		}
	}

	// pretend client occupies our slot on real server
	clent = client->edict;
	if( relay->playernum >= 0 )
	{
		client->edict = EDICT_NUM( relay, relay->playernum + 1 );

		backup_state = client->edict->s;
		client->edict->s = clent->s;
		client->edict->s.number = relay->playernum + 1;

		backup_shared = client->edict->r;
		client->edict->r = clent->r;
		if( client->mv )
			client->edict->r.client->ps.POVnum = relay->playernum + 1;
	}
	else
	{
		if( client->mv )
		{
			client->edict = NULL;
		}
		else
		{
			assert( client->edict != NULL );
			if( !client->edict )
				return;
		}
	}

	relay->fatvis.skyorg = skyorg;		// HACK HACK HACK
	SNAP_BuildClientFrameSnap( relay->cms, &relay->gi, relay->framenum, relay->realtime, &relay->fatvis,
		client, relay->module_export->GetGameState( relay->module ),
		&relay->client_entities,
		qtrue, tv_mempool );

	if( relay->playernum >= 0 )
	{
		client->edict->s = backup_state;
		client->edict->r = backup_shared;
	}
	client->edict = clent;
}