]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - sv_main.c
greatly improved pointfile command, it now shows a huge beam crosshair at the site...
[xonotic/darkplaces.git] / sv_main.c
index 8a4dc51c47b3fce0ba49029045b0550995747df9..53702fee3c01fb09e33d1f4ee3c14985340203a5 100644 (file)
--- a/sv_main.c
+++ b/sv_main.c
@@ -20,11 +20,13 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 // 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;
@@ -63,6 +65,7 @@ void SV_Init (void)
        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();
@@ -867,6 +870,7 @@ void SV_WriteEntitiesToClient (client_t *client, edict_t *clent, sizebuf_t *msg)
                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;
@@ -878,7 +882,6 @@ void SV_WriteEntitiesToClient (client_t *client, edict_t *clent, sizebuf_t *msg)
        eval_t *val;
        trace_t trace;
        model_t *model;
-       entity_frame_t entityframe;
        entity_state_t *s;
 
        if (client->sendsignon)
@@ -899,7 +902,7 @@ void SV_WriteEntitiesToClient (client_t *client, edict_t *clent, sizebuf_t *msg)
        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;
@@ -1162,7 +1165,7 @@ void SV_WriteEntitiesToClient (client_t *client, edict_t *clent, sizebuf_t *msg)
                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;
@@ -1181,8 +1184,8 @@ void SV_WriteEntitiesToClient (client_t *client, edict_t *clent, sizebuf_t *msg)
                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);
@@ -1385,13 +1388,13 @@ void SV_WriteClientdataToMessage (edict_t *ent, sizebuf_t *msg)
 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);
@@ -1533,7 +1536,7 @@ void SV_SendClientMessages (void)
                // changes level
                if (host_client->message.overflowed)
                {
-                       SV_DropClient (true);
+                       SV_DropClient (true); // overflowed
                        host_client->message.overflowed = false;
                        continue;
                }
@@ -1729,8 +1732,9 @@ extern float              scr_centertime_off;
 
 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)
@@ -1861,7 +1865,20 @@ void SV_SpawnServer (const char *server)
 // 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);