X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=protocol.c;h=034b11fe57f543a0aefb913ca1df7c4ccf0c1888;hb=da0612b4ffbcdd7552c9b2cbb510f1ecd6da1e97;hp=8367824d98eb3514d0f75060413b6c5a6a715731;hpb=eca922f8d360b2f8022bf6ccbec2f19cf5250eb2;p=xonotic%2Fdarkplaces.git diff --git a/protocol.c b/protocol.c index 8367824d..034b11fe 100644 --- a/protocol.c +++ b/protocol.c @@ -1,7 +1,7 @@ #include "quakedef.h" -// this is 80 bytes +// this is 88 bytes (must match entity_state_t in protocol.h) entity_state_t defaultstate = { // ! means this is not sent to client @@ -10,6 +10,7 @@ entity_state_t defaultstate = {0,0,0},//float angles[3]; 0,//int number; // entity number this state is for 0,//int effects; + 0,//unsigned int customizeentityforclient; // ! 0,//unsigned short modelindex; 0,//unsigned short frame; 0,//unsigned short tagentity; @@ -32,12 +33,12 @@ entity_state_t defaultstate = 0,//unsigned char tagindex; {32, 32, 32},//unsigned char colormod[3]; // padding to a multiple of 8 bytes (to align the double time) - {0,0}//unsigned char unused[2]; // ! + {0,0,0,0,0,0}//unsigned char unused[6]; // ! }; // LordHavoc: I own protocol ranges 96, 97, 3500-3599 -struct +struct protocolversioninfo_s { int number; const char *name; @@ -63,7 +64,7 @@ protocolversion_t Protocol_EnumForName(const char *s) int i; for (i = 1;protocolversioninfo[i].name;i++) if (!strcasecmp(s, protocolversioninfo[i].name)) - return i; + return (protocolversion_t)i; return PROTOCOL_UNKNOWN; } @@ -77,7 +78,7 @@ protocolversion_t Protocol_EnumForNumber(int n) int i; for (i = 1;protocolversioninfo[i].name;i++) if (protocolversioninfo[i].number == n) - return i; + return (protocolversion_t)i; return PROTOCOL_UNKNOWN; } @@ -102,7 +103,7 @@ void Protocol_Names(char *buffer, size_t buffersize) // keep track of quake entities because they need to be killed if they get stale int cl_lastquakeentity = 0; -qbyte cl_isquakeentity[MAX_EDICTS]; +unsigned char cl_isquakeentity[MAX_EDICTS]; void EntityFrameQuake_ReadEntity(int bits) { @@ -125,9 +126,9 @@ void EntityFrameQuake_ReadEntity(int bits) num = MSG_ReadByte (); if (num >= MAX_EDICTS) - Host_Error("EntityFrameQuake_ReadEntity: entity number (%i) >= MAX_EDICTS (%i)\n", num, MAX_EDICTS); + Host_Error("EntityFrameQuake_ReadEntity: entity number (%i) >= MAX_EDICTS (%i)", num, MAX_EDICTS); if (num < 1) - Host_Error("EntityFrameQuake_ReadEntity: invalid entity number (%i)\n", num); + Host_Error("EntityFrameQuake_ReadEntity: invalid entity number (%i)", num); if (cl_num_entities <= num) { @@ -172,7 +173,7 @@ void EntityFrameQuake_ReadEntity(int bits) if (bits & U_EFFECTS2) s.effects = (s.effects & 0x00FF) | (MSG_ReadByte() << 8); if (bits & U_GLOWSIZE) s.glowsize = MSG_ReadByte(); if (bits & U_GLOWCOLOR) s.glowcolor = MSG_ReadByte(); - if (bits & U_COLORMOD) {int c = MSG_ReadByte();s.colormod[0] = (qbyte)(((c >> 5) & 7) * (32.0f / 7.0f));s.colormod[1] = (qbyte)(((c >> 2) & 7) * (32.0f / 7.0f));s.colormod[2] = (qbyte)((c & 3) * (32.0f / 3.0f));} + if (bits & U_COLORMOD) {int c = MSG_ReadByte();s.colormod[0] = (unsigned char)(((c >> 5) & 7) * (32.0f / 7.0f));s.colormod[1] = (unsigned char)(((c >> 2) & 7) * (32.0f / 7.0f));s.colormod[2] = (unsigned char)((c & 3) * (32.0f / 3.0f));} if (bits & U_GLOWTRAIL) s.flags |= RENDER_GLOWTRAIL; if (bits & U_FRAME2) s.frame = (s.frame & 0x00FF) | (MSG_ReadByte() << 8); if (bits & U_MODEL2) s.modelindex = (s.modelindex & 0x00FF) | (MSG_ReadByte() << 8); @@ -208,7 +209,7 @@ void EntityFrameQuake_ReadEntity(int bits) } if (msg_badread) - Host_Error("EntityFrameQuake_ReadEntity: read error\n"); + Host_Error("EntityFrameQuake_ReadEntity: read error"); } void EntityFrameQuake_ISeeDeadEntities(void) @@ -244,7 +245,7 @@ void EntityFrameQuake_WriteFrame(sizebuf_t *msg, int numstates, const entity_sta entity_state_t baseline; int i, bits; sizebuf_t buf; - qbyte data[128]; + unsigned char data[128]; // prepare the buffer memset(&buf, 0, sizeof(buf)); @@ -270,7 +271,7 @@ void EntityFrameQuake_WriteFrame(sizebuf_t *msg, int numstates, const entity_sta bits |= U_EXTERIORMODEL; // LordHavoc: old stuff, but rewritten to have more exact tolerances - baseline = sv.edicts[s->number].e->baseline; + baseline = prog->edicts[s->number].priv.server->baseline; if (baseline.origin[0] != s->origin[0]) bits |= U_ORIGIN1; if (baseline.origin[1] != s->origin[1]) @@ -397,11 +398,11 @@ int EntityState_DeltaBits(const entity_state_t *o, const entity_state_t *n) bits |= E_ORIGIN2; if (fabs(n->origin[2] - o->origin[2]) > (1.0f / 256.0f)) bits |= E_ORIGIN3; - if ((qbyte) (n->angles[0] * (256.0f / 360.0f)) != (qbyte) (o->angles[0] * (256.0f / 360.0f))) + if ((unsigned char) (n->angles[0] * (256.0f / 360.0f)) != (unsigned char) (o->angles[0] * (256.0f / 360.0f))) bits |= E_ANGLE1; - if ((qbyte) (n->angles[1] * (256.0f / 360.0f)) != (qbyte) (o->angles[1] * (256.0f / 360.0f))) + if ((unsigned char) (n->angles[1] * (256.0f / 360.0f)) != (unsigned char) (o->angles[1] * (256.0f / 360.0f))) bits |= E_ANGLE2; - if ((qbyte) (n->angles[2] * (256.0f / 360.0f)) != (qbyte) (o->angles[2] * (256.0f / 360.0f))) + if ((unsigned char) (n->angles[2] * (256.0f / 360.0f)) != (unsigned char) (o->angles[2] * (256.0f / 360.0f))) bits |= E_ANGLE3; if ((n->modelindex ^ o->modelindex) & 0x00FF) bits |= E_MODEL1; @@ -639,23 +640,23 @@ void EntityState_ReadFields(entity_state_t *e, unsigned int bits) e->origin[2] = MSG_ReadCoord32f(); } } - if ((cl.protocol == PROTOCOL_DARKPLACES1 || cl.protocol == PROTOCOL_DARKPLACES2 || cl.protocol == PROTOCOL_DARKPLACES3 || cl.protocol == PROTOCOL_DARKPLACES4) && (e->flags & RENDER_LOWPRECISION)) + if ((cl.protocol == PROTOCOL_DARKPLACES5 || cl.protocol == PROTOCOL_DARKPLACES6) && !(e->flags & RENDER_LOWPRECISION)) { if (bits & E_ANGLE1) - e->angles[0] = MSG_ReadAngle8i(); + e->angles[0] = MSG_ReadAngle16i(); if (bits & E_ANGLE2) - e->angles[1] = MSG_ReadAngle8i(); + e->angles[1] = MSG_ReadAngle16i(); if (bits & E_ANGLE3) - e->angles[2] = MSG_ReadAngle8i(); + e->angles[2] = MSG_ReadAngle16i(); } else { if (bits & E_ANGLE1) - e->angles[0] = MSG_ReadAngle16i(); + e->angles[0] = MSG_ReadAngle8i(); if (bits & E_ANGLE2) - e->angles[1] = MSG_ReadAngle16i(); + e->angles[1] = MSG_ReadAngle8i(); if (bits & E_ANGLE3) - e->angles[2] = MSG_ReadAngle16i(); + e->angles[2] = MSG_ReadAngle8i(); } if (bits & E_MODEL1) e->modelindex = (e->modelindex & 0xFF00) | (unsigned int) MSG_ReadByte(); @@ -754,7 +755,7 @@ void EntityState_ReadFields(entity_state_t *e, unsigned int bits) // (client and server) allocates a new empty database entityframe_database_t *EntityFrame_AllocDatabase(mempool_t *mempool) { - return Mem_Alloc(mempool, sizeof(entityframe_database_t)); + return (entityframe_database_t *)Mem_Alloc(mempool, sizeof(entityframe_database_t)); } // (client and server) frees the database @@ -964,17 +965,17 @@ void EntityFrame_CL_ReadFrame(void) while ((number = (unsigned short) MSG_ReadShort()) != 0xFFFF && !msg_badread) { if (msg_badread) - Host_Error("EntityFrame_Read: read error\n"); + Host_Error("EntityFrame_Read: read error"); removed = number & 0x8000; number &= 0x7FFF; if (number >= MAX_EDICTS) - Host_Error("EntityFrame_Read: number (%i) >= MAX_EDICTS (%i)\n", number, MAX_EDICTS); + Host_Error("EntityFrame_Read: number (%i) >= MAX_EDICTS (%i)", number, MAX_EDICTS); // seek to entity, while copying any skipped entities (assume unchanged) while (old < oldend && old->number < number) { if (f->numentities >= MAX_ENTITY_DATABASE) - Host_Error("EntityFrame_Read: entity list too big\n"); + Host_Error("EntityFrame_Read: entity list too big"); f->entitydata[f->numentities] = *old++; f->entitydata[f->numentities++].time = cl.mtime[0]; } @@ -988,7 +989,7 @@ void EntityFrame_CL_ReadFrame(void) else { if (f->numentities >= MAX_ENTITY_DATABASE) - Host_Error("EntityFrame_Read: entity list too big\n"); + Host_Error("EntityFrame_Read: entity list too big"); // reserve this slot e = f->entitydata + f->numentities++; @@ -1020,13 +1021,13 @@ void EntityFrame_CL_ReadFrame(void) while (old < oldend) { if (f->numentities >= MAX_ENTITY_DATABASE) - Host_Error("EntityFrame_Read: entity list too big\n"); + Host_Error("EntityFrame_Read: entity list too big"); f->entitydata[f->numentities] = *old++; f->entitydata[f->numentities++].time = cl.mtime[0]; } EntityFrame_AddFrame(d, f->eye, f->framenum, f->numentities, f->entitydata); - memset(cl_entities_active, 0, cl_num_entities * sizeof(qbyte)); + memset(cl_entities_active, 0, cl_num_entities * sizeof(unsigned char)); number = 1; for (i = 0;i < f->numentities;i++) { @@ -1081,7 +1082,7 @@ entity_state_t *EntityFrame4_GetReferenceEntity(entityframe4_database_t *d, int int oldmax = d->maxreferenceentities; entity_state_t *oldentity = d->referenceentity; d->maxreferenceentities = (number + 15) & ~7; - d->referenceentity = Mem_Alloc(d->mempool, d->maxreferenceentities * sizeof(*d->referenceentity)); + d->referenceentity = (entity_state_t *)Mem_Alloc(d->mempool, d->maxreferenceentities * sizeof(*d->referenceentity)); if (oldentity) { memcpy(d->referenceentity, oldentity, oldmax * sizeof(*d->referenceentity)); @@ -1104,7 +1105,7 @@ void EntityFrame4_AddCommitEntity(entityframe4_database_t *d, const entity_state { entity_state_t *oldentity = d->currentcommit->entity; d->currentcommit->maxentities += 8; - d->currentcommit->entity = Mem_Alloc(d->mempool, d->currentcommit->maxentities * sizeof(*d->currentcommit->entity)); + d->currentcommit->entity = (entity_state_t *)Mem_Alloc(d->mempool, d->currentcommit->maxentities * sizeof(*d->currentcommit->entity)); if (oldentity) { memcpy(d->currentcommit->entity, oldentity, d->currentcommit->numentities * sizeof(*d->currentcommit->entity)); @@ -1117,7 +1118,7 @@ void EntityFrame4_AddCommitEntity(entityframe4_database_t *d, const entity_state entityframe4_database_t *EntityFrame4_AllocDatabase(mempool_t *pool) { entityframe4_database_t *d; - d = Mem_Alloc(pool, sizeof(*d)); + d = (entityframe4_database_t *)Mem_Alloc(pool, sizeof(*d)); d->mempool = pool; EntityFrame4_ResetDatabase(d); return d; @@ -1346,7 +1347,7 @@ void EntityFrame4_WriteFrame(sizebuf_t *msg, entityframe4_database_t *d, int num entity_state_t inactiveentitystate; int i, n, startnumber; sizebuf_t buf; - qbyte data[128]; + unsigned char data[128]; // if there isn't enough space to accomplish anything, skip it if (msg->cursize + 24 > msg->maxsize) @@ -1381,15 +1382,15 @@ void EntityFrame4_WriteFrame(sizebuf_t *msg, entityframe4_database_t *d, int num Con_Printf(" %i", d->commit[i].framenum); Con_Print(")\n"); } - if (d->currententitynumber >= sv.max_edicts) + if (d->currententitynumber >= prog->max_edicts) startnumber = 1; else - startnumber = bound(1, d->currententitynumber, sv.max_edicts - 1); + startnumber = bound(1, d->currententitynumber, prog->max_edicts - 1); MSG_WriteShort(msg, startnumber); // reset currententitynumber so if the loop does not break it we will // start at beginning next frame (if it does break, it will set it) d->currententitynumber = 1; - for (i = 0, n = startnumber;n < sv.max_edicts;n++) + for (i = 0, n = startnumber;n < prog->max_edicts;n++) { // find the old state to delta from e = EntityFrame4_GetReferenceEntity(d, n); @@ -1448,7 +1449,7 @@ void EntityFrame4_WriteFrame(sizebuf_t *msg, entityframe4_database_t *d, int num entityframe5_database_t *EntityFrame5_AllocDatabase(mempool_t *pool) { entityframe5_database_t *d; - d = Mem_Alloc(pool, sizeof(*d)); + d = (entityframe5_database_t *)Mem_Alloc(pool, sizeof(*d)); EntityFrame5_ResetDatabase(d); return d; } @@ -1475,27 +1476,27 @@ void EntityFrame5_ExpandEdicts(entityframe5_database_t *d, int newmax) { if (d->maxedicts < newmax) { - qbyte *data; + unsigned char *data; int oldmaxedicts = d->maxedicts; int *olddeltabits = d->deltabits; - qbyte *oldpriorities = d->priorities; + unsigned char *oldpriorities = d->priorities; int *oldupdateframenum = d->updateframenum; entity_state_t *oldstates = d->states; - qbyte *oldvisiblebits = d->visiblebits; + unsigned char *oldvisiblebits = d->visiblebits; d->maxedicts = newmax; - data = Mem_Alloc(sv_mempool, d->maxedicts * sizeof(int) + d->maxedicts * sizeof(qbyte) + d->maxedicts * sizeof(int) + d->maxedicts * sizeof(entity_state_t) + (d->maxedicts+7)/8 * sizeof(qbyte)); - d->deltabits = (void *)data;data += d->maxedicts * sizeof(int); - d->priorities = (void *)data;data += d->maxedicts * sizeof(qbyte); - d->updateframenum = (void *)data;data += d->maxedicts * sizeof(int); - d->states = (void *)data;data += d->maxedicts * sizeof(entity_state_t); - d->visiblebits = (void *)data;data += (d->maxedicts+7)/8 * sizeof(qbyte); + data = (unsigned char *)Mem_Alloc(sv_mempool, d->maxedicts * sizeof(int) + d->maxedicts * sizeof(unsigned char) + d->maxedicts * sizeof(int) + d->maxedicts * sizeof(entity_state_t) + (d->maxedicts+7)/8 * sizeof(unsigned char)); + d->deltabits = (int *)data;data += d->maxedicts * sizeof(int); + d->priorities = (unsigned char *)data;data += d->maxedicts * sizeof(unsigned char); + d->updateframenum = (int *)data;data += d->maxedicts * sizeof(int); + d->states = (entity_state_t *)data;data += d->maxedicts * sizeof(entity_state_t); + d->visiblebits = (unsigned char *)data;data += (d->maxedicts+7)/8 * sizeof(unsigned char); if (oldmaxedicts) { memcpy(d->deltabits, olddeltabits, oldmaxedicts * sizeof(int)); - memcpy(d->priorities, oldpriorities, oldmaxedicts * sizeof(qbyte)); + memcpy(d->priorities, oldpriorities, oldmaxedicts * sizeof(unsigned char)); memcpy(d->updateframenum, oldupdateframenum, oldmaxedicts * sizeof(int)); memcpy(d->states, oldstates, oldmaxedicts * sizeof(entity_state_t)); - memcpy(d->visiblebits, oldvisiblebits, (oldmaxedicts+7)/8 * sizeof(qbyte)); + memcpy(d->visiblebits, oldvisiblebits, (oldmaxedicts+7)/8 * sizeof(unsigned char)); // the previous buffers were a single allocation, so just one free Mem_Free(olddeltabits); } @@ -1953,7 +1954,7 @@ void EntityFrame5_LostFrame(entityframe5_database_t *d, int framenum) int i, j, k, l, bits; entityframe5_changestate_t *s, *s2; entityframe5_packetlog_t *p, *p2; - qbyte statsdeltabits[(MAX_CL_STATS+7)/8]; + unsigned char statsdeltabits[(MAX_CL_STATS+7)/8]; // scan for packets that were lost for (i = 0, p = d->packetlog;i < ENTITYFRAME5_MAXPACKETLOGS;i++, p++) { @@ -2022,11 +2023,11 @@ void EntityFrame5_WriteFrame(sizebuf_t *msg, entityframe5_database_t *d, int num const entity_state_t *n; int i, num, l, framenum, packetlognumber, priority; sizebuf_t buf; - qbyte data[128]; + unsigned char data[128]; entityframe5_packetlog_t *packetlog; - if (sv.max_edicts > d->maxedicts) - EntityFrame5_ExpandEdicts(d, (sv.max_edicts + 255) & ~255); + if (prog->max_edicts > d->maxedicts) + EntityFrame5_ExpandEdicts(d, prog->max_edicts); framenum = d->latestframenum + 1; d->viewentnum = viewentnum; @@ -2038,6 +2039,7 @@ void EntityFrame5_WriteFrame(sizebuf_t *msg, entityframe5_database_t *d, int num break; if (packetlognumber == ENTITYFRAME5_MAXPACKETLOGS) { + Con_DPrintf("EntityFrame5_WriteFrame: packetlog overflow for a client, resetting\n"); EntityFrame5_LostFrame(d, framenum); packetlognumber = 0; } @@ -2090,8 +2092,7 @@ void EntityFrame5_WriteFrame(sizebuf_t *msg, entityframe5_database_t *d, int num num++; } // all remaining entities are dead - // note: this must use sv.max_edicts, not sv.num_edicts, because sv.num_edicts can both increase and decrease, where as sv.max_edicts only increases (if sv.num_edicts is used, sometimes some entities are missed when the sv.num_edicts count goes back down after firing some shots) - for (;num < sv.max_edicts;num++) + for (;num < d->maxedicts;num++) { if (CHECKPVSBIT(d->visiblebits, num)) { @@ -2111,7 +2112,7 @@ void EntityFrame5_WriteFrame(sizebuf_t *msg, entityframe5_database_t *d, int num // build lists of entities by priority level memset(entityframe5_prioritychaincounts, 0, sizeof(entityframe5_prioritychaincounts)); l = 0; - for (num = 0;num < sv.num_edicts;num++) + for (num = 0;num < d->maxedicts;num++) { if (d->priorities[num]) { @@ -2129,7 +2130,7 @@ void EntityFrame5_WriteFrame(sizebuf_t *msg, entityframe5_database_t *d, int num // write stat updates if (sv.protocol != PROTOCOL_QUAKE && sv.protocol != PROTOCOL_QUAKEDP && sv.protocol != PROTOCOL_NEHAHRAMOVIE && sv.protocol != PROTOCOL_DARKPLACES1 && sv.protocol != PROTOCOL_DARKPLACES2 && sv.protocol != PROTOCOL_DARKPLACES3 && sv.protocol != PROTOCOL_DARKPLACES4 && sv.protocol != PROTOCOL_DARKPLACES5) { - for (i = 0;i < MAX_CL_STATS && buf.cursize + 6 + 11 <= buf.maxsize;i++) + for (i = 0;i < MAX_CL_STATS && msg->cursize + 6 + 11 <= msg->maxsize;i++) { if (d->statsdeltabits[i>>3] & (1<<(i&7))) {