Home | History | Annotate | Download | only in server
      1 /*
      2 Copyright (C) 1996-1997 Id Software, Inc.
      3 
      4 This program is free software; you can redistribute it and/or
      5 modify it under the terms of the GNU General Public License
      6 as published by the Free Software Foundation; either version 2
      7 of the License, or (at your option) any later version.
      8 
      9 This program is distributed in the hope that it will be useful,
     10 but WITHOUT ANY WARRANTY; without even the implied warranty of
     11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     12 
     13 See the GNU General Public License for more details.
     14 
     15 You should have received a copy of the GNU General Public License
     16 along with this program; if not, write to the Free Software
     17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
     18 
     19 */
     20 
     21 #include "qwsvdef.h"
     22 
     23 /*
     24 =============================================================================
     25 
     26 The PVS must include a small area around the client to allow head bobbing
     27 or other small motion on the client side.  Otherwise, a bob might cause an
     28 entity that should be visible to not show up, especially when the bob
     29 crosses a waterline.
     30 
     31 =============================================================================
     32 */
     33 
     34 int		fatbytes;
     35 byte	fatpvs[MAX_MAP_LEAFS/8];
     36 
     37 void SV_AddToFatPVS (vec3_t org, mnode_t *node)
     38 {
     39 	int		i;
     40 	byte	*pvs;
     41 	mplane_t	*plane;
     42 	float	d;
     43 
     44 	while (1)
     45 	{
     46 	// if this is a leaf, accumulate the pvs bits
     47 		if (node->contents < 0)
     48 		{
     49 			if (node->contents != CONTENTS_SOLID)
     50 			{
     51 				pvs = Mod_LeafPVS ( (mleaf_t *)node, sv.worldmodel);
     52 				for (i=0 ; i<fatbytes ; i++)
     53 					fatpvs[i] |= pvs[i];
     54 			}
     55 			return;
     56 		}
     57 
     58 		plane = node->plane;
     59 		d = DotProduct (org, plane->normal) - plane->dist;
     60 		if (d > 8)
     61 			node = node->children[0];
     62 		else if (d < -8)
     63 			node = node->children[1];
     64 		else
     65 		{	// go down both
     66 			SV_AddToFatPVS (org, node->children[0]);
     67 			node = node->children[1];
     68 		}
     69 	}
     70 }
     71 
     72 /*
     73 =============
     74 SV_FatPVS
     75 
     76 Calculates a PVS that is the inclusive or of all leafs within 8 pixels of the
     77 given point.
     78 =============
     79 */
     80 byte *SV_FatPVS (vec3_t org)
     81 {
     82 	fatbytes = (sv.worldmodel->numleafs+31)>>3;
     83 	Q_memset (fatpvs, 0, fatbytes);
     84 	SV_AddToFatPVS (org, sv.worldmodel->nodes);
     85 	return fatpvs;
     86 }
     87 
     88 //=============================================================================
     89 
     90 // because there can be a lot of nails, there is a special
     91 // network protocol for them
     92 #define	MAX_NAILS	32
     93 edict_t	*nails[MAX_NAILS];
     94 int		numnails;
     95 
     96 extern	int	sv_nailmodel, sv_supernailmodel, sv_playermodel;
     97 
     98 qboolean SV_AddNailUpdate (edict_t *ent)
     99 {
    100 	if (ent->v.modelindex != sv_nailmodel
    101 		&& ent->v.modelindex != sv_supernailmodel)
    102 		return false;
    103 	if (numnails == MAX_NAILS)
    104 		return true;
    105 	nails[numnails] = ent;
    106 	numnails++;
    107 	return true;
    108 }
    109 
    110 void SV_EmitNailUpdate (sizebuf_t *msg)
    111 {
    112 	byte	bits[6];	// [48 bits] xyzpy 12 12 12 4 8
    113 	int		n, i;
    114 	edict_t	*ent;
    115 	int		x, y, z, p, yaw;
    116 
    117 	if (!numnails)
    118 		return;
    119 
    120 	MSG_WriteByte (msg, svc_nails);
    121 	MSG_WriteByte (msg, numnails);
    122 
    123 	for (n=0 ; n<numnails ; n++)
    124 	{
    125 		ent = nails[n];
    126 		x = (int)(ent->v.origin[0]+4096)>>1;
    127 		y = (int)(ent->v.origin[1]+4096)>>1;
    128 		z = (int)(ent->v.origin[2]+4096)>>1;
    129 		p = (int)(16*ent->v.angles[0]/360)&15;
    130 		yaw = (int)(256*ent->v.angles[1]/360)&255;
    131 
    132 		bits[0] = x;
    133 		bits[1] = (x>>8) | (y<<4);
    134 		bits[2] = (y>>4);
    135 		bits[3] = z;
    136 		bits[4] = (z>>8) | (p<<4);
    137 		bits[5] = yaw;
    138 
    139 		for (i=0 ; i<6 ; i++)
    140 			MSG_WriteByte (msg, bits[i]);
    141 	}
    142 }
    143 
    144 //=============================================================================
    145 
    146 
    147 /*
    148 ==================
    149 SV_WriteDelta
    150 
    151 Writes part of a packetentities message.
    152 Can delta from either a baseline or a previous packet_entity
    153 ==================
    154 */
    155 void SV_WriteDelta (entity_state_t *from, entity_state_t *to, sizebuf_t *msg, qboolean force)
    156 {
    157 	int		bits;
    158 	int		i;
    159 	float	miss;
    160 
    161 // send an update
    162 	bits = 0;
    163 
    164 	for (i=0 ; i<3 ; i++)
    165 	{
    166 		miss = to->origin[i] - from->origin[i];
    167 		if ( miss < -0.1 || miss > 0.1 )
    168 			bits |= U_ORIGIN1<<i;
    169 	}
    170 
    171 	if ( to->angles[0] != from->angles[0] )
    172 		bits |= U_ANGLE1;
    173 
    174 	if ( to->angles[1] != from->angles[1] )
    175 		bits |= U_ANGLE2;
    176 
    177 	if ( to->angles[2] != from->angles[2] )
    178 		bits |= U_ANGLE3;
    179 
    180 	if ( to->colormap != from->colormap )
    181 		bits |= U_COLORMAP;
    182 
    183 	if ( to->skinnum != from->skinnum )
    184 		bits |= U_SKIN;
    185 
    186 	if ( to->frame != from->frame )
    187 		bits |= U_FRAME;
    188 
    189 	if ( to->effects != from->effects )
    190 		bits |= U_EFFECTS;
    191 
    192 	if ( to->modelindex != from->modelindex )
    193 		bits |= U_MODEL;
    194 
    195 	if (bits & 511)
    196 		bits |= U_MOREBITS;
    197 
    198 	if (to->flags & U_SOLID)
    199 		bits |= U_SOLID;
    200 
    201 	//
    202 	// write the message
    203 	//
    204 	if (!to->number)
    205 		SV_Error ("Unset entity number");
    206 	if (to->number >= 512)
    207 		SV_Error ("Entity number >= 512");
    208 
    209 	if (!bits && !force)
    210 		return;		// nothing to send!
    211 	i = to->number | (bits&~511);
    212 	if (i & U_REMOVE)
    213 		Sys_Error ("U_REMOVE");
    214 	MSG_WriteShort (msg, i);
    215 
    216 	if (bits & U_MOREBITS)
    217 		MSG_WriteByte (msg, bits&255);
    218 	if (bits & U_MODEL)
    219 		MSG_WriteByte (msg,	to->modelindex);
    220 	if (bits & U_FRAME)
    221 		MSG_WriteByte (msg, to->frame);
    222 	if (bits & U_COLORMAP)
    223 		MSG_WriteByte (msg, to->colormap);
    224 	if (bits & U_SKIN)
    225 		MSG_WriteByte (msg, to->skinnum);
    226 	if (bits & U_EFFECTS)
    227 		MSG_WriteByte (msg, to->effects);
    228 	if (bits & U_ORIGIN1)
    229 		MSG_WriteCoord (msg, to->origin[0]);
    230 	if (bits & U_ANGLE1)
    231 		MSG_WriteAngle(msg, to->angles[0]);
    232 	if (bits & U_ORIGIN2)
    233 		MSG_WriteCoord (msg, to->origin[1]);
    234 	if (bits & U_ANGLE2)
    235 		MSG_WriteAngle(msg, to->angles[1]);
    236 	if (bits & U_ORIGIN3)
    237 		MSG_WriteCoord (msg, to->origin[2]);
    238 	if (bits & U_ANGLE3)
    239 		MSG_WriteAngle(msg, to->angles[2]);
    240 }
    241 
    242 /*
    243 =============
    244 SV_EmitPacketEntities
    245 
    246 Writes a delta update of a packet_entities_t to the message.
    247 
    248 =============
    249 */
    250 void SV_EmitPacketEntities (client_t *client, packet_entities_t *to, sizebuf_t *msg)
    251 {
    252 	edict_t	*ent;
    253 	client_frame_t	*fromframe;
    254 	packet_entities_t *from;
    255 	int		oldindex, newindex;
    256 	int		oldnum, newnum;
    257 	int		oldmax;
    258 
    259 	// this is the frame that we are going to delta update from
    260 	if (client->delta_sequence != -1)
    261 	{
    262 		fromframe = &client->frames[client->delta_sequence & UPDATE_MASK];
    263 		from = &fromframe->entities;
    264 		oldmax = from->num_entities;
    265 
    266 		MSG_WriteByte (msg, svc_deltapacketentities);
    267 		MSG_WriteByte (msg, client->delta_sequence);
    268 	}
    269 	else
    270 	{
    271 		oldmax = 0;	// no delta update
    272 		from = NULL;
    273 
    274 		MSG_WriteByte (msg, svc_packetentities);
    275 	}
    276 
    277 	newindex = 0;
    278 	oldindex = 0;
    279 //Con_Printf ("---%i to %i ----\n", client->delta_sequence & UPDATE_MASK
    280 //			, client->netchan.outgoing_sequence & UPDATE_MASK);
    281 	while (newindex < to->num_entities || oldindex < oldmax)
    282 	{
    283 		newnum = newindex >= to->num_entities ? 9999 : to->entities[newindex].number;
    284 		oldnum = oldindex >= oldmax ? 9999 : from->entities[oldindex].number;
    285 
    286 		if (newnum == oldnum)
    287 		{	// delta update from old position
    288 //Con_Printf ("delta %i\n", newnum);
    289 			SV_WriteDelta (&from->entities[oldindex], &to->entities[newindex], msg, false);
    290 			oldindex++;
    291 			newindex++;
    292 			continue;
    293 		}
    294 
    295 		if (newnum < oldnum)
    296 		{	// this is a new entity, send it from the baseline
    297 			ent = EDICT_NUM(newnum);
    298 //Con_Printf ("baseline %i\n", newnum);
    299 			SV_WriteDelta (&ent->baseline, &to->entities[newindex], msg, true);
    300 			newindex++;
    301 			continue;
    302 		}
    303 
    304 		if (newnum > oldnum)
    305 		{	// the old entity isn't present in the new message
    306 //Con_Printf ("remove %i\n", oldnum);
    307 			MSG_WriteShort (msg, oldnum | U_REMOVE);
    308 			oldindex++;
    309 			continue;
    310 		}
    311 	}
    312 
    313 	MSG_WriteShort (msg, 0);	// end of packetentities
    314 }
    315 
    316 /*
    317 =============
    318 SV_WritePlayersToClient
    319 
    320 =============
    321 */
    322 void SV_WritePlayersToClient (client_t *client, edict_t *clent, byte *pvs, sizebuf_t *msg)
    323 {
    324 	int			i, j;
    325 	client_t	*cl;
    326 	edict_t		*ent;
    327 	int			msec;
    328 	usercmd_t	cmd;
    329 	int			pflags;
    330 
    331 	for (j=0,cl=svs.clients ; j<MAX_CLIENTS ; j++,cl++)
    332 	{
    333 		if (cl->state != cs_spawned)
    334 			continue;
    335 
    336 		ent = cl->edict;
    337 
    338 		// ZOID visibility tracking
    339 		if (ent != clent &&
    340 			!(client->spec_track && client->spec_track - 1 == j))
    341 		{
    342 			if (cl->spectator)
    343 				continue;
    344 
    345 			// ignore if not touching a PV leaf
    346 			for (i=0 ; i < ent->num_leafs ; i++)
    347 				if (pvs[ent->leafnums[i] >> 3] & (1 << (ent->leafnums[i]&7) ))
    348 					break;
    349 			if (i == ent->num_leafs)
    350 				continue;		// not visible
    351 		}
    352 
    353 		pflags = PF_MSEC | PF_COMMAND;
    354 
    355 		if (ent->v.modelindex != sv_playermodel)
    356 			pflags |= PF_MODEL;
    357 		for (i=0 ; i<3 ; i++)
    358 			if (ent->v.velocity[i])
    359 				pflags |= PF_VELOCITY1<<i;
    360 		if (ent->v.effects)
    361 			pflags |= PF_EFFECTS;
    362 		if (ent->v.skin)
    363 			pflags |= PF_SKINNUM;
    364 		if (ent->v.health <= 0)
    365 			pflags |= PF_DEAD;
    366 		if (ent->v.mins[2] != -24)
    367 			pflags |= PF_GIB;
    368 
    369 		if (cl->spectator)
    370 		{	// only sent origin and velocity to spectators
    371 			pflags &= PF_VELOCITY1 | PF_VELOCITY2 | PF_VELOCITY3;
    372 		}
    373 		else if (ent == clent)
    374 		{	// don't send a lot of data on personal entity
    375 			pflags &= ~(PF_MSEC|PF_COMMAND);
    376 			if (ent->v.weaponframe)
    377 				pflags |= PF_WEAPONFRAME;
    378 		}
    379 
    380 		if (client->spec_track && client->spec_track - 1 == j &&
    381 			ent->v.weaponframe)
    382 			pflags |= PF_WEAPONFRAME;
    383 
    384 		MSG_WriteByte (msg, svc_playerinfo);
    385 		MSG_WriteByte (msg, j);
    386 		MSG_WriteShort (msg, pflags);
    387 
    388 		for (i=0 ; i<3 ; i++)
    389 			MSG_WriteCoord (msg, ent->v.origin[i]);
    390 
    391 		MSG_WriteByte (msg, ent->v.frame);
    392 
    393 		if (pflags & PF_MSEC)
    394 		{
    395 			msec = 1000*(sv.time - cl->localtime);
    396 			if (msec > 255)
    397 				msec = 255;
    398 			MSG_WriteByte (msg, msec);
    399 		}
    400 
    401 		if (pflags & PF_COMMAND)
    402 		{
    403 			cmd = cl->lastcmd;
    404 
    405 			if (ent->v.health <= 0)
    406 			{	// don't show the corpse looking around...
    407 				cmd.angles[0] = 0;
    408 				cmd.angles[1] = ent->v.angles[1];
    409 				cmd.angles[0] = 0;
    410 			}
    411 
    412 			cmd.buttons = 0;	// never send buttons
    413 			cmd.impulse = 0;	// never send impulses
    414 
    415 			MSG_WriteDeltaUsercmd (msg, &nullcmd, &cmd);
    416 		}
    417 
    418 		for (i=0 ; i<3 ; i++)
    419 			if (pflags & (PF_VELOCITY1<<i) )
    420 				MSG_WriteShort (msg, ent->v.velocity[i]);
    421 
    422 		if (pflags & PF_MODEL)
    423 			MSG_WriteByte (msg, ent->v.modelindex);
    424 
    425 		if (pflags & PF_SKINNUM)
    426 			MSG_WriteByte (msg, ent->v.skin);
    427 
    428 		if (pflags & PF_EFFECTS)
    429 			MSG_WriteByte (msg, ent->v.effects);
    430 
    431 		if (pflags & PF_WEAPONFRAME)
    432 			MSG_WriteByte (msg, ent->v.weaponframe);
    433 	}
    434 }
    435 
    436 
    437 /*
    438 =============
    439 SV_WriteEntitiesToClient
    440 
    441 Encodes the current state of the world as
    442 a svc_packetentities messages and possibly
    443 a svc_nails message and
    444 svc_playerinfo messages
    445 =============
    446 */
    447 void SV_WriteEntitiesToClient (client_t *client, sizebuf_t *msg)
    448 {
    449 	int		e, i;
    450 	byte	*pvs;
    451 	vec3_t	org;
    452 	edict_t	*ent;
    453 	packet_entities_t	*pack;
    454 	edict_t	*clent;
    455 	client_frame_t	*frame;
    456 	entity_state_t	*state;
    457 
    458 	// this is the frame we are creating
    459 	frame = &client->frames[client->netchan.incoming_sequence & UPDATE_MASK];
    460 
    461 	// find the client's PVS
    462 	clent = client->edict;
    463 	VectorAdd (clent->v.origin, clent->v.view_ofs, org);
    464 	pvs = SV_FatPVS (org);
    465 
    466 	// send over the players in the PVS
    467 	SV_WritePlayersToClient (client, clent, pvs, msg);
    468 
    469 	// put other visible entities into either a packet_entities or a nails message
    470 	pack = &frame->entities;
    471 	pack->num_entities = 0;
    472 
    473 	numnails = 0;
    474 
    475 	for (e=MAX_CLIENTS+1, ent=EDICT_NUM(e) ; e<sv.num_edicts ; e++, ent = NEXT_EDICT(ent))
    476 	{
    477 		// ignore ents without visible models
    478 		if (!ent->v.modelindex || !*PR_GetString(ent->v.model))
    479 			continue;
    480 
    481 		// ignore if not touching a PV leaf
    482 		for (i=0 ; i < ent->num_leafs ; i++)
    483 			if (pvs[ent->leafnums[i] >> 3] & (1 << (ent->leafnums[i]&7) ))
    484 				break;
    485 
    486 		if (i == ent->num_leafs)
    487 			continue;		// not visible
    488 
    489 		if (SV_AddNailUpdate (ent))
    490 			continue;	// added to the special update list
    491 
    492 		// add to the packetentities
    493 		if (pack->num_entities == MAX_PACKET_ENTITIES)
    494 			continue;	// all full
    495 
    496 		state = &pack->entities[pack->num_entities];
    497 		pack->num_entities++;
    498 
    499 		state->number = e;
    500 		state->flags = 0;
    501 		VectorCopy (ent->v.origin, state->origin);
    502 		VectorCopy (ent->v.angles, state->angles);
    503 		state->modelindex = ent->v.modelindex;
    504 		state->frame = ent->v.frame;
    505 		state->colormap = ent->v.colormap;
    506 		state->skinnum = ent->v.skin;
    507 		state->effects = ent->v.effects;
    508 	}
    509 
    510 	// encode the packet entities as a delta from the
    511 	// last packetentities acknowledged by the client
    512 
    513 	SV_EmitPacketEntities (client, pack, msg);
    514 
    515 	// now add the specialized nail update
    516 	SV_EmitNailUpdate (msg);
    517 }
    518