private void parseGameState(Q3HuffmanReader reader) { reader.readLong(); while (true) { byte cmd = reader.readByte(); if (cmd == Q3_SVC.EOF) { break; } switch (cmd) { case Q3_SVC.CONFIGSTRING: short key = reader.readShort(); if (key < 0 || key > Q3Const.MAX_CONFIGSTRINGS) { return; } clc.configs[key] = reader.readBigString(); break; case Q3_SVC.BASELINE: long newnum = reader.readNumBits(Q3Const.GENTITYNUM_BITS); if (newnum < 0 || newnum >= Q3Const.MAX_GENTITIES) { Q3Utils.PrintDebug(clc.errors, "Baseline number out of range: {0}", newnum); return; } EntityState es = Ext2 <long, EntityState> .GetOrCreate(clc.entityBaselines, newnum); if (!reader.readDeltaEntity(es, (int)newnum)) { Q3Utils.PrintDebug(clc.errors, "unable to parse delta-entity state"); return; } break; default: Q3Utils.PrintDebug(clc.errors, "bad command in parseGameState"); return; } } //clc.clientNum clc.clientNum = reader.readLong(); //clc.checksumFeed clc.checksumFeed = reader.readLong(); }
public static void updatePlayerState(PlayerState state, int number, Q3HuffmanReader reader, bool reset) { switch (number) { case 0: state.commandTime = reset ? 0 : reader.readLong(); break; case 1: state.origin[0] = reset ? 0 : reader.readFloatIntegral(); break; case 2: state.origin[1] = reset ? 0 : reader.readFloatIntegral(); break; case 3: state.bobCycle = reset ? 0 : (int)reader.readNumBits(8); break; case 4: state.velocity[0] = reset ? 0 : reader.readFloatIntegral(); break; case 5: state.velocity[1] = reset ? 0 : reader.readFloatIntegral(); break; case 6: state.viewangles[1] = reset ? 0 : reader.readFloatIntegral(); break; case 7: state.viewangles[0] = reset ? 0 : reader.readFloatIntegral(); break; case 8: state.weaponTime = reset ? 0 : (int)reader.readNumBits(-16); break; case 9: state.origin[2] = reset ? 0 : reader.readFloatIntegral(); break; case 10: state.velocity[2] = reset ? 0 : reader.readFloatIntegral(); break; case 11: state.legsTimer = reset ? 0 : (int)reader.readNumBits(8); break; case 12: state.pm_time = reset ? 0 : (int)reader.readNumBits(-16); break; case 13: state.eventSequence = reset ? 0 : (int)reader.readNumBits(16); break; case 14: state.torsoAnim = reset ? 0 : (int)reader.readNumBits(8); break; case 15: state.movementDir = reset ? 0 : (int)reader.readNumBits(4); break; case 16: state.events[0] = reset ? 0 : (int)reader.readNumBits(8); break; case 17: state.legsAnim = reset ? 0 : (int)reader.readNumBits(8); break; case 18: state.events[1] = reset ? 0 : (int)reader.readNumBits(8); break; case 19: state.pm_flags = reset ? 0 : (int)reader.readNumBits(16); break; case 20: state.groundEntityNum = reset ? 0 : (int)reader.readNumBits(10); break; case 21: state.weaponstate = reset ? 0 : (int)reader.readNumBits(4); break; case 22: state.eFlags = reset ? 0 : (int)reader.readNumBits(16); break; case 23: state.externalEvent = reset ? 0 : (int)reader.readNumBits(10); break; case 24: state.gravity = reset ? 0 : (int)reader.readNumBits(16); break; case 25: state.speed = reset ? 0 : (int)reader.readNumBits(16); break; case 26: state.delta_angles[1] = reset ? 0 : (int)reader.readNumBits(16); break; case 27: state.externalEventParm = reset ? 0 : (int)reader.readNumBits(8); break; case 28: state.viewheight = reset ? 0 : (int)reader.readNumBits(-8); break; case 29: state.damageEvent = reset ? 0 : (int)reader.readNumBits(8); break; case 30: state.damageYaw = reset ? 0 : (int)reader.readNumBits(8); break; case 31: state.damagePitch = reset ? 0 : (int)reader.readNumBits(8); break; case 32: state.damageCount = reset ? 0 : (int)reader.readNumBits(8); break; case 33: state.generic1 = reset ? 0 : (int)reader.readNumBits(8); break; case 34: state.pm_type = reset ? 0 : (int)reader.readNumBits(8); break; case 35: state.delta_angles[0] = reset ? 0 : (int)reader.readNumBits(16); break; case 36: state.delta_angles[2] = reset ? 0 : (int)reader.readNumBits(16); break; case 37: state.torsoTimer = reset ? 0 : (int)reader.readNumBits(12); break; case 38: state.eventParms[0] = reset ? 0 : (int)reader.readNumBits(8); break; case 39: state.eventParms[1] = reset ? 0 : (int)reader.readNumBits(8); break; case 40: state.clientNum = reset ? 0 : (int)reader.readNumBits(8); break; case 41: state.weapon = reset ? 0 : (int)reader.readNumBits(5); break; case 42: state.viewangles[2] = reset ? 0 : reader.readFloatIntegral(); break; case 43: state.grapplePoint[0] = reset ? 0 : reader.readFloatIntegral(); break; case 44: state.grapplePoint[1] = reset ? 0 : reader.readFloatIntegral(); break; case 45: state.grapplePoint[2] = reset ? 0 : reader.readFloatIntegral(); break; case 46: state.jumppad_ent = reset ? 0 : (int)reader.readNumBits(10); break; case 47: state.loopSound = reset ? 0 : (int)reader.readNumBits(16); break; } }
private void parsePacketEntities(Q3HuffmanReader decoder, CLSnapshot oldframe, CLSnapshot newframe) { newframe.parseEntitiesNum = client.parseEntitiesNum; newframe.numEntities = 0; int newnum = 0; int oldindex = 0; int oldnum = 0; EntityState oldstate = null; if (oldframe == null) { oldnum = 99999; } else { if (oldindex >= oldframe.numEntities) { oldnum = 99999; } else { oldstate = Ext2 <int, EntityState> .GetOrCreate(client.parseEntities, (oldframe.parseEntitiesNum + oldindex)& (Q3Const.MAX_PARSE_ENTITIES - 1)); oldnum = oldstate.number; } } while (true) { newnum = (int)decoder.readNumBits(Q3Const.GENTITYNUM_BITS); if (newnum == (Q3Const.MAX_GENTITIES - 1)) { break; } if (decoder.isEOD()) { Q3Utils.PrintDebug(clc.errors, "ERR_DROP, CL_ParsePacketEntities: end of message"); return; } while (oldnum < newnum) { // one or more entities from the old packet are unchanged CL_DeltaEntity(decoder, newframe, oldnum, oldstate, true); oldindex++; if (oldindex >= oldframe.numEntities) { oldnum = 99999; } else { oldstate = Ext2 <int, EntityState> .GetOrCreate(client.parseEntities, (oldframe.parseEntitiesNum + oldindex)& (Q3Const.MAX_PARSE_ENTITIES - 1)); oldnum = oldstate.number; } } if (oldnum == newnum) { // delta from previous state CL_DeltaEntity(decoder, newframe, newnum, oldstate, false); oldindex++; if (oldindex >= oldframe.numEntities) { oldnum = 99999; } else { oldstate = Ext2 <int, EntityState> .GetOrCreate(client.parseEntities, (oldframe.parseEntitiesNum + oldindex)& (Q3Const.MAX_PARSE_ENTITIES - 1)); oldnum = oldstate.number; } continue; } if (oldnum > newnum) { // delta from baseline EntityState es = Ext2 <int, EntityState> .GetOrCreate(client.entityBaselines, newnum); CL_DeltaEntity(decoder, newframe, newnum, es, false); continue; } } // any remaining entities in the old frame are copied over while (oldnum != 99999) { // one or more entities from the old packet are unchanged CL_DeltaEntity(decoder, newframe, oldnum, oldstate, true); oldindex++; if (oldindex >= oldframe.numEntities) { oldnum = 99999; } else { oldstate = Ext2 <int, EntityState> .GetOrCreate(client.parseEntities, (oldframe.parseEntitiesNum + oldindex)& (Q3Const.MAX_PARSE_ENTITIES - 1)); oldnum = oldstate.number; } } }
public static void updateEntityState(EntityState state, int number, Q3HuffmanReader reader, bool reset) { switch (number) { case 0: state.pos.trTime = reset ? 0 : reader.readLong(); break; case 1: state.pos.trBase[0] = reset ? 0 : reader.readFloatIntegral(); break; case 2: state.pos.trBase[1] = reset ? 0 : reader.readFloatIntegral(); break; case 3: state.pos.trDelta[0] = reset ? 0 : reader.readFloatIntegral(); break; case 4: state.pos.trDelta[1] = reset ? 0 : reader.readFloatIntegral(); break; case 5: state.pos.trBase[2] = reset ? 0 : reader.readFloatIntegral(); break; case 6: state.apos.trBase[1] = reset ? 0 : reader.readFloatIntegral(); break; case 7: state.pos.trDelta[2] = reset ? 0 : reader.readFloatIntegral(); break; case 8: state.apos.trBase[0] = reset ? 0 : reader.readFloatIntegral(); break; case 9: state.events = reset ? 0 : (int)reader.readNumBits(10); break; case 10: state.angles2[1] = reset ? 0 : reader.readFloatIntegral(); break; case 11: state.eType = reset ? 0 : (int)reader.readNumBits(8); break; case 12: state.torsoAnim = reset ? 0 : (int)reader.readNumBits(8); break; case 13: state.eventParm = reset ? 0 : (int)reader.readNumBits(8); break; case 14: state.legsAnim = reset ? 0 : (int)reader.readNumBits(8); break; case 15: state.groundEntityNum = reset ? 0 : (int)reader.readNumBits(10); break; case 16: state.pos.trType = reset ? 0 : (TrType)reader.readByte(); break; case 17: state.eFlags = reset ? 0 : (int)reader.readNumBits(19); break; case 18: state.otherEntityNum = reset ? 0 : (int)reader.readNumBits(10); break; case 19: state.weapon = reset ? 0 : (int)reader.readNumBits(8); break; case 20: state.clientNum = reset ? 0 : (int)reader.readNumBits(8); break; case 21: state.angles[1] = reset ? 0 : reader.readFloatIntegral(); break; case 22: state.pos.trDuration = reset ? 0 : reader.readLong(); break; case 23: state.apos.trType = reset ? 0 : (TrType)reader.readByte(); break; case 24: state.origin[0] = reset ? 0 : reader.readFloatIntegral(); break; case 25: state.origin[1] = reset ? 0 : reader.readFloatIntegral(); break; case 26: state.origin[2] = reset ? 0 : reader.readFloatIntegral(); break; case 27: state.solid = reset ? 0 : (int)reader.readNumBits(24); break; case 28: state.powerups = reset ? 0 : (int)reader.readNumBits(16); break; case 29: state.modelindex = reset ? 0 : (int)reader.readNumBits(8); break; case 30: state.otherEntityNum2 = reset ? 0 : (int)reader.readNumBits(10); break; case 31: state.loopSound = reset ? 0 : (int)reader.readNumBits(8); break; case 32: state.generic1 = reset ? 0 : (int)reader.readNumBits(8); break; case 33: state.origin2[2] = reset ? 0 : reader.readFloatIntegral(); break; case 34: state.origin2[0] = reset ? 0 : reader.readFloatIntegral(); break; case 35: state.origin2[1] = reset ? 0 : reader.readFloatIntegral(); break; case 36: state.modelindex2 = reset ? 0 : (int)reader.readNumBits(8); break; case 37: state.angles[0] = reset ? 0 : reader.readFloatIntegral(); break; case 38: state.time = reset ? 0 : reader.readLong(); break; case 39: state.apos.trTime = reset ? 0 : reader.readLong(); break; case 40: state.apos.trDuration = reset ? 0 : reader.readLong(); break; case 41: state.apos.trBase[2] = reset ? 0 : reader.readFloatIntegral(); break; case 42: state.apos.trDelta[0] = reset ? 0 : reader.readFloatIntegral(); break; case 43: state.apos.trDelta[1] = reset ? 0 : reader.readFloatIntegral(); break; case 44: state.apos.trDelta[2] = reset ? 0 : reader.readFloatIntegral(); break; case 45: state.time2 = reset ? 0 : reader.readLong(); break; case 46: state.angles[2] = reset ? 0 : reader.readFloatIntegral(); break; case 47: state.angles2[0] = reset ? 0 : reader.readFloatIntegral(); break; case 48: state.angles2[2] = reset ? 0 : reader.readFloatIntegral(); break; case 49: state.constantLight = reset ? 0 : reader.readLong(); break; case 50: state.frame = reset ? 0 : (int)reader.readNumBits(16); break; } }