]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - sv_main.c
fix for misparsing of sound length in "data" chunk of WAVE, this should fix stereo...
[xonotic/darkplaces.git] / sv_main.c
index ba3d483b093c26213f2780ee608eba1fc8c13763..d8c47b0d5e7f3d4b6161d5259598ba55f294864c 100644 (file)
--- a/sv_main.c
+++ b/sv_main.c
@@ -246,7 +246,7 @@ void SV_SendServerinfo (client_t *client)
        MSG_WriteString (&client->message,message);
 
        MSG_WriteByte (&client->message, svc_serverinfo);
-       MSG_WriteLong (&client->message, DPPROTOCOL_VERSION2);
+       MSG_WriteLong (&client->message, DPPROTOCOL_VERSION3);
        MSG_WriteByte (&client->message, svs.maxclients);
 
        if (!coop.integer && deathmatch.integer)
@@ -333,10 +333,14 @@ void SV_ConnectClient (int clientnum)
                        client->spawn_parms[i] = (&pr_global_struct->parm1)[i];
        }
 
+#if NOROUTINGFIX
+       SV_SendServerinfo (client);
+#else
        // send serverinfo on first nop
        client->waitingforconnect = true;
        client->sendsignon = true;
        client->spawned = false;                // need prespawn, spawn, etc
+#endif
 }
 
 
@@ -409,12 +413,12 @@ crosses a waterline.
 */
 
 int            fatbytes;
-byte   fatpvs[MAX_MAP_LEAFS/8];
+qbyte  fatpvs[MAX_MAP_LEAFS/8];
 
 void SV_AddToFatPVS (vec3_t org, mnode_t *node)
 {
        int             i;
-       byte    *pvs;
+       qbyte   *pvs;
        mplane_t        *plane;
        float   d;
 
@@ -454,7 +458,7 @@ Calculates a PVS that is the inclusive or of all leafs within 8 pixels of the
 given point.
 =============
 */
-byte *SV_FatPVS (vec3_t org)
+qbyte *SV_FatPVS (vec3_t org)
 {
        fatbytes = (sv.worldmodel->numleafs+31)>>3;
        memset (fatpvs, 0, fatbytes);
@@ -465,7 +469,7 @@ byte *SV_FatPVS (vec3_t org)
 //=============================================================================
 
 
-int SV_BoxTouchingPVS (byte *pvs, vec3_t mins, vec3_t maxs, mnode_t *node)
+int SV_BoxTouchingPVS (qbyte *pvs, vec3_t mins, vec3_t maxs, mnode_t *node)
 {
        int leafnum;
 loc0:
@@ -510,7 +514,7 @@ void SV_WriteEntitiesToClient (client_t *client, edict_t *clent, sizebuf_t *msg)
 {
        int e, clentnum, bits, alpha, glowcolor, glowsize, scale, effects;
        int culled_pvs, culled_portal, culled_trace, visibleentities, totalentities;
-       byte *pvs;
+       qbyte *pvs;
        vec3_t org, origin, angles, entmins, entmaxs;
        float nextfullupdate;
        edict_t *ent;
@@ -680,7 +684,25 @@ void SV_WriteEntitiesToClient (client_t *client, edict_t *clent, sizebuf_t *msg)
                                        client->visibletime[e] = realtime + 1;
                                else
                                {
-                                       if (realtime > client->visibletime[e])
+                                       //test nearest point on bbox
+                                       testorigin[0] = bound(entmins[0], org[0], entmaxs[0]);
+                                       testorigin[1] = bound(entmins[1], org[1], entmaxs[1]);
+                                       testorigin[2] = bound(entmins[2], org[2], entmaxs[2]);
+
+                                       memset (&trace, 0, sizeof(trace_t));
+                                       trace.fraction = 1;
+                                       trace.allsolid = true;
+                                       VectorCopy(testorigin, trace.endpos);
+
+                                       VectorCopy(org, RecursiveHullCheckInfo.start);
+                                       VectorSubtract(testorigin, testeye, RecursiveHullCheckInfo.dist);
+                                       RecursiveHullCheckInfo.hull = sv.worldmodel->hulls;
+                                       RecursiveHullCheckInfo.trace = &trace;
+                                       SV_RecursiveHullCheck (sv.worldmodel->hulls->firstclipnode, 0, 1, testeye, testorigin);
+
+                                       if (trace.fraction == 1)
+                                               client->visibletime[e] = realtime + 1;
+                                       else if (realtime > client->visibletime[e])
                                        {
                                                culled_trace++;
                                                continue;
@@ -787,8 +809,8 @@ void SV_WriteEntitiesToClient (client_t *client, edict_t *clent, sizebuf_t *msg)
                if (((int)(angles[0]*(256.0/360.0)) & 255) != ((int)(baseline->angles[0]*(256.0/360.0)) & 255)) bits |= U_ANGLE1;
                if (((int)(angles[1]*(256.0/360.0)) & 255) != ((int)(baseline->angles[1]*(256.0/360.0)) & 255)) bits |= U_ANGLE2;
                if (((int)(angles[2]*(256.0/360.0)) & 255) != ((int)(baseline->angles[2]*(256.0/360.0)) & 255)) bits |= U_ANGLE3;
-               if (baseline->colormap != (byte) ent->v.colormap)                                                               bits |= U_COLORMAP;
-               if (baseline->skin != (byte) ent->v.skin)                                                                               bits |= U_SKIN;
+               if (baseline->colormap != (qbyte) ent->v.colormap)                                                              bits |= U_COLORMAP;
+               if (baseline->skin != (qbyte) ent->v.skin)                                                                              bits |= U_SKIN;
                if ((baseline->frame & 0x00FF) != ((int) ent->v.frame & 0x00FF))                                bits |= U_FRAME;
                if ((baseline->effects & 0x00FF) != ((int) ent->v.effects & 0x00FF))                    bits |= U_EFFECTS;
                if ((baseline->modelindex & 0x00FF) != ((int) ent->v.modelindex & 0x00FF))              bits |= U_MODEL;
@@ -868,7 +890,7 @@ void SV_WriteEntitiesToClient (client_t *client, edict_t *clent, sizebuf_t *msg)
 {
        int e, clentnum, flags, alpha, glowcolor, glowsize, scale, effects;
        int culled_pvs, culled_portal, culled_trace, visibleentities, totalentities;
-       byte *pvs;
+       qbyte *pvs;
        vec3_t org, origin, angles, entmins, entmaxs;
        edict_t *ent;
        eval_t *val;
@@ -1091,6 +1113,9 @@ void SV_WriteEntitiesToClient (client_t *client, edict_t *clent, sizebuf_t *msg)
 
                if (ent->v.movetype == MOVETYPE_STEP)
                        flags |= RENDER_STEP;
+               // don't send an entity if it's coordinates would wrap around
+               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);
                // if we run out of space, abort
@@ -1147,7 +1172,7 @@ void SV_WriteClientdataToMessage (edict_t *ent, sizebuf_t *msg)
        int             items;
        eval_t  *val;
        vec3_t  punchvector;
-       byte    viewzoom;
+       qbyte   viewzoom;
 
 //
 // send a damage message
@@ -1317,7 +1342,7 @@ SV_SendClientDatagram
 */
 qboolean SV_SendClientDatagram (client_t *client)
 {
-       byte            buf[MAX_DATAGRAM];
+       qbyte           buf[MAX_DATAGRAM];
        sizebuf_t       msg;
 
        msg.data = buf;
@@ -1327,7 +1352,7 @@ qboolean SV_SendClientDatagram (client_t *client)
        MSG_WriteByte (&msg, svc_time);
        MSG_WriteFloat (&msg, sv.time);
 
-       if (!client->waitingforconnect)
+       if (client->spawned)
        {
                // add the client specific data to the datagram
                SV_WriteClientdataToMessage (client->edict, &msg);
@@ -1399,7 +1424,7 @@ message buffer
 void SV_SendNop (client_t *client)
 {
        sizebuf_t       msg;
-       byte            buf[4];
+       qbyte           buf[4];
 
        msg.data = buf;
        msg.maxsize = sizeof(buf);
@@ -1430,11 +1455,13 @@ void SV_SendClientMessages (void)
                if (!host_client->active)
                        continue;
 
+#ifndef NOROUTINGFIX
                if (host_client->sendserverinfo)
                {
                        host_client->sendserverinfo = false;
                        SV_SendServerinfo (host_client);
                }
+#endif
 
                if (host_client->spawned)
                {
@@ -1791,6 +1818,7 @@ void SV_SpawnServer (char *server)
 // run two frames to allow everything to settle
        sv.frametime = pr_global_struct->frametime = host_frametime = 0.1;
        SV_Physics ();
+       sv.frametime = pr_global_struct->frametime = host_frametime = 0.1;
        SV_Physics ();
 
        Mod_PurgeUnused();