private void ReadDeltaPlayerstate(Q3HuffmanStream stream, PlayerState from, ref PlayerState to) { int i; if (from == null) { from = new PlayerState(); } from.CopyTo(to); int lc = stream.ReadByte(); NetField field; int trunc; for (i = 0, field = PlayerState.fields [i]; i < lc; i++) { field = PlayerState.fields [i]; if (stream.ReadBits(1) == 0) { // no change KeyValueCoder.TrySetFieldValue(to, field.name, KeyValueCoder.TryGetFieldValue(from, field.name)); } else { if (field.bits == 0) { // float if (stream.ReadBits(1) == 0) { // integral float trunc = stream.ReadBits(NetField.FLOAT_INT_BITS); // bias to allow equal parts positive and negative trunc -= NetField.FLOAT_INT_BIAS; KeyValueCoder.TrySetFieldValue(to, field.name, trunc); } else { // full floating point value // FIXIT: wrong conversion from 32 bits to floating point value KeyValueCoder.TrySetFieldValue(to, field.name, stream.ReadInt32()); } } else { // integer KeyValueCoder.TrySetFieldValue(to, field.name, stream.ReadBits(( int )field.bits)); } } } for (i = lc, field = PlayerState.fields [lc]; i < PlayerState.fields.Length; i++) { field = PlayerState.fields [i]; // no change KeyValueCoder.TrySetFieldValue(to, field.name, KeyValueCoder.TryGetFieldValue(from, field.name)); } short bits; // read the arrays if (0 != stream.ReadBits(1)) { // parse stats if (0 != stream.ReadBits(1)) { bits = stream.ReadInt16(); for (i = 0; i < 16; i++) { if (0 != (bits & (1 << i))) { to.stats [i] = stream.ReadInt16(); } } } // parse persistant stats if (0 != stream.ReadBits(1)) { bits = stream.ReadInt16(); for (i = 0; i < 16; i++) { if (0 != (bits & (1 << i))) { to.persistant [i] = stream.ReadInt16(); } } } // parse ammo if (0 != stream.ReadBits(1)) { bits = stream.ReadInt16(); for (i = 0; i < 16; i++) { if (0 != (bits & (1 << i))) { to.ammo [i] = stream.ReadInt16(); } } } // parse powerups if (0 != stream.ReadBits(1)) { bits = stream.ReadInt16(); for (i = 0; i < 16; i++) { if (0 != (bits & (1 << i))) { to.powerups [i] = stream.ReadInt32(); } } } } }
private void ReadDeltaEntity(Q3HuffmanStream stream, EntityState from, ref EntityState to, int number) { // check for a remove if (stream.ReadBits(1) == 1) { new EntityState().CopyTo(to); to.number = MAX_GENTITIES - 1; return; } // check for no delta if (stream.ReadBits(1) == 0) { from.CopyTo(to); to.number = number; return; } int lc = stream.ReadByte(); to.number = number; int i; NetField field; int trunc; for (i = 0, field = EntityState.fields [i]; i < lc && i < EntityState.fields.Length; i++) { field = EntityState.fields [i]; if (stream.ReadBits(1) == 0) { // no change KeyValueCoder.TrySetFieldValue(to, field.name, KeyValueCoder.TryGetFieldValue(from, field.name)); } else { if (field.bits == 0) { // float if (stream.ReadBits(1) == 0) { KeyValueCoder.TrySetFieldValue(to, field.name, 0); } else { if (stream.ReadBits(1) == 0) { // integral float trunc = stream.ReadBits(NetField.FLOAT_INT_BITS); // bias to allow equal parts positive and negative trunc -= NetField.FLOAT_INT_BIAS; KeyValueCoder.TrySetFieldValue(to, field.name, trunc); } else { // full floating point value // FIXIT: wrong conversion from 32 bits to floating point value KeyValueCoder.TrySetFieldValue(to, field.name, stream.ReadInt32()); } } } else { if (stream.ReadBits(1) == 0) { KeyValueCoder.TrySetFieldValue(to, field.name, 0); } else { // integer KeyValueCoder.TrySetFieldValue(to, field.name, stream.ReadBits(( int )field.bits)); } } } } for (i = lc; i < EntityState.fields.Length; i++) { field = EntityState.fields [i]; // no change KeyValueCoder.TrySetFieldValue(to, field.name, KeyValueCoder.TryGetFieldValue(from, field.name)); } }