Nice Lobby System Handbook
Unreal Engine 5.8 · C++ plugin

Nice Lobby System

A complete multiplayer front end you drop into an Unreal project: pick a character, play alone, then host or join games over Epic Online Services or your local network, with chat, voice, teams, game modes, stats and a full in-game menu. You change almost everything from four Data Assets, without writing code.

4 Data Assets to configure everything
5 ready-made game modes
6 tabs in the in-game menu
30+ chat commands
2 networks: Epic online + LAN
How to read this handbook. Chapter 1 shows what the plugin can do. Chapter 2 gets it running in your project. Chapter 3 explains every single setting in plain words (and has a search box). Chapters 4 and 5 are about playing and the in-game menu. Chapter 6 is for programmers. Chapter 7 has quick lists and fixes for common problems.
About the pictures. The screens in this handbook are drawn from the plugin's real layout and default colours, not photographed. Real screenshots will be added once the latest version is built in the editor.
Chapter 1

Everything Nice Lobby does

Grouped by what a player experiences. Each card ends with where you change it.

Playing together

Character select stage

Characters stand on a rotating 3D ring. Browse with arrows, mouse wheel, drag or gamepad; stats show as bars; type your player name; Online/Offline switch.

DA_NLS_Characters · DA_NLS_UI › Character Select

In-game menu

Press Backspace (gamepad Menu) during play: Find Games, Host Game, Team, Friends, Stats and Settings in one window you can resize and scale.

DA_NLS_UI › Server Browser

Online or LAN

Epic Online Services lobbies over peer-to-peer (cross-platform, no port forwarding) or your local network. If Epic isn't set up, it quietly falls back to LAN.

Character select › Online button · Config/DefaultEngine.ini

Five game modes

Free For All, Deathmatch, Team vs Team, Battle Royale and Co-op, with score and time limits, respawns, teams and friendly fire. Add your own.

DA_NLS_Levels › Game Modes

Match start flow

Waiting for players → everyone presses Ready → countdown → round. Optionally everyone travels to the voted level together first.

DA_NLS_Levels › Game Modes › Match Start

Quick Match

One button joins the best open game (lowest ping, then most players), skips full or locked rounds, and hosts a new one if none is found.

DA_NLS_GameSettings › Quick Match

Server browser filters

Search by name, host, level or mode; sort by ping, players or name; filter by mode and level; hide full games and games already in a round.

DA_NLS_UI › Default Server Filters

Teams & spectators

Pick your team or let the game choose, automatic balancing before each round, team colours everywhere, and a Spectate button.

DA_NLS_GameSettings › Teams

Scoreboard & round bar

Hold Left Alt to see Kills, Deaths, Ping (or your own columns). A bar at the top shows the mode, timer, team scores and the winner banner.

DA_NLS_UI › Scoreboard / Teams

Team leader & travel

The leader picks the next level and takes everyone along (seamless travel), or leads the whole team into another game. Members vote and mark Ready.

Team tab · DA_NLS_GameSettings › Travel

Host hand-over & dedicated servers

A leaving host hands the game to another player who re-hosts it, and everyone follows. Dedicated servers are supported too.

DA_NLS_GameSettings › Sessions / Dedicated Server

Rejoin after a crash

If the game crashed or the connection dropped, the next start offers REJOIN to go straight back into that game.

DA_NLS_GameSettings › Reconnect
Social & safety

Epic friends & invites

See which friends are online or playing, join their game, invite them to yours, accept invites from a banner or the Epic overlay.

Friends tab (online only)

Private games

Host an invite-only game: it is not listed anywhere, and the only way in is an invite from someone inside.

Host Game › Visibility

Text chat

All, Team and Whisper channels, a fading chat box, history, spam limits, blocked words, and chat commands for every setting.

DA_NLS_GameSettings › Chat · DA_NLS_UI › Chat

Voice chat

Push-to-talk (V) or always-on through Epic voice rooms, volume and microphone sliders, and a green dot by whoever is talking.

DA_NLS_GameSettings › Voice Chat

Moderation

Mute, Epic block list, report to Epic, vote kick when the leader is away, and a host ban list that remembers troublemakers.

DA_NLS_GameSettings › Moderation

Stats, leaderboards, achievements

Round stats go to Epic's stats service, feeding leaderboards and achievements. The Stats tab shows your totals and rankings.

DA_NLS_GameSettings › Online Stats

Cloud-saved profile

Your character, name and settings are kept in Epic's cloud storage, so they follow you to any PC you sign in on.

DA_NLS_GameSettings › Player
Polish & tools

Full settings screen

Graphics, audio volumes, look sensitivity and invert Y, key rebinding, chat and voice preferences, and the menu's own size.

In-game menu › Settings

Smart loading screen

Covers every level change and waits until your character, textures and shaders are ready, with level art and random tips.

DA_NLS_UI › Loading Screen

No spawning on top of each other

Each player gets a free Player Start; when they run out, players are placed in rings around one, never inside walls.

DA_NLS_GameSettings › Spawning

Gamepad everywhere

Every screen works with a controller: shoulder buttons switch tabs, sticks scroll and turn, the selected button grows and glows.

DA_NLS_UI › Gamepad & Keyboard

Portrait & thumbnail capture

Console commands photograph every character and level and plug the pictures straight into the Data Assets.

NLS.CapturePortraits · NLS.CaptureMapThumbnail

Ready to translate

Every on-screen text is localizable; system chat lines are built on each player's machine, so everyone reads them in their own language.

Tools › Localization Dashboard

Redesign any screen

Every screen is built in C++ but can be replaced by your own Widget Blueprint child while keeping all the logic.

DA_NLS_UI › Widget Classes
Chapter 2

Setup and making it yours

From an empty project to a working character select and in-game menu, then how to change characters, levels, modes and the look.

Install the plugin

  1. Copy the pluginPut the NiceLobby folder into your project's Plugins folder (create the folder if it doesn't exist). The project must be a C++ project; any game module works, even an empty one.
  2. Turn on the helper pluginsIn Edit › Plugins enable Python Editor Script Plugin and Editor Scripting Utilities. They are only used in the editor, for the setup tool. The plugin itself already switches on what it needs (Online Subsystem EOS, Null, Voice Chat, Enhanced Input).
  3. BuildRight-click the .uproject › Generate Visual Studio project files, open the solution and build Development Editor, or just open the project and let it build.
  4. Run the setup toolIn the editor: Tools › Nice Lobby: Run Setup. It creates the four Data Assets in /Game/NiceLobby/Data, a Widget Blueprint for every screen in /Game/NiceLobby/UI (see Changing the look), the character select level L_NLS_CharacterSelect and a small travel level L_NLS_Transition. Assets that already exist are left alone.
  5. Point the project at itProject Settings › Maps & Modes › Game Default Map = L_NLS_CharacterSelect. If you moved the Data Assets, set them in Project Settings › Plugins › Nice Lobby.
  6. Add spawn pointsOpen each level players can play on and use Tools › Nice Lobby: Add Player Starts (adds 8 around the first one). Save the level.
  7. Press PlayYou land on character select. Start Game opens the single-player level; Backspace opens the in-game menu.
Using the Game Animation Sample? The setup tool's defaults already target it: the Sandbox character pawn, the PC_Sandbox controller, the AC_VisualOverrideManager look component and the retargeted characters. For another project, edit the PRESET block at the top of Content/Python/nls_setup.py or fill the Data Assets by hand.
Want to play online? Out of the box everything works on LAN. For Epic online play (friends, voice, stats, cloud save) follow the Epic Developer Portal steps in chapter 6. It takes about 15 minutes.

The four Data Assets

Everything you would normally change lives in these four files. Double-click one to edit it. Anything you leave empty uses the plugin's default.

DA_NLS_Characters

Who you can play

Every character: name, role, description, portrait, colour, stats, the pawn it spawns as and its look. Also how the character select stage shows them.

All settings →
DA_NLS_Levels

Where you play, and how

The character select level, the single-player level, the levels a host can pick, and the game modes with their rules.

All settings →
DA_NLS_UI

How it looks and feels

Colours, fonts, sounds, texts, keys, menu size, scoreboard columns, chat box, loading screen and the widget classes for every screen.

All settings →
DA_NLS_GameSettings

The rules of the house

Game mode class, spawning, travel, chat and voice rules, teams, moderation, sessions, stats, Epic sign-in, dedicated servers.

All settings →

Characters, levels and game modes

Add a character

  1. Open DA_NLS_Characters › Characters › +.
  2. Give it a unique Id (no spaces), a Display Name, a Role and a Description.
  3. Set Pawn Class (what spawns in the game). Optional: a Visual Override Class for the look.
  4. Add a few Stats (Label, Value, Max Value) and pick an Accent Color.
  5. Play, then type NLS.CapturePortraits in the console to make its portrait.

Add a level

  1. Open DA_NLS_Levels › Multiplayer Maps › +.
  2. Fill Id, Display Name, Description and pick the Map.
  3. Add Player Starts to the level (Tools › Nice Lobby: Add Player Starts).
  4. Stand somewhere nice in the level and run NLS.CaptureMapThumbnail for its picture.
  5. To make it the solo level, also copy it into Single Player.

Add or change a game mode

  1. Open DA_NLS_Levels › Game Modes.
  2. Edit one of the five, or + a new one with a unique Id.
  3. Choose a Win Rule, teams, score and time limits, respawn and match start rules.
  4. Optional: limit it to some levels with Map Ids.
  5. Hosts see it on the Host Game page right away.
ModeHow you winTeamsLimitsRespawnLate joiners
Free For AllNobody wins: free play (also used for single player)NoNoneYesPlay right away
DeathmatchMost killsNo25 kills or 10 minYesPlay right away
Team vs TeamTeam with the most kills250 kills or 15 minYesPlay right away
Battle RoyaleLast player standingNoNoneNo (one life)Watch until next round
Co-opYour game says the mission succeededEveryone togetherYour choiceYesPlay right away

Hooking up your game

The plugin runs the lobby, rounds and scores. Your game only needs to tell it a few things.

Your game does…Call this (Blueprint or C++)On
Someone diesReportKill(Killer, Victim): +1 Kills, +1 Deaths, scores, respawn timer or eliminationNLS Game Mode (server)
Before applying damageCanDamage(Instigator, Victim): false for teammates (unless friendly fire), co-op partners, between rounds and spectatorsNLS Game Mode
Co-op mission endsEndCoopRound(bSuccess)NLS Game Mode
Any other score (captures, assists…)AddStat(Name, Delta) / SetStat, then add a scoreboard column with that nameNLS Player State
A message for everyoneBroadcastChatNotice(Text)NLS Game Mode
Your own look systemImplement INLSCharacterAppearanceInterface on the pawnYour pawn

Game mode and controller

Gameplay levels use NLSGameMode (or your child of it) from Game Settings › Default Game Mode Class. Your own player controller goes in Gameplay Player Controller Class; the menu keys are added to any controller automatically.

Look sensitivity & key rebinding

Add the NLS Look Sensitivity modifier to your Look action in the Input Mapping Context. For rebinding, turn on Project Settings › Enhanced Input › Enable User Settings and give each action Player Mappable Key Settings with a name.

Volume sliders

Create a Sound Mix and Master / Music / Effects Sound Classes, set your sounds to use them, and pick them in DA_NLS_UI › Audio. Without them, the master slider still turns the whole game up and down.

Changing the look

The built-in screens use one theme from DA_NLS_UI › Theme. These are the default colours: cool graphite with a warm amber accent.

ColourDefaultUsed for
Panel#10151CWindows and panels
Surface#1A212BRows, inputs, cards
Accent#F2A93BMain buttons, selection, highlights
Text#EEF2F6Normal text (Muted: #8E9AAB)
Success · Warning · Danger#4CC38A · #E8C14A · #E5534BReady, good ping · medium ping · errors, kick buttons, bad ping

Quick changes

  • Colours, corner radius: Theme
  • Fonts: six styles (Display, Heading, Label, Body, Small, Button); each picks a font, typeface, size and letter spacing
  • Sounds: hover, click, menu open/close, navigate, notification, error
  • Texts: game title, button labels, menu title, loading tips
  • Team names & colours: Teams

Redesign a screen in the Designer

  1. Open the screen's Widget Blueprint in /Game/NiceLobby/UI, for example WBP_NLS_ServerBrowser (the in-game menu).
  2. Everything is already there in the Designer: every panel, button, text and picker of the built-in layout. Restyle, move, add or delete freely, and compile.
  3. Keep the names of the widgets marked as variables (for example ServerList, RefreshButton): that's how the C++ finds them. If you delete one, that feature is simply skipped.
Where the Blueprints come from. Tools › Nice Lobby: Create Widget Blueprints (also part of Run Setup) makes a WBP_NLS_* child of every Nice Lobby widget class with the full default layout in its Designer, and puts them in DA_NLS_UI › Widget Classes. Existing ones are never touched. To start a screen over from the current DA_NLS_UI look, delete its Blueprint and run the tool again (or from Python: nls_setup.create_widget_blueprints(overwrite=True), which rebuilds them all).

What the Blueprint decides

  • Layout, sizes, positions, padding
  • Colours, fonts, brushes and button styles (copied from DA_NLS_UI when the Blueprint was made)
  • Any widgets, animations or graph logic you add

What the Data Assets still decide

  • On/off switches: resize grip, portrait cards, team portraits, voice settings, music/effects rows
  • Texts that have a setting: game title, menu title, Start/Quit labels, key hints
  • States drawn by code: selected tab and settings page, ready/ping colours, hover and focus
Widget BlueprintParent classSome widget names the C++ uses
WBP_NLS_CharacterSelectNLSCharacterSelectWidgetStartButton, QuickMatchButton, RejoinButton, PlayerNameBox, PrevButton, NextButton, ServiceButton, StatsBox, CarouselClip, CardsBox, QuitButton
WBP_NLS_ServerBrowser (in-game menu)NLSServerBrowserWidgetPageSwitcher, FilterBox, ServerList, SortSelector, ModeSelector, MapSelector, HostButton, TeamList, ReadyButton, FriendsList, LeaderboardList, SettingsSwitcher, SettingsGraphicsButton, VoiceSettingsBox, ResizeGrip…
WBP_NLS_OptionSelectorNLSOptionSelectorWidgetPrevButton, ValueText, NextButton (the "‹ value ›" picker used all over the menu)
WBP_NLS_ServerRowNLSServerRowWidgetServerNameText, HostText, MapText, PlayersText, PingText, JoinButton
WBP_NLS_TeamMemberRowNLSTeamMemberRowWidgetMemberPortraitBox, MemberNameText, MemberTagsText, ReadyPill, MoreButton, MuteButton, KickButton, BlockButton, ReportButton…
WBP_NLS_FriendRow · WBP_NLS_KeyBindingRowNLSFriendRowWidget · NLSKeyBindingRowWidgetFriendNameText, JoinFriendButton, InviteFriendButton · the action name and key button
WBP_NLS_Chat · WBP_NLS_LobbyChatNLSChatWidget / NLSLobbyChatWidgetMessageList, ChatInput, ChannelButton, ChannelLabel, ChatHintText
WBP_NLS_MatchHUDNLSMatchHUDWidgetMatchBar, MatchTitleText, TeamScoresBox, MatchScoreText, BannerText, BannerSubText
WBP_NLS_ScoreboardNLSScoreboardWidgetScoreboardTitleText, ScoreboardHeaderRow, ScoreboardRows, SpectatorsText
WBP_NLS_CharacterCard · WBP_NLS_ToastNLSCharacterCardWidget · NLSToastWidgetCardButton, PortraitImage, NameText · MessageText, IndicatorDot
Translating. All plugin text uses the NiceLobby text namespace. In Tools › Localization Dashboard add a target that gathers from Plugins/NiceLobby/Source and /Game/NiceLobby, then gather, translate and compile.
Chapter 3

Every setting, explained simply

Each knob in the five places you can change Nice Lobby, written so a 9-year-old could follow along. The grey text on the right is what it starts as.

How to read this chapter. Think of Nice Lobby as a big toy box with five drawers. Four drawers are the Data Assets you open in the editor (double-click them in the Content Browser). The fifth drawer is Player Settings: the things each player picks in the game menu, which are remembered for them.
253 settings

Game Settings DA_NLS_GameSettings

The rule book. It decides how games are run, who can say what, how many people fit, and how players sign in to Epic.

Framework
Default Game Mode ClassThe referee of every match. It knows the rules, keeps score and decides who wins. Leave it, or use your own referee that is a child of NLSGameMode.NLSGameMode
Gameplay Player Controller ClassThe thing that turns your button presses into actions. If your game has its own (the Game Animation Sample uses PC_Sandbox), put it here.empty
Fallback Pawn ClassThe body you get if a character forgot to say which body it uses. A spare costume, just in case.empty
Travel
Use Seamless TravelWhen the team moves to a new level, everyone stays connected, like a bus carrying all the players at once. Off means everyone gets off and climbs back on (reconnects).On
Transition MapA tiny empty room the bus passes through between two levels, so the computer can clean up the old level before loading the new one.L_NLS_Transition
Spawning
Spread Player SpawnsMakes sure players never appear on top of each other. Everyone gets their own starting spot, or a spot in a circle around one.On
Player Start TagOnly use starting spots that wear this name tag. Empty means any starting spot is fine.empty
Spawn SpacingHow far apart players stand when they have to share one starting spot.160 cm
Spawn Search RingsHow many circles around a starting spot the game checks for free room. Circle 1 has 6 places, circle 2 has 12, and so on.4
Spawn Capsule RadiusHow wide a player is, so the game knows how much empty space to look for.42
Spawn Capsule Half HeightHalf of how tall a player is, for the same reason.92
Player
Default Player NameThe name you get before you type one. A random number is added, like Player4821.Player
Use Online Name As DefaultAfter you sign in to Epic, your Epic name becomes your player name, unless you typed your own.On
Max Player Name LengthThe longest name allowed, counted in letters.20
Save Slot NameThe name of the save file that remembers your character, name and settings.NLS_Profile
Cloud Save ProfileAlso keeps your save file in Epic's cloud, so it follows you to another computer when you sign in there.On
Cloud Profile File NameThe name of that file in the cloud.NLSProfile.sav
Return To Single Player On DisconnectIf you lose connection, you are put back in the solo level. Off sends you to character select instead.On
Player Audio and Control DefaultsThe volume, look speed and invert setting new players start with. Each player can change their own on the Settings tab.100% · x1.0
Chat
Enable ChatLets players type messages to each other in multiplayer games.On
Chat Max Message LengthThe longest message allowed. Longer ones get cut.200
Chat Burst MessagesHow many messages you may send very quickly in a row before the spam guard says slow down.5
Chat Seconds Per MessageAfter that, you get one more message every this many seconds.1.5 s
Announce Joins And LeavesShows lines like "Raed joined the game" for everybody.On
Announce Team ChangesShows lines like "Raed is now the team leader" or "Ali was removed".On
Player Chat DefaultsWhat every new player's own chat and voice settings start as. Explained in the Player defaults part below.see Player defaults
Chat Blocked WordsWords that get turned into *** before anyone sees them. Big or small letters don't matter.empty
Voice Chat
Enable Voice ChatLets players talk with their microphones in online games. LAN games have no voice.On
Online Stats
Report Online StatsAt the end of each round your numbers (like kills) are sent to Epic, which keeps your all-time totals, leaderboards and achievements.On
Online StatsWhich scoreboard numbers are sent, and what they are called on Epic's side.Kills→KILLS, Deaths→DEATHS
Rounds Played StatCounts every round you play. Empty means don't count it.ROUNDS_PLAYED
Rounds Won StatCounts every round you (or your team) win.ROUNDS_WON
LeaderboardsWhich high-score lists the Stats tab shows. They must also exist in the Epic Developer Portal.KILLS, ROUNDS_WON
Leaderboard RowsHow many people each high-score list shows.10
Teams
Allow Team SelectionIn team modes, players may choose their team. Off means the game always chooses.On
Max Team ImbalanceA team can't have more than this many extra players compared to the smallest team, so teams stay fair.1
Auto Balance TeamsBefore every round the game moves players so teams are even. People who didn't pick a team are moved first.On
Allow SpectatorsPlayers may sit and watch instead of playing.On
Max SpectatorsHow many people may watch at the same time.4
Moderation
Allow Vote KickPlayers can vote to remove someone who is being mean, when the team leader isn't around to do it.On
Vote Kick Only When Leader AwayVoting is only allowed when the leader is away (or is the troublemaker). Off allows voting any time.On
Leader Away SecondsIf someone doesn't touch keyboard, mouse or controller for this long, they count as away.60 s
Vote Kick SecondsHow long a vote stays open. More than half of the other players must say yes.30 s
Vote Kick Blocks RejoinSomeone voted out can't come back into the same game.On
Allow Host BansThe host can ban a player from all of their games, forever (until unbanned).On
Honor Epic Block ListPeople you blocked on Epic are hidden in chat and silent in voice.On
Sessions
Default Server Name FormatThe name a new game gets. {0} becomes the host's name, so it reads "Raed's Game".{0}'s Game
Min PlayersThe smallest number a host can pick for how many players fit.2
Max Players LimitThe biggest number a host can pick.16
Default Max PlayersThe number already picked when the Host Game page opens.8
Max Search ResultsThe most games one search may find.100
Search Timeout SecondsGive up searching after this long.15 s
Allow Join In ProgressPeople may join a game that has already started.On
Allow Host Hand OverWhen the host leaves, they choose someone to become the new host, and everyone moves to that person's game.On
Use Lobbies If AvailableUse Epic lobbies (best for player-hosted games). Leave it on.On
Uses PresenceLets friends see what game you're in and join you.On
Session Bucket IdA secret team name. Only games with the same bucket can see each other, so two different games on one Epic account never mix.NiceLobby
Reconnect
Offer RejoinIf your game crashed or the internet dropped, you get a REJOIN button to jump back into the same game.On
Rejoin Window MinutesHow long after joining that button is offered.30
Quick Match
Quick Match Host If NoneIf Quick Match finds no game, it makes one for you. Off just says nothing was found.On
Quick Match Mode IdWhich game mode Quick Match makes. None means the default mode.None
Dedicated Server
Dedicated Server NameThe name a dedicated server shows in Find Games.Nice Lobby Server
Dedicated Max PlayersHow many players fit on a dedicated server.16
Dedicated Map IdWhich level a dedicated server opens. None means the first level in the list.None
Dedicated Mode IdWhich game mode it runs. None means the default mode.None
List Dedicated ServersPlayers also see dedicated servers in Find Games, next to games hosted by players.On
Epic Online Services
Login TypeHow players sign in to Epic in the real game. Account Portal opens Epic's sign-in page.Account Portal
Editor Login TypeHow you sign in while testing in the editor. Developer uses Epic's test tool, so each window can be a different test player.Developer
Try Persistent Auth FirstRemember the last sign-in, so next time you are signed in without typing anything.On
Login On StartupSign in as soon as the game starts, instead of the first time you go online.Off
Dev Auth HostWhere Epic's test sign-in tool is running on your computer.localhost:6300
Dev Auth Credential NamesThe test players' names in that tool. Window 1 uses the first name, window 2 the second, and so on.Player1 … Player4

UI DA_NLS_UI

The paint box. Colours, letters, sounds, keys and every screen's size and position.

Branding
Game TitleThe big name at the top of character select.NICE LOBBY
Character Select HeadingThe line under it.Choose your character
Theme
Scrim ColorThe dark see-through curtain behind open windows, so the window stands out.#05080C 62%
Panel ColorThe colour of windows.#10151C
Surface ColorThe colour of things inside windows: rows, boxes, cards.#1A212B
Surface Hover ColorThat colour when your mouse is over it.#232C38
Border ColorThe thin outline around boxes.white 8%
Accent ColorThe special colour for the most important buttons and for what is selected.#F2A93B amber
Accent Hover ColorThe special colour when the mouse is over it.#FFC266
On Accent Text ColorText written on top of the special colour, so you can still read it.#1B1206
Text ColorNormal writing.#EEF2F6
Muted Text ColorQuieter writing for less important things.#8E9AAB
Success ColorGood news: Ready, good ping, achievements.#4CC38A green
Warning ColorCareful: medium ping.#E8C14A yellow
Danger ColorBad news and dangerous buttons: errors, Kick, End Game.#E5534B red
Corner RadiusHow round the corners of boxes and buttons are.8
Fonts
Display FontThe biggest letters, like the game title.Bold 54
Heading FontTitles of windows and sections.Bold 26
Label FontSmall capital labels like PLAYER NAME.Bold 12, spaced
Body FontNormal text.Regular 15
Small FontLittle hints and descriptions.Regular 12
Button FontText on buttons. Each font picks a font file, a style (Bold, Regular…), a size and letter spacing.Bold
Sounds
Hover SoundPlays when the mouse moves over a button.empty
Click SoundPlays when you click.empty
Open Menu SoundPlays when the in-game menu opens.empty
Close Menu SoundPlays when it closes.empty
Navigate SoundPlays when you move around with the keyboard or controller.empty
Notify SoundPlays when a little message pops up.empty
Error SoundPlays when something went wrong.empty
Gamepad & Keyboard
Show Focus HighlightWhen you use a controller, the selected button grows and glows so you can see where you are.On
Focus Highlight ScaleHow much bigger the selected button gets.1.05
Focus Highlight TintHow much brighter it gets.1.35 brighter
Stick Dead ZoneTiny wiggles of the stick smaller than this are ignored.0.25
Stick Rotate SpeedHow fast the right stick turns the character on character select.240 °/s
Stick Scroll SpeedHow fast the right stick scrolls lists in the menu.1400
Stick Step Repeat DelayWhen you hold the left stick on character select, the time between one character and the next.0.22 s
Character Select
Ring RadiusHow far the characters stand from the middle of the turning circle.260 cm
Ring Turn SpeedHow fast the circle turns to the next character.5
Show Stat BarsShows a coloured bar for each stat. Off shows plain words like "Speed : 80".On
Show Portrait CardsAdds a row of picture cards at the bottom too.Off
Carousel NeighboursHow many cards show on each side of the chosen one.2
Card SizeHow big a card is.148 × 196
Card SpacingThe gap between cards.14
Neighbour Card ScaleHow small the side cards are compared to the chosen one.0.84
Neighbour Fade Per StepHow much more see-through each card gets the farther it is.0.28
Carousel Slide SpeedHow fast the cards slide.14
Drag Rotate SpeedHow fast the character spins when you drag it with the mouse.0.45
Auto Rotate SpeedSpins the character slowly by itself. 0 means stand still.0
Start Game TextWords on the start button.START GAME
Quit TextWords on the quit button.QUIT GAME
Player Name LabelThe label above the name box.PLAYER NAME
Online Text / Offline TextWords on the Online/Offline switch.ONLINE / OFFLINE (LAN)
Signing In TextShown while Epic sign-in is running.SIGNING IN…
Online Signed In FormatShown when you are signed in. {0} becomes your Epic name.ONLINE · {0}
Sign In Failed TextShown when sign-in didn't work.ONLINE · NOT SIGNED IN
Server Browser (in-game menu)
Toggle Server Browser KeyThe key that opens and closes the in-game menu. It is Backspace so Tab stays free for your game or the Epic overlay.Backspace
Toggle Server Browser Gamepad KeyThe controller button for the same thing.Menu / Start
Team Portrait SizeHow big the character picture is on each Team tab row. 0 hides it.72
Search When OpenedSearches for games every time you open the menu.On
Server Browser SizeHow big the menu window is.1360 × 820
Min Server Browser SizeThe smallest players can drag it.960 × 600
Server Browser Max Screen FractionThe menu never covers more than this much of the screen (0.94 = 94%).0.94
Allow Menu ResizePlayers may drag the bottom-right corner to make the menu bigger or smaller.On
Background Blur StrengthHow blurry the game looks behind the menu. 0 = no blur (a bit faster).6
Server Browser TitleThe title at the top of the menu.GAME MENU
No Games Found TextWhat it says when a search finds nothing.No games found…
Good Ping MsPing this low or lower is green, up to double is yellow, more is red. Ping is how long a message takes to reach the game, in milliseconds.60
Default Server FiltersHow the Find Games list is sorted and filtered when you first open it.Ping, show all
Teams
Team NamesThe names of team 1, team 2, and so on.Red, Blue, Green, Yellow, Purple, Orange, Cyan, Pink
Team ColorsEach team's colour, used on rows, the scoreboard and the round bar.matching colours
Show Match HUDShows the bar at the top with the mode, timer and scores during rounds.On
Scoreboard
Scoreboard KeyHold this key to see the scoreboard.Left Alt
Scoreboard Gamepad KeyHold this controller button to see it.View / Back
Scoreboard ColumnsThe columns after the player's name. The list is sorted by the first column, biggest first.KILLS, DEATHS, PING
Kills Stat Name / Deaths Stat NameThe names ReportKill adds to.Kills / Deaths
Scoreboard Name Column WidthHow wide the name column is.300
Scoreboard Title FormatThe title. {0} is the server name, {1} is the level.{0} · {1}
Audio
Volume Sound MixThe mixing desk the volume sliders move.empty
Master Sound ClassThe knob for all sounds. Empty means the master slider turns the whole game up and down.empty
Music Sound ClassThe knob for music. Empty hides the music slider.empty
Effects Sound ClassThe knob for sound effects. Empty hides that slider.empty
Voice Chat
Push To Talk KeyHold this to talk when you use push-to-talk.V
Push To Talk Gamepad KeyThe controller button for it.D-pad down
Speaking ColorThe colour of the little dot next to whoever is talking.green
Chat
Chat KeyOpens the chat box.Enter
Chat Command KeyOpens the chat box with / already typed, for commands./
Chat Width / Chat HeightHow big the chat box is.480 / 230
Chat Screen OffsetHow far the chat box is from the bottom-left corner.28, 150
Chat Fade TimeHow long the chat box takes to fade away.1 s
Chat History LimitHow many old messages are remembered.100
Chat All / Team / Whisper / System ColorThe colour of names for each kind of message.amber / blue / pink / grey
Chat Message SoundPlays when someone else's message arrives.empty
Loading Screen
Enable Loading ScreenShows a loading picture every time the level changes.On
Show Loading Screen On StartupAlso shows it when the game first starts.On
Loading BackgroundThe picture to use when a level has no picture of its own.empty
Loading LabelThe little word above the level's name.LOADING
Loading TipsHelpful sentences; one is picked at random each time.5 tips
Loading Min Display TimeThe shortest time it stays, so it doesn't just flash.1 s
Loading Max Wait TimeA safety net: it goes away after this long even if something is still loading.30 s
Loading Fade Out TimeHow long it takes to fade away.0.4 s
Loading Preload CharactersLoads all the characters during loading, so nobody stutters when a new player joins.On
Loading Wait For PawnWaits until your character is standing in the level.On
Loading Wait For TexturesWaits until pictures on walls and floors are sharp, not blurry.On
Loading Texture Wait TimeBut never waits longer than this for them.6 s
Loading Wait For ShadersWaits until the graphics card has prepared the effects, so the game doesn't hiccup later.On
Loading Use Movie PlayerIn the finished game, keeps the spinner turning even while the computer is very busy loading.On
Notifications
Toast DurationHow long the little pop-up messages stay on screen.4 s
Widget Classes
Character Select / Card / Server Browser / Server Row / Team Member Row / Friend Row / Key Binding Row / Option Selector / Toast / Chat / Lobby Chat / Match HUD / Scoreboard Widget ClassWhich screen design to use. Setup fills these with the WBP_NLS_* Widget Blueprints, so you can open one and change how it looks. Empty means the plain C++ version builds itself.WBP_NLS_*

Levels & game modes DA_NLS_Levels

The map book. Where the game starts, the solo level, the levels a host can choose and the ways to play.

Levels
Character Select MapThe first room you see, where you choose your character.L_NLS_CharacterSelect
Single PlayerThe level Start Game opens when you play alone.one level
Multiplayer MapsThe levels a host can pick, in order.list
Default Mode IdThe game mode used when nobody picked one, like in single player.FreeForAll
Each level
IdA short unique name with no spaces, used behind the scenes.
Display Name / DescriptionThe name and the sentence players read.
ThumbnailA small picture of the level for the Host Game page.
Loading ImageA big picture for the loading screen. Empty uses the thumbnail.
MapThe actual level file.
Game Mode ClassA special referee only for this level. Empty uses the normal one.empty
Recommended Max PlayersThe number of players already picked when a host chooses this level.8
Each game mode
Id / Display Name / DescriptionIts secret name, its real name and what it is about.
Win RuleHow you win: None (just play), Most Points, Last Standing (last one alive) or Objective (your game says when the mission is done).Most Points
Teams / Num TeamsSplit players into teams, and how many teams.Off / 2
Friendly FireMay you hurt your own teammates?Off
Points StatWhich number gives points. Kills, or anything your game counts.Kills
Score LimitPoints needed to win the round straight away.0 = none
Time Limit MinutesHow long a round lasts.0 = none
Respawn / Respawn DelayDo you come back after being knocked out, and after how long?On / 3 s
Allow Join In ProgressMay new players join during a round? If not, they watch until the next round.On
Min PlayersHow many players are needed before a round can start.2
Require ReadyEveryone must press Ready before the countdown starts.On
Countdown SecondsThe 10, 9, 8… before a round starts.10
Travel On StartWhen the countdown ends, everyone travels together to the level with the most votes, and the round starts when all have arrived.Off
Arrival Timeout SecondsDon't wait longer than this for slow loaders.30
Arrival Countdown SecondsA short "get ready" countdown after everyone arrived.3
Results SecondsHow long the winner is shown before the next round.10
Map IdsOnly allow this mode on these levels.empty = all
Game Mode ClassA special referee for this mode.empty

Characters DA_NLS_Characters

The cast list. Every character you can play and how they stand on the character select stage.

Characters
CharactersEveryone you can play. Add one with +.list
Default Character IdThe character new players start with. Empty means the first one.empty
Each character
IdA short unique name with no spaces. It's saved in your profile.
Display NameThe name players see.
RoleA short title above the name, like Scout.
DescriptionA few sentences about the character.
PortraitThe character's photo for cards and the Team tab. Empty shows their initials.
Accent ColorThe character's own colour for their card, role text and stat bars.amber
StatsLittle facts like Speed 80 out of 100, shown as bars.
Pawn ClassThe body you control in the game.
Visual Override ClassA costume put on top of that body (in the Game Animation Sample, things like BP_Echo).
Preview Actor ClassSomething special to stand on the stage instead of the normal model.
Preview Idle AnimationHow the character stands and breathes on the stage.
Preview OffsetMoves the character on the stage, for very tall or short ones.
EnabledUntick to hide the character without deleting it.On
Stage preview
Preview Base MeshThe basic model that wears the costumes on the stage.Mannequin
Preview Idle AnimationThe default standing animation.Neutral idle
Preview Mesh RotationTurns the model to face the camera.-90° yaw
Hide Base Mesh When OverriddenHides the basic model when a costume is shown, so you don't see two.On
Gameplay look
Appearance Component ClassThe part of the game body that knows how to wear a costume.AC_VisualOverrideManager
Appearance Property NameThe name of the costume slot on that part.VisualOverride
Appearance Rep Notify NameWhat to call after changing the costume, so everyone else sees it too.OnRep_VisualOverride

Player defaults Player defaults

Each player's own choices. You set the starting values in DA_NLS_GameSettings (Player Chat Defaults and Player Audio and Control Defaults); players change them on the Settings tab, and they are saved in their profile.

Chat (Settings › Chat & Voice)
Keep Chat Box OnThe chat box always stays on screen instead of fading away. Command: /chatboxOff
Fade DelayHow long the chat box stays after a message before fading. Command: /fade 85 s
New Messages Show Chat BoxA new message brings up the whole box. Off: messages float alone and fade. Command: /newmessagesOn
Keep Typing After SendingAfter you press Enter the box stays open so you can type again. Command: /keeptypingOn
Chat History LinesHow many recent messages the box shows. Command: /history 2020
Show TimestampsShows the time, like 14:05, before each line. Command: /timestampsOff
Show Join Leave MessagesShows "joined" and "left" lines. Command: /joinleaveOn
Play Message SoundA little sound when someone else writes. Command: /chatsoundOn
Voice (Settings › Chat & Voice)
Voice ModePush To Talk (hold V), Always On, or Off. Command: /voice ptt, /voice open, /voice offPush To Talk
Voice VolumeHow loud other people are, from 0 to 200%. Command: /voicevolume 120100%
Mic VolumeHow loud you sound to others. Command: /micvolume 80100%
Audio, controls and menu
Master / Music / Effects VolumeHow loud everything, the music and the effects are.100%
Look SensitivityHow fast the camera turns when you move the mouse or stick.x1.0
Invert Look YPushing up looks down, like a plane.Off
Menu SizeMakes the in-game menu bigger or smaller, text and all (75–150%).100%
Menu window sizeThe size you dragged the menu to. Double-click the corner to reset.default
Graphics (saved on this computer only)
QualityHow detailed everything looks. Lower is faster.set by your PC
Display ModeFullscreen, Borderless (a window that fills the screen) or Windowed.set by your PC
ResolutionHow many dots the picture has.your screen
Render ScaleDraws the 3D world smaller and stretches it, for more speed.100%
VSyncWaits for the monitor, so the picture never tears, but buttons feel a hair slower.set by your PC
Frame Rate LimitThe most pictures per second.set by your PC
Chapter 4

Playing the game

How to test with several players on one computer, every key and button, the scoreboard, chat and voice, and how a round goes.

Playtest in the editor

LAN · quickest

Two players on one PC

  1. Click the ⋮ next to Play › Number of Players = 2.
  2. Net Mode = Play Standalone (each window is its own game and starts at character select).
  3. Press Play. In both windows click OFFLINE (LAN) on the Online/Offline switch.
  4. Window 1: Start Game, then Backspace › Host Game › HOST GAME.
  5. Window 2: Start Game, Backspace › Find Games › JOIN (or just QUICK MATCH).
Epic online

Two Epic test accounts

  1. Run the EOS Dev Auth Tool (EOS SDK/Tools/EOS_DevAuthTool), port 6300.
  2. Log in two Epic accounts and name the credentials Player1 and Player2 (the names in Game Settings › Dev Auth Credential Names).
  3. Press Play with 2 players as above, but click ONLINE. Window 1 signs in as Player1, window 2 as Player2. No browser needed.
  4. For Friends, invites and voice, make the two accounts Epic friends first.
Separate game windows. Use the Play menu's Standalone Game or launch the .uproject twice. Each copy takes the next free Dev Auth credential automatically; add -NLSDevAuth=Player2 to force one.
Seamless travel in the editor. When a team changes level inside the editor, the engine may use classic travel (everyone reconnects). That's normal; test seamless travel in Standalone or a packaged game.

Every key and button

WhereWhatKeyboard & mouseGamepad
Character selectNext / previous character← →, A D, Q E, mouse wheel, click a cardLB / RB, D-pad, left stick
Turn the characterDrag with the mouseRight stick
Start gameEnterA
Go to the buttonsClickD-pad up / down
Type your nameClick the name boxSelect it and press A
During playOpen / close the in-game menuBackspace (close: Esc too)Menu / Start (close: B)
Scoreboard (hold)Left AltView / Back
Open chatEnter, or / for a command–
Talk (push-to-talk)hold Vhold D-pad down
Epic overlayShift+F3 (Epic's default)–
Game controlsWhatever your game uses; rebind them on Settings › Controls
In-game menuSwitch tabClick the tabLB / RB
Move between buttonsTab, arrowsD-pad, left stick
Scroll a listMouse wheelRight stick
Resize the windowDrag the bottom-right corner; double-click it to resetSettings › Graphics › Menu Size
Chat boxSendEnter (empty line closes)–
Switch channel All › Team › WhisperTab–
Repeat what you sent↑ ↓, close with Esc–

The scoreboard

Hold Left Alt in any multiplayer game. Your row is outlined, team modes are grouped and tinted by team, a green dot shows who is talking, and spectators are listed underneath.

Raed's Game · Harbor
PLAYERKILLSDEATHSPING
 Mira  LEADER14638
Ali9894
Raed  HOST115—
Sana7941
Spectating: Omar
Team vs Team scoreboard. Red team on top (Mira is talking), the host has no ping because the game runs on their PC.

Chat and voice

Chatting

  • Press Enter, type, press Enter. The box shows for a few seconds, then fades.
  • All goes to everyone, Team only to your team, Whisper to one person: /w Ali see you there.
  • /r replies to the last whisper. /help lists every command (full list in chapter 7).
  • Mute someone with /mute name or the MUTE button on the Team tab. Only you stop hearing them.
  • The same chat is on the Team tab of the menu.

Talking (online games)

  • Hold V and speak. A green dot appears by your name on the Team tab and scoreboard.
  • Prefer an open mic? Settings › Chat & Voice › Voice Chat = Always On, or type /voice open.
  • Too loud or quiet: Voice Volume and Microphone Volume, 0–200%.
  • LAN games have no voice; everything else works the same.
Sana joined the game.
Mira: ready when you are
[TEAM] Ali: I'll take the left side
From Omar: gg last round
Everyone is ready. Starting in 10 seconds.
TEAMType a message… /help for commands
The chat box: names are coloured by channel (All amber, Team blue, Whisper pink, game notices grey).

Opening and resizing the menu

Backspace opens the in-game menu over the game; the game behind it blurs. Backspace or Esc closes it. Drag the small grip in the bottom-right corner to change its shape (it stays centred and grows on both sides). Double-click the grip to go back to the normal size. For bigger or smaller text and buttons, use Settings › Graphics › Menu Size. Both are remembered in your profile.

A round, from start to finish

In modes with rounds (everything except Free For All) the bar at the top of the screen tells you what's happening.

  1. Waiting for playersFewer players than the mode's Min Players. Everyone can run around freely. Bar: DEATHMATCH · WAITING FOR PLAYERS (1/2)
  2. Everyone presses ReadyOn the Team tab or with /ready. Bar: DEATHMATCH · READY 2/3. The banner tells you if it's waiting for you.
  3. Countdown10 seconds. If someone un-readies or leaves, it stops. With Travel On Start, everyone moves to the most-voted level here.
  4. RoundFresh scores, everyone respawned, the timer runs. Kills score points; in Battle Royale you have one life, then you watch.
  5. Results"RED TEAM WINS", "YOU WIN", "DRAW" or "MISSION COMPLETE" for 10 seconds, then the next round starts by itself.
TEAM VS TEAM · 12:48 RED 31BLUE 27
RED TEAM WINS
Victory! Next round in 8
The round bar (top) and the result banner.
Chapter 6

For developers

Where everything lives in the code, how the pieces talk to each other, how to build and package the game, run a dedicated server, and set up Epic Online Services.

How it fits together

Nice Lobby is one plugin with two runtime C++ modules and one editor module. NiceLobby holds everything that works on any online service. NiceLobbyEOS is a thin layer that talks straight to the Epic SDK (P2P networking, voice, reports, sanctions, stats) and plugs into NiceLobby through a few static hooks, so the core module never depends on EOS. NiceLobbyEditor only exists in the editor and makes the Widget Blueprints.

DATA ASSETS (what designers edit) DA_NLS_Characters · DA_NLS_Levels · DA_NLS_UI · DA_NLS_GameSettings ← picked in Project Settings › Nice Lobby (UNLSDeveloperSettings) GAME INSTANCE SUBSYSTEMS (live the whole run) NLSGameSubsystemprofile, settings, bans, travel NLSSessionSubsystemlogin, host, find, join, rejoin NLSFriendsSubsystemfriends, invites, presence NLSVoiceSubsystempush-to-talk, volumes NLSCloudSave / NLSStatssettings sync, stats, boards NLSUISubsystem · NLSChatwidgets, chat, loading screen GAMEPLAY FRAMEWORK (per level, replicated) NLSGameModerules, rounds, spawns, teams NLSGameStatematch phase, scores, votes NLSPlayerStatename, character, ready, team NLSGameSessionbans, kicks, server name NLSMenuGameMode / PCcharacter select level NLSCharacterAppearanceapplies the picked look UNREAL ONLINE SUBSYSTEM OSS EOSlobbies, friends, presence, login OSS NullLAN games, no account needed NiceLobbyEOS MODULE (Win64 · Mac · Android) NLSNetDriverEOS P2P, falls back to IP SDK hooksvoice users, reports, sanctions, stats
The golden rule. Almost everything a designer wants to change is in a Data Asset. Reach for C++ when you need new behaviour, and prefer subclassing (your own Game Mode, your own widget class set in DA_NLS_UI) over editing the plugin, so updates stay easy.

Folders

PathWhat's there
Plugins/NiceLobby/NiceLobby.upluginPlugin descriptor. NiceLobby (Runtime), NiceLobbyEOS (RuntimeNoCommandlet, Win64 / Mac / Android) and NiceLobbyEditor (Editor).
Plugins/NiceLobby/Source/NiceLobby/Public|Private/The core, split into Data, Framework, Online, Input and UI, plus a few top-level files.
Plugins/NiceLobby/Source/NiceLobbyEOS/NLSNetDriver and NiceLobbyEOSModule.cpp (all direct EOS SDK calls).
Plugins/NiceLobby/Source/NiceLobbyEditor/UNLSWidgetBlueprintTools: generates the WBP_NLS_* Widget Blueprints.
Plugins/NiceLobby/Content/Python/nls_setup.py (creates the Data Assets, Widget Blueprints, character select and transition maps, player starts) and init_unreal.py (adds the Tools menu entries).
Content/NiceLobby/Your project's NLS content: Data (the four Data Assets), UI (the WBP_NLS_* Widget Blueprints), Maps (L_NLS_CharacterSelect, L_NLS_Transition), Portraits, Thumbnails.
Config/DefaultEngine.iniDefault map, online subsystem (EOS, with Null for LAN), EOS artifact and the NLSNetDriver definitions.
Source/NiceLobbySystemServer.Target.csThe dedicated server target.

Every class, and when to touch it

Paths are under Plugins/NiceLobby/Source/NiceLobby/. Headers are in Public/…, code in Private/… with the same sub-folder.

Class / fileFolderJobEdit it when…
FNiceLobbyModule/Module start-up.Rarely.
UNLSDeveloperSettings/Project Settings › Nice Lobby: points at the four Data Assets and has the static getters (GetGameSettings(), GetLevelData()…).You add a fifth Data Asset.
UNLSGameSubsystem/The player's profile (name, character, chat and player settings), save/load, ban list, level travel, applying audio and cloud settings.You add a new saved player setting.
NLSTypes.h/Shared structs and enums: FNLSPlayerSettings, FNLSChatSettings, map and mode definitions, session info.You add a field to one of those structs.
UNLSCaptureLibrary/Editor helper that renders character portraits and level thumbnails.You want different capture framing.
UNLSCharacterData, UNLSLevelData, UNLSUIData, UNLSGameSettingsDataDataThe four Data Asset classes. Every property is explained in chapter 3.You need a new designer-facing setting.
ANLSGameModeFrameworkMatch flow (warm-up, countdown, round, results), spawning, teams and balancing, scoring, respawns, Co-op, Battle Royale, damage rules.New rules: subclass it and set it as Default Game Mode Class.
ANLSGameStateFrameworkReplicated match phase, timer, team scores, level votes.New match-wide data everyone must see.
ANLSPlayerStateFrameworkReplicated name, character, ready, team, spectating, kills/deaths, leader flag.New per-player replicated data.
ANLSGameSessionFrameworkBan checks on login, kicks, server name, dedicated-server command line.Custom join rules.
ANLSMenuGameMode, ANLSMenuPlayerControllerFrameworkThe character select level.You change how the first screen behaves.
ANLSCharacterStageFrameworkThe 3D pedestal and camera on the character select screen.A different stage layout.
UNLSCharacterAppearance + INLSCharacterAppearanceInterfaceFrameworkApplies the picked character's mesh, anim class and materials to the pawn (ApplyNLSCharacter).Your pawn needs a custom way to change looks.
UNLSChatSubsystemFrameworkChannels, whispers, mutes, all chat commands, history, notices.You add a chat command.
UNLSSessionSubsystemOnlineLogin, host, find, quick match, join, private games, filters, rejoin, host hand-over, LAN fallback.New session settings or search rules.
UNLSFriendsSubsystemOnlineFriends list, presence, invites, join-via-friend.Rarely.
UNLSVoiceSubsystemOnlineVoice mode, push-to-talk, volumes, who is talking. Uses VoiceUserProvider hook from NiceLobbyEOS.Voice behaviour.
UNLSCloudSaveSubsystemOnlineUploads and downloads the profile (minus graphics) through the User Cloud interface (EOS Player Data Storage).You sync more data.
NLSOnlineStats (FNLSOnlineStatsServices, UNLSStatsSubsystem)OnlineIngests stats, reads leaderboards and achievements.New stats (also add them in the Dev Portal).
NLSModeration (FNLSModerationServices)OnlineBlock list, player reports, sanctions check, vote kick.Moderation rules.
UNLSLookSensitivityModifierInputEnhanced Input modifier that applies Look Sensitivity and Invert Y.Rarely.
UNLSUISubsystemUICreates and shows every NLS widget, toasts, menu open/close, input mode.You change when screens appear.
UNLSServerBrowserWidgetUIThe whole in-game menu (all six tabs). Built in C++ from the widget tree, styled by FNLSUIStyle.New tab or new menu row.
UNLSCharacterSelectWidgetUIThe first screen.Character select layout.
UNLSChatWidget, UNLSLobbyChatWidgetUIThe in-game chat box and the chat inside the Team tab.Chat looks.
UNLSScoreboardWidget, UNLSMatchHUDWidgetUIHold-Alt scoreboard; round bar, countdown and result banner.HUD looks.
UNLSLoadingScreenSubsystem + SNLSLoadingScreenUISlate loading screen during level travel.Loading screen looks.
NLSWidgets.hUIBuilding blocks: base widget, card, option selector, server row, team member row, key binding row, friend row, toast.A shared control changes.
FNLSUIStyleUIHelpers that make buttons, labels and panels using the colours and fonts in DA_NLS_UI.A global style rule.
UNLSWidgetBaseUIBase of every NLS widget: builds the C++ layout only when the widget has no Designer layout (BuildDefaultLayout), then OnLayoutReady binds events and applies Data Asset switches and texts.Every screen's OnLayoutReady must work with a Designer layout: put on/off switches there, not in the build.
UNLSWidgetBlueprintToolsNiceLobbyEditorCreates WBP_NLS_* children with the default layout moved into their Designer (bound widgets keep their property names), compiles, saves and wires them into DA_NLS_UI.You add a widget class: add it to GetSpecs() (children before the screens that contain them).
UNLSNetDriverNiceLobbyEOSUses EOS P2P for EOS: addresses and plain IP otherwise (LAN, not signed in, dedicated).Networking transport.
NiceLobbyEOSModule.cppNiceLobbyEOSFills the static hooks with EOS SDK calls (RTC voice, Reports, Sanctions, Stats, Leaderboards, Achievements).A different backend: replace the hooks.

Changing the code safely

Extend

Subclass, don't fork

  • Rules: make BP_MyGameMode or a C++ child of ANLSGameMode, override what you need, and set it in DA_NLS_GameSettings › Default Game Mode Class (or per mode in DA_NLS_Levels).
  • Screens: edit the WBP_NLS_* Widget Blueprints (or your own children) that DA_NLS_UI points at; see chapter 2. New behaviour goes in the Blueprint graph or a C++ subclass.
  • Gameplay events: call the hooks (ReportKill, EndCoopRound, AddStat…) from your own Blueprints.
Gotchas

Things the compiler will catch you on

  • Unreal treats variable shadowing (C4458 / C4456 / C4457) as an error. Don't name locals after members of a parent class, e.g. CategoryName or Rows in a widget.
  • NiceLobby must not include EOS headers. Add a hook (a static TFunction) and fill it in NiceLobbyEOS.
  • All user-facing text uses LOCTEXT, so it can be translated.

Building and packaging

  1. Generate project filesRight-click NiceLobbySystem.uproject › Generate Visual Studio project files (or open the folder in Rider).
  2. Build the editorOpen the solution, pick Development Editor + Win64, and build the NiceLobbySystem project. Or just double-click the .uproject and let Unreal compile.
  3. After changing C++Close the editor and build again for header changes. Live Coding (Ctrl+Alt+F11) is fine for code inside functions.
  4. PackageIn the editor: Platforms › Windows › Package Project. Use Development while testing (logs and console work) and Shipping for release. Make sure the four Data Assets and both NLS maps are cooked (they are referenced, so they are by default).
  5. Test the packageRun two copies of the packaged game, or one on each PC. Add -log to see what's happening.

Dedicated server

Players normally host on their own PC. For a server that is always on, build the NiceLobbySystemServer target. That needs Unreal built from source (the launcher version can't build servers).

  1. BuildIn a source build: Platforms › Windows › Server as the target, then Package Project. Or build NiceLobbySystemServer in Development Server.
  2. RunStart it with the options below. It appears in Find Games like any other game, with no player as host.
  3. Epic sign-inFor an online dedicated server, the client in the Dev Portal needs the Trusted Server policy.
NiceLobbySystemServer.exe -log -port=7777 ^
  -NLSServerName="EU Arena 1" -NLSMap=Harbor -NLSMode=TeamVsTeam -NLSMaxPlayers=12
# LAN only:  add  -NLSLAN -UseLocalIPs
OptionMeaning
-NLSServerName=Name shown in Find Games.
-NLSMap=Map Id from DA_NLS_Levels.
-NLSMode=Game mode Id from DA_NLS_Levels.
-NLSMaxPlayers=How many players fit.
-NLSLANAdvertise on the local network only (Null subsystem).
-UseLocalIPs, -port=Standard Unreal networking options.

Setting up Epic Online Services

Until this is done, Nice Lobby quietly plays on LAN. Everything below happens on dev.epicgames.com/portal.

  1. Create a productYour organisation › Create Product. It gets a Product Id, a Sandbox (Dev) and a Deployment.
  2. Create a clientProduct Settings › Clients › Add new client. Make a client policy of type Peer2Peer (for player-hosted games). For a dedicated server, make a second client with Trusted Server. Write down the Client Id and Client Secret.
  3. Epic Account ServicesProduct Settings › Epic Account Services › create an Application, link your client, and under Permissions turn on Basic Profile, Online Presence and Friends. Fill in the brand settings (name, links) or players can't sign in.
  4. Fill in the artifactUnreal › Project Settings › Plugins › Online Subsystem EOS › Artifacts › add one: Artifact Name, Client Id, Client Secret, Product Id, Sandbox Id, Deployment Id, and an Encryption Key of exactly 64 hex characters (any random value, e.g. from openssl rand -hex 32). Set it as the default artifact. The same values live in Config/DefaultEngine.ini.
  5. Dev Auth ToolFor testing several accounts on one PC: run the EOS Dev Auth Tool (in the EOS SDK's Tools folder) on port 6300 and sign in two Epic accounts named Player1 and Player2. Each game window picks a free credential by itself; add -NLSDevAuth=Player2 to force one. See chapter 4.
  6. StatsGame Services › Stats › create KILLS, DEATHS, ROUNDS_PLAYED and ROUNDS_WON, each with aggregation SUM. Names must match exactly.
  7. LeaderboardsGame Services › Leaderboards › create boards named KILLS and ROUNDS_WON that read the matching stat. They then appear on the Stats tab.
  8. AchievementsGame Services › Achievements › add your achievements, unlocked by the stats above (e.g. First Blood when KILLS ≥ 1). Upload an icon for each.
  9. Player Data StorageNeeded for cloud settings. It is on by default for the product; nothing to create.
  10. Session bucketIn DA_NLS_GameSettings set a Session Bucket Id unique to your game, so you don't see other people's test games.
Before you publish: while the Epic Account Services application is unpublished, only accounts that belong to your Dev Portal organisation can sign in. Add testers to the organisation, or get the application approved under Brand Review.

Blueprint API

Get a subsystem with its Get node (e.g. Get NLS Session Subsystem) and call:

Session subsystem

Login · HostGame · FindGames · CancelFindGames · QuickMatch · JoinGame · JoinGameWithTeam · LeaveGame · ReturnToMainMenu · RejoinLastGame · ForgetLastGame

Events: OnLoginComplete, OnHostComplete, OnJoinComplete, OnQuickMatchComplete, OnFindGamesComplete, OnStateChanged.

Game mode

ReportKill · RespawnPlayer · EndRound · EndCoopRound · BalanceTeams · ResetAllStats · BroadcastChatNotice

Events on the game state: OnMatchStateChanged, OnTeamStateChanged.

Game subsystem

SelectCharacter · SetPlayerName · SaveProfile · SetPreferLAN · SetPlayerSettings · ResetPlayerSettings · SetChatSettings · ResetChatSettings · StartSinglePlayer · ReturnToCharacterSelect

Events: OnCharacterSelected, OnPlayerNameChanged.

Chat, friends, stats

Chat: OnChatMessage, OnChannelChanged, OnChatCleared, OnChatSettingsChanged. Friends: OnFriendsUpdated.

Stats: AddStat / SetStat on NLS Player State (they show on the scoreboard and are sent to Epic).

Character: implement INLSCharacterAppearanceInterface › ApplyNLSCharacter on your pawn.

Chapter 7

Quick reference

Every chat command, answers to the usual problems, and a little dictionary of the words used in this handbook.

All chat commands

Type them in the chat box (Enter, or / to start with a slash already typed). Commands are not case sensitive. To send a message that starts with a slash, type two: //like this.

CommandAlso worksWhat it does
Talking
/all message/a /s /sayTalk to everyone. With no message, switches the box to All.
/team message/t /p /partyTalk to your team only.
/w name message/whisper /msg /tell /pmA private message to one player.
/r message/replyAnswer the last person who whispered you.
Basics
/mute name/ignoreStop seeing and hearing someone (this game only).
/unmute name/unignoreUndo a mute.
/clear/clsEmpty your chat box.
/help/? /commandsLists the commands in the chat.
Match
/ready/rdySwitch ready on or off. /ready off always means not ready.
/unreadyNot ready.
/jointeam name | number | auto/side /switchteamChange team in team modes.
/spectate/spec /watchWatch instead of play.
/play/unspectateStop watching and play again.
Chat settings (on, off, or nothing to switch)
/chatbox/chatboxtoggle /keepchatbox /keepchatboxonKeep the chat box always visible.
/keeptyping/keeptypingaftersendingStay in the box after you send.
/newmessages/popup /newmessagesshowchatboxNew messages make the box appear.
/timestamps/timestamp /timeShow the time on each line.
/joinleave/joinleavemessagesShow "X joined" lines.
/chatsound/sound /messagesoundA small sound for new messages.
/fade seconds/fadedelay /chatfadeHow long the box stays before fading.
/history lines/chathistory /linesHow many old lines to keep.
/chatsettings/settingsShow your current chat settings.
/resetchat/chatreset /resetchatsettingsPut chat settings back to normal.
Voice
/voice ptt | open | off/voicechat /vcPush to talk, always on, or off.
/voicevolume 0–200/vv /voicevolHow loud others are.
/micvolume 0–200/mic /microphoneHow loud you are.
Safety
/block nameHide someone from you for good (also through Epic).
/report name reason textReport to Epic. Reasons: cheat, exploit, name, abuse, scam, spam, other.
/votekick name/kickvote /vkStart a vote to remove someone.
/vote yes | noy nVote in a running vote kick.
/ban nameHost: remove someone and keep them out of your games.
/unban nameHost: let them back in.
/bans/banlistShow your ban list.

When something goes wrong

It always says OFFLINE (LAN)

EOS couldn't start. Check that the artifact in Project Settings › Online Subsystem EOS is filled in and is the default, and that the encryption key is 64 hex characters. The log line starting with LogEOS says what is wrong.

"ONLINE · NOT SIGNED IN"

EOS works but the sign-in failed. In the editor, run the Dev Auth Tool. In a package, the Epic Account Services application must be linked to your client, and your account must be in the organisation while it is unpublished.

Find Games is empty

Both players must use the same build, the same Session Bucket Id, and the same mode (both online or both LAN). Untick the Full Games and In Progress filters, then Refresh.

Everyone spawns in the same spot

Add more Player Starts (Tools › Nice Lobby: Add Player Starts) or keep Spread Player Spawns on.

My character looks wrong after travel

Your pawn class needs INLSCharacterAppearanceInterface, or the default appearance component, so it can take the picked mesh and animations. See chapter 2.

Voice doesn't work

Voice needs Epic (online) and Enable Voice Chat on in DA_NLS_GameSettings; every lobby then gets a voice room. On LAN there is no voice. Check Voice Chat isn't Off, and hold V in push-to-talk.

Stats tab is empty

The stat and leaderboard names in the Dev Portal must match DA_NLS_GameSettings exactly (KILLS, DEATHS, ROUNDS_PLAYED, ROUNDS_WON). New stats can take a minute to appear.

The build fails with C4458

A local variable has the same name as a member of a parent class. Rename the local. Unreal treats this warning as an error.

Words used in this handbook

WordMeans
Data AssetA settings file you open in the editor. Like a form you fill in.
HostThe computer that runs the game. Everyone else connects to it.
LeaderThe player who picks the next level. Often the host, but can be given away.
SessionOne game that people can find and join.
LobbyThe waiting area of a game, where you see who is in and who is ready.
LANPlaying with computers on the same home or office network, no internet account needed.
EOSEpic Online Services: Epic's free servers for sign-in, friends, finding games, voice and stats.
P2P"Peer to peer": players connect straight to the host's PC, with Epic helping them find each other.
Dedicated serverA computer that only runs the game, with no player sitting at it.
Seamless travelMoving the whole team to a new level without anyone disconnecting.
Spawn / Player StartWhere a player appears in a level.
PingHow long a message takes to reach the host and back, in milliseconds. Lower is better.
SpectateWatching the game without playing.
ReplicatedCopied from the host to every player automatically.
PIE"Play In Editor": pressing Play inside Unreal.

Nice Lobby System handbook · written for UE 5.8 · branch Claude of AbbasGames/NiceLobbySystem.

↑