• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 */
SV_Init(void)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 */
SV_StartParticle(vec3_t org,vec3_t dir,int color,int count)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 */
SV_StartSound(edict_t * entity,int channel,const char * sample,int volume,float attenuation)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 */
SV_SendServerinfo(client_t * client)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 */
SV_ConnectClient(int clientnum)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 */
SV_CheckForNewClients(void)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 */
SV_ClearDatagram(void)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 
SV_AddToFatPVS(vec3_t org,mnode_t * node)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 */
SV_FatPVS(vec3_t org)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 */
SV_WriteEntitiesToClient(edict_t * clent,sizebuf_t * msg)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 */
SV_CleanupEnts(void)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 */
SV_WriteClientdataToMessage(edict_t * ent,sizebuf_t * msg)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 */
SV_SendClientDatagram(client_t * client)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 */
SV_UpdateToReliableMessages(void)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 */
SV_SendNop(client_t * client)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 */
SV_SendClientMessages(void)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 */
SV_ModelIndex(const char * name)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 */
SV_CreateBaseline(void)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 */
SV_SendReconnect(void)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 */
SV_SaveSpawnparms(void)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
SV_SpawnServer(char * server,char * startspot)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