diff --git a/FFXIVClassic_Lobby_Server/FFXIVClassic_Lobby_Server.csproj b/FFXIVClassic_Lobby_Server/FFXIVClassic_Lobby_Server.csproj index de26b36a..cbf0bda1 100644 --- a/FFXIVClassic_Lobby_Server/FFXIVClassic_Lobby_Server.csproj +++ b/FFXIVClassic_Lobby_Server/FFXIVClassic_Lobby_Server.csproj @@ -52,6 +52,7 @@ + @@ -62,10 +63,12 @@ + + diff --git a/FFXIVClassic_Lobby_Server/PacketProcessor.cs b/FFXIVClassic_Lobby_Server/PacketProcessor.cs index 106983be..0912b786 100644 --- a/FFXIVClassic_Lobby_Server/PacketProcessor.cs +++ b/FFXIVClassic_Lobby_Server/PacketProcessor.cs @@ -148,6 +148,7 @@ namespace FFXIVClassic_Lobby_Server Console.WriteLine("{0} => Get characters", client.currentUserId == 0 ? client.getAddress() : "User " + client.currentUserId); sendWorldList(client, packet); + sendCharacterList(client, packet); BasePacket outgoingPacket = new BasePacket("./packets/getCharsPacket.bin"); BasePacket.encryptPacket(client.blowfish, outgoingPacket); @@ -270,7 +271,18 @@ namespace FFXIVClassic_Lobby_Server private void sendCharacterList(ClientConnection client, SubPacket packet) { + //List serverList = Database.getServers(); + List charaList = new List(); + charaList.Add(new Character()); + charaList.Add(new Character()); + + CharacterListPacket characterlistPacket = new CharacterListPacket(1, charaList); + List subPackets = characterlistPacket.buildPackets(); + + BasePacket basePacket = BasePacket.createPacket(subPackets, true, false); + BasePacket.encryptPacket(client.blowfish, basePacket); + client.queuePacket(basePacket); } } diff --git a/FFXIVClassic_Lobby_Server/dataobjects/Character.cs b/FFXIVClassic_Lobby_Server/dataobjects/Character.cs index 7de8836d..5947f952 100644 --- a/FFXIVClassic_Lobby_Server/dataobjects/Character.cs +++ b/FFXIVClassic_Lobby_Server/dataobjects/Character.cs @@ -9,7 +9,8 @@ namespace FFXIVClassic_Lobby_Server { class Character { - public string name = ""; + public string name = "Test Test"; + public string world = "Test World"; public uint id = 0; diff --git a/FFXIVClassic_Lobby_Server/dataobjects/Retainer.cs b/FFXIVClassic_Lobby_Server/dataobjects/Retainer.cs new file mode 100644 index 00000000..e0769a91 --- /dev/null +++ b/FFXIVClassic_Lobby_Server/dataobjects/Retainer.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using FFXIVClassic_Lobby_Server.common; + +namespace FFXIVClassic_Lobby_Server +{ + class Retainer + { + public string name = ""; + + } +} diff --git a/FFXIVClassic_Lobby_Server/packets/CharacterListPacket.cs b/FFXIVClassic_Lobby_Server/packets/CharacterListPacket.cs new file mode 100644 index 00000000..61ea5612 --- /dev/null +++ b/FFXIVClassic_Lobby_Server/packets/CharacterListPacket.cs @@ -0,0 +1,103 @@ +using FFXIVClassic_Lobby_Server.dataobjects; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_Lobby_Server.packets +{ + class CharacterListPacket + { + public const ushort OPCODE = 0x0D; + public const ushort MAXPERPACKET = 3; + + private ulong sequence; + private List characterList; + + public CharacterListPacket(ulong sequence, List characterList) + { + this.sequence = sequence; + this.characterList = characterList; + } + + public List buildPackets() + { + List subPackets = new List(); + + int characterCount = 0; + int totalCount = 0; + + MemoryStream memStream = null; + BinaryWriter binWriter = null; + + foreach (Character chara in characterList) + { + if (totalCount == 0 || characterCount % MAXPERPACKET == 0) + { + memStream = new MemoryStream(0x3D0); + binWriter = new BinaryWriter(memStream); + + //Write List Info + binWriter.Write((UInt64)sequence); + binWriter.Write(characterList.Count - totalCount <= MAXPERPACKET ? (byte)(characterList.Count + 1) : (byte)0); + binWriter.Write(characterList.Count - totalCount <= MAXPERPACKET ? (UInt32)(characterList.Count - totalCount) : (UInt32)MAXPERPACKET); + binWriter.Write((byte)6); + binWriter.Write((UInt16)5); + } + + binWriter.Seek(0x10 + (0x1D0 * characterCount), SeekOrigin.Begin); + + //Write Entries + binWriter.Write((uint)0); + binWriter.Write((uint)totalCount); + binWriter.Write((uint)0); + binWriter.Write((uint)0); + binWriter.Write(Encoding.ASCII.GetBytes(chara.name.PadRight(0x20, '\0'))); + binWriter.Write(Encoding.ASCII.GetBytes(chara.world.PadRight(0x10, '\0'))); + binWriter.Write("wAQAAOonIyMNAAAAV3Jlbml4IFdyb25nABwAAAAEAAAAAwAAAAMAAAA_8OADAAHQFAAEAAABAAAAABTQCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGEgAAAAMQAAQCQAAMAsAACKVAAAAPgCAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAAAAkAwAAAAAAAAAAANvb1M05AQAABBoAAAEABqoiIuIKAAAAcHJ2MElubjAxABEAAABkZWZhdWx0VGVycml0b3J5AAwJAhcABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAA="); + + characterCount++; + totalCount++; + + //Send this chunk of character list + if (characterCount >= MAXPERPACKET) + { + byte[] data = memStream.GetBuffer(); + binWriter.Dispose(); + memStream.Dispose(); + SubPacket subpacket = new SubPacket(OPCODE, 0xe0006868, 0xe0006868, data); + subPackets.Add(subpacket); + characterCount = 0; + } + + } + + //If there is anything left that was missed or the list is empty + if (characterCount > 0 || characterList.Count == 0) + { + if (characterList.Count == 0) + { + memStream = new MemoryStream(0x3D0); + binWriter = new BinaryWriter(memStream); + + //Write Empty List Info + binWriter.Write((UInt64)0); + binWriter.Write((byte)1); + binWriter.Write((UInt32)0); + binWriter.Write((byte)0); + binWriter.Write((UInt16)0); + } + + byte[] data = memStream.GetBuffer(); + binWriter.Dispose(); + memStream.Dispose(); + SubPacket subpacket = new SubPacket(OPCODE, 0xe0006868, 0xe0006868, data); + subPackets.Add(subpacket); + } + + return subPackets; + } + } +} diff --git a/FFXIVClassic_Lobby_Server/packets/RetainerListPacket.cs b/FFXIVClassic_Lobby_Server/packets/RetainerListPacket.cs new file mode 100644 index 00000000..d308df19 --- /dev/null +++ b/FFXIVClassic_Lobby_Server/packets/RetainerListPacket.cs @@ -0,0 +1,97 @@ +using FFXIVClassic_Lobby_Server.dataobjects; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_Lobby_Server.packets +{ + class RetainerListPacket + { + public const ushort OPCODE = 0x17; + public const ushort MAXPERPACKET = 3; + + private List retainerList; + + public RetainerListPacket(List retainerList) + { + this.retainerList = retainerList; + } + + public List buildPackets() + { + List subPackets = new List(); + + int retainerCount = 0; + int totalCount = 0; + + MemoryStream memStream = null; + BinaryWriter binWriter = null; + + foreach (Retainer chara in retainerList) + { + if (totalCount == 0 || retainerCount % MAXPERPACKET == 0) + { + memStream = new MemoryStream(0x210); + binWriter = new BinaryWriter(memStream); + + //Write List Info + binWriter.Write((UInt64)0); + binWriter.Write(retainerList.Count - totalCount <= MAXPERPACKET ? (byte)(retainerList.Count + 1) : (byte)0); + binWriter.Write(retainerList.Count - totalCount <= MAXPERPACKET ? (UInt32)(retainerList.Count - totalCount) : (UInt32)MAXPERPACKET); + binWriter.Write((byte)6); + binWriter.Write((UInt16)5); + } + + //Write Entries + //binWriter.Write((ushort)world.id); + //binWriter.Write((ushort)world.listPosition); + //binWriter.Write((uint)world.population); + //binWriter.Write((UInt64)0); + //binWriter.Write(Encoding.ASCII.GetBytes(world.name.PadRight(64, '\0'))); + + retainerCount++; + totalCount++; + + //Send this chunk of character list + if (retainerCount >= MAXPERPACKET) + { + byte[] data = memStream.GetBuffer(); + binWriter.Dispose(); + memStream.Dispose(); + SubPacket subpacket = new SubPacket(OPCODE, 0xe0006868, 0xe0006868, data); + subPackets.Add(subpacket); + retainerCount = 0; + } + + } + + //If there is anything left that was missed or the list is empty + if (retainerCount > 0 || retainerList.Count == 0) + { + if (retainerList.Count == 0) + { + memStream = new MemoryStream(0x210); + binWriter = new BinaryWriter(memStream); + + //Write Empty List Info + binWriter.Write((UInt64)0); + binWriter.Write((byte)1); + binWriter.Write((UInt32)0); + binWriter.Write((byte)0); + binWriter.Write((UInt16)0); + } + + byte[] data = memStream.GetBuffer(); + binWriter.Dispose(); + memStream.Dispose(); + SubPacket subpacket = new SubPacket(OPCODE, 0xe0006868, 0xe0006868, data); + subPackets.Add(subpacket); + } + + return subPackets; + } + } +} diff --git a/FFXIVClassic_Lobby_Server/packets/WorldListPacket.cs b/FFXIVClassic_Lobby_Server/packets/WorldListPacket.cs index 9691d2de..34385d4b 100644 --- a/FFXIVClassic_Lobby_Server/packets/WorldListPacket.cs +++ b/FFXIVClassic_Lobby_Server/packets/WorldListPacket.cs @@ -10,6 +10,9 @@ namespace FFXIVClassic_Lobby_Server.packets { class WorldListPacket { + public const ushort OPCODE = 0x15; + public const ushort MAXPERPACKET = 6; + private List worldList; public WorldListPacket(List serverList) @@ -29,17 +32,17 @@ namespace FFXIVClassic_Lobby_Server.packets foreach (World world in worldList) { - if (totalCount == 0 || serverCount % 6 == 0) + if (totalCount == 0 || serverCount % MAXPERPACKET == 0) { memStream = new MemoryStream(0x210); binWriter = new BinaryWriter(memStream); //Write List Info binWriter.Write((UInt64)0); - binWriter.Write(worldList.Count - totalCount <= 6 ? (byte)(worldList.Count + 1) : (byte)0); - binWriter.Write(worldList.Count - totalCount <= 6 ? (UInt32)(worldList.Count - totalCount) : (UInt32)6); - binWriter.Write((byte)6); - binWriter.Write((UInt16)5); + binWriter.Write(worldList.Count - totalCount <= MAXPERPACKET ? (byte)(worldList.Count + 1) : (byte)0); + binWriter.Write(worldList.Count - totalCount <= MAXPERPACKET ? (UInt32)(worldList.Count - totalCount) : (UInt32)MAXPERPACKET); + binWriter.Write((byte)0); + binWriter.Write((UInt16)0); } //Write Entries @@ -53,12 +56,12 @@ namespace FFXIVClassic_Lobby_Server.packets totalCount++; //Send this chunk of world list - if (serverCount >= 6) + if (serverCount >= MAXPERPACKET) { byte[] data = memStream.GetBuffer(); binWriter.Dispose(); memStream.Dispose(); - SubPacket subpacket = new SubPacket(0x15, 0xe0006868, 0xe0006868, data); + SubPacket subpacket = new SubPacket(OPCODE, 0xe0006868, 0xe0006868, data); subPackets.Add(subpacket); serverCount = 0; } @@ -84,7 +87,7 @@ namespace FFXIVClassic_Lobby_Server.packets byte[] data = memStream.GetBuffer(); binWriter.Dispose(); memStream.Dispose(); - SubPacket subpacket = new SubPacket(0x15, 0xe0006868, 0xe0006868, data); + SubPacket subpacket = new SubPacket(OPCODE, 0xe0006868, 0xe0006868, data); subPackets.Add(subpacket); }