Skip to content

Commit

Permalink
Packets 21 and 149 - Fetch Friend Favorite Game Server List (#46)
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 and Friend Favorites.

Added Inbound Packet GameServerFetchFriendsFavorites (21)
 * It only expects a gameid. From there the server sends back GameServerSendFriendsFavorites packet. (Weirdly enough, this one uses the string "gameid" unlike the All packet.)

Added Outbound Packet GameServerSendFriendsFavorites (149)
 * Four attributes are sent: gameid, a list of gameips and a list of gameports (both iterates in sync), list of a list of ints for FriendIds.
 * 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.
 * The FriendIds nested list is a weird one, only ever used again in FriendofFriends. I had to make a list of userids and then put it inside of FriendIds. I don't know why they designed it as such, as vanilla xfire doesn't use this information at all it seems...

XFireMessageType and XFireMessageTypeFactory adds the packets to the lists as needed.
  • Loading branch information
desukuran authored Mar 29, 2024
1 parent f50774e commit 017656e
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 0 deletions.
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 GameServerFetchFriendsFavorites : XFireMessage
{
public GameServerFetchFriendsFavorites() : base(XFireMessageType.GameServerFetchFriendsFavorites) { }

[XMessageField("gameid")]
public int GameId { get; set; }

public override async Task Process(IXFireClient context)
{
await context.SendAndProcessMessage(new GameServerSendFriendsFavorites(GameId));
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
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 GameServerSendFriendsFavorites : XFireMessage
{
public GameServerSendFriendsFavorites(int gameId) : base(XFireMessageType.GameServerSendFriendsFavorites)
{
GameId = gameId;
GameIps = new List<int>();
GamePorts = new List<int>();
FriendIds = new List<List<int>>();
}

[XMessageField("gameid")]
public int GameId { get; set; }

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

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

[XMessageField("friends")]
public List<List<int>> FriendIds { get; set; }

public override Task Process(IXFireClient context)
{
//TODO: Have a Database of IPs and Ports, with a user id who favorited it that is fetched by gameid
// Probably reads from the favorites database based on userid and gameid.
//
// You will need to start off processing with making a new temporary List<int> to put inside of FriendIds to satisfy the nested list need, this will hold the userid who favorited the server.
// Start off with sending back the GameId sent
// Iterate that list of favorites into Ips and Ports (unsigned ints on both) and your new userid List<List>
// If no hits, send GameIps and GamePorts with empty List<int>s, for FriendIds send back an empty List<List<int>> 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,
GameServerFetchFriendsFavorites = 21,
GameServerFetchAll = 22,
StatusChange = 32,
Unknown37 = 37,
Expand All @@ -34,6 +35,7 @@ public enum XFireMessageType : short
UserLookupResult = 143,
ServerPong = 144,
ServerList = 148,
GameServerSendFriendsFavorites = 149,
GameServerSendAll = 150,
Groups = 151,
GroupsFriends = 152,
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 @@ -36,6 +36,7 @@ private XFireMessageTypeFactory()
Add(new FriendRequestDecline());
Add(new FriendRemoval());
Add(new GameServerFetchAll());
Add(new GameServerFetchFriendsFavorites());
Add(new NicknameChange());
Add(new StatusChange());
Add(new Logout());
Expand Down

0 comments on commit 017656e

Please sign in to comment.