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); }
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); } }
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)); }
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); } } }
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; }
/// <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; }
/// <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); }
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)); } } }
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); // ? } }
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); }
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); } }
/// <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) { }
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); } }
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; }
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(); }
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(); } }