]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - protocol.c
added DP_SV_MODELFLAGS_AS_EFFECTS extension, this adds EF_ROCKET and
[xonotic/darkplaces.git] / protocol.c
index 8b4d2b9ab823999ebd63592ea757344a54f66ce2..aa40970e1e18b8cf76f58693562ccc73c3adf3c7 100644 (file)
@@ -35,8 +35,9 @@ entity_state_t defaultstate =
        0,//unsigned char flags;
        0,//unsigned char tagindex;
        {32, 32, 32},//unsigned char colormod[3];
+       0,//unsigned char internaleffects; // INTEF_FLAG1QW and so on
        // padding to a multiple of 8 bytes (to align the double time)
-       {0,0}//unsigned char unused[2]; // !
+       0//unsigned char unused; // !
 };
 
 // LordHavoc: I own protocol ranges 96, 97, 3500-3599
@@ -1794,7 +1795,7 @@ void EntityState5_WriteUpdate(int number, const entity_state_t *s, int changedbi
        else
        {
                bits = changedbits;
-               if ((bits & E5_ORIGIN) && !(s->flags & RENDER_EXTERIORMODEL) && (s->origin[0] < -4096 || s->origin[0] >= 4096 || s->origin[1] < -4096 || s->origin[1] >= 4096 || s->origin[2] < -4096 || s->origin[2] >= 4096))
+               if ((bits & E5_ORIGIN) && ((s->flags & RENDER_EXTERIORMODEL) || s->origin[0] < -4096 || s->origin[0] >= 4096 || s->origin[1] < -4096 || s->origin[1] >= 4096 || s->origin[2] < -4096 || s->origin[2] >= 4096))
                        bits |= E5_ORIGIN32;
                if ((bits & E5_ANGLES) && !(s->flags & RENDER_LOWPRECISION))
                        bits |= E5_ANGLES16;
@@ -1804,9 +1805,9 @@ void EntityState5_WriteUpdate(int number, const entity_state_t *s, int changedbi
                        bits |= E5_FRAME16;
                if (bits & E5_EFFECTS)
                {
-                       if (s->effects >= 65536)
+                       if (s->effects & 0xFFFF0000)
                                bits |= E5_EFFECTS32;
-                       else if (s->effects >= 256)
+                       else if (s->effects & 0xFFFFFF00)
                                bits |= E5_EFFECTS16;
                }
                if (bits >= 256)
@@ -2428,43 +2429,43 @@ void EntityFrame5_WriteFrame(sizebuf_t *msg, entityframe5_database_t *d, int num
 }
 
 
-static int QW_TranslateEffects(int qweffects, int number)
+static void QW_TranslateEffects(entity_state_t *s, int qweffects)
 {
-       int effects = 0;
+       s->effects = 0;
+       s->internaleffects = 0;
        if (qweffects & QW_EF_BRIGHTFIELD)
-               effects |= EF_BRIGHTFIELD;
+               s->effects |= EF_BRIGHTFIELD;
        if (qweffects & QW_EF_MUZZLEFLASH)
-               effects |= EF_MUZZLEFLASH;
+               s->effects |= EF_MUZZLEFLASH;
        if (qweffects & QW_EF_FLAG1)
        {
                // mimic FTEQW's interpretation of EF_FLAG1 as EF_NODRAW on non-player entities
-               if (number > cl.maxclients)
-                       effects |= EF_NODRAW;
+               if (s->number > cl.maxclients)
+                       s->effects |= EF_NODRAW;
                else
-                       effects |= EF_FLAG1QW;
+                       s->internaleffects |= INTEF_FLAG1QW;
        }
        if (qweffects & QW_EF_FLAG2)
        {
                // mimic FTEQW's interpretation of EF_FLAG2 as EF_ADDITIVE on non-player entities
-               if (number > cl.maxclients)
-                       effects |= EF_ADDITIVE;
+               if (s->number > cl.maxclients)
+                       s->effects |= EF_ADDITIVE;
                else
-                       effects |= EF_FLAG2QW;
+                       s->internaleffects |= INTEF_FLAG2QW;
        }
        if (qweffects & QW_EF_RED)
        {
                if (qweffects & QW_EF_BLUE)
-                       effects |= EF_RED | EF_BLUE;
+                       s->effects |= EF_RED | EF_BLUE;
                else
-                       effects |= EF_RED;
+                       s->effects |= EF_RED;
        }
        else if (qweffects & QW_EF_BLUE)
-               effects |= EF_BLUE;
+               s->effects |= EF_BLUE;
        else if (qweffects & QW_EF_BRIGHTLIGHT)
-               effects |= EF_BRIGHTLIGHT;
+               s->effects |= EF_BRIGHTLIGHT;
        else if (qweffects & QW_EF_DIMLIGHT)
-               effects |= EF_DIMLIGHT;
-       return effects;
+               s->effects |= EF_DIMLIGHT;
 }
 
 void EntityStateQW_ReadPlayerUpdate(void)
@@ -2488,6 +2489,7 @@ void EntityStateQW_ReadPlayerUpdate(void)
        s = &ent->state_current;
        *s = defaultstate;
        s->active = true;
+       s->number = enumber;
        s->colormap = enumber;
        playerflags = MSG_ReadShort();
        MSG_ReadVector(s->origin, cls.protocol);
@@ -2540,7 +2542,7 @@ void EntityStateQW_ReadPlayerUpdate(void)
        if (playerflags & QW_PF_SKINNUM)
                s->skin = MSG_ReadByte();
        if (playerflags & QW_PF_EFFECTS)
-               s->effects = QW_TranslateEffects(MSG_ReadByte(), enumber);
+               QW_TranslateEffects(s, MSG_ReadByte());
        if (playerflags & QW_PF_WEAPONFRAME)
                weaponframe = MSG_ReadByte();
        else
@@ -2592,8 +2594,6 @@ void EntityStateQW_ReadPlayerUpdate(void)
        cl.entities_active[enumber] = s->active;
        // set the update time
        s->time = cl.mtime[0] - msec * 0.001; // qw has no clock
-       // fix the number (it gets wiped occasionally by copying from defaultstate)
-       s->number = enumber;
        // check if we need to update the lerp stuff
        if (s->active)
                CL_MoveLerpEntityStates(&cl.entities[enumber]);
@@ -2619,7 +2619,7 @@ static void EntityStateQW_ReadEntityUpdate(entity_state_t *s, int bits)
        if (bits & QW_U_SKIN)
                s->skin = MSG_ReadByte();
        if (bits & QW_U_EFFECTS)
-               s->effects = QW_TranslateEffects(qweffects = MSG_ReadByte(), s->number);
+               QW_TranslateEffects(s, qweffects = MSG_ReadByte());
        if (bits & QW_U_ORIGIN1)
                s->origin[0] = MSG_ReadCoord13i();
        if (bits & QW_U_ANGLE1)