// sv_main.c -- server main program
#include "quakedef.h"
+#include "portals.h"
static cvar_t sv_cullentities_pvs = {0, "sv_cullentities_pvs", "0"}; // fast but loose
static cvar_t sv_cullentities_portal = {0, "sv_cullentities_portal", "0"}; // extremely accurate visibility checking, but too slow
static cvar_t sv_cullentities_trace = {0, "sv_cullentities_trace", "1"}; // tends to get false negatives, uses a timeout to keep entities visible a short time after becoming hidden
static cvar_t sv_cullentities_stats = {0, "sv_cullentities_stats", "0"};
+static cvar_t sv_entpatch = {0, "sv_entpatch", "1"};
server_t sv;
server_static_t svs;
Cvar_RegisterVariable (&sv_cullentities_portal);
Cvar_RegisterVariable (&sv_cullentities_trace);
Cvar_RegisterVariable (&sv_cullentities_stats);
+ Cvar_RegisterVariable (&sv_entpatch);
SV_Phys_Init();
SV_World_Init();
Con_Printf("client \"%s\" entities: %d total, %d visible, %d culled by: %d pvs %d portal %d trace\n", client->name, totalentities, visibleentities, culled_pvs + culled_portal + culled_trace, culled_pvs, culled_portal, culled_trace);
}
#else
+static entity_frame_t sv_writeentitiestoclient_entityframe;
void SV_WriteEntitiesToClient (client_t *client, edict_t *clent, sizebuf_t *msg)
{
int e, clentnum, flags, alpha, glowcolor, glowsize, scale, effects, modelindex;
eval_t *val;
trace_t trace;
model_t *model;
- entity_frame_t entityframe;
entity_state_t *s;
if (client->sendsignon)
if (e >= 128)
e -= 256;
testorigin[2] -= (float) e;
- EntityFrame_Clear(&entityframe, testorigin);
+ EntityFrame_Clear(&sv_writeentitiestoclient_entityframe, testorigin);
culled_pvs = 0;
culled_portal = 0;
if ((effects & EF_LOWPRECISION) && origin[0] >= -32768 && origin[1] >= -32768 && origin[2] >= -32768 && origin[0] <= 32767 && origin[1] <= 32767 && origin[2] <= 32767)
flags |= RENDER_LOWPRECISION;
- s = EntityFrame_NewEntity(&entityframe, e);
+ s = EntityFrame_NewEntity(&sv_writeentitiestoclient_entityframe, e);
// if we run out of space, abort
if (!s)
break;
s->glowcolor = glowcolor;
s->flags = flags;
}
- entityframe.framenum = ++client->entityframenumber;
- EntityFrame_Write(&client->entitydatabase, &entityframe, msg);
+ sv_writeentitiestoclient_entityframe.framenum = ++client->entityframenumber;
+ EntityFrame_Write(&client->entitydatabase, &sv_writeentitiestoclient_entityframe, msg);
if (sv_cullentities_stats.integer)
Con_Printf("client \"%s\" entities: %d total, %d visible, %d culled by: %d pvs %d portal %d trace\n", client->name, totalentities, visibleentities, culled_pvs + culled_portal + culled_trace, culled_pvs, culled_portal, culled_trace);
SV_SendClientDatagram
=======================
*/
+static qbyte sv_sendclientdatagram_buf[MAX_DATAGRAM]; // FIXME?
qboolean SV_SendClientDatagram (client_t *client)
{
- qbyte buf[MAX_DATAGRAM];
sizebuf_t msg;
- msg.data = buf;
- msg.maxsize = sizeof(buf);
+ msg.data = sv_sendclientdatagram_buf;
+ msg.maxsize = sizeof(sv_sendclientdatagram_buf);
msg.cursize = 0;
MSG_WriteByte (&msg, svc_time);
// changes level
if (host_client->message.overflowed)
{
- SV_DropClient (true);
+ SV_DropClient (true); // overflowed
host_client->message.overflowed = false;
continue;
}
void SV_SpawnServer (const char *server)
{
- edict_t *ent;
- int i;
+ edict_t *ent;
+ int i;
+ qbyte *entities;
// let's not have any servers with no name
if (hostname.string[0] == 0)
// serverflags are for cross level information (sigils)
pr_global_struct->serverflags = svs.serverflags;
- ED_LoadFromFile (sv.worldmodel->entities);
+ // load replacement entity file if found
+ entities = NULL;
+ if (sv_entpatch.integer)
+ entities = FS_LoadFile(va("maps/%s.ent", sv.name), true);
+ if (entities)
+ {
+ Con_Printf("Loaded maps/%s.ent\n", sv.name);
+ ED_LoadFromFile (entities);
+ Mem_Free(entities);
+ }
+ else
+ ED_LoadFromFile (sv.worldmodel->entities);
+
+
// LordHavoc: clear world angles (to fix e3m3.bsp)
VectorClear(sv.edicts->v->angles);