mirror of
https://bitbucket.org/Ioncannon/project-meteor-server.git
synced 2025-05-20 08:26:59 -04:00
Added account and select character packet creators. Fixed wrong field being read for session id. Most of the server is now NOT hardcoded and customizable from the DB. Only hardcoded packet left is the initial handshake.
This commit is contained in:
99
FFXIVClassic_Lobby_Server/packets/AccountListPacket.cs
Normal file
99
FFXIVClassic_Lobby_Server/packets/AccountListPacket.cs
Normal file
@@ -0,0 +1,99 @@
|
||||
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 AccountListPacket
|
||||
{
|
||||
public const ushort OPCODE = 0x0C;
|
||||
public const ushort MAXPERPACKET = 8;
|
||||
|
||||
private UInt64 sequence;
|
||||
private List<Account> accountList;
|
||||
|
||||
public AccountListPacket(UInt64 sequence, List<Account> accountList)
|
||||
{
|
||||
this.sequence = sequence;
|
||||
this.accountList = accountList;
|
||||
}
|
||||
|
||||
public List<SubPacket> buildPackets()
|
||||
{
|
||||
List<SubPacket> subPackets = new List<SubPacket>();
|
||||
|
||||
int accountCount = 0;
|
||||
int totalCount = 0;
|
||||
|
||||
MemoryStream memStream = null;
|
||||
BinaryWriter binWriter = null;
|
||||
|
||||
foreach (Account account in accountList)
|
||||
{
|
||||
if (totalCount == 0 || accountCount % MAXPERPACKET == 0)
|
||||
{
|
||||
memStream = new MemoryStream(0x280);
|
||||
binWriter = new BinaryWriter(memStream);
|
||||
|
||||
//Write List Info
|
||||
binWriter.Write((UInt64)sequence);
|
||||
byte listTracker = (byte)((MAXPERPACKET * 2) * subPackets.Count);
|
||||
binWriter.Write(accountList.Count - totalCount <= MAXPERPACKET ? (byte)(listTracker + 1) : (byte)(listTracker));
|
||||
binWriter.Write(accountList.Count - totalCount <= MAXPERPACKET ? (UInt32)(accountList.Count - totalCount) : (UInt32)MAXPERPACKET);
|
||||
binWriter.Write((byte)0);
|
||||
binWriter.Write((UInt16)0);
|
||||
}
|
||||
|
||||
//Write Entries
|
||||
binWriter.Write((UInt32)account.id);
|
||||
binWriter.Write((UInt32)0);
|
||||
binWriter.Write(Encoding.ASCII.GetBytes(account.name.PadRight(0x40, '\0')));
|
||||
|
||||
accountCount++;
|
||||
totalCount++;
|
||||
|
||||
//Send this chunk of world list
|
||||
if (accountCount >= MAXPERPACKET)
|
||||
{
|
||||
byte[] data = memStream.GetBuffer();
|
||||
binWriter.Dispose();
|
||||
memStream.Dispose();
|
||||
SubPacket subpacket = new SubPacket(OPCODE, 0xe0006868, 0xe0006868, data);
|
||||
subPackets.Add(subpacket);
|
||||
accountCount = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//If there is anything left that was missed or the list is empty
|
||||
if (accountCount > 0 || accountList.Count == 0)
|
||||
{
|
||||
if (accountList.Count == 0)
|
||||
{
|
||||
memStream = new MemoryStream(0x210);
|
||||
binWriter = new BinaryWriter(memStream);
|
||||
|
||||
//Write Empty List Info
|
||||
binWriter.Write((UInt64)sequence);
|
||||
byte listTracker = (byte)((MAXPERPACKET * 2) * subPackets.Count);
|
||||
binWriter.Write(accountList.Count - totalCount <= MAXPERPACKET ? (byte)(listTracker + 1) : (byte)(listTracker));
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
@@ -13,13 +13,13 @@ namespace FFXIVClassic_Lobby_Server.packets
|
||||
public unsafe struct SessionPacket
|
||||
{
|
||||
[FieldOffset(0)]
|
||||
public UInt64 sequence;
|
||||
public UInt64 sequence;
|
||||
[FieldOffset(0x10)]
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x40)]
|
||||
public String session;
|
||||
[FieldOffset(0x50)]
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]
|
||||
public String version;
|
||||
[FieldOffset(0x70)]
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]
|
||||
public String session;
|
||||
public String version;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
@@ -37,38 +37,13 @@ namespace FFXIVClassic_Lobby_Server.packets
|
||||
public String characterInfoEncoded;
|
||||
}
|
||||
|
||||
//Response Packets
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public unsafe struct ReserveCharaResponse
|
||||
public unsafe struct SelectCharRequestPacket
|
||||
{
|
||||
public UInt64 sequence;
|
||||
public uint errorCode;
|
||||
public uint statusCode;
|
||||
public uint errorId;
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x2BB)]
|
||||
public String errorMessage;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public unsafe struct MakeCharaResponse
|
||||
{
|
||||
public UInt64 sequence;
|
||||
public uint errorCode;
|
||||
public uint statusCode;
|
||||
public uint errorId;
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x2BB)]
|
||||
public String errorMessage;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public unsafe struct DeleteCharaResponse
|
||||
{
|
||||
public UInt64 sequence;
|
||||
public uint errorCode;
|
||||
public uint statusCode;
|
||||
public uint errorId;
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x2BB)]
|
||||
public String errorMessage;
|
||||
public uint characterId;
|
||||
public uint unknownId;
|
||||
public UInt64 ticket;
|
||||
}
|
||||
|
||||
public static unsafe CharacterRequestPacket toCharacterRequestStruct(byte[] bytes)
|
||||
@@ -87,6 +62,14 @@ namespace FFXIVClassic_Lobby_Server.packets
|
||||
}
|
||||
}
|
||||
|
||||
public static unsafe SelectCharRequestPacket toSelectCharRequestStruct(byte[] bytes)
|
||||
{
|
||||
fixed (byte* pdata = &bytes[0])
|
||||
{
|
||||
return (SelectCharRequestPacket)Marshal.PtrToStructure(new IntPtr(pdata), typeof(SelectCharRequestPacket));
|
||||
}
|
||||
}
|
||||
|
||||
public static byte[] StructureToByteArray(object obj)
|
||||
{
|
||||
int len = Marshal.SizeOf(obj);
|
||||
|
@@ -0,0 +1,59 @@
|
||||
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 SelectCharacterConfirmPacket
|
||||
{
|
||||
public const ushort OPCODE = 0x0F;
|
||||
|
||||
private UInt64 sequence;
|
||||
private UInt32 characterId;
|
||||
private string sessionToken;
|
||||
private string worldIp;
|
||||
private UInt16 worldPort;
|
||||
private UInt64 selectCharTicket;
|
||||
|
||||
public SelectCharacterConfirmPacket(UInt64 sequence, UInt32 characterId, string sessionToken, string worldIp, ushort worldPort, UInt64 selectCharTicket)
|
||||
{
|
||||
this.sequence = sequence;
|
||||
this.characterId = characterId;
|
||||
this.sessionToken = sessionToken;
|
||||
this.worldIp = worldIp;
|
||||
this.worldPort = worldPort;
|
||||
this.selectCharTicket = selectCharTicket;
|
||||
}
|
||||
|
||||
public List<SubPacket> buildPackets()
|
||||
{
|
||||
List<SubPacket> subPackets = new List<SubPacket>();
|
||||
|
||||
byte[] data;
|
||||
|
||||
using (MemoryStream memStream = new MemoryStream(0x98))
|
||||
{
|
||||
using (BinaryWriter binWriter = new BinaryWriter(memStream))
|
||||
{
|
||||
binWriter.Write((UInt64)sequence);
|
||||
binWriter.Write((UInt32)characterId); //ActorId
|
||||
binWriter.Write((UInt32)characterId); //CharacterId
|
||||
binWriter.Write((UInt32)0);
|
||||
binWriter.Write(Encoding.ASCII.GetBytes(sessionToken.PadRight(0x42, '\0'))); //Session Token
|
||||
binWriter.Write((UInt16)worldPort); //World Port
|
||||
binWriter.Write(Encoding.ASCII.GetBytes(worldIp.PadRight(0x38, '\0'))); //World Hostname/IP
|
||||
binWriter.Write((UInt64)selectCharTicket); //Ticket or Handshake of somekind
|
||||
}
|
||||
data = memStream.GetBuffer();
|
||||
}
|
||||
|
||||
SubPacket subpacket = new SubPacket(OPCODE, 0xe0006868, 0xe0006868, data);
|
||||
subPackets.Add(subpacket);
|
||||
|
||||
return subPackets;
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user