Skip to content

Commit

Permalink
Packets 22 and 150 - Game Servers By ID - All (#45)
Browse files Browse the repository at this point in the history
* Preliminary adding, it reads and sends as it should but no real data is sent, just enough to satisfy xfire awaiting something.
* This packet deals with fetching all game server information based on Game ID.

Added Inbound Packet GameServerFetchAll (22)
 ! This one sends a numerical attribute name.
 * It only expects a gameid. From there the server sends back GameServerSendAll packet.

Added Outbound Packet GameServerSendAll (150)
 * Three attributes are sent: gameid, a list of gameips and a list of gameports (both iterates in sync).
 ! All three attributes are numerical.
 * I have added as such for future addition: It makes the lists but doesn't populate them and sends back the GameId sent by the client.
 * In my testing of using a list of hardcoded localhost servers results using Quake 3 and Half-Life 1.5 proved to work, as the base xfire client comes with server query tools built in.

XFireMessageType and XFireMessageTypeFactory adds the packets to the lists as needed.

MessageSerializer's GetAttributeName now includes GameServerFetchAll as it recieves attributes that aren't strings. I should fix this eventually, as some packets use bytes and others use strings.
  • Loading branch information
desukuran authored Mar 28, 2024
1 parent b772c67 commit f50774e
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/PFire.Core/Protocol/MessageSerializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ private static string GetAttributeName(BinaryReader reader, Type messageType)
// TODO: Be brave enough to find an elegant fix for this
// XFire decides not to follow its own rules. Message type 32 does not have a prefix byte for the length of the attribute name
// and breaks this code. Assume first byte after the attribute count as the attribute name
var count = messageType == typeof(StatusChange) ? 1 : reader.ReadByte();
var count = (messageType == typeof(StatusChange) || messageType == typeof(GameServerFetchAll)) ? 1 : reader.ReadByte();

var readBytes = reader.ReadBytes(count);
return Encoding.UTF8.GetString(readBytes);
Expand Down
19 changes: 19 additions & 0 deletions src/PFire.Core/Protocol/Messages/Inbound/GameServerFetchAll.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using PFire.Core.Protocol.Messages.Outbound;
using PFire.Core.Session;
using System.Threading.Tasks;

namespace PFire.Core.Protocol.Messages.Inbound
{
internal sealed class GameServerFetchAll : XFireMessage
{
public GameServerFetchAll() : base(XFireMessageType.GameServerFetchAll) { }

[XMessageField(0x21)]
public int GameId { get; set; }

public override async Task Process(IXFireClient context)
{
await context.SendAndProcessMessage(new GameServerSendAll(GameId));
}
}
}
39 changes: 39 additions & 0 deletions src/PFire.Core/Protocol/Messages/Outbound/GameServerSendAll.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using PFire.Core.Session;

namespace PFire.Core.Protocol.Messages.Outbound
{
internal sealed class GameServerSendAll : XFireMessage
{
public GameServerSendAll(int gameId) : base(XFireMessageType.GameServerSendAll)
{
GameId = gameId;
GameIps = new List<int>();
GamePorts = new List<int>();
}

[XMessageField(0x21)]
public int GameId { get; set; }

[XMessageField(0x22)]
public List<int> GameIps { get; set; }

[XMessageField(0x23)]
public List<int> GamePorts { get; set; }

public override Task Process(IXFireClient context)
{
//TODO: Have a Database of IPs and Ports that is fetched by gameid
// Send back the GameId sent
// Iterate that into Ips and Ports (unsigned ints on both)
// If no hits, send with empty List<int>s regardless, because the client expects a response.

return Task.CompletedTask;
}
}
}
2 changes: 2 additions & 0 deletions src/PFire.Core/Protocol/Messages/XFireMessageType.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public enum XFireMessageType : short
NicknameChange = 14,
ClientConfiguration = 16,
ConnectionInformation = 17,
GameServerFetchAll = 22,
StatusChange = 32,
Unknown37 = 37,
Logout = 36,
Expand All @@ -33,6 +34,7 @@ public enum XFireMessageType : short
UserLookupResult = 143,
ServerPong = 144,
ServerList = 148,
GameServerSendAll = 150,
Groups = 151,
GroupsFriends = 152,
FriendStatusChange = 154,
Expand Down
1 change: 1 addition & 0 deletions src/PFire.Core/Protocol/XFireMessageTypeFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ private XFireMessageTypeFactory()
Add(new FriendRequestAccept());
Add(new FriendRequestDecline());
Add(new FriendRemoval());
Add(new GameServerFetchAll());
Add(new NicknameChange());
Add(new StatusChange());
Add(new Logout());
Expand Down

0 comments on commit f50774e

Please sign in to comment.