public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size) { PacketReader reader = new PacketReader(data); FullMovementData movData = reader.ReadStruct <FullMovementData>(); if (movData.entity1.ID == 0 && movData.entity2.ID != 0) { movData.entity1 = movData.entity2; } movData.timestamp = 0; // This could be simplified PacketWriter writer = new PacketWriter(); writer.WriteStruct(movData); Logger.WriteInternal("[MOV] {0} stopped moving at ({1}, {2}, {3})", context.Character.Name, Helper.FloatFromHalfPrecision(movData.currentPos.x), Helper.FloatFromHalfPrecision(movData.currentPos.y), Helper.FloatFromHalfPrecision(movData.currentPos.z)); foreach (var c in Server.Instance.Clients) { if (c == context || c.Character == null || c.CurrentZone != context.CurrentZone) { continue; } c.SendPacket(0x04, 0x71, 0x40, writer.ToArray()); } }
public MovementPacket(FullMovementData data) { this.data = data; }
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size) { PacketReader reader = new PacketReader(data); // This packet is "Compressed" basically. reader.ReadBytes(6); // Get past the junk // For simplicity's sake, read the 3 flag bytes into a big int byte[] flagBytes = reader.ReadBytes(3); uint dataFlags = flagBytes[0]; dataFlags |= (uint)(flagBytes[1] << 8); dataFlags |= (uint)(flagBytes[2] << 16); PackedData theFlags = (PackedData)dataFlags; // Debug Logger.WriteInternal("[MOV] Movement packet from {0} contains {1} data.", context.Character.Name, theFlags); // TODO: Maybe do this better someday FullMovementData dstData = new FullMovementData(); if (theFlags.HasFlag(PackedData.ENT1_ID)) { dstData.entity1.ID = (uint)reader.ReadUInt64(); } if (theFlags.HasFlag(PackedData.ENT1_TYPE)) { dstData.entity1.EntityType = (EntityType)reader.ReadUInt16(); } if (theFlags.HasFlag(PackedData.ENT1_A)) { dstData.entity1.Unknown_A = reader.ReadUInt16(); } if (theFlags.HasFlag(PackedData.ENT2_ID)) { dstData.entity1.ID = (uint)reader.ReadUInt64(); } if (theFlags.HasFlag(PackedData.ENT2_TYPE)) { dstData.entity1.EntityType = (EntityType)reader.ReadUInt16(); } if (theFlags.HasFlag(PackedData.ENT2_A)) { dstData.entity1.Unknown_A = reader.ReadUInt16(); } if (theFlags.HasFlag(PackedData.TIMESTAMP)) { dstData.timestamp = reader.ReadUInt32(); context.MovementTimestamp = dstData.timestamp; } if (theFlags.HasFlag(PackedData.ROT_X)) { dstData.rotation.x = reader.ReadUInt16(); context.CurrentLocation.RotX = Helper.FloatFromHalfPrecision(dstData.rotation.x); } if (theFlags.HasFlag(PackedData.ROT_Y)) { dstData.rotation.y = reader.ReadUInt16(); context.CurrentLocation.RotY = Helper.FloatFromHalfPrecision(dstData.rotation.y); } if (theFlags.HasFlag(PackedData.ROT_Z)) { dstData.rotation.z = reader.ReadUInt16(); context.CurrentLocation.RotZ = Helper.FloatFromHalfPrecision(dstData.rotation.z); } if (theFlags.HasFlag(PackedData.ROT_W)) { dstData.rotation.w = reader.ReadUInt16(); context.CurrentLocation.RotW = Helper.FloatFromHalfPrecision(dstData.rotation.w); } if (theFlags.HasFlag(PackedData.CUR_X)) { dstData.currentPos.x = reader.ReadUInt16(); context.CurrentLocation.PosX = Helper.FloatFromHalfPrecision(dstData.currentPos.x); } if (theFlags.HasFlag(PackedData.CUR_Y)) { dstData.currentPos.y = reader.ReadUInt16(); context.CurrentLocation.PosY = Helper.FloatFromHalfPrecision(dstData.currentPos.y); } if (theFlags.HasFlag(PackedData.CUR_Z)) { dstData.currentPos.z = reader.ReadUInt16(); context.CurrentLocation.PosZ = Helper.FloatFromHalfPrecision(dstData.currentPos.z); } if (theFlags.HasFlag(PackedData.UNKNOWN4)) { dstData.Unknown2 = reader.ReadUInt16(); } if (theFlags.HasFlag(PackedData.UNK_X)) { dstData.unknownPos.x = reader.ReadUInt16(); context.LastLocation.PosX = Helper.FloatFromHalfPrecision(dstData.unknownPos.x); } if (theFlags.HasFlag(PackedData.UNK_Y)) { dstData.unknownPos.y = reader.ReadUInt16(); context.LastLocation.PosY = Helper.FloatFromHalfPrecision(dstData.unknownPos.y); } if (theFlags.HasFlag(PackedData.UNK_Z)) { dstData.unknownPos.z = reader.ReadUInt16(); context.LastLocation.PosZ = Helper.FloatFromHalfPrecision(dstData.unknownPos.z); } if (theFlags.HasFlag(PackedData.UNKNOWN5)) { dstData.Unknown3 = reader.ReadUInt16(); } if (theFlags.HasFlag(PackedData.UNKNOWN6)) { if (theFlags.HasFlag(PackedData.UNKNOWN7)) { dstData.Unknown4 = reader.ReadByte(); } else { dstData.Unknown4 = reader.ReadUInt32(); } } Logger.WriteInternal("[MOV] Player moving! {0} -> ({1}, {2}, {3})", context.Character.Name, context.CurrentLocation.PosX, context.CurrentLocation.PosY, context.CurrentLocation.PosZ); foreach (var c in Server.Instance.Clients) { if (c.Character == null || c == context || c.CurrentZone != context.CurrentZone) { continue; } c.SendPacket(0x4, 0x7, flags, data); } }
public override void HandlePacket(Client context, byte flags, byte[] data, uint position, uint size) { PacketReader reader = new PacketReader(data); // This packet is "Compressed" basically. reader.ReadBytes(6); // Get past the junk // For simplicity's sake, read the 3 flag bytes into a big int byte[] flagBytes = reader.ReadBytes(3); uint dataFlags = flagBytes[0]; dataFlags |= (uint)(flagBytes[1] << 8); dataFlags |= (uint)(flagBytes[2] << 16); PackedData theFlags = (PackedData)dataFlags; // Debug Logger.WriteInternal("[MOV] Movement packet from {0} contains {1} data.", context.Character.Name, theFlags); // TODO: Maybe do this better someday FullMovementData dstData = new FullMovementData(); if (theFlags.HasFlag(PackedData.ENT1_ID)) { dstData.entity1.ID = (uint)reader.ReadUInt64(); } if (theFlags.HasFlag(PackedData.ENT1_TYPE)) { dstData.entity1.EntityType = (EntityType)reader.ReadUInt16(); } if (theFlags.HasFlag(PackedData.ENT1_A)) { dstData.entity1.Unknown_A = reader.ReadUInt16(); } if (theFlags.HasFlag(PackedData.ENT2_ID)) { dstData.entity1.ID = (uint)reader.ReadUInt64(); } if (theFlags.HasFlag(PackedData.ENT2_TYPE)) { dstData.entity1.EntityType = (EntityType)reader.ReadUInt16(); } if (theFlags.HasFlag(PackedData.ENT2_A)) { dstData.entity1.Unknown_A = reader.ReadUInt16(); } if (theFlags.HasFlag(PackedData.TIMESTAMP)) { dstData.timestamp = reader.ReadUInt32(); context.MovementTimestamp = dstData.timestamp; } if (theFlags.HasFlag(PackedData.ROT_X)) { dstData.rotation.x = reader.ReadUInt16(); context.CurrentLocation.RotX = Helper.FloatFromHalfPrecision(dstData.rotation.x); } if (theFlags.HasFlag(PackedData.ROT_Y)) { dstData.rotation.y = reader.ReadUInt16(); context.CurrentLocation.RotY = Helper.FloatFromHalfPrecision(dstData.rotation.y); } if (theFlags.HasFlag(PackedData.ROT_Z)) { dstData.rotation.z = reader.ReadUInt16(); context.CurrentLocation.RotZ = Helper.FloatFromHalfPrecision(dstData.rotation.z); } if (theFlags.HasFlag(PackedData.ROT_W)) { dstData.rotation.w = reader.ReadUInt16(); context.CurrentLocation.RotW = Helper.FloatFromHalfPrecision(dstData.rotation.w); } if (theFlags.HasFlag(PackedData.CUR_X)) { dstData.currentPos.x = reader.ReadUInt16(); context.CurrentLocation.PosX = Helper.FloatFromHalfPrecision(dstData.currentPos.x); } if (theFlags.HasFlag(PackedData.CUR_Y)) { dstData.currentPos.y = reader.ReadUInt16(); context.CurrentLocation.PosY = Helper.FloatFromHalfPrecision(dstData.currentPos.y); } if (theFlags.HasFlag(PackedData.CUR_Z)) { dstData.currentPos.z = reader.ReadUInt16(); context.CurrentLocation.PosZ = Helper.FloatFromHalfPrecision(dstData.currentPos.z); } if (theFlags.HasFlag(PackedData.UNKNOWN4)) { dstData.Unknown2 = reader.ReadUInt16(); } if (theFlags.HasFlag(PackedData.UNK_X)) { dstData.unknownPos.x = reader.ReadUInt16(); context.LastLocation.PosX = Helper.FloatFromHalfPrecision(dstData.unknownPos.x); } if (theFlags.HasFlag(PackedData.UNK_Y)) { dstData.unknownPos.y = reader.ReadUInt16(); context.LastLocation.PosY = Helper.FloatFromHalfPrecision(dstData.unknownPos.y); } if (theFlags.HasFlag(PackedData.UNK_Z)) { dstData.unknownPos.z = reader.ReadUInt16(); context.LastLocation.PosZ = Helper.FloatFromHalfPrecision(dstData.unknownPos.z); } if (theFlags.HasFlag(PackedData.UNKNOWN5)) { dstData.Unknown3 = reader.ReadUInt16(); } if (theFlags.HasFlag(PackedData.UNKNOWN6)) { if (theFlags.HasFlag(PackedData.UNKNOWN7)) { dstData.Unknown4 = reader.ReadByte(); } else { dstData.Unknown4 = reader.ReadUInt32(); } } Logger.WriteInternal("[MOV] Player moving! {0} -> ({1}, {2}, {3})", context.Character.Name, context.CurrentLocation.PosX, context.CurrentLocation.PosY, context.CurrentLocation.PosZ); foreach (var c in Server.Instance.Clients) { if (c.Character == null || c == context || c.CurrentZone != context.CurrentZone) continue; c.SendPacket(0x4, 0x7, flags, data); } }