From 93a08c0128172ee275daa238e058b2e5a5ade49a Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Sun, 6 Dec 2015 22:58:42 -0500 Subject: [PATCH] More recruitment packets implemented. Still need to finish the search results packet. --- .../FFXIVClassic Map Server.csproj | 3 ++ FFXIVClassic Map Server/PacketProcessor.cs | 21 +++++++----- .../RecruitmentDetailsRequestPacket.cs | 33 ++++++++++++++++++ .../send/recruitment/EndRecruitmentPacket.cs | 22 ++++++++++++ .../send/recruitment/RecruiterStatePacket.cs | 34 +++++++++++++++++++ 5 files changed, 105 insertions(+), 8 deletions(-) create mode 100644 FFXIVClassic Map Server/packets/receive/recruitment/RecruitmentDetailsRequestPacket.cs create mode 100644 FFXIVClassic Map Server/packets/send/recruitment/EndRecruitmentPacket.cs create mode 100644 FFXIVClassic Map Server/packets/send/recruitment/RecruiterStatePacket.cs diff --git a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj index 80e19018..ef44b3a0 100644 --- a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj +++ b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj @@ -91,6 +91,7 @@ + @@ -141,6 +142,8 @@ + + diff --git a/FFXIVClassic Map Server/PacketProcessor.cs b/FFXIVClassic Map Server/PacketProcessor.cs index 73ba9557..31dc42a3 100644 --- a/FFXIVClassic Map Server/PacketProcessor.cs +++ b/FFXIVClassic Map Server/PacketProcessor.cs @@ -347,14 +347,21 @@ namespace FFXIVClassic_Lobby_Server StartRecruitingRequestPacket recruitRequestPacket = new StartRecruitingRequestPacket(subpacket.data); client.queuePacket(BasePacket.createPacket(StartRecruitingResponse.buildPacket(player.actorID, true), true, false)); break; + //End Recruiting + case 0x01C4: + client.queuePacket(BasePacket.createPacket(EndRecruitmentPacket.buildPacket(player.actorID), true, false)); + break; + //Party Window Opened, Request State + case 0x01C5: + client.queuePacket(BasePacket.createPacket(RecruiterStatePacket.buildPacket(player.actorID, true, true, 1), true, false)); + break; + //Search Recruiting case 0x01C7: - subpacket.debugPrintSubPacket(); RecruitmentSearchRequestPacket recruitSearchPacket = new RecruitmentSearchRequestPacket(subpacket.data); break; - //Current Recruitment Details + //Get Recruitment Details case 0x01C8: - subpacket.debugPrintSubPacket(); - //CurrentRecruitmentDetailsPacket currentRecruitDetailsPacket = new CurrentRecruitmentDetailsPacket(subpacket.data); + RecruitmentDetailsRequestPacket currentRecruitDetailsPacket = new RecruitmentDetailsRequestPacket(subpacket.data); RecruitmentDetails details = new RecruitmentDetails(); details.recruiterName = "Localhost Character"; details.purposeId = 2; @@ -364,12 +371,10 @@ namespace FFXIVClassic_Lobby_Server details.num[0] = 1; client.queuePacket(BasePacket.createPacket(CurrentRecruitmentDetailsPacket.buildPacket(player.actorID, details), true, false)); break; - //Party Window Opened, Request State - case 0x01C5: - case 0x01C4: + //Accepted Recruiting case 0x01C6: subpacket.debugPrintSubPacket(); - break; + break; /* SOCIAL STUFF */ case 0x01C9: AddRemoveSocialPacket addBlackList = new AddRemoveSocialPacket(subpacket.data); diff --git a/FFXIVClassic Map Server/packets/receive/recruitment/RecruitmentDetailsRequestPacket.cs b/FFXIVClassic Map Server/packets/receive/recruitment/RecruitmentDetailsRequestPacket.cs new file mode 100644 index 00000000..7f2706af --- /dev/null +++ b/FFXIVClassic Map Server/packets/receive/recruitment/RecruitmentDetailsRequestPacket.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_Map_Server.packets.receive.recruitment +{ + class RecruitmentDetailsRequestPacket + { + public bool invalidPacket = false; + + public ulong recruitmentId; + + public RecruitmentDetailsRequestPacket(byte[] data) + { + using (MemoryStream mem = new MemoryStream(data)) + { + using (BinaryReader binReader = new BinaryReader(mem)) + { + try{ + recruitmentId = binReader.ReadUInt64(); + + } + catch (Exception){ + invalidPacket = true; + } + } + } + } + } +} diff --git a/FFXIVClassic Map Server/packets/send/recruitment/EndRecruitmentPacket.cs b/FFXIVClassic Map Server/packets/send/recruitment/EndRecruitmentPacket.cs new file mode 100644 index 00000000..cf67203a --- /dev/null +++ b/FFXIVClassic Map Server/packets/send/recruitment/EndRecruitmentPacket.cs @@ -0,0 +1,22 @@ +using FFXIVClassic_Lobby_Server.packets; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_Map_Server.packets.send.recruitment +{ + class EndRecruitmentPacket + { + public const ushort OPCODE = 0x01C4; + public const uint PACKET_SIZE = 0x28; + + public static SubPacket buildPacket(uint playerActorID) + { + byte[] data = new byte[PACKET_SIZE - 0x20]; + data[0] = 1; + return new SubPacket(OPCODE, playerActorID, playerActorID, data); + } + } +} diff --git a/FFXIVClassic Map Server/packets/send/recruitment/RecruiterStatePacket.cs b/FFXIVClassic Map Server/packets/send/recruitment/RecruiterStatePacket.cs new file mode 100644 index 00000000..50d4b82e --- /dev/null +++ b/FFXIVClassic Map Server/packets/send/recruitment/RecruiterStatePacket.cs @@ -0,0 +1,34 @@ +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.recruitment +{ + class RecruiterStatePacket + { + public const ushort OPCODE = 0x01C5; + public const uint PACKET_SIZE = 0x038; + + public static SubPacket buildPacket(uint playerActorID, bool isRecruiting, bool isRecruiter, long recruitmentId) + { + byte[] data = new byte[PACKET_SIZE - 0x20]; + + using (MemoryStream mem = new MemoryStream(data)) + { + using (BinaryWriter binWriter = new BinaryWriter(mem)) + { + binWriter.Write((UInt64)recruitmentId); + binWriter.Write((UInt32)0); + binWriter.Write((byte)(isRecruiter ? 1 : 0)); + binWriter.Write((byte)(isRecruiting ? 1 : 0)); + } + } + + return new SubPacket(OPCODE, playerActorID, playerActorID, data); + } + } +}