+
+
+
+/*
+int EntityState5_PriorityForChangedBits(int changedbits)
+{
+ if (changedbits & E5_ISACTIVE)
+ return 2;
+ else if (changedbits & (E5_FLAGS | E5_ATTACHMENT | E5_MODEL | E5_SKIN | E5_EXTERIORFORENTITY | E5_COLORMAP | E5_LIGHT | E5_GLOW | E5_EFFECTS | E5_ORIGIN | E5_ANGLES | E5_FRAME | E5_ALPHA | E5_SCALE))
+ return 1;
+ else
+ return 0;
+}
+
+void EntityState5_WriteUpdate(int number, entitystate_t *s, int changedbits, sizebuf_t *msg)
+{
+ bits = 0;
+ if (!s->active)
+ MSG_WriteShort(msg, number | 0x8000);
+ else
+ {
+ bits |= E5_ISACTIVE;
+ if (changedbits & E5_ORIGIN)
+ {
+ bits |= E5_ORIGIN;
+ if (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 (changedbits & E5_ANGLES)
+ {
+ bits |= E5_ANGLES;
+ if (!(s->flags & RENDERFLAGS_LOWPRECISION))
+ bits |= E5_ANGLES16;
+ }
+ if (changedbits & E5_MODEL)
+ {
+ bits |= E5_MODEL;
+ if (s->modelindex >= 256)
+ bits |= E5_MODEL16;
+ }
+ if (changedbits & E5_FRAME)
+ {
+ bits |= E5_FRAME;
+ if (s->frame >= 256)
+ bits |= E5_FRAME16;
+ }
+ if (changedbits & E5_SKIN)
+ bits |= E5_SKIN;
+ if (changedbits & E5_EFFECTS)
+ {
+ bits |= E5_EFFECTS;
+ if (s->modelindex >= 256)
+ bits |= E5_MODEL16;
+ }
+ if (changedbits & E5_FLAGS)
+ bits |= E5_FLAGS;
+ if (changedbits & E5_ALPHA)
+ bits |= E5_ALPHA;
+ if (changedbits & E5_SCALE)
+ bits |= E5_SCALE;
+ if (changedbits & E5_ATTACHMENT)
+ bits |= E5_ATTACHMENT;
+ if (changedbits & E5_EXTERIORFORENTITY)
+ bits |= E5_EXTERIORFORENTITY;
+ if (changedbits & E5_LIGHT)
+ bits |= E5_LIGHT;
+ if (changedbits & E5_COLORMAP)
+ bits |= E5_COLORMAP;
+ if (changedbits & E5_GLOW)
+ bits |= E5_GLOW;
+ if (bits >= 256)
+ bits |= E5_EXTEND1;
+ if (bits >= 65536)
+ bits |= E5_EXTEND2;
+ if (bits >= 16777216)
+ bits |= E5_EXTEND3;
+ MSG_WriteShort(msg, number);
+ MSG_WriteByte(msg, bits & 0xFF);
+ if (bits & E5_EXTEND1)
+ MSG_WriteByte(msg, (bits >> 8) & 0xFF);
+ if (bits & E5_EXTEND2)
+ MSG_WriteByte(msg, (bits >> 16) & 0xFF);
+ if (bits & E5_EXTEND3)
+ MSG_WriteByte(msg, (bits >> 24) & 0xFF);
+ if (bits & E5_FLAGS)
+ MSG_WriteByte(msg, s->flags);
+ if (bits & E5_ORIGIN)
+ {
+ if (bits & E5_ORIGIN32)
+ {
+ MSG_WriteFloat(msg, s->origin[0]);
+ MSG_WriteFloat(msg, s->origin[1]);
+ MSG_WriteFloat(msg, s->origin[2]);
+ }
+ else
+ {
+ MSG_WriteShort(msg, (int)floor(s->origin[0] * 8 + 0.5f));
+ MSG_WriteShort(msg, (int)floor(s->origin[1] * 8 + 0.5f));
+ MSG_WriteShort(msg, (int)floor(s->origin[2] * 8 + 0.5f));
+ }
+ }
+ if (bits & E5_ANGLES)
+ {
+ if (bits & E5_ANGLES16)
+ {
+ MSG_WriteShort(msg, (int)floor(s->angles[0] * (65536.0f / 360.0f) + 0.5f));
+ MSG_WriteShort(msg, (int)floor(s->angles[1] * (65536.0f / 360.0f) + 0.5f));
+ MSG_WriteShort(msg, (int)floor(s->angles[2] * (65536.0f / 360.0f) + 0.5f));
+ }
+ else
+ {
+ MSG_WriteByte(msg, (int)floor(s->angles[0] * (256.0f / 360.0f) + 0.5f));
+ MSG_WriteByte(msg, (int)floor(s->angles[1] * (256.0f / 360.0f) + 0.5f));
+ MSG_WriteByte(msg, (int)floor(s->angles[2] * (256.0f / 360.0f) + 0.5f));
+ }
+ }
+ if (bits & E5_MODEL)
+ {
+ if (bits & E5_MODEL16)
+ MSG_WriteShort(msg, s->modelindex);
+ else
+ MSG_WriteByte(msg, s->modelindex);
+ }
+ if (bits & E5_FRAME)
+ {
+ if (bits & E5_FRAME16)
+ MSG_WriteShort(msg, s->frame);
+ else
+ MSG_WriteByte(msg, s->frame);
+ }
+ if (bits & E5_SKIN)
+ MSG_WriteByte(msg, s->flags);
+ if (bits & E5_EFFECTS)
+ {
+ if (bits & E5_EFFECTS32)
+ MSG_WriteLong(msg, s->effects);
+ else if (bits & E5_EFFECTS16)
+ MSG_WriteShort(msg, s->effects);
+ else
+ MSG_WriteByte(msg, s->effects);
+ }
+ if (bits & E5_ALPHA)
+ MSG_WriteByte(msg, s->flags);
+ if (bits & E5_SCALE)
+ MSG_WriteByte(msg, s->flags);
+ if (bits & E5_ATTACHMENT)
+ {
+ MSG_WriteShort(msg, s->tagentity);
+ MSG_WriteByte(msg, s->tagindex);
+ }
+ if (bits & E5_EXTERIORFORENTITY)
+ MSG_WriteShort(msg, s->tagentity);
+ if (bits & E5_LIGHT)
+ {
+ MSG_WriteShort(msg, s->light[0]);
+ MSG_WriteShort(msg, s->light[1]);
+ MSG_WriteShort(msg, s->light[2]);
+ MSG_WriteShort(msg, s->light[3]);
+ }
+ if (bits & E5_COLORMAP)
+ MSG_WriteByte(msg, s->colormap);
+ if (bits & E5_GLOW)
+ {
+ MSG_WriteByte(msg, s->glowsize);
+ MSG_WriteByte(msg, s->glowcolor);
+ }
+ }
+}
+
+int EntityFrame5_ReadUpdate(void)
+{
+ number = MSG_ReadShort();
+ e = cl_entities + (number & 0x7FFF);
+ e->state_previous = e->state_current;
+ if (number & 0x8000)
+ {
+ if (number == 0x8000)
+ {
+ // end of entity list
+ return false;
+ }
+ // remove
+ number &= 0x7FFF;
+ e->state_current = defaultstate;
+ e->state_current.number = number;
+ return true;
+ }
+ else
+ {
+ }
+}
+
+int cl_entityframe5_lastreceivedframenum;
+
+void EntityFrame5_CL_ReadFrame(void)
+{
+ int n, enumber;
+ entity_t *ent;
+ entity_state_t *s;
+ // read the number of this frame to echo back in next input packet
+ cl_entityframe5_lastreceivedframenum = MSG_ReadLong();
+ // read entity numbers until we find a 0x8000
+ // (which would be remove world entity, but is actually a terminator)
+ while ((n = MSG_ReadShort()) != 0x8000)
+ {
+ // get the entity number and look it up
+ enumber = n & 0x7FFF;
+ ent = cl_entities + enumber;
+ // slide the current into the previous slot
+ ent->state_previous = ent->state_current;
+ // read the update
+ s = &ent->state_current;
+ if (n & 0x8000)
+ {
+ // remove entity
+ *s = defaultstate;
+ }
+ else
+ {
+ // update entity
+ s->active = true;
+ EntityState_ReadFields(s, EntityState_ReadExtendBits());
+ }
+ // set the cl_entities_active flag
+ cl_entities_active[enumber] = s->active;
+ // set the update time
+ s->time = cl.mtime[0];
+ // 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]);
+ // print extra messages if desired
+ if (developer_networkentities.integer >= 2 && cl_entities[enumber].state_current.active != cl_entities[enumber].state_previous.active)
+ {
+ if (cl_entities[enumber].state_current.active)
+ Con_Printf("entity #%i has become active\n", enumber);
+ else if (cl_entities[enumber].state_previous.active)
+ Con_Printf("entity #%i has become inactive\n", enumber);
+ }
+ }
+}
+
+#define ENTITYFRAME5_MAXPACKETLOGS 64
+#define ENTITYFRAME5_MAXSTATES 128
+
+typedef struct entityframe5_state_s
+{
+ unsigned short entitynumber;
+ qbyte active;
+ qbyte activedirtybit;
+ int dirtybits;
+}
+entityframe5_state_t;
+
+typedef struct entityframe5_packetlog_s
+{
+ int packetnumber;
+ int numstates;
+ entityframe5_state_t states[ENTITYFRAME5_MAXSTATES];
+}
+entityframe5_packetlog_t;
+
+typedef struct entityframe5_s
+{
+ int ackedframenum;
+ entityframe5_packetlog_t packetlog[ENTITYFRAME5_MAXPACKETLOGS];
+ qbyte activedirtybits[(MAX_EDICTS + 7) / 8];
+ int dirtybits[MAX_EDICTS];
+}
+entityframe5_t;
+
+void EntityFrame5_AckFrame(entityframe5_t *d, int framenum)
+{
+ int i, j, k, l, dirtybits, activedirtybit;
+ entityframe5_state_t *s, *s2;
+ entityframe5_packetlog_t *p, *p2;
+ if (framenum >= d->ackedframenum)
+ return;
+ d->ackedframenum = framenum;
+ // scan for packets made obsolete by this ack
+ for (i = 0, p = d->packetlog;i < ENTITYFRAME5_MAXPACKETLOGS;i++, p++)
+ {
+ // skip packets that are empty or in the future
+ if (p->packetnumber == 0 || p->packetnumber > framenum)
+ continue;
+ // if the packetnumber matches it is deleted without any processing
+ // (since it was received).
+ // if the packet number is less than this ack it was lost and its
+ // important information will be repeated in this update if it is not
+ // already obsolete due to a later update.
+ if (p->packetnumber < framenum)
+ {
+ // packet was lost - merge dirtybits into the main array so they
+ // will be re-sent, but only if there is no newer update of that
+ // bit in the logs (as those will arrive before this update)
+ for (j = 0, s = p->states;j < p->numstates;j++, s++)
+ {
+ activedirtybit = s->activedirtybit;
+ dirtybits = s->dirtybits;
+ // check for any newer updates to this entity
+ for (k = 0, p2 = d->packetlog;k < ENTITYFRAME5_MAXPACKETLOGS;k++, p2++)
+ {
+ if (p2->packetnumber > framenum)
+ {
+ for (l = 0, s2 = p2->states;l < p2->numstates;l++, p2++)
+ {
+ if (s2->entitynumber == s->entitynumber)
+ {
+ activedirtybit &= ~s2->activedirtybit;
+ dirtybits &= ~s2->dirtybits;
+ break;
+ }
+ }
+ if (!activedirtybit && !dirtybits)
+ break;
+ }
+ }
+ // if the bits haven't all been cleared, there were some bits
+ // lost with this packet, so set them again now
+ if (activedirtybit)
+ d->activedirtybits[s->entitynumber / 8] |= 1 << (s->entitynumber & 7);
+ if (dirtybits)
+ d->dirtybits[s->entitynumber] |= dirtybits;
+ }
+ }
+ // delete this packet log as it is now obsolete
+ p->packetnumber = 0;
+ }
+}
+
+void EntityFrame5_WriteFrame(sizebuf_t *msg, int numstates, entity_state_t *states)
+{
+}
+*/
+