Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
/*
|
2000-02-04 13:40:04 +00:00
|
|
|
sv_main.c - server main program
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
Copyright (C) 1996-1997 Id Software, Inc.
|
2000-01-08 04:50:26 +00:00
|
|
|
Portions Copyright (C) 1999,2000 Nelson Rush.
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
|
|
modify it under the terms of the GNU General Public License
|
|
|
|
as published by the Free Software Foundation; either version 2
|
|
|
|
of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
2000-03-19 15:59:51 +00:00
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
|
|
|
|
See the GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
2000-02-04 13:40:04 +00:00
|
|
|
#include <quakedef.h>
|
|
|
|
#include <client.h>
|
|
|
|
#include <server.h>
|
|
|
|
#include <world.h>
|
2000-01-29 18:46:26 +00:00
|
|
|
#include <qtypes.h>
|
|
|
|
#include <cvar.h>
|
|
|
|
#include <protocol.h>
|
|
|
|
#include <sys.h>
|
|
|
|
#include <console.h>
|
|
|
|
#include <sound.h>
|
|
|
|
#include <lib_replace.h>
|
|
|
|
#include <mathlib.h>
|
|
|
|
#include <net.h>
|
|
|
|
#include <cmd.h>
|
2000-02-10 09:03:30 +00:00
|
|
|
#include <keys.h>
|
2000-02-11 05:47:57 +00:00
|
|
|
#include <phys.h>
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
|
|
|
|
server_t sv;
|
|
|
|
server_static_t svs;
|
|
|
|
|
|
|
|
char localmodels[MAX_MODELS][5]; // inline model names for precache
|
|
|
|
|
|
|
|
//============================================================================
|
|
|
|
|
2000-02-10 09:43:27 +00:00
|
|
|
/*
|
|
|
|
==================
|
|
|
|
SV_Shutdown
|
|
|
|
|
|
|
|
This only happens at the end of a game, not between levels
|
|
|
|
==================
|
|
|
|
*/
|
|
|
|
void SV_Shutdown(qboolean crash)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
int count;
|
|
|
|
sizebuf_t buf;
|
|
|
|
char message[4];
|
|
|
|
double start;
|
|
|
|
|
|
|
|
if (!sv.active)
|
|
|
|
return;
|
|
|
|
|
|
|
|
sv.active = false;
|
|
|
|
|
|
|
|
// stop all client sounds immediately
|
|
|
|
if (cls.state >= ca_connected)
|
|
|
|
CL_Disconnect ();
|
|
|
|
|
|
|
|
// flush any pending messages - like the score!!!
|
|
|
|
start = Sys_DoubleTime();
|
|
|
|
do
|
|
|
|
{
|
|
|
|
count = 0;
|
|
|
|
for (i=0, host_client = svs.clients ; i<svs.maxclients ; i++, host_client++)
|
|
|
|
{
|
|
|
|
if (host_client->active && host_client->message.cursize)
|
|
|
|
{
|
|
|
|
if (NET_CanSendMessage (host_client->netconnection))
|
|
|
|
{
|
|
|
|
NET_SendMessage(host_client->netconnection, &host_client->message);
|
|
|
|
SZ_Clear (&host_client->message);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
NET_GetMessage(host_client->netconnection);
|
|
|
|
count++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ((Sys_DoubleTime() - start) > 3.0)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
while (count);
|
|
|
|
|
|
|
|
// make sure all the clients know we're disconnecting
|
|
|
|
buf.data = message;
|
|
|
|
buf.maxsize = 4;
|
|
|
|
buf.cursize = 0;
|
|
|
|
MSG_WriteByte(&buf, svc_disconnect);
|
|
|
|
count = NET_SendToAll(&buf, 5);
|
|
|
|
if (count)
|
|
|
|
Con_Printf("SV_ShutdownServer: NET_SendToAll failed for %u clients\n", count);
|
|
|
|
|
|
|
|
for (i=0, host_client = svs.clients ; i<svs.maxclients ; i++, host_client++)
|
|
|
|
if (host_client->active)
|
|
|
|
SV_DropClient(crash);
|
|
|
|
|
|
|
|
//
|
|
|
|
// clear structures
|
|
|
|
//
|
|
|
|
memset (&sv, 0, sizeof(sv));
|
|
|
|
memset (svs.clients, 0, svs.maxclientslimit*sizeof(client_t));
|
|
|
|
}
|
2000-02-12 11:25:12 +00:00
|
|
|
/*
|
|
|
|
================
|
|
|
|
SV_Error
|
|
|
|
|
|
|
|
Sends a datagram to all the clients informing them of the server crash,
|
|
|
|
then exits
|
|
|
|
================
|
|
|
|
*/
|
|
|
|
void SV_Error (char *error, ...)
|
|
|
|
{
|
|
|
|
va_list argptr;
|
|
|
|
static char string[1024];
|
|
|
|
static qboolean inerror = false;
|
|
|
|
|
|
|
|
if (inerror)
|
|
|
|
Sys_Error ("SV_Error: recursively entered (%s)", string);
|
|
|
|
|
|
|
|
inerror = true;
|
|
|
|
|
|
|
|
va_start (argptr, error);
|
|
|
|
vsnprintf (string, sizeof(string), error, argptr);
|
|
|
|
va_end (argptr);
|
|
|
|
|
|
|
|
Con_Printf ("SV_Error: %s\n",string);
|
|
|
|
|
|
|
|
//SV_FinalMessage (va("server crashed: %s\n", string));
|
2000-03-19 15:59:51 +00:00
|
|
|
|
2000-02-12 11:25:12 +00:00
|
|
|
SV_Shutdown (false);//XXX
|
|
|
|
|
|
|
|
Sys_Error ("SV_Error: %s\n",string);
|
|
|
|
}
|
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
/*
|
|
|
|
===============
|
|
|
|
SV_Init
|
|
|
|
===============
|
|
|
|
*/
|
|
|
|
void SV_Init (void)
|
|
|
|
{
|
|
|
|
int i;
|
2000-02-27 07:13:32 +00:00
|
|
|
extern cvar_t *sv_maxvelocity;
|
|
|
|
extern cvar_t *sv_gravity;
|
|
|
|
extern cvar_t *sv_nostep;
|
|
|
|
extern cvar_t *sv_friction;
|
|
|
|
extern cvar_t *sv_edgefriction;
|
|
|
|
extern cvar_t *sv_stopspeed;
|
|
|
|
extern cvar_t *sv_maxspeed;
|
|
|
|
extern cvar_t *sv_accelerate;
|
|
|
|
extern cvar_t *sv_idealpitchscale;
|
|
|
|
extern cvar_t *sv_aim;
|
|
|
|
|
2000-05-02 09:45:22 +00:00
|
|
|
sv_maxvelocity = Cvar_Get ("sv_maxvelocity","2000",0,"None");
|
2000-02-27 07:13:32 +00:00
|
|
|
sv_gravity = Cvar_Get ("sv_gravity","800",
|
|
|
|
CVAR_USERINFO|CVAR_SERVERINFO,"None");
|
|
|
|
sv_friction = Cvar_Get ("sv_friction","4",
|
|
|
|
CVAR_USERINFO|CVAR_SERVERINFO,"None");
|
2000-05-06 23:03:45 +00:00
|
|
|
sv_edgefriction = Cvar_Get ("edgefriction","2",0,"None");
|
|
|
|
Cvar_Alias_Get("sv_edgefriction",sv_edgefriction);
|
2000-02-27 07:13:32 +00:00
|
|
|
sv_stopspeed = Cvar_Get ("sv_stopspeed","100",0,"None");
|
|
|
|
sv_maxspeed = Cvar_Get ("sv_maxspeed","320",
|
|
|
|
CVAR_USERINFO|CVAR_SERVERINFO,"None");
|
|
|
|
sv_accelerate = Cvar_Get ("sv_accelerate","10",0,"None");
|
|
|
|
sv_idealpitchscale = Cvar_Get ("sv_idealpitchscale","0.8",0,"None");
|
|
|
|
sv_aim = Cvar_Get ("sv_aim","0.93",0,"None");
|
|
|
|
sv_nostep = Cvar_Get ("sv_nostep","0",0,"None");
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
|
|
|
|
for (i=0 ; i<MAX_MODELS ; i++)
|
2000-01-05 00:05:48 +00:00
|
|
|
snprintf(localmodels[i], sizeof(localmodels[i]), "*%i", i);
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
=============================================================================
|
|
|
|
|
|
|
|
EVENT MESSAGES
|
|
|
|
|
|
|
|
=============================================================================
|
|
|
|
*/
|
|
|
|
|
2000-03-19 15:59:51 +00:00
|
|
|
/*
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
==================
|
|
|
|
SV_StartParticle
|
|
|
|
|
|
|
|
Make sure the event gets sent to all clients
|
|
|
|
==================
|
|
|
|
*/
|
|
|
|
void SV_StartParticle (vec3_t org, vec3_t dir, int color, int count)
|
|
|
|
{
|
|
|
|
int i, v;
|
|
|
|
|
|
|
|
if (sv.datagram.cursize > MAX_DATAGRAM-16)
|
2000-03-19 15:59:51 +00:00
|
|
|
return;
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
MSG_WriteByte (&sv.datagram, svc_particle);
|
|
|
|
MSG_WriteCoord (&sv.datagram, org[0]);
|
|
|
|
MSG_WriteCoord (&sv.datagram, org[1]);
|
|
|
|
MSG_WriteCoord (&sv.datagram, org[2]);
|
|
|
|
for (i=0 ; i<3 ; i++)
|
|
|
|
{
|
|
|
|
v = dir[i]*16;
|
|
|
|
if (v > 127)
|
|
|
|
v = 127;
|
|
|
|
else if (v < -128)
|
|
|
|
v = -128;
|
|
|
|
MSG_WriteChar (&sv.datagram, v);
|
|
|
|
}
|
|
|
|
MSG_WriteByte (&sv.datagram, count);
|
|
|
|
MSG_WriteByte (&sv.datagram, color);
|
2000-03-19 15:59:51 +00:00
|
|
|
}
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
|
2000-03-19 15:59:51 +00:00
|
|
|
/*
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
==================
|
|
|
|
SV_StartSound
|
|
|
|
|
|
|
|
Each entity can have eight independant sound sources, like voice,
|
|
|
|
weapon, feet, etc.
|
|
|
|
|
|
|
|
Channel 0 is an auto-allocate channel, the others override anything
|
|
|
|
allready running on that entity/channel pair.
|
|
|
|
|
|
|
|
An attenuation of 0 will play full volume everywhere in the level.
|
|
|
|
Larger attenuations will drop off. (max 4 attenuation)
|
|
|
|
|
|
|
|
==================
|
2000-03-19 15:59:51 +00:00
|
|
|
*/
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
void SV_StartSound (edict_t *entity, int channel, char *sample, int volume,
|
|
|
|
float attenuation)
|
2000-03-19 15:59:51 +00:00
|
|
|
{
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
int sound_num;
|
|
|
|
int field_mask;
|
|
|
|
int i;
|
|
|
|
int ent;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
if (volume < 0 || volume > 255)
|
|
|
|
Sys_Error ("SV_StartSound: volume = %i", volume);
|
|
|
|
|
|
|
|
if (attenuation < 0 || attenuation > 4)
|
|
|
|
Sys_Error ("SV_StartSound: attenuation = %f", attenuation);
|
|
|
|
|
|
|
|
if (channel < 0 || channel > 7)
|
|
|
|
Sys_Error ("SV_StartSound: channel = %i", channel);
|
|
|
|
|
|
|
|
if (sv.datagram.cursize > MAX_DATAGRAM-16)
|
2000-03-19 15:59:51 +00:00
|
|
|
return;
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
|
|
|
|
// find precache number for sound
|
|
|
|
for (sound_num=1 ; sound_num<MAX_SOUNDS
|
|
|
|
&& sv.sound_precache[sound_num] ; sound_num++)
|
|
|
|
if (!strcmp(sample, sv.sound_precache[sound_num]))
|
|
|
|
break;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
if ( sound_num == MAX_SOUNDS || !sv.sound_precache[sound_num] )
|
|
|
|
{
|
|
|
|
Con_Printf ("SV_StartSound: %s not precacheed\n", sample);
|
|
|
|
return;
|
|
|
|
}
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
ent = NUM_FOR_EDICT(entity);
|
|
|
|
|
|
|
|
channel = (ent<<3) | channel;
|
|
|
|
|
|
|
|
field_mask = 0;
|
|
|
|
if (volume != DEFAULT_SOUND_PACKET_VOLUME)
|
|
|
|
field_mask |= SND_VOLUME;
|
|
|
|
if (attenuation != DEFAULT_SOUND_PACKET_ATTENUATION)
|
|
|
|
field_mask |= SND_ATTENUATION;
|
|
|
|
|
|
|
|
// directed messages go only to the entity the are targeted on
|
|
|
|
MSG_WriteByte (&sv.datagram, svc_sound);
|
|
|
|
MSG_WriteByte (&sv.datagram, field_mask);
|
|
|
|
if (field_mask & SND_VOLUME)
|
|
|
|
MSG_WriteByte (&sv.datagram, volume);
|
|
|
|
if (field_mask & SND_ATTENUATION)
|
|
|
|
MSG_WriteByte (&sv.datagram, attenuation*64);
|
|
|
|
MSG_WriteShort (&sv.datagram, channel);
|
|
|
|
MSG_WriteByte (&sv.datagram, sound_num);
|
|
|
|
for (i=0 ; i<3 ; i++)
|
|
|
|
MSG_WriteCoord (&sv.datagram, entity->v.origin[i]+0.5*(entity->v.mins[i]+entity->v.maxs[i]));
|
2000-03-19 15:59:51 +00:00
|
|
|
}
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
==============================================================================
|
|
|
|
|
|
|
|
CLIENT SPAWNING
|
|
|
|
|
|
|
|
==============================================================================
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
================
|
|
|
|
SV_SendServerinfo
|
|
|
|
|
|
|
|
Sends the first message from the server to a connected client.
|
|
|
|
This will be sent on the initial connection and upon each server load.
|
|
|
|
================
|
|
|
|
*/
|
|
|
|
void SV_SendServerinfo (client_t *client)
|
|
|
|
{
|
|
|
|
char **s;
|
|
|
|
char message[2048];
|
|
|
|
|
|
|
|
MSG_WriteByte (&client->message, svc_print);
|
2000-01-05 00:05:48 +00:00
|
|
|
snprintf(message, sizeof(message), "%c\nVERSION %s SERVER (%i CRC)", 2, VERSION, pr_crc);
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
MSG_WriteString (&client->message,message);
|
|
|
|
|
|
|
|
MSG_WriteByte (&client->message, svc_serverinfo);
|
|
|
|
MSG_WriteLong (&client->message, PROTOCOL_VERSION);
|
|
|
|
MSG_WriteByte (&client->message, svs.maxclients);
|
|
|
|
|
2000-02-27 07:13:32 +00:00
|
|
|
if (!coop->value && deathmatch->value)
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
MSG_WriteByte (&client->message, GAME_DEATHMATCH);
|
|
|
|
else
|
|
|
|
MSG_WriteByte (&client->message, GAME_COOP);
|
|
|
|
|
2000-01-05 00:05:48 +00:00
|
|
|
snprintf(message, sizeof(message), pr_strings+sv.edicts->v.message);
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
|
|
|
|
MSG_WriteString (&client->message,message);
|
|
|
|
|
|
|
|
for (s = sv.model_precache+1 ; *s ; s++)
|
|
|
|
MSG_WriteString (&client->message, *s);
|
|
|
|
MSG_WriteByte (&client->message, 0);
|
|
|
|
|
|
|
|
for (s = sv.sound_precache+1 ; *s ; s++)
|
|
|
|
MSG_WriteString (&client->message, *s);
|
|
|
|
MSG_WriteByte (&client->message, 0);
|
|
|
|
|
|
|
|
// send music
|
|
|
|
MSG_WriteByte (&client->message, svc_cdtrack);
|
|
|
|
MSG_WriteByte (&client->message, sv.edicts->v.sounds);
|
|
|
|
MSG_WriteByte (&client->message, sv.edicts->v.sounds);
|
|
|
|
|
2000-03-19 15:59:51 +00:00
|
|
|
// set view
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
MSG_WriteByte (&client->message, svc_setview);
|
|
|
|
MSG_WriteShort (&client->message, NUM_FOR_EDICT(client->edict));
|
|
|
|
|
|
|
|
MSG_WriteByte (&client->message, svc_signonnum);
|
|
|
|
MSG_WriteByte (&client->message, 1);
|
|
|
|
|
|
|
|
client->sendsignon = true;
|
|
|
|
client->spawned = false; // need prespawn, spawn, etc
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
================
|
|
|
|
SV_ConnectClient
|
|
|
|
|
|
|
|
Initializes a client_t for a new net connection. This will only be called
|
|
|
|
once for a player each game, not once for each level change.
|
|
|
|
================
|
|
|
|
*/
|
|
|
|
void SV_ConnectClient (int clientnum)
|
|
|
|
{
|
|
|
|
edict_t *ent;
|
|
|
|
client_t *client;
|
|
|
|
int edictnum;
|
|
|
|
struct qsocket_s *netconnection;
|
|
|
|
int i;
|
|
|
|
float spawn_parms[NUM_SPAWN_PARMS];
|
|
|
|
|
|
|
|
client = svs.clients + clientnum;
|
|
|
|
|
|
|
|
Con_DPrintf ("Client %s connected\n", client->netconnection->address);
|
|
|
|
|
|
|
|
edictnum = clientnum+1;
|
|
|
|
|
|
|
|
ent = EDICT_NUM(edictnum);
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
// set up the client_t
|
|
|
|
netconnection = client->netconnection;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
if (sv.loadgame)
|
|
|
|
memcpy (spawn_parms, client->spawn_parms, sizeof(spawn_parms));
|
|
|
|
memset (client, 0, sizeof(*client));
|
|
|
|
client->netconnection = netconnection;
|
|
|
|
|
|
|
|
strcpy (client->name, "unconnected");
|
|
|
|
client->active = true;
|
|
|
|
client->spawned = false;
|
|
|
|
client->edict = ent;
|
|
|
|
client->message.data = client->msgbuf;
|
|
|
|
client->message.maxsize = sizeof(client->msgbuf);
|
|
|
|
client->message.allowoverflow = true; // we can catch it
|
|
|
|
|
2000-03-19 15:59:51 +00:00
|
|
|
client->privileged = false;
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
|
|
|
|
if (sv.loadgame)
|
|
|
|
memcpy (client->spawn_parms, spawn_parms, sizeof(spawn_parms));
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// call the progs to get default spawn parms for the new client
|
|
|
|
PR_ExecuteProgram (pr_global_struct->SetNewParms);
|
|
|
|
for (i=0 ; i<NUM_SPAWN_PARMS ; i++)
|
|
|
|
client->spawn_parms[i] = (&pr_global_struct->parm1)[i];
|
|
|
|
}
|
|
|
|
|
|
|
|
SV_SendServerinfo (client);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
===================
|
|
|
|
SV_CheckForNewClients
|
|
|
|
|
|
|
|
===================
|
|
|
|
*/
|
|
|
|
void SV_CheckForNewClients (void)
|
|
|
|
{
|
|
|
|
struct qsocket_s *ret;
|
|
|
|
int i;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
//
|
|
|
|
// check for new connections
|
|
|
|
//
|
|
|
|
while (1)
|
|
|
|
{
|
|
|
|
ret = NET_CheckNewConnections ();
|
|
|
|
if (!ret)
|
|
|
|
break;
|
|
|
|
|
2000-03-19 15:59:51 +00:00
|
|
|
//
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
// init a new client structure
|
2000-03-19 15:59:51 +00:00
|
|
|
//
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
for (i=0 ; i<svs.maxclients ; i++)
|
|
|
|
if (!svs.clients[i].active)
|
|
|
|
break;
|
|
|
|
if (i == svs.maxclients)
|
|
|
|
Sys_Error ("Host_CheckForNewClients: no free clients");
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
svs.clients[i].netconnection = ret;
|
2000-03-19 15:59:51 +00:00
|
|
|
SV_ConnectClient (i);
|
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
net_activeconnections++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
===============================================================================
|
|
|
|
|
|
|
|
FRAME UPDATES
|
|
|
|
|
|
|
|
===============================================================================
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
==================
|
|
|
|
SV_ClearDatagram
|
|
|
|
|
|
|
|
==================
|
|
|
|
*/
|
|
|
|
void SV_ClearDatagram (void)
|
|
|
|
{
|
|
|
|
SZ_Clear (&sv.datagram);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
=============================================================================
|
|
|
|
|
|
|
|
The PVS must include a small area around the client to allow head bobbing
|
|
|
|
or other small motion on the client side. Otherwise, a bob might cause an
|
|
|
|
entity that should be visible to not show up, especially when the bob
|
|
|
|
crosses a waterline.
|
|
|
|
|
|
|
|
=============================================================================
|
|
|
|
*/
|
|
|
|
|
|
|
|
int fatbytes;
|
|
|
|
byte fatpvs[MAX_MAP_LEAFS/8];
|
|
|
|
|
|
|
|
void SV_AddToFatPVS (vec3_t org, mnode_t *node)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
byte *pvs;
|
|
|
|
mplane_t *plane;
|
|
|
|
float d;
|
|
|
|
|
|
|
|
while (1)
|
|
|
|
{
|
|
|
|
// if this is a leaf, accumulate the pvs bits
|
|
|
|
if (node->contents < 0)
|
|
|
|
{
|
|
|
|
if (node->contents != CONTENTS_SOLID)
|
|
|
|
{
|
|
|
|
pvs = Mod_LeafPVS ( (mleaf_t *)node, sv.worldmodel);
|
|
|
|
for (i=0 ; i<fatbytes ; i++)
|
|
|
|
fatpvs[i] |= pvs[i];
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
plane = node->plane;
|
|
|
|
d = DotProduct (org, plane->normal) - plane->dist;
|
|
|
|
if (d > 8)
|
|
|
|
node = node->children[0];
|
|
|
|
else if (d < -8)
|
|
|
|
node = node->children[1];
|
|
|
|
else
|
|
|
|
{ // go down both
|
|
|
|
SV_AddToFatPVS (org, node->children[0]);
|
|
|
|
node = node->children[1];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
=============
|
|
|
|
SV_FatPVS
|
|
|
|
|
|
|
|
Calculates a PVS that is the inclusive or of all leafs within 8 pixels of the
|
|
|
|
given point.
|
|
|
|
=============
|
|
|
|
*/
|
|
|
|
byte *SV_FatPVS (vec3_t org)
|
|
|
|
{
|
|
|
|
fatbytes = (sv.worldmodel->numleafs+31)>>3;
|
|
|
|
Q_memset (fatpvs, 0, fatbytes);
|
|
|
|
SV_AddToFatPVS (org, sv.worldmodel->nodes);
|
|
|
|
return fatpvs;
|
|
|
|
}
|
|
|
|
|
|
|
|
//=============================================================================
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
=============
|
|
|
|
SV_WriteEntitiesToClient
|
|
|
|
|
|
|
|
=============
|
|
|
|
*/
|
|
|
|
void SV_WriteEntitiesToClient (edict_t *clent, sizebuf_t *msg)
|
|
|
|
{
|
|
|
|
int e, i;
|
|
|
|
int bits;
|
|
|
|
byte *pvs;
|
|
|
|
vec3_t org;
|
|
|
|
float miss;
|
|
|
|
edict_t *ent;
|
|
|
|
|
|
|
|
// find the client's PVS
|
|
|
|
VectorAdd (clent->v.origin, clent->v.view_ofs, org);
|
|
|
|
pvs = SV_FatPVS (org);
|
|
|
|
|
|
|
|
// send over all entities (excpet the client) that touch the pvs
|
|
|
|
ent = NEXT_EDICT(sv.edicts);
|
|
|
|
for (e=1 ; e<sv.num_edicts ; e++, ent = NEXT_EDICT(ent))
|
|
|
|
{
|
|
|
|
#ifdef QUAKE2
|
|
|
|
// don't send if flagged for NODRAW and there are no lighting effects
|
|
|
|
if (ent->v.effects == EF_NODRAW)
|
|
|
|
continue;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// ignore if not touching a PV leaf
|
|
|
|
if (ent != clent) // clent is ALLWAYS sent
|
|
|
|
{
|
|
|
|
// ignore ents without visible models
|
|
|
|
if (!ent->v.modelindex || !pr_strings[ent->v.model])
|
|
|
|
continue;
|
|
|
|
|
|
|
|
for (i=0 ; i < ent->num_leafs ; i++)
|
|
|
|
if (pvs[ent->leafnums[i] >> 3] & (1 << (ent->leafnums[i]&7) ))
|
|
|
|
break;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
if (i == ent->num_leafs)
|
|
|
|
continue; // not visible
|
|
|
|
}
|
|
|
|
|
|
|
|
if (msg->maxsize - msg->cursize < 16)
|
|
|
|
{
|
|
|
|
Con_Printf ("packet overflow\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// send an update
|
|
|
|
bits = 0;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
for (i=0 ; i<3 ; i++)
|
|
|
|
{
|
|
|
|
miss = ent->v.origin[i] - ent->baseline.origin[i];
|
|
|
|
if ( miss < -0.1 || miss > 0.1 )
|
|
|
|
bits |= U_ORIGIN1<<i;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( ent->v.angles[0] != ent->baseline.angles[0] )
|
|
|
|
bits |= U_ANGLE1;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
if ( ent->v.angles[1] != ent->baseline.angles[1] )
|
|
|
|
bits |= U_ANGLE2;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
if ( ent->v.angles[2] != ent->baseline.angles[2] )
|
|
|
|
bits |= U_ANGLE3;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
if (ent->v.movetype == MOVETYPE_STEP)
|
|
|
|
bits |= U_NOLERP; // don't mess up the step animation
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
if (ent->baseline.colormap != ent->v.colormap)
|
|
|
|
bits |= U_COLORMAP;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
2000-01-29 18:46:26 +00:00
|
|
|
if (ent->baseline.skinnum != ent->v.skin)
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
bits |= U_SKIN;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
if (ent->baseline.frame != ent->v.frame)
|
|
|
|
bits |= U_FRAME;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
if (ent->baseline.effects != ent->v.effects)
|
|
|
|
bits |= U_EFFECTS;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
if (ent->baseline.modelindex != ent->v.modelindex)
|
|
|
|
bits |= U_MODEL;
|
|
|
|
|
|
|
|
if (e >= 256)
|
|
|
|
bits |= U_LONGENTITY;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
if (bits >= 256)
|
|
|
|
bits |= U_MOREBITS;
|
|
|
|
|
|
|
|
//
|
|
|
|
// write the message
|
|
|
|
//
|
|
|
|
MSG_WriteByte (msg,bits | U_SIGNAL);
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
if (bits & U_MOREBITS)
|
|
|
|
MSG_WriteByte (msg, bits>>8);
|
|
|
|
if (bits & U_LONGENTITY)
|
|
|
|
MSG_WriteShort (msg,e);
|
|
|
|
else
|
|
|
|
MSG_WriteByte (msg,e);
|
|
|
|
|
|
|
|
if (bits & U_MODEL)
|
|
|
|
MSG_WriteByte (msg, ent->v.modelindex);
|
|
|
|
if (bits & U_FRAME)
|
|
|
|
MSG_WriteByte (msg, ent->v.frame);
|
|
|
|
if (bits & U_COLORMAP)
|
|
|
|
MSG_WriteByte (msg, ent->v.colormap);
|
|
|
|
if (bits & U_SKIN)
|
|
|
|
MSG_WriteByte (msg, ent->v.skin);
|
|
|
|
if (bits & U_EFFECTS)
|
|
|
|
MSG_WriteByte (msg, ent->v.effects);
|
|
|
|
if (bits & U_ORIGIN1)
|
2000-03-19 15:59:51 +00:00
|
|
|
MSG_WriteCoord (msg, ent->v.origin[0]);
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
if (bits & U_ANGLE1)
|
|
|
|
MSG_WriteAngle(msg, ent->v.angles[0]);
|
|
|
|
if (bits & U_ORIGIN2)
|
|
|
|
MSG_WriteCoord (msg, ent->v.origin[1]);
|
|
|
|
if (bits & U_ANGLE2)
|
|
|
|
MSG_WriteAngle(msg, ent->v.angles[1]);
|
|
|
|
if (bits & U_ORIGIN3)
|
|
|
|
MSG_WriteCoord (msg, ent->v.origin[2]);
|
|
|
|
if (bits & U_ANGLE3)
|
|
|
|
MSG_WriteAngle(msg, ent->v.angles[2]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
=============
|
|
|
|
SV_CleanupEnts
|
|
|
|
|
|
|
|
=============
|
|
|
|
*/
|
|
|
|
void SV_CleanupEnts (void)
|
|
|
|
{
|
|
|
|
int e;
|
|
|
|
edict_t *ent;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
ent = NEXT_EDICT(sv.edicts);
|
|
|
|
for (e=1 ; e<sv.num_edicts ; e++, ent = NEXT_EDICT(ent))
|
|
|
|
{
|
|
|
|
ent->v.effects = (int)ent->v.effects & ~EF_MUZZLEFLASH;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
==================
|
|
|
|
SV_WriteClientdataToMessage
|
|
|
|
|
|
|
|
==================
|
|
|
|
*/
|
|
|
|
void SV_WriteClientdataToMessage (edict_t *ent, sizebuf_t *msg)
|
|
|
|
{
|
|
|
|
int bits;
|
|
|
|
int i;
|
|
|
|
edict_t *other;
|
|
|
|
int items;
|
|
|
|
#ifndef QUAKE2
|
|
|
|
eval_t *val;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
//
|
|
|
|
// send a damage message
|
|
|
|
//
|
|
|
|
if (ent->v.dmg_take || ent->v.dmg_save)
|
|
|
|
{
|
|
|
|
other = PROG_TO_EDICT(ent->v.dmg_inflictor);
|
|
|
|
MSG_WriteByte (msg, svc_damage);
|
|
|
|
MSG_WriteByte (msg, ent->v.dmg_save);
|
|
|
|
MSG_WriteByte (msg, ent->v.dmg_take);
|
|
|
|
for (i=0 ; i<3 ; i++)
|
|
|
|
MSG_WriteCoord (msg, other->v.origin[i] + 0.5*(other->v.mins[i] + other->v.maxs[i]));
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
ent->v.dmg_take = 0;
|
|
|
|
ent->v.dmg_save = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// send the current viewpos offset from the view entity
|
|
|
|
//
|
|
|
|
SV_SetIdealPitch (); // how much to look up / down ideally
|
|
|
|
|
|
|
|
// a fixangle might get lost in a dropped packet. Oh well.
|
|
|
|
if ( ent->v.fixangle )
|
|
|
|
{
|
|
|
|
MSG_WriteByte (msg, svc_setangle);
|
|
|
|
for (i=0 ; i < 3 ; i++)
|
|
|
|
MSG_WriteAngle (msg, ent->v.angles[i] );
|
|
|
|
ent->v.fixangle = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
bits = 0;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
if (ent->v.view_ofs[2] != DEFAULT_VIEWHEIGHT)
|
|
|
|
bits |= SU_VIEWHEIGHT;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
if (ent->v.idealpitch)
|
|
|
|
bits |= SU_IDEALPITCH;
|
|
|
|
|
|
|
|
// stuff the sigil bits into the high bits of items for sbar, or else
|
|
|
|
// mix in items2
|
|
|
|
#ifdef QUAKE2
|
|
|
|
items = (int)ent->v.items | ((int)ent->v.items2 << 23);
|
|
|
|
#else
|
|
|
|
val = GetEdictFieldValue(ent, "items2");
|
|
|
|
|
|
|
|
if (val)
|
|
|
|
items = (int)ent->v.items | ((int)val->_float << 23);
|
|
|
|
else
|
|
|
|
items = (int)ent->v.items | ((int)pr_global_struct->serverflags << 28);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
bits |= SU_ITEMS;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
if ( (int)ent->v.flags & FL_ONGROUND)
|
|
|
|
bits |= SU_ONGROUND;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
if ( ent->v.waterlevel >= 2)
|
|
|
|
bits |= SU_INWATER;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
for (i=0 ; i<3 ; i++)
|
|
|
|
{
|
|
|
|
if (ent->v.punchangle[i])
|
|
|
|
bits |= (SU_PUNCH1<<i);
|
|
|
|
if (ent->v.velocity[i])
|
|
|
|
bits |= (SU_VELOCITY1<<i);
|
|
|
|
}
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
if (ent->v.weaponframe)
|
|
|
|
bits |= SU_WEAPONFRAME;
|
|
|
|
|
|
|
|
if (ent->v.armorvalue)
|
|
|
|
bits |= SU_ARMOR;
|
|
|
|
|
|
|
|
// if (ent->v.weapon)
|
|
|
|
bits |= SU_WEAPON;
|
|
|
|
|
|
|
|
// send the data
|
|
|
|
|
|
|
|
MSG_WriteByte (msg, svc_clientdata);
|
|
|
|
MSG_WriteShort (msg, bits);
|
|
|
|
|
|
|
|
if (bits & SU_VIEWHEIGHT)
|
|
|
|
MSG_WriteChar (msg, ent->v.view_ofs[2]);
|
|
|
|
|
|
|
|
if (bits & SU_IDEALPITCH)
|
|
|
|
MSG_WriteChar (msg, ent->v.idealpitch);
|
|
|
|
|
|
|
|
for (i=0 ; i<3 ; i++)
|
|
|
|
{
|
|
|
|
if (bits & (SU_PUNCH1<<i))
|
|
|
|
MSG_WriteChar (msg, ent->v.punchangle[i]);
|
|
|
|
if (bits & (SU_VELOCITY1<<i))
|
|
|
|
MSG_WriteChar (msg, ent->v.velocity[i]/16);
|
|
|
|
}
|
|
|
|
|
|
|
|
// [always sent] if (bits & SU_ITEMS)
|
|
|
|
MSG_WriteLong (msg, items);
|
|
|
|
|
|
|
|
if (bits & SU_WEAPONFRAME)
|
|
|
|
MSG_WriteByte (msg, ent->v.weaponframe);
|
|
|
|
if (bits & SU_ARMOR)
|
|
|
|
MSG_WriteByte (msg, ent->v.armorvalue);
|
|
|
|
if (bits & SU_WEAPON)
|
|
|
|
MSG_WriteByte (msg, SV_ModelIndex(pr_strings+ent->v.weaponmodel));
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
MSG_WriteShort (msg, ent->v.health);
|
|
|
|
MSG_WriteByte (msg, ent->v.currentammo);
|
|
|
|
MSG_WriteByte (msg, ent->v.ammo_shells);
|
|
|
|
MSG_WriteByte (msg, ent->v.ammo_nails);
|
|
|
|
MSG_WriteByte (msg, ent->v.ammo_rockets);
|
|
|
|
MSG_WriteByte (msg, ent->v.ammo_cells);
|
|
|
|
|
|
|
|
if (standard_quake)
|
|
|
|
{
|
|
|
|
MSG_WriteByte (msg, ent->v.weapon);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
for(i=0;i<32;i++)
|
|
|
|
{
|
|
|
|
if ( ((int)ent->v.weapon) & (1<<i) )
|
|
|
|
{
|
|
|
|
MSG_WriteByte (msg, i);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
=======================
|
|
|
|
SV_SendClientDatagram
|
|
|
|
=======================
|
|
|
|
*/
|
|
|
|
qboolean SV_SendClientDatagram (client_t *client)
|
|
|
|
{
|
|
|
|
byte buf[MAX_DATAGRAM];
|
|
|
|
sizebuf_t msg;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
msg.data = buf;
|
|
|
|
msg.maxsize = sizeof(buf);
|
|
|
|
msg.cursize = 0;
|
|
|
|
|
|
|
|
MSG_WriteByte (&msg, svc_time);
|
|
|
|
MSG_WriteFloat (&msg, sv.time);
|
|
|
|
|
|
|
|
// add the client specific data to the datagram
|
|
|
|
SV_WriteClientdataToMessage (client->edict, &msg);
|
|
|
|
|
|
|
|
SV_WriteEntitiesToClient (client->edict, &msg);
|
|
|
|
|
|
|
|
// copy the server datagram if there is space
|
|
|
|
if (msg.cursize + sv.datagram.cursize < msg.maxsize)
|
|
|
|
SZ_Write (&msg, sv.datagram.data, sv.datagram.cursize);
|
|
|
|
|
|
|
|
// send the datagram
|
|
|
|
if (NET_SendUnreliableMessage (client->netconnection, &msg) == -1)
|
|
|
|
{
|
|
|
|
SV_DropClient (true);// if the message couldn't send, kick off
|
|
|
|
return false;
|
|
|
|
}
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
=======================
|
|
|
|
SV_UpdateToReliableMessages
|
|
|
|
=======================
|
|
|
|
*/
|
|
|
|
void SV_UpdateToReliableMessages (void)
|
|
|
|
{
|
|
|
|
int i, j;
|
|
|
|
client_t *client;
|
|
|
|
|
|
|
|
// check for changes to be sent over the reliable streams
|
|
|
|
for (i=0, host_client = svs.clients ; i<svs.maxclients ; i++, host_client++)
|
|
|
|
{
|
|
|
|
if (host_client->old_frags != host_client->edict->v.frags)
|
|
|
|
{
|
|
|
|
for (j=0, client = svs.clients ; j<svs.maxclients ; j++, client++)
|
|
|
|
{
|
|
|
|
if (!client->active)
|
|
|
|
continue;
|
|
|
|
MSG_WriteByte (&client->message, svc_updatefrags);
|
|
|
|
MSG_WriteByte (&client->message, i);
|
|
|
|
MSG_WriteShort (&client->message, host_client->edict->v.frags);
|
|
|
|
}
|
|
|
|
|
|
|
|
host_client->old_frags = host_client->edict->v.frags;
|
|
|
|
}
|
|
|
|
}
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
for (j=0, client = svs.clients ; j<svs.maxclients ; j++, client++)
|
|
|
|
{
|
|
|
|
if (!client->active)
|
|
|
|
continue;
|
|
|
|
SZ_Write (&client->message, sv.reliable_datagram.data, sv.reliable_datagram.cursize);
|
|
|
|
}
|
|
|
|
|
|
|
|
SZ_Clear (&sv.reliable_datagram);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
=======================
|
|
|
|
SV_SendNop
|
|
|
|
|
|
|
|
Send a nop message without trashing or sending the accumulated client
|
|
|
|
message buffer
|
|
|
|
=======================
|
|
|
|
*/
|
|
|
|
void SV_SendNop (client_t *client)
|
|
|
|
{
|
|
|
|
sizebuf_t msg;
|
|
|
|
byte buf[4];
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
msg.data = buf;
|
|
|
|
msg.maxsize = sizeof(buf);
|
|
|
|
msg.cursize = 0;
|
|
|
|
|
|
|
|
MSG_WriteChar (&msg, svc_nop);
|
|
|
|
|
|
|
|
if (NET_SendUnreliableMessage (client->netconnection, &msg) == -1)
|
|
|
|
SV_DropClient (true); // if the message couldn't send, kick off
|
|
|
|
client->last_message = realtime;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
=======================
|
|
|
|
SV_SendClientMessages
|
|
|
|
=======================
|
|
|
|
*/
|
|
|
|
void SV_SendClientMessages (void)
|
|
|
|
{
|
|
|
|
int i;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
// update frags, names, etc
|
|
|
|
SV_UpdateToReliableMessages ();
|
|
|
|
|
|
|
|
// build individual updates
|
|
|
|
for (i=0, host_client = svs.clients ; i<svs.maxclients ; i++, host_client++)
|
|
|
|
{
|
|
|
|
if (!host_client->active)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (host_client->spawned)
|
|
|
|
{
|
|
|
|
if (!SV_SendClientDatagram (host_client))
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// the player isn't totally in the game yet
|
|
|
|
// send small keepalive messages if too much time has passed
|
|
|
|
// send a full message when the next signon stage has been requested
|
2000-03-19 15:59:51 +00:00
|
|
|
// some other message data (name changes, etc) may accumulate
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
// between signon stages
|
|
|
|
if (!host_client->sendsignon)
|
|
|
|
{
|
|
|
|
if (realtime - host_client->last_message > 5)
|
|
|
|
SV_SendNop (host_client);
|
|
|
|
continue; // don't send out non-signon messages
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// check for an overflowed message. Should only happen
|
|
|
|
// on a very fucked up connection that backs up a lot, then
|
|
|
|
// changes level
|
|
|
|
if (host_client->message.overflowed)
|
|
|
|
{
|
|
|
|
SV_DropClient (true);
|
|
|
|
host_client->message.overflowed = false;
|
|
|
|
continue;
|
|
|
|
}
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
if (host_client->message.cursize || host_client->dropasap)
|
|
|
|
{
|
|
|
|
if (!NET_CanSendMessage (host_client->netconnection))
|
|
|
|
{
|
|
|
|
// I_Printf ("can't write\n");
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (host_client->dropasap)
|
|
|
|
SV_DropClient (false); // went to another level
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (NET_SendMessage (host_client->netconnection
|
|
|
|
, &host_client->message) == -1)
|
|
|
|
SV_DropClient (true); // if the message couldn't send, kick off
|
|
|
|
SZ_Clear (&host_client->message);
|
|
|
|
host_client->last_message = realtime;
|
|
|
|
host_client->sendsignon = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2000-03-19 15:59:51 +00:00
|
|
|
|
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
// clear muzzle flashes
|
|
|
|
SV_CleanupEnts ();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
==============================================================================
|
|
|
|
|
|
|
|
SERVER SPAWNING
|
|
|
|
|
|
|
|
==============================================================================
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
================
|
|
|
|
SV_ModelIndex
|
|
|
|
|
|
|
|
================
|
|
|
|
*/
|
|
|
|
int SV_ModelIndex (char *name)
|
|
|
|
{
|
|
|
|
int i;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
if (!name || !name[0])
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
for (i=0 ; i<MAX_MODELS && sv.model_precache[i] ; i++)
|
|
|
|
if (!strcmp(sv.model_precache[i], name))
|
|
|
|
return i;
|
|
|
|
if (i==MAX_MODELS || !sv.model_precache[i])
|
|
|
|
Sys_Error ("SV_ModelIndex: model %s not precached", name);
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
================
|
|
|
|
SV_CreateBaseline
|
|
|
|
|
|
|
|
================
|
|
|
|
*/
|
|
|
|
void SV_CreateBaseline (void)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
edict_t *svent;
|
2000-03-19 15:59:51 +00:00
|
|
|
int entnum;
|
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
for (entnum = 0; entnum < sv.num_edicts ; entnum++)
|
|
|
|
{
|
|
|
|
// get the current server version
|
|
|
|
svent = EDICT_NUM(entnum);
|
|
|
|
if (svent->free)
|
|
|
|
continue;
|
|
|
|
if (entnum > svs.maxclients && !svent->v.modelindex)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
//
|
|
|
|
// create entity baseline
|
|
|
|
//
|
|
|
|
VectorCopy (svent->v.origin, svent->baseline.origin);
|
|
|
|
VectorCopy (svent->v.angles, svent->baseline.angles);
|
|
|
|
svent->baseline.frame = svent->v.frame;
|
2000-01-29 18:46:26 +00:00
|
|
|
svent->baseline.skinnum = svent->v.skin;
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
if (entnum > 0 && entnum <= svs.maxclients)
|
|
|
|
{
|
|
|
|
svent->baseline.colormap = entnum;
|
|
|
|
svent->baseline.modelindex = SV_ModelIndex("progs/player.mdl");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
svent->baseline.colormap = 0;
|
|
|
|
svent->baseline.modelindex =
|
|
|
|
SV_ModelIndex(pr_strings + svent->v.model);
|
|
|
|
}
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
//
|
|
|
|
// add to the message
|
|
|
|
//
|
2000-03-19 15:59:51 +00:00
|
|
|
MSG_WriteByte (&sv.signon,svc_spawnbaseline);
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
MSG_WriteShort (&sv.signon,entnum);
|
|
|
|
|
|
|
|
MSG_WriteByte (&sv.signon, svent->baseline.modelindex);
|
|
|
|
MSG_WriteByte (&sv.signon, svent->baseline.frame);
|
|
|
|
MSG_WriteByte (&sv.signon, svent->baseline.colormap);
|
2000-01-29 18:46:26 +00:00
|
|
|
MSG_WriteByte (&sv.signon, svent->baseline.skinnum);
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
for (i=0 ; i<3 ; i++)
|
|
|
|
{
|
|
|
|
MSG_WriteCoord(&sv.signon, svent->baseline.origin[i]);
|
|
|
|
MSG_WriteAngle(&sv.signon, svent->baseline.angles[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
================
|
|
|
|
SV_SendReconnect
|
|
|
|
|
|
|
|
Tell all the clients that the server is changing levels
|
|
|
|
================
|
|
|
|
*/
|
|
|
|
void SV_SendReconnect (void)
|
|
|
|
{
|
|
|
|
char data[128];
|
|
|
|
sizebuf_t msg;
|
|
|
|
|
|
|
|
msg.data = data;
|
|
|
|
msg.cursize = 0;
|
|
|
|
msg.maxsize = sizeof(data);
|
|
|
|
|
|
|
|
MSG_WriteChar (&msg, svc_stufftext);
|
|
|
|
MSG_WriteString (&msg, "reconnect\n");
|
|
|
|
NET_SendToAll (&msg, 5);
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
if (cls.state != ca_dedicated)
|
|
|
|
#ifdef QUAKE2
|
|
|
|
Cbuf_InsertText ("reconnect\n");
|
|
|
|
#else
|
|
|
|
Cmd_ExecuteString ("reconnect\n", src_command);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
================
|
|
|
|
SV_SaveSpawnparms
|
|
|
|
|
|
|
|
Grabs the current state of each client for saving across the
|
|
|
|
transition to another level
|
|
|
|
================
|
|
|
|
*/
|
|
|
|
void SV_SaveSpawnparms (void)
|
|
|
|
{
|
|
|
|
int i, j;
|
|
|
|
|
|
|
|
svs.serverflags = pr_global_struct->serverflags;
|
|
|
|
|
|
|
|
for (i=0, host_client = svs.clients ; i<svs.maxclients ; i++, host_client++)
|
|
|
|
{
|
|
|
|
if (!host_client->active)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
// call the progs to get default spawn parms for the new client
|
|
|
|
pr_global_struct->self = EDICT_TO_PROG(host_client->edict);
|
|
|
|
PR_ExecuteProgram (pr_global_struct->SetChangeParms);
|
|
|
|
for (j=0 ; j<NUM_SPAWN_PARMS ; j++)
|
|
|
|
host_client->spawn_parms[j] = (&pr_global_struct->parm1)[j];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
================
|
|
|
|
SV_SpawnServer
|
|
|
|
|
|
|
|
This is called at the start of each level
|
|
|
|
================
|
|
|
|
*/
|
|
|
|
extern float scr_centertime_off;
|
|
|
|
|
|
|
|
#ifdef QUAKE2
|
|
|
|
void SV_SpawnServer (char *server, char *startspot)
|
|
|
|
#else
|
|
|
|
void SV_SpawnServer (char *server)
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
edict_t *ent;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
// let's not have any servers with no name
|
2000-02-27 07:13:32 +00:00
|
|
|
if (hostname->string[0] == 0)
|
2000-04-03 14:30:02 +00:00
|
|
|
Cvar_Set (hostname, "UNNAMED");
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
scr_centertime_off = 0;
|
|
|
|
|
|
|
|
Con_DPrintf ("SpawnServer: %s\n",server);
|
|
|
|
svs.changelevel_issued = false; // now safe to issue another
|
|
|
|
|
|
|
|
//
|
|
|
|
// tell all connected clients that we are going to a new level
|
|
|
|
//
|
|
|
|
if (sv.active)
|
|
|
|
{
|
|
|
|
SV_SendReconnect ();
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// make cvars consistant
|
|
|
|
//
|
2000-02-27 07:13:32 +00:00
|
|
|
if (coop->value)
|
|
|
|
deathmatch->value = 0;
|
|
|
|
current_skill = (int)(skill->value + 0.5);
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
if (current_skill < 0)
|
|
|
|
current_skill = 0;
|
|
|
|
if (current_skill > 3)
|
|
|
|
current_skill = 3;
|
|
|
|
|
2000-02-27 07:13:32 +00:00
|
|
|
skill->value = (float)current_skill;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
//
|
|
|
|
// set up the new server
|
|
|
|
//
|
|
|
|
Host_ClearMemory ();
|
|
|
|
|
|
|
|
memset (&sv, 0, sizeof(sv));
|
|
|
|
|
|
|
|
strcpy (sv.name, server);
|
|
|
|
#ifdef QUAKE2
|
|
|
|
if (startspot)
|
|
|
|
strcpy(sv.startspot, startspot);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// load progs to get entity field count
|
|
|
|
PR_LoadProgs ();
|
|
|
|
|
|
|
|
// allocate server memory
|
|
|
|
sv.max_edicts = MAX_EDICTS;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
sv.edicts = Hunk_AllocName (sv.max_edicts*pr_edict_size, "edicts");
|
|
|
|
|
|
|
|
sv.datagram.maxsize = sizeof(sv.datagram_buf);
|
|
|
|
sv.datagram.cursize = 0;
|
|
|
|
sv.datagram.data = sv.datagram_buf;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
sv.reliable_datagram.maxsize = sizeof(sv.reliable_datagram_buf);
|
|
|
|
sv.reliable_datagram.cursize = 0;
|
|
|
|
sv.reliable_datagram.data = sv.reliable_datagram_buf;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
sv.signon.maxsize = sizeof(sv.signon_buf);
|
|
|
|
sv.signon.cursize = 0;
|
|
|
|
sv.signon.data = sv.signon_buf;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
// leave slots at start for clients only
|
|
|
|
sv.num_edicts = svs.maxclients+1;
|
|
|
|
for (i=0 ; i<svs.maxclients ; i++)
|
|
|
|
{
|
|
|
|
ent = EDICT_NUM(i+1);
|
|
|
|
svs.clients[i].edict = ent;
|
|
|
|
}
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
sv.state = ss_loading;
|
|
|
|
sv.paused = false;
|
|
|
|
|
|
|
|
sv.time = 1.0;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
strcpy (sv.name, server);
|
2000-01-05 00:05:48 +00:00
|
|
|
snprintf(sv.modelname, sizeof(sv.modelname),"maps/%s.bsp", server);
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
sv.worldmodel = Mod_ForName (sv.modelname, false);
|
|
|
|
if (!sv.worldmodel)
|
|
|
|
{
|
|
|
|
Con_Printf ("Couldn't spawn server %s\n", sv.modelname);
|
|
|
|
sv.active = false;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
sv.models[1] = sv.worldmodel;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
//
|
|
|
|
// clear world interaction links
|
|
|
|
//
|
|
|
|
SV_ClearWorld ();
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
sv.sound_precache[0] = pr_strings;
|
|
|
|
|
|
|
|
sv.model_precache[0] = pr_strings;
|
|
|
|
sv.model_precache[1] = sv.modelname;
|
|
|
|
for (i=1 ; i<sv.worldmodel->numsubmodels ; i++)
|
|
|
|
{
|
|
|
|
sv.model_precache[1+i] = localmodels[i];
|
|
|
|
sv.models[i+1] = Mod_ForName (localmodels[i], false);
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// load the rest of the entities
|
2000-03-19 15:59:51 +00:00
|
|
|
//
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
ent = EDICT_NUM(0);
|
|
|
|
memset (&ent->v, 0, progs->entityfields * 4);
|
|
|
|
ent->free = false;
|
|
|
|
ent->v.model = sv.worldmodel->name - pr_strings;
|
|
|
|
ent->v.modelindex = 1; // world model
|
|
|
|
ent->v.solid = SOLID_BSP;
|
|
|
|
ent->v.movetype = MOVETYPE_PUSH;
|
|
|
|
|
2000-02-27 07:13:32 +00:00
|
|
|
if (coop->value)
|
|
|
|
pr_global_struct->coop = coop->value;
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
else
|
2000-02-27 07:13:32 +00:00
|
|
|
pr_global_struct->deathmatch = deathmatch->value;
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
|
|
|
|
pr_global_struct->mapname = sv.name - pr_strings;
|
|
|
|
#ifdef QUAKE2
|
|
|
|
pr_global_struct->startspot = sv.startspot - pr_strings;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// serverflags are for cross level information (sigils)
|
|
|
|
pr_global_struct->serverflags = svs.serverflags;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
ED_LoadFromFile (sv.worldmodel->entities);
|
|
|
|
|
|
|
|
sv.active = true;
|
|
|
|
|
|
|
|
// all setup is completed, any further precache statements are errors
|
|
|
|
sv.state = ss_active;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
// run two frames to allow everything to settle
|
|
|
|
host_frametime = 0.1;
|
|
|
|
SV_Physics ();
|
|
|
|
SV_Physics ();
|
|
|
|
|
|
|
|
// create a baseline for more efficient communications
|
|
|
|
SV_CreateBaseline ();
|
|
|
|
|
|
|
|
// send serverinfo to all connected clients
|
|
|
|
for (i=0,host_client = svs.clients ; i<svs.maxclients ; i++, host_client++)
|
|
|
|
if (host_client->active)
|
|
|
|
SV_SendServerinfo (host_client);
|
2000-03-19 15:59:51 +00:00
|
|
|
|
Created new subdir: uquake. Pick your favorite U word for the meaning --
Unchained, Ultimate, Ultra, Up Yours, Underworld, Underground, Unified,
Unity, etc. You know the drill.
This takes care of the "standalone" problem with the wrong name, and the
recent snafu with multiple developers working on the same files
simultaneously...expect me (and probably others) to start locking dirs when
updates are taking place.
And yes, this update is really as large as it looks. Software only at the
moment, but I will have the makefile updated to build the GL builds as
well.
1999-12-26 13:51:52 +00:00
|
|
|
Con_DPrintf ("Server spawned.\n");
|
|
|
|
}
|
|
|
|
|
2000-02-10 09:03:30 +00:00
|
|
|
/*
|
|
|
|
=================
|
|
|
|
SV_ClientPrintf
|
|
|
|
|
2000-03-19 15:59:51 +00:00
|
|
|
Sends text across to be displayed
|
2000-02-10 09:03:30 +00:00
|
|
|
FIXME: make this just a stuffed echo?
|
|
|
|
=================
|
|
|
|
*/
|
|
|
|
void SV_ClientPrintf (char *fmt, ...)
|
|
|
|
{
|
|
|
|
va_list argptr;
|
|
|
|
char string[1024];
|
2000-03-19 15:59:51 +00:00
|
|
|
|
2000-02-10 09:03:30 +00:00
|
|
|
va_start (argptr, fmt);
|
|
|
|
vsnprintf (string, sizeof(string), fmt, argptr);
|
|
|
|
va_end (argptr);
|
2000-03-19 15:59:51 +00:00
|
|
|
|
2000-02-10 09:03:30 +00:00
|
|
|
MSG_WriteByte (&host_client->message, svc_print);
|
|
|
|
MSG_WriteString (&host_client->message, string);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
=================
|
|
|
|
SV_BroadcastPrintf
|
|
|
|
|
|
|
|
Sends text to all active clients
|
|
|
|
=================
|
|
|
|
*/
|
|
|
|
void SV_BroadcastPrintf (char *fmt, ...)
|
|
|
|
{
|
|
|
|
va_list argptr;
|
|
|
|
char string[1024];
|
|
|
|
int i;
|
2000-03-19 15:59:51 +00:00
|
|
|
|
2000-02-10 09:03:30 +00:00
|
|
|
va_start (argptr, fmt);
|
|
|
|
vsnprintf (string, sizeof(string), fmt, argptr);
|
|
|
|
va_end (argptr);
|
2000-03-19 15:59:51 +00:00
|
|
|
|
2000-02-10 09:03:30 +00:00
|
|
|
for (i=0 ; i<svs.maxclients ; i++)
|
|
|
|
if (svs.clients[i].active && svs.clients[i].spawned)
|
|
|
|
{
|
|
|
|
MSG_WriteByte (&svs.clients[i].message, svc_print);
|
|
|
|
MSG_WriteString (&svs.clients[i].message, string);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
=====================
|
|
|
|
SV_DropClient
|
|
|
|
|
|
|
|
Called when the player is getting totally kicked off the host
|
|
|
|
if (crash = true), don't bother sending signofs
|
|
|
|
=====================
|
|
|
|
*/
|
|
|
|
void SV_DropClient (qboolean crash)
|
|
|
|
{
|
|
|
|
int saveSelf;
|
|
|
|
int i;
|
|
|
|
client_t *client;
|
|
|
|
|
|
|
|
if (!crash)
|
|
|
|
{
|
|
|
|
// send any final messages (don't check for errors)
|
|
|
|
if (NET_CanSendMessage (host_client->netconnection))
|
|
|
|
{
|
|
|
|
MSG_WriteByte (&host_client->message, svc_disconnect);
|
|
|
|
NET_SendMessage (host_client->netconnection, &host_client->message);
|
|
|
|
}
|
2000-03-19 15:59:51 +00:00
|
|
|
|
2000-02-10 09:03:30 +00:00
|
|
|
if (host_client->edict && host_client->spawned)
|
|
|
|
{
|
|
|
|
// call the prog function for removing a client
|
|
|
|
// this will set the body to a dead frame, among other things
|
|
|
|
saveSelf = pr_global_struct->self;
|
|
|
|
pr_global_struct->self = EDICT_TO_PROG(host_client->edict);
|
|
|
|
PR_ExecuteProgram (pr_global_struct->ClientDisconnect);
|
|
|
|
pr_global_struct->self = saveSelf;
|
|
|
|
}
|
|
|
|
|
|
|
|
Sys_Printf ("Client %s removed\n",host_client->name);
|
|
|
|
}
|
|
|
|
|
|
|
|
// break the net connection
|
|
|
|
NET_Close (host_client->netconnection);
|
|
|
|
host_client->netconnection = NULL;
|
|
|
|
|
|
|
|
// free the client (the body stays around)
|
|
|
|
host_client->active = false;
|
|
|
|
host_client->name[0] = 0;
|
|
|
|
host_client->old_frags = -999999;
|
|
|
|
net_activeconnections--;
|
|
|
|
|
|
|
|
// send notification to all clients
|
|
|
|
for (i=0, client = svs.clients ; i<svs.maxclients ; i++, client++)
|
|
|
|
{
|
|
|
|
if (!client->active)
|
|
|
|
continue;
|
|
|
|
MSG_WriteByte (&client->message, svc_updatename);
|
|
|
|
MSG_WriteByte (&client->message, host_client - svs.clients);
|
|
|
|
MSG_WriteString (&client->message, "");
|
|
|
|
MSG_WriteByte (&client->message, svc_updatefrags);
|
|
|
|
MSG_WriteByte (&client->message, host_client - svs.clients);
|
|
|
|
MSG_WriteShort (&client->message, 0);
|
|
|
|
MSG_WriteByte (&client->message, svc_updatecolors);
|
|
|
|
MSG_WriteByte (&client->message, host_client - svs.clients);
|
|
|
|
MSG_WriteByte (&client->message, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
==================
|
|
|
|
Host_ServerFrame
|
|
|
|
|
|
|
|
==================
|
|
|
|
*/
|
|
|
|
#ifdef FPS_20
|
|
|
|
|
|
|
|
void SV_FrameMain (void)
|
|
|
|
{
|
2000-03-19 15:59:51 +00:00
|
|
|
// run the world state
|
2000-02-10 09:03:30 +00:00
|
|
|
pr_global_struct->frametime = host_frametime;
|
|
|
|
|
|
|
|
// read client messages
|
|
|
|
SV_RunClients ();
|
2000-03-19 15:59:51 +00:00
|
|
|
|
2000-02-10 09:03:30 +00:00
|
|
|
// move things around and think
|
|
|
|
// always pause in single player if in console or menus
|
|
|
|
if (!sv.paused && (svs.maxclients > 1 || key_dest == key_game) )
|
|
|
|
SV_Physics ();
|
|
|
|
}
|
|
|
|
|
|
|
|
void SV_Frame (void)
|
|
|
|
{
|
|
|
|
float save_host_frametime;
|
|
|
|
float temp_host_frametime;
|
|
|
|
|
2000-03-19 15:59:51 +00:00
|
|
|
// run the world state
|
2000-02-10 09:03:30 +00:00
|
|
|
pr_global_struct->frametime = host_frametime;
|
|
|
|
|
|
|
|
// set the time and clear the general datagram
|
|
|
|
SV_ClearDatagram ();
|
2000-03-19 15:59:51 +00:00
|
|
|
|
2000-02-10 09:03:30 +00:00
|
|
|
// check for new clients
|
|
|
|
SV_CheckForNewClients ();
|
|
|
|
|
|
|
|
temp_host_frametime = save_host_frametime = host_frametime;
|
|
|
|
while(temp_host_frametime > (1.0/72.0))
|
|
|
|
{
|
|
|
|
if (temp_host_frametime > 0.05)
|
|
|
|
host_frametime = 0.05;
|
|
|
|
else
|
|
|
|
host_frametime = temp_host_frametime;
|
|
|
|
temp_host_frametime -= host_frametime;
|
|
|
|
SV_FrameMain ();
|
|
|
|
}
|
|
|
|
host_frametime = save_host_frametime;
|
|
|
|
|
|
|
|
// send all messages to the clients
|
|
|
|
SV_SendClientMessages ();
|
|
|
|
}
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
void SV_Frame (void)
|
|
|
|
{
|
2000-03-19 15:59:51 +00:00
|
|
|
// run the world state
|
2000-02-10 09:03:30 +00:00
|
|
|
pr_global_struct->frametime = host_frametime;
|
|
|
|
|
|
|
|
// set the time and clear the general datagram
|
|
|
|
SV_ClearDatagram ();
|
2000-03-19 15:59:51 +00:00
|
|
|
|
2000-02-10 09:03:30 +00:00
|
|
|
// check for new clients
|
|
|
|
SV_CheckForNewClients ();
|
|
|
|
|
|
|
|
// read client messages
|
|
|
|
SV_RunClients ();
|
2000-03-19 15:59:51 +00:00
|
|
|
|
2000-02-10 09:03:30 +00:00
|
|
|
// move things around and think
|
|
|
|
// always pause in single player if in console or menus
|
|
|
|
if (!sv.paused && (svs.maxclients > 1 || key_dest == key_game) )
|
|
|
|
SV_Physics ();
|
|
|
|
|
|
|
|
// send all messages to the clients
|
|
|
|
SV_SendClientMessages ();
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|