Ejemplo n.º 1
0
        private void _BuildValuesUpdate(ObjectUpdateType type, ObjectUpdateFlags flags, ref PacketOut pkt, IPlayer plr)
        {
            UpdateMask mask = new UpdateMask(State.UpdateFields.Length);
            PacketOut  tmp  = new PacketOut();


            UpdatefieldFlags visibilityFlags = UpdatefieldFlags.UF_FLAG_PUBLIC;

            if (plr.GetPrimaryKeyLong() == this.GetPrimaryKeyLong())
            {
                visibilityFlags |= UpdatefieldFlags.UF_FLAG_PRIVATE;
            }

            var fieldFlags = GetFlagVisibility();

            for (var i = 0; i < State.UpdateFields.Length; ++i)
            {
                //if ((fieldFlags[i] & visibilityFlags) == 0)
                //    continue;
                tmp.Write(State.UpdateFields[i].data);
                mask.SetBit(i);
            }

            pkt.Write((byte)mask.GetMaxBlockCount());
            for (var i = 0; i < mask.GetMaxBlockCount(); ++i)
            {
                pkt.Write(mask.m_blocks[i]);
            }

            pkt.Write(tmp);
        }
Ejemplo n.º 2
0
        public void BuildTargetedCreationUpdate(UpdateData data, Character character)
        {
            ObjectUpdateType  updateType  = ObjectUpdateType.CreateObject;
            ObjectUpdateFlags updateFlags = UpdateFlags;

            if (ID.ObjectType == ObjectID.Type.Corpse ||
                ID.ObjectType == ObjectID.Type.DynamicObject ||
                ID.ObjectType == ObjectID.Type.GameObject ||
                ID.ObjectType == ObjectID.Type.Player ||
                ID.ObjectType == ObjectID.Type.Unit)
            {
                updateType = ObjectUpdateType.CreateObject2;
            }

            if (character == this)
            {
                updateFlags |= ObjectUpdateFlags.Self;
            }

            using (ByteBuffer buffer = new ByteBuffer())
            {
                // creation update
                AppendCreationUpdate(buffer, updateType, updateFlags);

                // movement update
                AppendMovementUpdate(buffer, updateType, updateFlags);

                // values update
                UpdateMask updateMask = GetCreationUpdateMask();
                AppendValuesUpdate(buffer, updateType, updateFlags, updateMask);

                // append the update
                data.AddUpdateBlock(buffer);
            }
        }
Ejemplo n.º 3
0
        public Task <PacketOut> BuildCreateUpdateFor(IPlayer plr)
        {
            ObjectUpdateType updateType = ObjectUpdateType.UPDATETYPE_CREATE_OBJECT;

            ObjectUpdateFlags updateFlags = State.UpdateFlags;

            if (plr.GetPrimaryKeyLong() == this.GetPrimaryKeyLong())
            {
                updateFlags |= ObjectUpdateFlags.UPDATEFLAG_SELF;
            }

            if ((updateFlags & ObjectUpdateFlags.UPDATEFLAG_STATIONARY_POSITION) != 0)
            {
                if (_IsPlayer())
                {
                    updateType = ObjectUpdateType.UPDATETYPE_CREATE_OBJECT2;
                }
            }

            PacketOut p = new PacketOut();

            p.Write((byte)updateType);
            p.Write(pGUID);
            p.Write((byte)State.MyType);
            _BuildMovementUpdate(updateType, updateFlags, ref p);
            _BuildValuesUpdate(updateType, updateFlags, ref p, plr);
            return(Task.FromResult(p));
        }
Ejemplo n.º 4
0
        public void BuildTargetedUpdate(UpdateData data, Character character)
        {
            ObjectUpdateFlags updateFlags = UpdateFlags;

            if (character == this)
            {
                updateFlags |= ObjectUpdateFlags.Self;
            }

            if ((ChangeState & ObjectChangeState.Movement) != 0)
            {
                using (ByteBuffer buffer = new ByteBuffer())
                {
                    buffer.Append((byte)ObjectUpdateType.Movement);
                    buffer.Append(ID);

                    AppendMovementUpdate(buffer, ObjectUpdateType.Movement, updateFlags);

                    data.AddUpdateBlock(buffer);
                }
            }
            if ((ChangeState & ObjectChangeState.Values) != 0)
            {
                using (ByteBuffer buffer = new ByteBuffer())
                {
                    buffer.Append((byte)ObjectUpdateType.Values);
                    buffer.Append(ID.GetPacked()); // why is movement a full id and values is packed? no clue

                    AppendValuesUpdate(buffer, ObjectUpdateType.Values, updateFlags, updateMask);

                    data.AddUpdateBlock(buffer);
                }
            }
        }
Ejemplo n.º 5
0
 protected ObjectUpdate(ObjectID objectId, ObjectTypeID typeId, ObjectUpdateFlags updateFlags, MovementUpdate movementUpdate, ValuesUpdate valuesUpdate, ObjectUpdateType?type)
 {
     ObjectId       = objectId;
     TypeId         = typeId;
     UpdateFlags    = updateFlags;
     UpdateType     = type;
     MovementUpdate = movementUpdate;
     ValuesUpdate   = valuesUpdate;
 }
Ejemplo n.º 6
0
 /// <summary>
 /// Creates a new CreationUpdate instance.
 /// </summary>
 /// <param name="movementUpdate">Cannot be null</param>
 /// <param name="valuesUpdate">Cannot be null</param>
 public CreationUpdate(ObjectID id, ObjectTypeID typeId, ObjectUpdateFlags updateFlags, MovementUpdate movementUpdate, ValuesUpdate valuesUpdate) : base(
         id,
         typeId,
         updateFlags,
         movementUpdate ?? throw new ArgumentNullException(nameof(movementUpdate)),
         valuesUpdate ?? throw new ArgumentNullException(nameof(valuesUpdate)),
         id.ObjectType == ObjectID.Type.Corpse ||
         id.ObjectType == ObjectID.Type.DynamicObject ||
         id.ObjectType == ObjectID.Type.GameObject ||
         id.ObjectType == ObjectID.Type.Player ||
         id.ObjectType == ObjectID.Type.Unit ?
         ObjectUpdateType.CreateObject2 :
         ObjectUpdateType.CreateObject)
 {
 }
 //TODO: Validate
 /// <inheritdoc />
 public MovementBlockData(ObjectUpdateFlags updateFlags, MovementInfo moveInfo,
                          float[] movementSpeeds, SplineInfo splineInformation, CorpseInfo deadMovementInformation,
                          StationaryMovementInfo stationaryObjectMovementInformation, int unk1,
                          uint lowGuid, PackedGuid target, uint unknownTransportTimer, VehicleMovementInfo vehicleMovementInformation, long packedRotationQuat)
 {
     UpdateFlags                         = updateFlags;
     MoveInfo                            = moveInfo;
     MovementSpeeds                      = movementSpeeds;
     SplineInformation                   = splineInformation;
     DeadMovementInformation             = deadMovementInformation;
     StationaryObjectMovementInformation = stationaryObjectMovementInformation;
     Unk1    = unk1;
     LowGuid = lowGuid;
     Target  = target;
     UnknownTransportTimer      = unknownTransportTimer;
     VehicleMovementInformation = vehicleMovementInformation;
     UpdatePackedQuaternion     = packedRotationQuat;
 }
Ejemplo n.º 8
0
        /// <inheritdoc />
        public MovementBlockData Convert(MovementBlockData_Vanilla fromObj)
        {
            if (fromObj == null)
            {
                return(null);
            }

            ObjectUpdateFlags flags = ObjectUpdateFlagsConverter.Convert(fromObj.UpdateFlags);

            //Should be null if the object isn't living.
            MovementInfo info = MoveInfoConverter.Convert(fromObj.MoveInfo);

            SplineInfo spline     = SplineInfoConverter.Convert(fromObj.SplineInformation);
            CorpseInfo corpseInfo = CorpseInfoConverter.Convert(fromObj.DeadMovementInformation);

            MovementBlockData data = new MovementBlockData(flags, info, fromObj.MovementSpeeds?.Concat(Enumerable.Repeat(1.0f, 3))?.ToArray(), spline, corpseInfo, null,
                                                           /*TC always sends 0 but we can try this*/ (int)fromObj.HighGuid, /*Mangos always sends for UPDATE_ALL 0x10 AKA LOW_GUID. We can try TC hack if this doesn't work*/ 0x1,
                                                           /*This is target*/ flags.HasFlag(ObjectUpdateFlags.UPDATEFLAG_HAS_TARGET) ? fromObj.FullGuid : PackedGuid.Empty, fromObj.TransportTime, null, /*This is a packed QUATERRION but Vanilla doesn't send anything. TODO compute this*/ 0);

            return(data);
        }
Ejemplo n.º 9
0
        protected virtual void AppendValuesUpdate(ByteBuffer buffer, ObjectUpdateType updateType, ObjectUpdateFlags updateFlags, UpdateMask updateMask)
        {
            buffer.Append(updateMask.BlockCount);
            buffer.Append(updateMask.Data);

            // write the value set
            for (ushort i = 0; i < FieldCount; ++i)
            {
                if (updateMask.GetBit(i))
                {
                    buffer.Append(GetFieldUnsigned(i));
                }
            }
        }
Ejemplo n.º 10
0
        protected virtual void AppendMovementUpdate(ByteBuffer buffer, ObjectUpdateType updateType, ObjectUpdateFlags updateFlags)
        {
            if ((updateFlags & ObjectUpdateFlags.HasPosition) != 0)
            {
                buffer.Append(Position);
            }

            if ((updateFlags & ObjectUpdateFlags.MaskID) != 0)
            {
                buffer.Append(ID.MaskID);
            }

            if ((updateFlags & ObjectUpdateFlags.All) != 0)
            {
                buffer.Append(1); // ?
            }
        }
Ejemplo n.º 11
0
 protected virtual void AppendCreationUpdate(ByteBuffer buffer, ObjectUpdateType updateType, ObjectUpdateFlags updateFlags)
 {
     buffer.Append((byte)updateType);
     buffer.Append(ID.GetPacked());
     buffer.Append((byte)TypeID);
     buffer.Append((byte)updateFlags);
 }
Ejemplo n.º 12
0
        protected override void AppendMovementUpdate(ByteBuffer buffer, ObjectUpdateType updateType, ObjectUpdateFlags updateFlags)
        {
            if ((updateFlags & ObjectUpdateFlags.Living) != 0)
            {
                log.DebugFormat("appending movement update with movementflags = {0}", MovementFlags);

                buffer.Append((int)MovementFlags);
                buffer.Append(MovementTime); // time
                buffer.Append(Position);
                buffer.Append(0);            // fallingTime

                buffer.Append(MovementSpeed.Walking);
                buffer.Append(MovementSpeed.Running);
                buffer.Append(MovementSpeed.RunningBack);
                buffer.Append(MovementSpeed.Swimming);
                buffer.Append(MovementSpeed.SwimmingBack);
                buffer.Append(MovementSpeed.Turning);

                // remove HasPosition from the updateFlags when passing to GameObject, since we already wrote the position
                base.AppendMovementUpdate(buffer, updateType, updateFlags & ~ObjectUpdateFlags.HasPosition);
            }
            else
            {
                base.AppendMovementUpdate(buffer, updateType, updateFlags);
            }
        }
Ejemplo n.º 13
0
 /// <summary>
 /// Creates a new ObjectUpdate. If this is not a CreationUpdate, then only
 /// one of movementUpdate or valuesUpdate may be non-null.
 /// </summary>
 public ObjectUpdate(ObjectID objectId, ObjectTypeID typeId, ObjectUpdateFlags updateFlags, MovementUpdate movementUpdate, ValuesUpdate valuesUpdate)
     : this(objectId, typeId, updateFlags, movementUpdate, valuesUpdate, null)
 {
 }
Ejemplo n.º 14
0
        private void _BuildMovementUpdate(ObjectUpdateType type, ObjectUpdateFlags flags, ref PacketOut pkt)
        {
            var asUnit = ToRef() as IUnitImpl;

            pkt.Write((UInt16)flags);

            if ((flags & ObjectUpdateFlags.UPDATEFLAG_LIVING) != 0)
            {
                UInt32 moveflags   = 0;
                UInt16 moveflagsex = 0;

                pkt.Write(moveflags);
                pkt.Write(moveflagsex);
                pkt.Write(Time.GetMSTime());
                pkt.Write(State.PositionX);
                pkt.Write(State.PositionY);
                pkt.Write(State.PositionZ);
                pkt.Write(State.Orientation);

                pkt.Write((UInt32)0);   //fall time

                pkt.Write((float)14.0); //walk speed
                pkt.Write((float)14.0); //run speed
                pkt.Write((float)14.0); //runback speed
                pkt.Write((float)14.0); //swim speed
                pkt.Write((float)14.0); //swimback speed
                pkt.Write((float)14.0); //flight speed
                pkt.Write((float)14.0); //flightback speed
                pkt.Write((float)14.0); //turn rate
                pkt.Write((float)14.0); //pitch rate
            }
            else
            {
                if ((flags & ObjectUpdateFlags.UPDATEFLAG_POSITION) != 0)
                {
                    pkt.Write((byte)0);  //packed guid of transport
                    pkt.Write(State.PositionX);
                    pkt.Write(State.PositionY);
                    pkt.Write(State.PositionZ);

                    pkt.Write((float)0);  //transport offset x
                    pkt.Write((float)0);  //transport offset y
                    pkt.Write((float)0);  //transport offset z

                    pkt.Write(State.Orientation);
                }
                else
                {
                    if ((flags & ObjectUpdateFlags.UPDATEFLAG_STATIONARY_POSITION) != 0)
                    {
                        pkt.Write(State.PositionX);
                        pkt.Write(State.PositionY);
                        pkt.Write(State.PositionZ);
                        pkt.Write(State.Orientation);
                    }
                }
            }

            if ((flags & ObjectUpdateFlags.UPDATEFLAG_UNKNOWN) != 0)
            {
                pkt.Write((UInt32)0);
            }

            if ((flags & ObjectUpdateFlags.UPDATEFLAG_LOWGUID) != 0)
            {
                //lowguid of some items 2F or 8 for players
                TypeID myType = State.MyType;

                switch (myType)
                {
                case TypeID.TYPEID_OBJECT:
                case TypeID.TYPEID_ITEM:
                case TypeID.TYPEID_CONTAINER:
                case TypeID.TYPEID_GAMEOBJECT:
                case TypeID.TYPEID_DYNAMICOBJECT:
                case TypeID.TYPEID_CORPSE:
                {
                    pkt.Write((UInt32)_GetUInt64(EObjectFields.OBJECT_FIELD_GUID));
                }
                break;

                case TypeID.TYPEID_UNIT:
                    pkt.Write((UInt32)0xB);
                    break;

                case TypeID.TYPEID_PLAYER:
                {
                    if ((flags & ObjectUpdateFlags.UPDATEFLAG_SELF) != 0)
                    {
                        pkt.Write((UInt32)0x2F);
                    }
                    else
                    {
                        pkt.Write((UInt32)0x8);
                    }
                }
                break;

                default:
                    pkt.Write((UInt32)0);
                    break;
                }
            }

            if ((flags & ObjectUpdateFlags.UPDATEFLAG_HAS_TARGET) != 0)
            {
                pkt.Write((byte)0);  //packed guid of target
            }

            if ((flags & ObjectUpdateFlags.UPDATEFLAG_TRANSPORT) != 0)
            {
                pkt.Write(Time.GetMSTime()); //fk knows
            }
            if ((flags & ObjectUpdateFlags.UPDATEFLAG_VEHICLE) != 0)
            {
                pkt.Write((UInt32)0); //vehicle id
                pkt.Write((float)0);  //orientation
            }

            if ((flags & ObjectUpdateFlags.UPDATEFLAG_ROTATION) != 0)
            {
                //this is the packed quart :(
                pkt.Write((UInt64)0);
            }
        }
Ejemplo n.º 15
0
 public override void SetAll(System.Collections.Generic.IDictionary<string,object> values)
 {   
     object value;
     if (values == null) { InitStateFields(); return; }
     if (values.TryGetValue("Exists", out value)) @Exists = (Boolean) value;
     if (values.TryGetValue("PositionX", out value)) @PositionX = (Single) value;
     if (values.TryGetValue("PositionY", out value)) @PositionY = (Single) value;
     if (values.TryGetValue("PositionZ", out value)) @PositionZ = (Single) value;
     if (values.TryGetValue("Orientation", out value)) @Orientation = (Single) value;
     if (values.TryGetValue("MapID", out value)) @MapID = (UInt32) value;
     if (values.TryGetValue("InstanceID", out value)) @InstanceID = (UInt32) value;
     if (values.TryGetValue("MyType", out value)) @MyType = (TypeID) value;
     if (values.TryGetValue("ObjType", out value)) @ObjType = (ObjectType) value;
     if (values.TryGetValue("UpdateFields", out value)) @UpdateFields = (UpdateField[]) value;
     if (values.TryGetValue("UpdateFlags", out value)) @UpdateFlags = (ObjectUpdateFlags) value;
 }
Ejemplo n.º 16
0
            void ReadMovementUpdateData(InPacket packet)
            {
                flags = (ObjectUpdateFlags)packet.ReadUInt16();
                if (flags.HasFlag(ObjectUpdateFlags.UPDATEFLAG_LIVING))
                {
                    ReadMovementInfo(packet);

                    movementSpeeds = new Dictionary<UnitMoveType,float>();
                    movementSpeeds[UnitMoveType.MOVE_WALK] = packet.ReadSingle();
                    movementSpeeds[UnitMoveType.MOVE_RUN] = packet.ReadSingle();
                    movementSpeeds[UnitMoveType.MOVE_RUN_BACK] = packet.ReadSingle();
                    movementSpeeds[UnitMoveType.MOVE_SWIM] = packet.ReadSingle();
                    movementSpeeds[UnitMoveType.MOVE_SWIM_BACK] = packet.ReadSingle();
                    movementSpeeds[UnitMoveType.MOVE_FLIGHT] = packet.ReadSingle();
                    movementSpeeds[UnitMoveType.MOVE_FLIGHT_BACK] = packet.ReadSingle();
                    movementSpeeds[UnitMoveType.MOVE_TURN_RATE] = packet.ReadSingle();
                    movementSpeeds[UnitMoveType.MOVE_PITCH_RATE] = packet.ReadSingle();

                    if (movementInfo.Flags.HasFlag(MovementFlags.MOVEMENTFLAG_SPLINE_ENABLED))
                    {
                        splineFlags = (SplineFlags)packet.ReadUInt32();
                        if (splineFlags.HasFlag(SplineFlags.Final_Angle))
                            splineFacingAngle = packet.ReadSingle();
                        else if (splineFlags.HasFlag(SplineFlags.Final_Target))
                            splineFacingTargetGuid = packet.ReadUInt64();
                        else if (splineFlags.HasFlag(SplineFlags.Final_Point))
                            splineFacingPointX = packet.ReadVector3();

                        splineTimePassed = packet.ReadInt32();
                        splineDuration = packet.ReadInt32();
                        splineId = packet.ReadUInt32();
                        packet.ReadSingle();
                        packet.ReadSingle();
                        splineVerticalAcceleration = packet.ReadSingle();
                        splineEffectStartTime = packet.ReadInt32();
                        uint splineCount = packet.ReadUInt32();
                        for (uint index = 0; index < splineCount; index++)
                            splinePoints.Add(packet.ReadVector3());
                        splineEvaluationMode = (SplineEvaluationMode)packet.ReadByte();
                        splineEndPoint = packet.ReadVector3();
                    }
                }
                else if (flags.HasFlag(ObjectUpdateFlags.UPDATEFLAG_POSITION))
                {
                    transportGuid = packet.ReadPackedGuid();
                    position = packet.ReadVector3();
                    transportOffset = packet.ReadVector3();
                    o = packet.ReadSingle();
                    corpseOrientation = packet.ReadSingle();
                }
                else if (flags.HasFlag(ObjectUpdateFlags.UPDATEFLAG_STATIONARY_POSITION))
                {
                    position = packet.ReadVector3();
                    o = packet.ReadSingle();
                }

                if (flags.HasFlag(ObjectUpdateFlags.UPDATEFLAG_UNKNOWN))
                    packet.ReadUInt32();

                if (flags.HasFlag(ObjectUpdateFlags.UPDATEFLAG_LOWGUID))
                    lowGuid = packet.ReadUInt32();

                if (flags.HasFlag(ObjectUpdateFlags.UPDATEFLAG_HAS_TARGET))
                    targetGuid = packet.ReadPackedGuid();

                if (flags.HasFlag(ObjectUpdateFlags.UPDATEFLAG_TRANSPORT))
                    transportTimer = packet.ReadUInt32();

                if (flags.HasFlag(ObjectUpdateFlags.UPDATEFLAG_VEHICLE))
                {
                    vehicledID = packet.ReadUInt32();
                    vehicleOrientation = packet.ReadSingle();
                }

                if (flags.HasFlag(ObjectUpdateFlags.UPDATEFLAG_ROTATION))
                    goRotation = packet.ReadInt64();
            }
Ejemplo n.º 17
0
            void ReadMovementUpdateData(InPacket packet)
            {
                flags = (ObjectUpdateFlags)packet.ReadUInt16();
                if (flags.HasFlag(ObjectUpdateFlags.UPDATEFLAG_LIVING))
                {
                    ReadMovementInfo(packet);

                    movementSpeeds = new Dictionary <UnitMoveType, float>();
                    movementSpeeds[UnitMoveType.MOVE_WALK]        = packet.ReadSingle();
                    movementSpeeds[UnitMoveType.MOVE_RUN]         = packet.ReadSingle();
                    movementSpeeds[UnitMoveType.MOVE_RUN_BACK]    = packet.ReadSingle();
                    movementSpeeds[UnitMoveType.MOVE_SWIM]        = packet.ReadSingle();
                    movementSpeeds[UnitMoveType.MOVE_SWIM_BACK]   = packet.ReadSingle();
                    movementSpeeds[UnitMoveType.MOVE_FLIGHT]      = packet.ReadSingle();
                    movementSpeeds[UnitMoveType.MOVE_FLIGHT_BACK] = packet.ReadSingle();
                    movementSpeeds[UnitMoveType.MOVE_TURN_RATE]   = packet.ReadSingle();
                    movementSpeeds[UnitMoveType.MOVE_PITCH_RATE]  = packet.ReadSingle();

                    if (movementInfo.Flags.HasFlag(MovementFlags.MOVEMENTFLAG_SPLINE_ENABLED))
                    {
                        splineFlags = (SplineFlags)packet.ReadUInt32();
                        if (splineFlags.HasFlag(SplineFlags.Final_Angle))
                        {
                            splineFacingAngle = packet.ReadSingle();
                        }
                        else if (splineFlags.HasFlag(SplineFlags.Final_Target))
                        {
                            splineFacingTargetGuid = packet.ReadUInt64();
                        }
                        else if (splineFlags.HasFlag(SplineFlags.Final_Point))
                        {
                            splineFacingPointX = packet.ReadVector3();
                        }

                        splineTimePassed = packet.ReadInt32();
                        splineDuration   = packet.ReadInt32();
                        splineId         = packet.ReadUInt32();
                        packet.ReadSingle();
                        packet.ReadSingle();
                        splineVerticalAcceleration = packet.ReadSingle();
                        splineEffectStartTime      = packet.ReadInt32();
                        uint splineCount = packet.ReadUInt32();
                        for (uint index = 0; index < splineCount; index++)
                        {
                            splinePoints.Add(packet.ReadVector3());
                        }
                        splineEvaluationMode = (SplineEvaluationMode)packet.ReadByte();
                        splineEndPoint       = packet.ReadVector3();
                    }
                }
                else if (flags.HasFlag(ObjectUpdateFlags.UPDATEFLAG_POSITION))
                {
                    transportGuid   = packet.ReadPackedGuid();
                    position        = packet.ReadVector3();
                    transportOffset = packet.ReadVector3();
                    o = packet.ReadSingle();
                    corpseOrientation = packet.ReadSingle();
                }
                else if (flags.HasFlag(ObjectUpdateFlags.UPDATEFLAG_STATIONARY_POSITION))
                {
                    position = packet.ReadVector3();
                    o        = packet.ReadSingle();
                }

                if (flags.HasFlag(ObjectUpdateFlags.UPDATEFLAG_UNKNOWN))
                {
                    packet.ReadUInt32();
                }

                if (flags.HasFlag(ObjectUpdateFlags.UPDATEFLAG_LOWGUID))
                {
                    lowGuid = packet.ReadUInt32();
                }

                if (flags.HasFlag(ObjectUpdateFlags.UPDATEFLAG_HAS_TARGET))
                {
                    targetGuid = packet.ReadPackedGuid();
                }

                if (flags.HasFlag(ObjectUpdateFlags.UPDATEFLAG_TRANSPORT))
                {
                    transportTimer = packet.ReadUInt32();
                }

                if (flags.HasFlag(ObjectUpdateFlags.UPDATEFLAG_VEHICLE))
                {
                    vehicledID         = packet.ReadUInt32();
                    vehicleOrientation = packet.ReadSingle();
                }

                if (flags.HasFlag(ObjectUpdateFlags.UPDATEFLAG_ROTATION))
                {
                    goRotation = packet.ReadInt64();
                }
            }