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