Skip to content

RLBot v5 (Beta) Overview

RLBot v5 is the next major version of the RLBot framework, bringing a host of reliability improvements and some new features to the table.

RLBot v5 is now in pre-release! RLBot v5 is now stable and almost feature-complete, meaning people can start adopting it. Note that the various language interfaces are still in development and may be unstable. There is also a functional GUI ready for bot development, with only QoL features still missing.

Windows Installer: DOWNLOAD

Any updates to RLBot v5 and the language interfaces will be announced in the RLBot Discord #annoucements channel.

In the remainder of this document we will cover:

  • Our reasoning for creating v5 and an overview of its architecture GOTO
  • A list of features completed/reworked/todo/removed in v5 (beta) GOTO
  • A guide on breaking changes and how to transition from v4 to v5 GOTO
  • Links to v5 language interfaces and more GOTO

Why v5?

RLBot v4 has been incredibly user-friendly, feature-rich, and stable. It was made in 2018 when RLBot was still using DLL injection. Later, in 2019, the collaboration with Psyonix and the official API was introduced. Since then, there have only been minor changes and new features, which prove how well-designed v4 was. In fact, v5 is not that different from v4. It is primarily a rewrite and an opportunity to fix the flaws of v4 that have been revealed over the years. So here are the main reasons we made v5:

  • The closed-source part of v4 is doing more than just communication with the Psyonix API. This has long prevented the community from fixing certain bugs themselves. Therefore, we are extracting that functionality into the open-source part of RLBot, making the closed-source part exclusively about communication with the API.
  • The closed-source part of v4 is written in C++. By rewriting the backend of RLBot in C#, we hope that more people feel comfortable contributing to it.
  • No more DLLs. You may not be aware, but most bots still use a DLL to communicate directly to the RLBot backend. In v5, the transition to web sockets is finally complete and this allows the bot interfaces to be improved (e.g. Python type hints are not a hack anymore).
  • All languages can start matches in v4, but the logic for launching Rocket League and bots was only implemented in Python (and partially Rust). This discouraged people from writing match starters (GUI, autoleague, etc) in languages other than Python (even CleoPetra, written in Java, uses a Python process to start matches). Therefore, we are moving this logic to the backend for v5, such that more languages can benefit from it.
  • We are freeing ourselves from design choices made under the restrictions of the DLL injection.
  • The Psyonix API made a few extra features available to us, but we never integrated them in v4. They are integrated in v5.
  • Python is very slow. The rewrite in C# has made this clear.
  • The .cfg file format has no standard. We are changing to the similar .toml format.

So while the changes to the functionality and interface are minor, the architecture and the framework's internal code is very different. We hope these changes will make it enjoyable to work with and contribute to RLBot moving forward.

Features of v5

[Legend: ✅=done, 🟨=todo, ✨=new, 🛠=reworked/changed, ⛔=removed]

  • ✅🛠 First-class Windows & Linux support
    • No current plans for MacOS, as there's no way to run Rocket League without a full VM
  • ✅🛠 All bots connect to core directly via the sockets flatbuffer spec
    • As a consequence, adding new language support is much easier - if your language can write/read a TCP socket, it's possible! Bonus points if your language is one of the 14 that are currently supported by FlatBuffers
  • ✅🛠 Any language can still start/stop/manage a match, but the logic for launching Rocket League and bots are now in RLBotServer.
  • ✅🛠 All configs files now use the standard toml format. Example: necto/bot.toml
  • ✅ Hiveminds
  • ✅ Scripts
  • ✅🛠 The bot configuration's python_file has been replaced with run_command and run_command_linux
    • ✅ On Linux, if run_command_linux isn't specified, v5 will attempt to run run_command under Wine
  • ✅✨ Multi-ball support for when there's more/less than 1 ball in a game
  • ✅✨ New mutator options
    • A Knockout match can be started
    • Start with one, two, four, or six balls
    • Max 7 goals
    • Beach ball, anniversary ball, spooky cube, or the haunted dropshot ball
    • Curve ball or beach ball curve
    • Medium ball size
    • Reverse gravity
    • Tactical rumble (fyi we still can't read rumble items)
    • Boost strength 5x
    • Max time 11 minutes
  • ✅✨ Freeplay matches. Useful if you want to use the Rocket League's freeplay-exclusive features
  • ✅ Rendering
    • ⛔ Keyboard shortcuts to toggle rendering. We plan to have buttons that toggle rendering in the GUI!
    • ✅✨ Rendering can be toggled for individual bots
    • ✅✨ Bots and scripts can toggle their own rendering if rendering is not set to AlwaysOff.
    • ✅✨ New RenderAnchors. Attach your rendering to the location and rotation of a car or ball plus both an absolute and local offset. No re-rendering is required and it is smooth. Example: video posted on Discord
  • ✅ Game state manipulation (aka state setting)
  • ✅ Updated ball prediction algorithm for better accuracy in all game modes that use a ball
  • ✅✨ Support for Psyonix Beginner bots
  • ✅✨ More customizable Psyonix bots
  • ✅✨ Override a bot name/loadout (without editing the bot configuration)
    • Use cases include: Spawning specific Psyonix bots or give Nexto your in-game name to troll friends
  • ✅🛠 Generated loadouts are now created by your bot instead of a separated loadout generator script
  • ✅✨ Hot-swap your bot's loadout. Respawn your bot's car with a different loadout on command without restarting the match or interfering with the other bots
    • Only enabled when state setting is also enabled
  • ✅✨ New data in GamePacket for every player:
    • Last known player input
    • has_double_jumped and has_dodged are now separately tracked fields
    • If the player was the last player to be spectated in the match
    • Player accolades. A list of small awards/events by the player, e.g. EpicSave, Demolition, PoolShot, LowFive, etc. See full list here)
  • ✅🛠 Match comms and quick chat have been combined into just MatchComms with an optional quick chat message such that both bots and humans can understand what is meant
    • ⛔ Quick chat messages are no longer restricted to a set of hardcoded options
    • ✅🛠 The team_only filtering finally works. No more spying on enemy chats
  • ✅🛠 RLBot waits for all processes to fully boot before letting the match start, but this can also be toggled on a per-bot level.
  • ✅🛠 RLBot can be instructed to not launch certain bots. They must instead be launcher manually, which may be handy during development.
  • ✅🛠 Performance metrics (i.e. missed responses by bots). It is no longer possible to toggle this display with keyboard shortcuts. Instead, it shows up automatically only when there are problems. Currently, the performance percentages will be shown anytime either RLBot itself or a bot is running below 100%.
  • ⛔ Non-standard Tick Rates (standard is 120hz)
    • All bots are now expected to run at 120hz. If you need more time to process inputs, it's advisable to engineer your bot around this by, for example, using an extra asynchronous thread running complex algorithms.
  • ⛔ DropshotTileInfo
    • This functionality was lost with the introduction of the Psyonix API and is removed v5. But it might return.

On top of all that, the framework is also significantly faster.

Breaking Changes / Migration

The migration guide for the Python interface gives a good overview of the breaking changes and what to do instead so we refer to that: https://github.com/RLBot/python-interface/wiki/Migration

Below you can find links to the implementation of RLBot v5, the language interfaces, and related documentation. This wiki will also be updated as things stabilize.

RLBot v5 framework:

Language interfaces (unstable):