Esempio n. 1
0
    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);
        }
    }