]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - sv_main.c
you can now (try to) play in maps you don't have, and models you don't have are shown...
[xonotic/darkplaces.git] / sv_main.c
index 00fb05819c92674998f43b42610125150d146083..0a5b5bdf8c500f8de57c1d204f52d538106b5d40 100644 (file)
--- a/sv_main.c
+++ b/sv_main.c
@@ -36,6 +36,7 @@ static mempool_t *sv_edicts_mempool = NULL;
 //============================================================================
 
 extern void SV_Phys_Init (void);
+extern void SV_World_Init (void);
 
 /*
 ===============
@@ -64,6 +65,7 @@ void SV_Init (void)
        Cvar_RegisterVariable (&sv_cullentities_stats);
 
        SV_Phys_Init();
+       SV_World_Init();
 
        for (i = 0;i < MAX_MODELS;i++)
                sprintf (localmodels[i], "*%i", i);
@@ -520,7 +522,7 @@ void SV_WriteEntitiesToClient (client_t *client, edict_t *clent, sizebuf_t *msg)
        int culled_pvs, culled_portal, culled_trace, visibleentities, totalentities;
        qbyte *pvs;
        vec3_t origin, angles, entmins, entmaxs, testorigin, testeye;
-       float nextfullupdate;
+       float nextfullupdate, alphaf;
        edict_t *ent;
        eval_t *val;
        entity_state_t *baseline; // LordHavoc: delta or startup baseline
@@ -532,13 +534,6 @@ void SV_WriteEntitiesToClient (client_t *client, edict_t *clent, sizebuf_t *msg)
 // find the client's PVS
        VectorAdd (clent->v.origin, clent->v.view_ofs, testeye);
        pvs = SV_FatPVS (testeye);
-       /*
-       // dp protocol
-       MSG_WriteByte(msg, svc_playerposition);
-       MSG_WriteFloat(msg, testeye[0]);
-       MSG_WriteFloat(msg, testeye[1]);
-       MSG_WriteFloat(msg, testeye[2]);
-       */
 
        culled_pvs = 0;
        culled_portal = 0;
@@ -695,23 +690,23 @@ void SV_WriteEntitiesToClient (client_t *client, edict_t *clent, sizebuf_t *msg)
                        visibleentities++;
                }
 
-               alpha = 255;
+               alphaf = 255.0f;
                scale = 16;
                glowcolor = 254;
                effects = ent->v.effects;
 
                if ((val = GETEDICTFIELDVALUE(ent, eval_alpha)))
                if (val->_float != 0)
-                       alpha = (int) (val->_float * 255.0);
+                       alphaf = val->_float * 255.0f;
 
                // HalfLife support
                if ((val = GETEDICTFIELDVALUE(ent, eval_renderamt)))
                if (val->_float != 0)
-                       alpha = (int) val->_float;
+                       alphaf = val->_float;
 
-               if (alpha == 0)
-                       alpha = 255;
-               alpha = bound(0, alpha, 255);
+               if (alphaf == 0.0f)
+                       alphaf = 255.0f;
+               alpha = bound(0, alphaf, 255);
 
                if ((val = GETEDICTFIELDVALUE(ent, eval_scale)))
                if ((scale = (int) (val->_float * 16.0)) == 0) scale = 16;
@@ -783,9 +778,6 @@ void SV_WriteEntitiesToClient (client_t *client, edict_t *clent, sizebuf_t *msg)
                        bits |= U_STEP;
 
                // LordHavoc: old stuff, but rewritten to have more exact tolerances
-//             if ((int)(origin[0]*8.0) != (int)(baseline->origin[0]*8.0))                                             bits |= U_ORIGIN1;
-//             if ((int)(origin[1]*8.0) != (int)(baseline->origin[1]*8.0))                                             bits |= U_ORIGIN2;
-//             if ((int)(origin[2]*8.0) != (int)(baseline->origin[2]*8.0))                                             bits |= U_ORIGIN3;
                if (origin[0] != baseline->origin[0])                                                                                   bits |= U_ORIGIN1;
                if (origin[1] != baseline->origin[1])                                                                                   bits |= U_ORIGIN2;
                if (origin[2] != baseline->origin[2])                                                                                   bits |= U_ORIGIN3;
@@ -873,6 +865,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;
+       float alphaf;
        qbyte *pvs;
        vec3_t origin, angles, entmins, entmaxs, testorigin, testeye;
        edict_t *ent;
@@ -888,9 +881,19 @@ void SV_WriteEntitiesToClient (client_t *client, edict_t *clent, sizebuf_t *msg)
        Mod_CheckLoaded(sv.worldmodel);
 
 // find the client's PVS
+       // the real place being tested from
        VectorAdd (clent->v.origin, clent->v.view_ofs, testeye);
        pvs = SV_FatPVS (testeye);
-       EntityFrame_Clear(&entityframe, testeye);
+
+       // the place being reported (to consider the fact the client still
+       // applies the view_ofs[2], so we have to only send the fractional part
+       // of view_ofs[2], undoing what the client will redo)
+       VectorCopy (testeye, testorigin);
+       e = (int) clent->v.view_ofs[2] & 255;
+       if (e >= 128)
+               e -= 256;
+       testorigin[2] -= (float) e;
+       EntityFrame_Clear(&entityframe, testorigin);
 
        culled_pvs = 0;
        culled_portal = 0;
@@ -1033,23 +1036,23 @@ void SV_WriteEntitiesToClient (client_t *client, edict_t *clent, sizebuf_t *msg)
                        visibleentities++;
                }
 
-               alpha = 255;
+               alphaf = 255.0f;
                scale = 16;
                glowcolor = 254;
                effects = ent->v.effects;
 
                if ((val = GETEDICTFIELDVALUE(ent, eval_alpha)))
                if (val->_float != 0)
-                       alpha = (int) (val->_float * 255.0);
+                       alphaf = val->_float * 255.0;
 
                // HalfLife support
                if ((val = GETEDICTFIELDVALUE(ent, eval_renderamt)))
                if (val->_float != 0)
-                       alpha = (int) val->_float;
+                       alphaf = val->_float;
 
-               if (alpha == 0)
-                       alpha = 255;
-               alpha = bound(0, alpha, 255);
+               if (alphaf == 0.0f)
+                       alphaf = 255.0f;
+               alpha = bound(0, alphaf, 255);
 
                if ((val = GETEDICTFIELDVALUE(ent, eval_scale)))
                if ((scale = (int) (val->_float * 16.0)) == 0) scale = 16;
@@ -1094,6 +1097,8 @@ void SV_WriteEntitiesToClient (client_t *client, edict_t *clent, sizebuf_t *msg)
                        break;
                VectorCopy(origin, s->origin);
                VectorCopy(angles, s->angles);
+               if (ent->v.colormap >= 1024)
+                       flags |= RENDER_COLORMAPPED;
                s->colormap = ent->v.colormap;
                s->skin = ent->v.skin;
                s->frame = ent->v.frame;
@@ -1177,7 +1182,7 @@ void SV_WriteClientdataToMessage (edict_t *ent, sizebuf_t *msg)
 
        bits = 0;
 
-       //if (ent->v.view_ofs[2] != DEFAULT_VIEWHEIGHT)
+       if (ent->v.view_ofs[2] != DEFAULT_VIEWHEIGHT)
                bits |= SU_VIEWHEIGHT;
 
        if (ent->v.idealpitch)
@@ -1235,8 +1240,7 @@ void SV_WriteClientdataToMessage (edict_t *ent, sizebuf_t *msg)
        if (ent->v.armorvalue)
                bits |= SU_ARMOR;
 
-//     if (ent->v.weapon)
-               bits |= SU_WEAPON;
+       bits |= SU_WEAPON;
 
        if (bits >= 65536)
                bits |= SU_EXTEND1;
@@ -1253,8 +1257,7 @@ void SV_WriteClientdataToMessage (edict_t *ent, sizebuf_t *msg)
                MSG_WriteByte(msg, bits >> 24);
 
        if (bits & SU_VIEWHEIGHT)
-               //MSG_WriteChar (msg, ent->v.view_ofs[2]);
-               MSG_WriteChar (msg, 0);
+               MSG_WriteChar (msg, ent->v.view_ofs[2]);
 
        if (bits & SU_IDEALPITCH)
                MSG_WriteChar (msg, ent->v.idealpitch);
@@ -1467,10 +1470,7 @@ void SV_SendClientMessages (void)
                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
@@ -1559,7 +1559,7 @@ void SV_CreateBaseline (void)
                else
                {
                        svent->baseline.colormap = 0;
-                       svent->baseline.modelindex = svent->v.modelindex; //SV_ModelIndex(pr_strings + svent->v.model);
+                       svent->baseline.modelindex = svent->v.modelindex;
                }
 
                large = false;
@@ -1806,3 +1806,4 @@ void SV_SpawnServer (char *server)
 
        Con_DPrintf ("Server spawned.\n");
 }
+