public void WriteUpdatePacket(WriteStream w, ref PacketHeader header, int avatarCount, AvatarStateQuantized[] avatars, int cubeCount, int[] cubeIds, bool[] notChanged, bool[] hasDelta, bool[] hasPerfectPrediction, bool[] hasPrediction, ushort[] baselineIds, CubeState[] cubes, CubeDelta[] deltas, CubeDelta[] predictions ) { w.Bits((byte)StateUpdate, 8); w.Bits(header.id, 16); w.Bits(header.ack, 16); w.Bits(header.ackBits, 32); w.Bits(header.frame, 32); w.Bits(header.resetId, 16); w.Float(header.timeOffset); w.Int(avatarCount, 0, MaxClients); for (int i = 0; i < avatarCount; ++i) { WriteAvatar(w, ref avatars[i]); } w.Int(cubeCount, 0, MaxStateUpdates); for (int i = 0; i < cubeCount; ++i) { w.Int(cubeIds[i], 0, MaxCubes - 1); #if DEBUG_DELTA_COMPRESSION write_int(stream, cubeDelta[i].absolute_position_x, PositionMinimumXZ, PositionMaximumXZ); write_int(stream, cubeDelta[i].absolute_position_y, PositionMinimumY, PositionMaximumY); write_int(stream, cubeDelta[i].absolute_position_z, PositionMinimumXZ, PositionMaximumXZ); #endif // #if DEBUG_DELTA_COMPRESSION w.Int(cubes[i].authorityId, 0, MaxAuthority - 1); w.Bits(cubes[i].authorityPacketId, 16); w.Bits(cubes[i].ownershipId, 16); w.Bool(notChanged[i]); if (notChanged[i]) { w.Bits(baselineIds[i], 16); continue; } w.Bool(hasPerfectPrediction[i]); if (hasPerfectPrediction[i]) { w.Bits(baselineIds[i], 16); w.Bits(cubes[i].rotationLargest, 2); w.Bits(cubes[i].rotationX, RotationBits); w.Bits(cubes[i].rotationY, RotationBits); w.Bits(cubes[i].rotationZ, RotationBits); continue; } w.Bool(hasPrediction[i]); if (hasPrediction[i]) { w.Bits(baselineIds[i], 16); w.Bool(cubes[i].isActive); WriteLinearVelocityDelta(w, predictions[i].linearVelocityX, predictions[i].linearVelocityY, predictions[i].linearVelocityZ); WriteAngularVelocityDelta(w, predictions[i].angularVelocityX, predictions[i].angularVelocityY, predictions[i].angularVelocityZ); WritePositionDelta(w, predictions[i].positionX, predictions[i].positionY, predictions[i].positionZ); w.Bits(cubes[i].rotationLargest, 2); w.Bits(cubes[i].rotationX, RotationBits); w.Bits(cubes[i].rotationY, RotationBits); w.Bits(cubes[i].rotationZ, RotationBits); continue; } w.Bool(hasDelta[i]); if (hasDelta[i]) { w.Bits(baselineIds[i], 16); w.Bool(cubes[i].isActive); WriteLinearVelocityDelta(w, deltas[i].linearVelocityX, deltas[i].linearVelocityY, deltas[i].linearVelocityZ); WriteAngularVelocityDelta(w, deltas[i].angularVelocityX, deltas[i].angularVelocityY, deltas[i].angularVelocityZ); WritePositionDelta(w, deltas[i].positionX, deltas[i].positionY, deltas[i].positionZ); w.Bits(cubes[i].rotationLargest, 2); w.Bits(cubes[i].rotationX, RotationBits); w.Bits(cubes[i].rotationY, RotationBits); w.Bits(cubes[i].rotationZ, RotationBits); continue; } w.Bool(cubes[i].isActive); w.Int(cubes[i].positionX, MinPositionXZ, MaxPositionXZ); w.Int(cubes[i].positionY, MinPositionY, MaxPositionY); w.Int(cubes[i].positionZ, MinPositionXZ, MaxPositionXZ); w.Bits(cubes[i].rotationLargest, 2); w.Bits(cubes[i].rotationX, RotationBits); w.Bits(cubes[i].rotationY, RotationBits); w.Bits(cubes[i].rotationZ, RotationBits); if (!cubes[i].isActive) { continue; } w.Int(cubes[i].linearVelocityX, LinearVelocityMinimum, LinearVelocityMaximum); w.Int(cubes[i].linearVelocityY, LinearVelocityMinimum, LinearVelocityMaximum); w.Int(cubes[i].linearVelocityZ, LinearVelocityMinimum, LinearVelocityMaximum); w.Int(cubes[i].angularVelocityX, AngularVelocityMinimum, AngularVelocityMaximum); w.Int(cubes[i].angularVelocityY, AngularVelocityMinimum, AngularVelocityMaximum); w.Int(cubes[i].angularVelocityZ, AngularVelocityMinimum, AngularVelocityMaximum); } }