Home | History | Annotate | Download | only in jni
      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 // sv_main.c -- server main program
     21 
     22 #include "quakedef.h"
     23 
     24 server_t		sv;
     25 server_static_t	svs;
     26 
     27 char	localmodels[MAX_MODELS][5];			// inline model names for precache
     28 
     29 //============================================================================
     30 
     31 /*
     32 ===============
     33 SV_Init
     34 ===============
     35 */
     36 void SV_Init (void)
     37 {
     38 	int		i;
     39 	extern	cvar_t	sv_maxvelocity;
     40 	extern	cvar_t	sv_gravity;
     41 	extern	cvar_t	sv_nostep;
     42 	extern	cvar_t	sv_friction;
     43 	extern	cvar_t	sv_edgefriction;
     44 	extern	cvar_t	sv_stopspeed;
     45 	extern	cvar_t	sv_maxspeed;
     46 	extern	cvar_t	sv_accelerate;
     47 	extern	cvar_t	sv_idealpitchscale;
     48 	extern	cvar_t	sv_aim;
     49 
     50 	Cvar_RegisterVariable (&sv_maxvelocity);
     51 	Cvar_RegisterVariable (&sv_gravity);
     52 	Cvar_RegisterVariable (&sv_friction);
     53 	Cvar_RegisterVariable (&sv_edgefriction);
     54 	Cvar_RegisterVariable (&sv_stopspeed);
     55 	Cvar_RegisterVariable (&sv_maxspeed);
     56 	Cvar_RegisterVariable (&sv_accelerate);
     57 	Cvar_RegisterVariable (&sv_idealpitchscale);
     58 	Cvar_RegisterVariable (&sv_aim);
     59 	Cvar_RegisterVariable (&sv_nostep);
     60 
     61 	for (i=0 ; i<MAX_MODELS ; i++)
     62 		sprintf (localmodels[i], "*%i", i);
     63 }
     64 
     65 /*
     66 =============================================================================
     67 
     68 EVENT MESSAGES
     69 
     70 =============================================================================
     71 */
     72 
     73 /*
     74 ==================
     75 SV_StartParticle
     76 
     77 Make sure the event gets sent to all clients
     78 ==================
     79 */
     80 void SV_StartParticle (vec3_t org, vec3_t dir, int color, int count)
     81 {
     82 	int		i, v;
     83 
     84 	if (sv.datagram.cursize > MAX_DATAGRAM-16)
     85 		return;
     86 	MSG_WriteByte (&sv.datagram, svc_particle);
     87 	MSG_WriteCoord (&sv.datagram, org[0]);
     88 	MSG_WriteCoord (&sv.datagram, org[1]);
     89 	MSG_WriteCoord (&sv.datagram, org[2]);
     90 	for (i=0 ; i<3 ; i++)
     91 	{
     92 		v = (int)(dir[i]*16);
     93 		if (v > 127)
     94 			v = 127;
     95 		else if (v < -128)
     96 			v = -128;
     97 		MSG_WriteChar (&sv.datagram, v);
     98 	}
     99 	MSG_WriteByte (&sv.datagram, count);
    100 	MSG_WriteByte (&sv.datagram, color);
    101 }
    102 
    103 /*
    104 ==================
    105 SV_StartSound
    106 
    107 Each entity can have eight independant sound sources, like voice,
    108 weapon, feet, etc.
    109 
    110 Channel 0 is an auto-allocate channel, the others override anything
    111 allready running on that entity/channel pair.
    112 
    113 An attenuation of 0 will play full volume everywhere in the level.
    114 Larger attenuations will drop off.  (max 4 attenuation)
    115 
    116 ==================
    117 */
    118 void SV_StartSound (edict_t *entity, int channel, const char *sample, int volume,
    119     float attenuation)
    120 {
    121     int         sound_num;
    122     int field_mask;
    123     int			i;
    124 	int			ent;
    125 
    126 	if (volume < 0 || volume > 255)
    127 		Sys_Error ("SV_StartSound: volume = %i", volume);
    128 
    129 	if (attenuation < 0 || attenuation > 4)
    130 		Sys_Error ("SV_StartSound: attenuation = %f", attenuation);
    131 
    132 	if (channel < 0 || channel > 7)
    133 		Sys_Error ("SV_StartSound: channel = %i", channel);
    134 
    135 	if (sv.datagram.cursize > MAX_DATAGRAM-16)
    136 		return;
    137 
    138 // find precache number for sound
    139     for (sound_num=1 ; sound_num<MAX_SOUNDS
    140         && sv.sound_precache[sound_num] ; sound_num++)
    141         if (!strcmp(sample, sv.sound_precache[sound_num]))
    142             break;
    143 
    144     if ( sound_num == MAX_SOUNDS || !sv.sound_precache[sound_num] )
    145     {
    146         Con_Printf ("SV_StartSound: %s not precacheed\n", sample);
    147         return;
    148     }
    149 
    150 	ent = NUM_FOR_EDICT(entity);
    151 
    152 	channel = (ent<<3) | channel;
    153 
    154 	field_mask = 0;
    155 	if (volume != DEFAULT_SOUND_PACKET_VOLUME)
    156 		field_mask |= SND_VOLUME;
    157 	if (attenuation != DEFAULT_SOUND_PACKET_ATTENUATION)
    158 		field_mask |= SND_ATTENUATION;
    159 
    160 // directed messages go only to the entity the are targeted on
    161 	MSG_WriteByte (&sv.datagram, svc_sound);
    162 	MSG_WriteByte (&sv.datagram, field_mask);
    163 	if (field_mask & SND_VOLUME)
    164 		MSG_WriteByte (&sv.datagram, volume);
    165 	if (field_mask & SND_ATTENUATION)
    166 		MSG_WriteByte (&sv.datagram, (int) (attenuation*64));
    167 	MSG_WriteShort (&sv.datagram, channel);
    168 	MSG_WriteByte (&sv.datagram, sound_num);
    169 	for (i=0 ; i<3 ; i++)
    170 		MSG_WriteCoord (&sv.datagram, entity->u.v.origin[i]+0.5*(entity->u.v.mins[i]+entity->u.v.maxs[i]));
    171 }
    172 
    173 /*
    174 ==============================================================================
    175 
    176 CLIENT SPAWNING
    177 
    178 ==============================================================================
    179 */
    180 
    181 /*
    182 ================
    183 SV_SendServerinfo
    184 
    185 Sends the first message from the server to a connected client.
    186 This will be sent on the initial connection and upon each server load.
    187 ================
    188 */
    189 void SV_SendServerinfo (client_t *client)
    190 {
    191 	char			**s;
    192 	char			message[2048];
    193 
    194 	MSG_WriteByte (&client->message, svc_print);
    195 	sprintf (message, "%c\nVERSION %4.2f SERVER (%i CRC)", 2, VERSION, pr_crc);
    196 	MSG_WriteString (&client->message,message);
    197 
    198 	MSG_WriteByte (&client->message, svc_serverinfo);
    199 	MSG_WriteLong (&client->message, PROTOCOL_VERSION);
    200 	MSG_WriteByte (&client->message, svs.maxclients);
    201 
    202 	if (!coop.value && deathmatch.value)
    203 		MSG_WriteByte (&client->message, GAME_DEATHMATCH);
    204 	else
    205 		MSG_WriteByte (&client->message, GAME_COOP);
    206 
    207 	sprintf (message, "%s", pr_strings+sv.edicts->u.v.message);
    208 
    209 	MSG_WriteString (&client->message,message);
    210 
    211 	for (s = sv.model_precache+1 ; *s ; s++)
    212 		MSG_WriteString (&client->message, *s);
    213 	MSG_WriteByte (&client->message, 0);
    214 
    215 	for (s = sv.sound_precache+1 ; *s ; s++)
    216 		MSG_WriteString (&client->message, *s);
    217 	MSG_WriteByte (&client->message, 0);
    218 
    219 // send music
    220 	MSG_WriteByte (&client->message, svc_cdtrack);
    221 	MSG_WriteByte (&client->message, (int) sv.edicts->u.v.sounds);
    222 	MSG_WriteByte (&client->message, (int) sv.edicts->u.v.sounds);
    223 
    224 // set view
    225 	MSG_WriteByte (&client->message, svc_setview);
    226 	MSG_WriteShort (&client->message, NUM_FOR_EDICT(client->edict));
    227 
    228 	MSG_WriteByte (&client->message, svc_signonnum);
    229 	MSG_WriteByte (&client->message, 1);
    230 
    231 	client->sendsignon = true;
    232 	client->spawned = false;		// need prespawn, spawn, etc
    233 }
    234 
    235 /*
    236 ================
    237 SV_ConnectClient
    238 
    239 Initializes a client_t for a new net connection.  This will only be called
    240 once for a player each game, not once for each level change.
    241 ================
    242 */
    243 void SV_ConnectClient (int clientnum)
    244 {
    245 	edict_t			*ent;
    246 	client_t		*client;
    247 	int				edictnum;
    248 	struct qsocket_s *netconnection;
    249 	int				i;
    250 	float			spawn_parms[NUM_SPAWN_PARMS] = {};
    251 
    252 	client = svs.clients + clientnum;
    253 
    254 	Con_DPrintf ("Client %s connected\n", client->netconnection->address);
    255 
    256 	edictnum = clientnum+1;
    257 
    258 	ent = EDICT_NUM(edictnum);
    259 
    260 // set up the client_t
    261 	netconnection = client->netconnection;
    262 
    263 	if (sv.loadgame)
    264 		memcpy (spawn_parms, client->spawn_parms, sizeof(spawn_parms));
    265 	memset (client, 0, sizeof(*client));
    266 	client->netconnection = netconnection;
    267 
    268 	strcpy (client->name, "unconnected");
    269 	client->active = true;
    270 	client->spawned = false;
    271 	client->edict = ent;
    272 	client->message.data = client->msgbuf;
    273 	client->message.maxsize = sizeof(client->msgbuf);
    274 	client->message.allowoverflow = true;		// we can catch it
    275 
    276 #ifdef IDGODS
    277 	client->privileged = IsID(&client->netconnection->addr);
    278 #else
    279 	client->privileged = false;
    280 #endif
    281 
    282 	if (sv.loadgame)
    283 		memcpy (client->spawn_parms, spawn_parms, sizeof(spawn_parms));
    284 	else
    285 	{
    286 	// call the progs to get default spawn parms for the new client
    287 		PR_ExecuteProgram (pr_global_struct->SetNewParms);
    288 		for (i=0 ; i<NUM_SPAWN_PARMS ; i++)
    289 			client->spawn_parms[i] = (&pr_global_struct->parm1)[i];
    290 	}
    291 
    292 	SV_SendServerinfo (client);
    293 }
    294 
    295 
    296 /*
    297 ===================
    298 SV_CheckForNewClients
    299 
    300 ===================
    301 */
    302 void SV_CheckForNewClients (void)
    303 {
    304 	struct qsocket_s	*ret;
    305 	int				i;
    306 
    307 //
    308 // check for new connections
    309 //
    310 	while (1)
    311 	{
    312 		ret = NET_CheckNewConnections ();
    313 		if (!ret)
    314 			break;
    315 
    316 	//
    317 	// init a new client structure
    318 	//
    319 		for (i=0 ; i<svs.maxclients ; i++)
    320 			if (!svs.clients[i].active)
    321 				break;
    322 		if (i == svs.maxclients)
    323 			Sys_Error ("Host_CheckForNewClients: no free clients");
    324 
    325 		svs.clients[i].netconnection = ret;
    326 		SV_ConnectClient (i);
    327 
    328 		net_activeconnections++;
    329 	}
    330 }
    331 
    332 
    333 
    334 /*
    335 ===============================================================================
    336 
    337 FRAME UPDATES
    338 
    339 ===============================================================================
    340 */
    341 
    342 /*
    343 ==================
    344 SV_ClearDatagram
    345 
    346 ==================
    347 */
    348 void SV_ClearDatagram (void)
    349 {
    350 	SZ_Clear (&sv.datagram);
    351 }
    352 
    353 /*
    354 =============================================================================
    355 
    356 The PVS must include a small area around the client to allow head bobbing
    357 or other small motion on the client side.  Otherwise, a bob might cause an
    358 entity that should be visible to not show up, especially when the bob
    359 crosses a waterline.
    360 
    361 =============================================================================
    362 */
    363 
    364 int		fatbytes;
    365 byte	fatpvs[MAX_MAP_LEAFS/8];
    366 
    367 void SV_AddToFatPVS (vec3_t org, mnode_t *node)
    368 {
    369 	int		i;
    370 	byte	*pvs;
    371 	mplane_t	*plane;
    372 	float	d;
    373 
    374 	while (1)
    375 	{
    376 	// if this is a leaf, accumulate the pvs bits
    377 		if (node->contents < 0)
    378 		{
    379 			if (node->contents != CONTENTS_SOLID)
    380 			{
    381 				pvs = Mod_LeafPVS ( (mleaf_t *)node, sv.worldmodel);
    382 				for (i=0 ; i<fatbytes ; i++)
    383 					fatpvs[i] |= pvs[i];
    384 			}
    385 			return;
    386 		}
    387 
    388 		plane = node->plane;
    389 		d = DotProduct (org, plane->normal) - plane->dist;
    390 		if (d > 8)
    391 			node = node->children[0];
    392 		else if (d < -8)
    393 			node = node->children[1];
    394 		else
    395 		{	// go down both
    396 			SV_AddToFatPVS (org, node->children[0]);
    397 			node = node->children[1];
    398 		}
    399 	}
    400 }
    401 
    402 /*
    403 =============
    404 SV_FatPVS
    405 
    406 Calculates a PVS that is the inclusive or of all leafs within 8 pixels of the
    407 given point.
    408 =============
    409 */
    410 byte *SV_FatPVS (vec3_t org)
    411 {
    412 	fatbytes = (sv.worldmodel->numleafs+31)>>3;
    413 	Q_memset (fatpvs, 0, fatbytes);
    414 	SV_AddToFatPVS (org, sv.worldmodel->nodes);
    415 	return fatpvs;
    416 }
    417 
    418 //=============================================================================
    419 
    420 
    421 /*
    422 =============
    423 SV_WriteEntitiesToClient
    424 
    425 =============
    426 */
    427 void SV_WriteEntitiesToClient (edict_t	*clent, sizebuf_t *msg)
    428 {
    429 	int		e, i;
    430 	int		bits;
    431 	byte	*pvs;
    432 	vec3_t	org;
    433 	float	miss;
    434 	edict_t	*ent;
    435 
    436 // find the client's PVS
    437 	VectorAdd (clent->u.v.origin, clent->u.v.view_ofs, org);
    438 	pvs = SV_FatPVS (org);
    439 
    440 // send over all entities (excpet the client) that touch the pvs
    441 	ent = NEXT_EDICT(sv.edicts);
    442 	for (e=1 ; e<sv.num_edicts ; e++, ent = NEXT_EDICT(ent))
    443 	{
    444 #ifdef QUAKE2
    445 		// don't send if flagged for NODRAW and there are no lighting effects
    446 		if (ent->u.v.effects == EF_NODRAW)
    447 			continue;
    448 #endif
    449 
    450 // ignore if not touching a PV leaf
    451 		if (ent != clent)	// clent is ALLWAYS sent
    452 		{
    453 // ignore ents without visible models
    454 			if (!ent->u.v.modelindex || !pr_strings[ent->u.v.model])
    455 				continue;
    456 
    457 			for (i=0 ; i < ent->num_leafs ; i++)
    458 				if (pvs[ent->leafnums[i] >> 3] & (1 << (ent->leafnums[i]&7) ))
    459 					break;
    460 
    461 			if (i == ent->num_leafs)
    462 				continue;		// not visible
    463 		}
    464 
    465 		if (msg->maxsize - msg->cursize < 16)
    466 		{
    467 			Con_Printf ("packet overflow\n");
    468 			return;
    469 		}
    470 
    471 // send an update
    472 		bits = 0;
    473 
    474 		for (i=0 ; i<3 ; i++)
    475 		{
    476 			miss = ent->u.v.origin[i] - ent->baseline.origin[i];
    477 			if ( miss < -0.1 || miss > 0.1 )
    478 				bits |= U_ORIGIN1<<i;
    479 		}
    480 
    481 		if ( ent->u.v.angles[0] != ent->baseline.angles[0] )
    482 			bits |= U_ANGLE1;
    483 
    484 		if ( ent->u.v.angles[1] != ent->baseline.angles[1] )
    485 			bits |= U_ANGLE2;
    486 
    487 		if ( ent->u.v.angles[2] != ent->baseline.angles[2] )
    488 			bits |= U_ANGLE3;
    489 
    490 		if (ent->u.v.movetype == MOVETYPE_STEP)
    491 			bits |= U_NOLERP;	// don't mess up the step animation
    492 
    493 		if (ent->baseline.colormap != ent->u.v.colormap)
    494 			bits |= U_COLORMAP;
    495 
    496 		if (ent->baseline.skin != ent->u.v.skin)
    497 			bits |= U_SKIN;
    498 
    499 		if (ent->baseline.frame != ent->u.v.frame)
    500 			bits |= U_FRAME;
    501 
    502 		if (ent->baseline.effects != ent->u.v.effects)
    503 			bits |= U_EFFECTS;
    504 
    505 		if (ent->baseline.modelindex != ent->u.v.modelindex)
    506 			bits |= U_MODEL;
    507 
    508 		if (e >= 256)
    509 			bits |= U_LONGENTITY;
    510 
    511 		if (bits >= 256)
    512 			bits |= U_MOREBITS;
    513 
    514 	//
    515 	// write the message
    516 	//
    517 		MSG_WriteByte (msg,bits | U_SIGNAL);
    518 
    519 		if (bits & U_MOREBITS)
    520 			MSG_WriteByte (msg, bits>>8);
    521 		if (bits & U_LONGENTITY)
    522 			MSG_WriteShort (msg,e);
    523 		else
    524 			MSG_WriteByte (msg,e);
    525 
    526 		if (bits & U_MODEL)
    527 			MSG_WriteByte (msg,	(int) ent->u.v.modelindex);
    528 		if (bits & U_FRAME)
    529 			MSG_WriteByte (msg, (int) ent->u.v.frame);
    530 		if (bits & U_COLORMAP)
    531 			MSG_WriteByte (msg, (int) ent->u.v.colormap);
    532 		if (bits & U_SKIN)
    533 			MSG_WriteByte (msg, (int) ent->u.v.skin);
    534 		if (bits & U_EFFECTS)
    535 			MSG_WriteByte (msg, (int) ent->u.v.effects);
    536 		if (bits & U_ORIGIN1)
    537 			MSG_WriteCoord (msg, ent->u.v.origin[0]);
    538 		if (bits & U_ANGLE1)
    539 			MSG_WriteAngle(msg, ent->u.v.angles[0]);
    540 		if (bits & U_ORIGIN2)
    541 			MSG_WriteCoord (msg, ent->u.v.origin[1]);
    542 		if (bits & U_ANGLE2)
    543 			MSG_WriteAngle(msg, ent->u.v.angles[1]);
    544 		if (bits & U_ORIGIN3)
    545 			MSG_WriteCoord (msg, ent->u.v.origin[2]);
    546 		if (bits & U_ANGLE3)
    547 			MSG_WriteAngle(msg, ent->u.v.angles[2]);
    548 	}
    549 }
    550 
    551 /*
    552 =============
    553 SV_CleanupEnts
    554 
    555 =============
    556 */
    557 void SV_CleanupEnts (void)
    558 {
    559 	int		e;
    560 	edict_t	*ent;
    561 
    562 	ent = NEXT_EDICT(sv.edicts);
    563 	for (e=1 ; e<sv.num_edicts ; e++, ent = NEXT_EDICT(ent))
    564 	{
    565 		ent->u.v.effects = (int)ent->u.v.effects & ~EF_MUZZLEFLASH;
    566 	}
    567 
    568 }
    569 
    570 /*
    571 ==================
    572 SV_WriteClientdataToMessage
    573 
    574 ==================
    575 */
    576 void SV_WriteClientdataToMessage (edict_t *ent, sizebuf_t *msg)
    577 {
    578 	int		bits;
    579 	int		i;
    580 	edict_t	*other;
    581 	int		items;
    582 #ifndef QUAKE2
    583 	eval_t	*val;
    584 #endif
    585 
    586 //
    587 // send a damage message
    588 //
    589 	if (ent->u.v.dmg_take || ent->u.v.dmg_save)
    590 	{
    591 		other = PROG_TO_EDICT(ent->u.v.dmg_inflictor);
    592 		MSG_WriteByte (msg, svc_damage);
    593 		MSG_WriteByte (msg, (int) ent->u.v.dmg_save);
    594 		MSG_WriteByte (msg, (int) ent->u.v.dmg_take);
    595 		for (i=0 ; i<3 ; i++)
    596 			MSG_WriteCoord (msg, other->u.v.origin[i] + 0.5*(other->u.v.mins[i] + other->u.v.maxs[i]));
    597 
    598 		ent->u.v.dmg_take = 0;
    599 		ent->u.v.dmg_save = 0;
    600 	}
    601 
    602 //
    603 // send the current viewpos offset from the view entity
    604 //
    605 	SV_SetIdealPitch ();		// how much to look up / down ideally
    606 
    607 // a fixangle might get lost in a dropped packet.  Oh well.
    608 	if ( ent->u.v.fixangle )
    609 	{
    610 		MSG_WriteByte (msg, svc_setangle);
    611 		for (i=0 ; i < 3 ; i++)
    612 			MSG_WriteAngle (msg, ent->u.v.angles[i] );
    613 		ent->u.v.fixangle = 0;
    614 	}
    615 
    616 	bits = 0;
    617 
    618 	if (ent->u.v.view_ofs[2] != DEFAULT_VIEWHEIGHT)
    619 		bits |= SU_VIEWHEIGHT;
    620 
    621 	if (ent->u.v.idealpitch)
    622 		bits |= SU_IDEALPITCH;
    623 
    624 // stuff the sigil bits into the high bits of items for sbar, or else
    625 // mix in items2
    626 #ifdef QUAKE2
    627 	items = (int)ent->u.v.items | ((int)ent->u.v.items2 << 23);
    628 #else
    629 	val = GetEdictFieldValue(ent, "items2");
    630 
    631 	if (val)
    632 		items = (int)ent->u.v.items | ((int)val->_float << 23);
    633 	else
    634 		items = (int)ent->u.v.items | ((int)pr_global_struct->serverflags << 28);
    635 #endif
    636 
    637 	bits |= SU_ITEMS;
    638 
    639 	if ( (int)ent->u.v.flags & FL_ONGROUND)
    640 		bits |= SU_ONGROUND;
    641 
    642 	if ( ent->u.v.waterlevel >= 2)
    643 		bits |= SU_INWATER;
    644 
    645 	for (i=0 ; i<3 ; i++)
    646 	{
    647 		if (ent->u.v.punchangle[i])
    648 			bits |= (SU_PUNCH1<<i);
    649 		if (ent->u.v.velocity[i])
    650 			bits |= (SU_VELOCITY1<<i);
    651 	}
    652 
    653 	if (ent->u.v.weaponframe)
    654 		bits |= SU_WEAPONFRAME;
    655 
    656 	if (ent->u.v.armorvalue)
    657 		bits |= SU_ARMOR;
    658 
    659 //	if (ent->u.v.weapon)
    660 		bits |= SU_WEAPON;
    661 
    662 // send the data
    663 
    664 	MSG_WriteByte (msg, svc_clientdata);
    665 	MSG_WriteShort (msg, bits);
    666 
    667 	if (bits & SU_VIEWHEIGHT)
    668 		MSG_WriteChar (msg, (int) ent->u.v.view_ofs[2]);
    669 
    670 	if (bits & SU_IDEALPITCH)
    671 		MSG_WriteChar (msg, (int) ent->u.v.idealpitch);
    672 
    673 	for (i=0 ; i<3 ; i++)
    674 	{
    675 		if (bits & (SU_PUNCH1<<i))
    676 			MSG_WriteChar (msg, (int) ent->u.v.punchangle[i]);
    677 		if (bits & (SU_VELOCITY1<<i))
    678 			MSG_WriteChar (msg, (int) ent->u.v.velocity[i]/16);
    679 	}
    680 
    681 // [always sent]	if (bits & SU_ITEMS)
    682 	MSG_WriteLong (msg, items);
    683 
    684 	if (bits & SU_WEAPONFRAME)
    685 		MSG_WriteByte (msg, (int) ent->u.v.weaponframe);
    686 	if (bits & SU_ARMOR)
    687 		MSG_WriteByte (msg, (int) ent->u.v.armorvalue);
    688 	if (bits & SU_WEAPON)
    689 		MSG_WriteByte (msg, SV_ModelIndex(pr_strings+ent->u.v.weaponmodel));
    690 
    691 	MSG_WriteShort (msg, (int) ent->u.v.health);
    692 	MSG_WriteByte (msg, (int) ent->u.v.currentammo);
    693 	MSG_WriteByte (msg, (int) ent->u.v.ammo_shells);
    694 	MSG_WriteByte (msg, (int) ent->u.v.ammo_nails);
    695 	MSG_WriteByte (msg, (int) ent->u.v.ammo_rockets);
    696 	MSG_WriteByte (msg, (int) ent->u.v.ammo_cells);
    697 
    698 	if (standard_quake)
    699 	{
    700 		MSG_WriteByte (msg, (int) ent->u.v.weapon);
    701 	}
    702 	else
    703 	{
    704 		for(i=0;i<32;i++)
    705 		{
    706 			if ( ((int)ent->u.v.weapon) & (1<<i) )
    707 			{
    708 				MSG_WriteByte (msg, i);
    709 				break;
    710 			}
    711 		}
    712 	}
    713 }
    714 
    715 /*
    716 =======================
    717 SV_SendClientDatagram
    718 =======================
    719 */
    720 qboolean SV_SendClientDatagram (client_t *client)
    721 {
    722 	byte		buf[MAX_DATAGRAM];
    723 	sizebuf_t	msg;
    724 
    725 	msg.data = buf;
    726 	msg.maxsize = sizeof(buf);
    727 	msg.cursize = 0;
    728 
    729 	MSG_WriteByte (&msg, svc_time);
    730 	MSG_WriteFloat (&msg, sv.time);
    731 
    732 // add the client specific data to the datagram
    733 	SV_WriteClientdataToMessage (client->edict, &msg);
    734 
    735 	SV_WriteEntitiesToClient (client->edict, &msg);
    736 
    737 // copy the server datagram if there is space
    738 	if (msg.cursize + sv.datagram.cursize < msg.maxsize)
    739 		SZ_Write (&msg, sv.datagram.data, sv.datagram.cursize);
    740 
    741 // send the datagram
    742 	if (NET_SendUnreliableMessage (client->netconnection, &msg) == -1)
    743 	{
    744 		SV_DropClient (true);// if the message couldn't send, kick off
    745 		return false;
    746 	}
    747 
    748 	return true;
    749 }
    750 
    751 /*
    752 =======================
    753 SV_UpdateToReliableMessages
    754 =======================
    755 */
    756 void SV_UpdateToReliableMessages (void)
    757 {
    758 	int			i, j;
    759 	client_t *client;
    760 
    761 // check for changes to be sent over the reliable streams
    762 	for (i=0, host_client = svs.clients ; i<svs.maxclients ; i++, host_client++)
    763 	{
    764 		if (host_client->old_frags != host_client->edict->u.v.frags)
    765 		{
    766 			for (j=0, client = svs.clients ; j<svs.maxclients ; j++, client++)
    767 			{
    768 				if (!client->active)
    769 					continue;
    770 				MSG_WriteByte (&client->message, svc_updatefrags);
    771 				MSG_WriteByte (&client->message, i);
    772 				MSG_WriteShort (&client->message, (int) host_client->edict->u.v.frags);
    773 			}
    774 
    775 			host_client->old_frags = (int) host_client->edict->u.v.frags;
    776 		}
    777 	}
    778 
    779 	for (j=0, client = svs.clients ; j<svs.maxclients ; j++, client++)
    780 	{
    781 		if (!client->active)
    782 			continue;
    783 		SZ_Write (&client->message, sv.reliable_datagram.data, sv.reliable_datagram.cursize);
    784 	}
    785 
    786 	SZ_Clear (&sv.reliable_datagram);
    787 }
    788 
    789 
    790 /*
    791 =======================
    792 SV_SendNop
    793 
    794 Send a nop message without trashing or sending the accumulated client
    795 message buffer
    796 =======================
    797 */
    798 void SV_SendNop (client_t *client)
    799 {
    800 	sizebuf_t	msg;
    801 	byte		buf[4];
    802 
    803 	msg.data = buf;
    804 	msg.maxsize = sizeof(buf);
    805 	msg.cursize = 0;
    806 
    807 	MSG_WriteChar (&msg, svc_nop);
    808 
    809 	if (NET_SendUnreliableMessage (client->netconnection, &msg) == -1)
    810 		SV_DropClient (true);	// if the message couldn't send, kick off
    811 	client->last_message = realtime;
    812 }
    813 
    814 /*
    815 =======================
    816 SV_SendClientMessages
    817 =======================
    818 */
    819 void SV_SendClientMessages (void)
    820 {
    821 	int			i;
    822 
    823 // update frags, names, etc
    824 	SV_UpdateToReliableMessages ();
    825 
    826 // build individual updates
    827 	for (i=0, host_client = svs.clients ; i<svs.maxclients ; i++, host_client++)
    828 	{
    829 		if (!host_client->active)
    830 			continue;
    831 
    832 		if (host_client->spawned)
    833 		{
    834 			if (!SV_SendClientDatagram (host_client))
    835 				continue;
    836 		}
    837 		else
    838 		{
    839 		// the player isn't totally in the game yet
    840 		// send small keepalive messages if too much time has passed
    841 		// send a full message when the next signon stage has been requested
    842 		// some other message data (name changes, etc) may accumulate
    843 		// between signon stages
    844 			if (!host_client->sendsignon)
    845 			{
    846 				if (realtime - host_client->last_message > 5)
    847 					SV_SendNop (host_client);
    848 				continue;	// don't send out non-signon messages
    849 			}
    850 		}
    851 
    852 		// check for an overflowed message.  Should only happen
    853 		// on a very fucked up connection that backs up a lot, then
    854 		// changes level
    855 		if (host_client->message.overflowed)
    856 		{
    857 			SV_DropClient (true);
    858 			host_client->message.overflowed = false;
    859 			continue;
    860 		}
    861 
    862 		if (host_client->message.cursize || host_client->dropasap)
    863 		{
    864 			if (!NET_CanSendMessage (host_client->netconnection))
    865 			{
    866 //				I_Printf ("can't write\n");
    867 				continue;
    868 			}
    869 
    870 			if (host_client->dropasap)
    871 				SV_DropClient (false);	// went to another level
    872 			else
    873 			{
    874 				if (NET_SendMessage (host_client->netconnection
    875 				, &host_client->message) == -1)
    876 					SV_DropClient (true);	// if the message couldn't send, kick off
    877 				SZ_Clear (&host_client->message);
    878 				host_client->last_message = realtime;
    879 				host_client->sendsignon = false;
    880 			}
    881 		}
    882 	}
    883 
    884 
    885 // clear muzzle flashes
    886 	SV_CleanupEnts ();
    887 }
    888 
    889 
    890 /*
    891 ==============================================================================
    892 
    893 SERVER SPAWNING
    894 
    895 ==============================================================================
    896 */
    897 
    898 /*
    899 ================
    900 SV_ModelIndex
    901 
    902 ================
    903 */
    904 int SV_ModelIndex (const char *name)
    905 {
    906 	int		i;
    907 
    908 	if (!name || !name[0])
    909 		return 0;
    910 
    911 	for (i=0 ; i<MAX_MODELS && sv.model_precache[i] ; i++)
    912 		if (!strcmp(sv.model_precache[i], name))
    913 			return i;
    914 	if (i==MAX_MODELS || !sv.model_precache[i])
    915 		Sys_Error ("SV_ModelIndex: model %s not precached", name);
    916 	return i;
    917 }
    918 
    919 /*
    920 ================
    921 SV_CreateBaseline
    922 
    923 ================
    924 */
    925 void SV_CreateBaseline (void)
    926 {
    927 	int			i;
    928 	edict_t			*svent;
    929 	int				entnum;
    930 
    931 	for (entnum = 0; entnum < sv.num_edicts ; entnum++)
    932 	{
    933 	// get the current server version
    934 		svent = EDICT_NUM(entnum);
    935 		if (svent->free)
    936 			continue;
    937 		if (entnum > svs.maxclients && !svent->u.v.modelindex)
    938 			continue;
    939 
    940 	//
    941 	// create entity baseline
    942 	//
    943 		VectorCopy (svent->u.v.origin, svent->baseline.origin);
    944 		VectorCopy (svent->u.v.angles, svent->baseline.angles);
    945 		svent->baseline.frame = (int) svent->u.v.frame;
    946 		svent->baseline.skin = (int) svent->u.v.skin;
    947 		if (entnum > 0 && entnum <= svs.maxclients)
    948 		{
    949 			svent->baseline.colormap = entnum;
    950 			svent->baseline.modelindex = SV_ModelIndex("progs/player.mdl");
    951 		}
    952 		else
    953 		{
    954 			svent->baseline.colormap = 0;
    955 			svent->baseline.modelindex =
    956 				SV_ModelIndex(pr_strings + svent->u.v.model);
    957 		}
    958 
    959 	//
    960 	// add to the message
    961 	//
    962 		MSG_WriteByte (&sv.signon,svc_spawnbaseline);
    963 		MSG_WriteShort (&sv.signon,entnum);
    964 
    965 		MSG_WriteByte (&sv.signon, svent->baseline.modelindex);
    966 		MSG_WriteByte (&sv.signon, svent->baseline.frame);
    967 		MSG_WriteByte (&sv.signon, svent->baseline.colormap);
    968 		MSG_WriteByte (&sv.signon, svent->baseline.skin);
    969 		for (i=0 ; i<3 ; i++)
    970 		{
    971 			MSG_WriteCoord(&sv.signon, svent->baseline.origin[i]);
    972 			MSG_WriteAngle(&sv.signon, svent->baseline.angles[i]);
    973 		}
    974 	}
    975 }
    976 
    977 
    978 /*
    979 ================
    980 SV_SendReconnect
    981 
    982 Tell all the clients that the server is changing levels
    983 ================
    984 */
    985 void SV_SendReconnect (void)
    986 {
    987 	char	data[128];
    988 	sizebuf_t	msg;
    989 
    990 	msg.data = (byte*) data;
    991 	msg.cursize = 0;
    992 	msg.maxsize = sizeof(data);
    993 
    994 	MSG_WriteChar (&msg, svc_stufftext);
    995 	MSG_WriteString (&msg, "reconnect\n");
    996 	NET_SendToAll (&msg, 5);
    997 
    998 	if (cls.state != ca_dedicated)
    999 #ifdef QUAKE2
   1000 		Cbuf_InsertText ("reconnect\n");
   1001 #else
   1002 		Cmd_ExecuteString2 ("reconnect\n", src_command);
   1003 #endif
   1004 }
   1005 
   1006 
   1007 /*
   1008 ================
   1009 SV_SaveSpawnparms
   1010 
   1011 Grabs the current state of each client for saving across the
   1012 transition to another level
   1013 ================
   1014 */
   1015 void SV_SaveSpawnparms (void)
   1016 {
   1017 	int		i, j;
   1018 
   1019 	svs.serverflags = (int) pr_global_struct->serverflags;
   1020 
   1021 	for (i=0, host_client = svs.clients ; i<svs.maxclients ; i++, host_client++)
   1022 	{
   1023 		if (!host_client->active)
   1024 			continue;
   1025 
   1026 	// call the progs to get default spawn parms for the new client
   1027 		pr_global_struct->self = EDICT_TO_PROG(host_client->edict);
   1028 		PR_ExecuteProgram (pr_global_struct->SetChangeParms);
   1029 		for (j=0 ; j<NUM_SPAWN_PARMS ; j++)
   1030 			host_client->spawn_parms[j] = (&pr_global_struct->parm1)[j];
   1031 	}
   1032 }
   1033 
   1034 
   1035 /*
   1036 ================
   1037 SV_SpawnServer
   1038 
   1039 This is called at the start of each level
   1040 ================
   1041 */
   1042 extern float		scr_centertime_off;
   1043 
   1044 #ifdef QUAKE2
   1045 void SV_SpawnServer (char *server, char *startspot)
   1046 #else
   1047 void SV_SpawnServer (char *server)
   1048 #endif
   1049 {
   1050 	edict_t		*ent;
   1051 	int			i;
   1052 
   1053 	// let's not have any servers with no name
   1054 	if (hostname.string[0] == 0)
   1055 		Cvar_Set ("hostname", "UNNAMED");
   1056 	scr_centertime_off = 0;
   1057 
   1058 	Con_DPrintf ("SpawnServer: %s\n",server);
   1059 	svs.changelevel_issued = false;		// now safe to issue another
   1060 
   1061 //
   1062 // tell all connected clients that we are going to a new level
   1063 //
   1064 	if (sv.active)
   1065 	{
   1066 		SV_SendReconnect ();
   1067 	}
   1068 
   1069 //
   1070 // make cvars consistant
   1071 //
   1072 	if (coop.value)
   1073 		Cvar_SetValue ("deathmatch", 0);
   1074 	current_skill = (int)(skill.value + 0.5);
   1075 	if (current_skill < 0)
   1076 		current_skill = 0;
   1077 	if (current_skill > 3)
   1078 		current_skill = 3;
   1079 
   1080 	Cvar_SetValue ("skill", (float)current_skill);
   1081 
   1082 //
   1083 // set up the new server
   1084 //
   1085 	Host_ClearMemory ();
   1086 
   1087 	memset (&sv, 0, sizeof(sv));
   1088 
   1089 	strcpy (sv.name, server);
   1090 #ifdef QUAKE2
   1091 	if (startspot)
   1092 		strcpy(sv.startspot, startspot);
   1093 #endif
   1094 
   1095 // load progs to get entity field count
   1096 	PR_LoadProgs ();
   1097 
   1098 // allocate server memory
   1099 	sv.max_edicts = MAX_EDICTS;
   1100 
   1101 	sv.edicts = (edict_t*) Hunk_AllocName (sv.max_edicts*pr_edict_size, "edicts");
   1102 
   1103 	sv.datagram.maxsize = sizeof(sv.datagram_buf);
   1104 	sv.datagram.cursize = 0;
   1105 	sv.datagram.data = sv.datagram_buf;
   1106 
   1107 	sv.reliable_datagram.maxsize = sizeof(sv.reliable_datagram_buf);
   1108 	sv.reliable_datagram.cursize = 0;
   1109 	sv.reliable_datagram.data = sv.reliable_datagram_buf;
   1110 
   1111 	sv.signon.maxsize = sizeof(sv.signon_buf);
   1112 	sv.signon.cursize = 0;
   1113 	sv.signon.data = sv.signon_buf;
   1114 
   1115 // leave slots at start for clients only
   1116 	sv.num_edicts = svs.maxclients+1;
   1117 	for (i=0 ; i<svs.maxclients ; i++)
   1118 	{
   1119 		ent = EDICT_NUM(i+1);
   1120 		svs.clients[i].edict = ent;
   1121 	}
   1122 
   1123 	sv.state = ss_loading;
   1124 	sv.paused = false;
   1125 
   1126 	sv.time = 1.0;
   1127 
   1128 	strcpy (sv.name, server);
   1129 	sprintf (sv.modelname,"maps/%s.bsp", server);
   1130 	sv.worldmodel = Mod_ForName (sv.modelname, false);
   1131 	if (!sv.worldmodel)
   1132 	{
   1133 		Con_Printf ("Couldn't spawn server %s\n", sv.modelname);
   1134 		sv.active = false;
   1135 		return;
   1136 	}
   1137 	sv.models[1] = sv.worldmodel;
   1138 
   1139 //
   1140 // clear world interaction links
   1141 //
   1142 	SV_ClearWorld ();
   1143 
   1144 	sv.sound_precache[0] = pr_strings;
   1145 
   1146 	sv.model_precache[0] = pr_strings;
   1147 	sv.model_precache[1] = sv.modelname;
   1148 	for (i=1 ; i<sv.worldmodel->numsubmodels ; i++)
   1149 	{
   1150 		sv.model_precache[1+i] = localmodels[i];
   1151 		sv.models[i+1] = Mod_ForName (localmodels[i], false);
   1152 	}
   1153 
   1154 //
   1155 // load the rest of the entities
   1156 //
   1157 	ent = EDICT_NUM(0);
   1158 	memset (&ent->u.v, 0, progs->entityfields * 4);
   1159 	ent->free = false;
   1160 	ent->u.v.model = sv.worldmodel->name - pr_strings;
   1161 	ent->u.v.modelindex = 1;		// world model
   1162 	ent->u.v.solid = SOLID_BSP;
   1163 	ent->u.v.movetype = MOVETYPE_PUSH;
   1164 
   1165 	if (coop.value)
   1166 		pr_global_struct->coop = coop.value;
   1167 	else
   1168 		pr_global_struct->deathmatch = deathmatch.value;
   1169 
   1170 	pr_global_struct->mapname = sv.name - pr_strings;
   1171 #ifdef QUAKE2
   1172 	pr_global_struct->startspot = sv.startspot - pr_strings;
   1173 #endif
   1174 
   1175 // serverflags are for cross level information (sigils)
   1176 	pr_global_struct->serverflags = svs.serverflags;
   1177 
   1178 	ED_LoadFromFile (sv.worldmodel->entities);
   1179 
   1180 	sv.active = true;
   1181 
   1182 // all setup is completed, any further precache statements are errors
   1183 	sv.state = ss_active;
   1184 
   1185 // run two frames to allow everything to settle
   1186 	host_frametime = 0.1;
   1187 	SV_Physics ();
   1188 	SV_Physics ();
   1189 
   1190 // create a baseline for more efficient communications
   1191 	SV_CreateBaseline ();
   1192 
   1193 // send serverinfo to all connected clients
   1194 	for (i=0,host_client = svs.clients ; i<svs.maxclients ; i++, host_client++)
   1195 		if (host_client->active)
   1196 			SV_SendServerinfo (host_client);
   1197 
   1198 	Con_DPrintf ("Server spawned.\n");
   1199 }
   1200 
   1201