From 0dcebd165860bf2797e0a32bb0848b05916cb66b Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Sat, 5 Dec 2015 18:18:35 -0500 Subject: [PATCH] Finished figuring out and implementing the last friend list and black list packets. --- .../packets/send/social/FriendStatusPacket.cs | 46 ++++++++++++++++++ .../send/social/FriendlistAddedPacket.cs | 5 +- .../send/social/SendBlacklistPacket.cs | 44 +++++++++++++++++ .../send/social/SendFriendlistPacket.cs | 47 +++++++++++++++++++ 4 files changed, 139 insertions(+), 3 deletions(-) create mode 100644 FFXIVClassic Map Server/packets/send/social/FriendStatusPacket.cs create mode 100644 FFXIVClassic Map Server/packets/send/social/SendBlacklistPacket.cs create mode 100644 FFXIVClassic Map Server/packets/send/social/SendFriendlistPacket.cs diff --git a/FFXIVClassic Map Server/packets/send/social/FriendStatusPacket.cs b/FFXIVClassic Map Server/packets/send/social/FriendStatusPacket.cs new file mode 100644 index 00000000..816ddce5 --- /dev/null +++ b/FFXIVClassic Map Server/packets/send/social/FriendStatusPacket.cs @@ -0,0 +1,46 @@ +using FFXIVClassic_Lobby_Server.packets; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_Map_Server.packets.send.social +{ + class FriendStatusPacket + { + public const ushort OPCODE = 0x01CF; + public const uint PACKET_SIZE = 0x686; + + public static SubPacket buildPacket(uint playerActorID, Tuple[] friendStatus) + { + byte[] data = new byte[PACKET_SIZE - 0x20]; + + using (MemoryStream mem = new MemoryStream(data)) + { + using (BinaryWriter binWriter = new BinaryWriter(mem)) + { + binWriter.Write((UInt32)0); + int max; + + if (friendStatus.Length <= 200) + max = friendStatus.Length; + else + max = 200; + + binWriter.Write((UInt32)max); + + for (int i = 0; i < max; i++) + { + binWriter.Write((UInt64)friendStatus[i].Item1); + binWriter.Write((UInt64)(friendStatus[i].Item2 ? 1 : 0)); + } + + } + } + + return new SubPacket(OPCODE, playerActorID, playerActorID, data); + } + } +} diff --git a/FFXIVClassic Map Server/packets/send/social/FriendlistAddedPacket.cs b/FFXIVClassic Map Server/packets/send/social/FriendlistAddedPacket.cs index 620f3a5b..51036bb8 100644 --- a/FFXIVClassic Map Server/packets/send/social/FriendlistAddedPacket.cs +++ b/FFXIVClassic Map Server/packets/send/social/FriendlistAddedPacket.cs @@ -13,7 +13,7 @@ namespace FFXIVClassic_Map_Server.packets.send.social public const ushort OPCODE = 0x01CC; public const uint PACKET_SIZE = 0x067; - public static SubPacket buildPacket(uint playerActorID, bool isSuccess, uint index, bool isOnline, string nameToAdd) + public static SubPacket buildPacket(uint playerActorID, bool isSuccess, long id, bool isOnline, string nameToAdd) { byte[] data = new byte[PACKET_SIZE - 0x20]; @@ -21,8 +21,7 @@ namespace FFXIVClassic_Map_Server.packets.send.social { using (BinaryWriter binWriter = new BinaryWriter(mem)) { - binWriter.Write((UInt32)index); - binWriter.Write((UInt32)0); + binWriter.Write((UInt64)id); binWriter.Write((byte)(isOnline ? 1 : 0)); binWriter.Write((byte)(isSuccess ? 1 : 0)); binWriter.Write(Encoding.ASCII.GetBytes(nameToAdd), 0, Encoding.ASCII.GetByteCount(nameToAdd) >= 0x20 ? 0x20 : Encoding.ASCII.GetByteCount(nameToAdd)); diff --git a/FFXIVClassic Map Server/packets/send/social/SendBlacklistPacket.cs b/FFXIVClassic Map Server/packets/send/social/SendBlacklistPacket.cs new file mode 100644 index 00000000..893fb2b3 --- /dev/null +++ b/FFXIVClassic Map Server/packets/send/social/SendBlacklistPacket.cs @@ -0,0 +1,44 @@ +using FFXIVClassic_Lobby_Server.packets; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_Map_Server.packets.send.social +{ + class SendBlacklistPacket + { + public const ushort OPCODE = 0x01CB; + public const uint PACKET_SIZE = 0x686; + + public static SubPacket buildPacket(uint playerActorID, string[] blacklistedNames, ref int offset) + { + byte[] data = new byte[PACKET_SIZE - 0x20]; + + using (MemoryStream mem = new MemoryStream(data)) + { + using (BinaryWriter binWriter = new BinaryWriter(mem)) + { + binWriter.Write((UInt32)0); + int max; + + if (blacklistedNames.Length - offset <= 0x32) + max = blacklistedNames.Length - offset; + else + max = 0x32; + + binWriter.Write((UInt32)max); + + for (int i = 0; i < max; i++ ) + binWriter.Write(Encoding.ASCII.GetBytes(blacklistedNames[i]), 0, Encoding.ASCII.GetByteCount(blacklistedNames[i]) >= 0x20 ? 0x20 : Encoding.ASCII.GetByteCount(blacklistedNames[i])); + + offset += max; + } + } + + return new SubPacket(OPCODE, playerActorID, playerActorID, data); + } + } +} diff --git a/FFXIVClassic Map Server/packets/send/social/SendFriendlistPacket.cs b/FFXIVClassic Map Server/packets/send/social/SendFriendlistPacket.cs new file mode 100644 index 00000000..35d0fb7e --- /dev/null +++ b/FFXIVClassic Map Server/packets/send/social/SendFriendlistPacket.cs @@ -0,0 +1,47 @@ +using FFXIVClassic_Lobby_Server.packets; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_Map_Server.packets.send.social +{ + class SendFriendlistPacket + { + public const ushort OPCODE = 0x01CE; + public const uint PACKET_SIZE = 0x686; + + public static SubPacket buildPacket(uint playerActorID, Tuple[] friends, ref int offset) + { + byte[] data = new byte[PACKET_SIZE - 0x20]; + + using (MemoryStream mem = new MemoryStream(data)) + { + using (BinaryWriter binWriter = new BinaryWriter(mem)) + { + binWriter.Write((UInt32)0); + int max; + + if (friends.Length - offset <= 0x32) + max = friends.Length - offset; + else + max = 0x32; + + binWriter.Write((UInt32)max); + + for (int i = 0; i < max; i++) + { + binWriter.Write(Encoding.ASCII.GetBytes(friends[i].Item2), 0, Encoding.ASCII.GetByteCount(friends[i].Item2) >= 0x20 ? 0x20 : Encoding.ASCII.GetByteCount(friends[i].Item2)); + binWriter.Write((UInt64)friends[i].Item1); + } + + offset += max; + } + } + + return new SubPacket(OPCODE, playerActorID, playerActorID, data); + } + } +}