Advanced Party System is an Unreal Engine plugin that allows for parties in your game. It provides a way for players to make a connection between friends through the use of beacons, straight from the main menu.

The plugin's advanced functionality is fully exposed to blueprints and is very user friendly, with little knowledge needed to get all the features running.

Purchase the Advanced Party System plugin from the Unreal Engine marketplace here.
FEATURES
  • Steam Friends List and Invites
  • Kick Players and Disband Party
  • Leave Party
  • Game Matchmaking
  • Reconnect to Party
  • Party Privacy - Public or Private Parties
  • Replicated Chat System
  • Replicated Ready Up System
  • Many More Advanced Features
SETUP
The following will demonstrate the initial setup needed to get the Advanced Party System plugin working for your game.
CONFIG SETTINGS
Copy this block of code into your project's DefaultEngine.ini file.
DefaultEngine.ini
[/Script/Engine.GameEngine]
!NetDriverDefinitions=ClearArray
+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="OnlineSubsystemSteam.SteamNetDriver",DriverClassNameFallback="OnlineSubsystemUtils.IpNetDriver")
+NetDriverDefinitions=(DefName="BeaconNetDriver",DriverClassName="OnlineSubsystemSteam.SteamNetDriver",DriverClassNameFallback="OnlineSubsystemUtils.IpNetDriver")

[OnlineSubsystem]
DefaultPlatformService=Steam

[OnlineSubsystemSteam]
bEnabled=true
bInitServerOnClient=true
SteamDevAppId=480
bUseSteamNetworking=false
P2PConnectionTimeout=60.0

[/Script/OnlineSubsystemUtils.OnlineBeaconHost]
ListenPort=7787
BeaconConnectionInitialTimeout=60.0
BeaconConnectionTimeout=60.0

[/Script/OnlineSubsystemSteam.SteamNetDriver]
NetConnectionClassName="OnlineSubsystemSteam.SteamNetConnection"
The highlighted values dictate how long (in seconds) a player should try, in reconnecting back to its host after leaving a game. Set this value to whatever you wish but make sure that all 3 have the same value.
CREATING CLASSES
Create a subclass of AdvancedLobby_GameInstance or parent it to an existing game instance. This is important as a lot of the plugin's logic is written in the game instance.

Now, in your your game instance, there should be a new Advanced Lobby category under the Class Defaults tab. Here you should find the Lobby Player State Class option which we will touch on later (Custom Data Replication).

Create a subclass of AdvancedLobby_PlayerController or parent it to an existing player controller. This class holds all the Advanced Lobby events and is also responsible for displaying your main menu/lobby widget.

All AdvancedLobby_PlayerController events:
In the Advanced Party System example blueprints, found in the Content folder of the plugin, you can see how the player controller has been setup.
GENERAL USAGE
The following will show how to implement basic functionality of the Advanced Party System plugin into your game.

For more specific use cases, feel free to go through the example blueprints and widgets, found in the Content folder of the plugin. These examples show how majority of the plugin's features have been implemented into blueprints.

All blueprint functions also have a brief, but helpful description on what it does, to give you a better understanding on how to use each node.
Creating a Party
A party can be easily created with the Create Party Session node. This will create a party session and initialise a beacon host, to allow for friends to connect to the party. Put this on the Construct event in you main menu/lobby widget, or the Begin Play event in your player controller.
Create Party Session
The Create Party Session node gives you the option to customise the size of your party and the party privacy - either public (players can join at any time without an invite) or private (an invite is required before a player can join).
Joining A Party
A party can be joined from an invite or depending on the party privacy, directly from the friends list. The Join Party node will attempt to find the friend's current party session and join it, also initiating a beacon connecting between the host and the client.
Join Party
When an invite is received with the Party Invite Received player controller event, the friend's display name and unique net ID is given. Using the friend's unique net ID you can join the party.

The Friend Info variable structure used in the above example can be retrieved with the Get Friends List node. This will return a Friend Info structure for each friend on your Steam friends list. This structure holds the friend's display name, unique net ID, and current online status.
Leave / Kicked From Party
After leaving a party, make sure that you are creating a new party on the On Success of the Leave Party node.
Leave Party
Do the same for the Kicked from Party player controller event.
Kicked from Party
Creating / Joining a Game
Advanced Party System provides plenty of options for game session as well as party sessions. The party host can either search for sessions with Find Game Sessions and join one with Join Game, create a session with Create Game Session, or matchmake for a game using Matchmake. With either one of these, all party members are sent to join the new session that the host has created or joined. When using Create Game Session call Open level from the On Success pin and make sure to enter listen in the Options box. Do the same with the Matchmake node off the On Create Success pin.
Only the party leader/host should be calling these functions as party members cannot follow a client into a game session.
Leaving The Game / Reconnecting
When leaving the game, there are a few steps that can be easily missed. Firstly destroy the game session with the default Destroy Session node. From the On Success, open your main menu/lobby level with Open Level. Make sure to input closed into the Options string - without this, reconnecting to the party may fail.
Now, go back to the Construct event in your main menu/lobby widget, where you placed your Create Party Session node. Before creating a party, we need to do a quick check to see if we are reconnecting back to the party or if we are creating a party for the first time. We can do this with Get Game Mode -> Options String == ?closed into a branch. If the game mode's option string is equal to ?closed, this means we are reconnecting to the party.
Off of True we want to add the Reconnect to Party node, and from False link up our Create Party Session.
On success is called when Reconnect to Party has successfully triggered but this doesn't mean we have reconnected to the party yet. If the client leaves before the host, it will wait for however long you have defined in the Config Settings. If the host leaves before the timer is up, the client will successfully join the host, but if the host stays in the game once the timer ends, the client will disconnect and create his own party.

If you want more in depth details on how to fully implement this, look through the SLS_MainMenuWidget and SLS_Reconnecting widget found in the Content folder of the plugin.
Chat Messaging
First we want a chat box to hold all our messages and give a way to enter a chat. Add a Vertical Box, which holds a Scroll Box and a Text Box.
Add this new widget to your main menu/lobby widget.

Click on the Text Box and add an On Text Committed event. Create a switch on Commit Method and from On Enter call Send Chat Message. Use the Text from the On Text Committed event and parse it into the Message parameter. With Get Lobby Player State -> Get Player Name, input the value into Sender Name.
Create a new widget for the chat message. This should include a Horizontal Box which holds two Text elements - one for the sender name and one for the message.
Now, create two text variables - one for the sender name and one for the message. Make both variables Instance Editable and Expose on Spawn.
Bind the sender name text element to the new Sender variable. For the message text element, bind its text directly to the new Message variable.
Go back to your chat box widget and create a new custom event. Name it AddMessage and give it two input variables - one for the sender name and one for the message. Create the new chat message widget and parse in the two variables. Add it to the message scroll box.
Finally, go to your player controller and add the Chat Message Received event. From the main menu widget, get its chat box element and call AddMessage.
If you want more in depth details on how to fully implement this, look through the widget found in the Content folder of the plugin.
Ready Up
With the release of the V1.1 update, has come a new ready up system. This will allow you to ready up in the main menu/lobby, notifying the host to start matchmaking. When all party members including the host are ready, matchmaking/create session/join session (whichever one you wish) will be triggered.

For example, on a button click a person will ready up using the Ready Up node:
Using the All Players Ready player controller event, you can identify when all party members are ready to join a game.

Here is an example using the Matchmake node:
Try the updated demo files to fully test out the new ready up feature.
Custom Data Replication
If you plan on using custom data replication, the AdvancedLobby_PlayerState class is where it is all handled. Creating a child class for this class is not mandatory for the plugin's functionality, this is only required if you want your custom data to be replicated.

Create a subclass of AdvancedLobby_PlayerState, however do not parent it to an existing player state class if you have one. This class is not a direct child of the standard player state class but instead a child of the LobbyBeaconPlayerState class which has extra features to support lobby functionality.

After creating your custom class, make sure to add it in the game instance settings. Go to your game instance's Class Defaults tab where you should find the Advanced Lobby section. In the Lobby Player State Class setting, select your new player state class.

Before you start replicating your data, make sure that all your variables that you want to replicate are set to Replicated or Rep Notify. Also, when changing the variable's value, make sure that you are doing it on the server.

Here is an example of replicating data to give you a general idea:
The SetCharacterIndex event is called in the main menu/lobby widget after clicking a button for example.
Testing
When using the Steam Online Subsystem, it is important to note that you cannot test the same game on the same computer with the same Steam account. For everything to properly operate, there must be two different laptops/computers. These two systems must both be logged into different Steam accounts and should have each other friended.

When the time comes to test your game, package your project and compress it into a zip file. Send this file to your other laptop/computer which should be logged into a different Steam account. Simply unzip the file and open up the ProjectName.exe.