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