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);
+ }
+ }
+}