Original Post — Direct link

Hey there !

If you're from Psyonix and are reading this, thank you in advance for your time !

A little introduction

I'm Can't Fly, the developer behind ballchasing.com.

I'd like to start by saying: RocketLEague is the bestest most awesomest game ever !

This is the game that brought me back to gaming after many years of hiatus.

It was love at first sight, when a friend showed me the game. around 2017.

I've since put 3700 hours in the game, and it would have been much more if not for me launching ballchasing.com.

The scope of the project was initially very modest: just a simple whole-field viewer of a Rocket League game, to prove to my friend that we kept loosing because he sucked.

I've spent a couple months getting my head around the replay file format,taking inspiration from some of the existing parsers, mostly jjbot's C# parser.

Then I reached my set goal: completely parse a replay file, extract the players and car positions,and render the game in a webpage using three.js, with a barebones 3D representation.

I thought that this could be of interest to the community, so I posted a video preview of the 3D viewer here in reddit, and to my surprise, the post just exploded.

The community's excitement, praise, encouragement and suggestions have fueled me to go much farther than what I initially planned to do, with the site main focus changing from the 3D viewer to stats extraction.

Since then, the site has grown beyond my wildest dreams:

  • 30k+ registered users
  • 40k+ daily replay uploads
  • 12+ million uploaded replays
  • 300k+ monthly page views
  • The API being actively used by multiple communities & tournaments to do the heavy lifting of parsing and computing stats
  • Major tournaments making replays available on the site

Whew, that was a lengthy introduction.

Back to the meat of the subject: a couple of suggestions that would greatly improve the quality of life of developers providing tools around Rocket League for the community.

1. Add timezone to replay date

I'm referring to the ReplayDate field in the replay file header.

2. Add the season in the replay file

Either in the header, or in the network stream, maybe in the TAGame.GRI_TA class ?

Just to give you an idea of how complex it is today to determine a given replay's season, here's the code I currently use in the ballchasing.com codebase:

func For(gameVersion int, licenseeVersion int, date time.Time) int {
    switch {
    case licenseeVersion == 29:
        return 14
    case licenseeVersion == 28:
        switch {
        case date.Before(time.Date(2020, 3, 25, 18, 0, 0, 0, time.UTC)):
            return 13
        default:
            return 14
        }
    case gameVersion == 0:
        switch {
        case date.Before(time.Date(2016, 2, 10, 1, 0, 0, 0, time.UTC)):
            return 1
        case date.Before(time.Date(2016, 6, 21, 2, 0, 0, 0, time.UTC)):
            return 2
        default:
            return 0
        }

    case gameVersion >= 30:
        switch {
        case date.Before(time.Date(2019, 8, 27, 17, 0, 0, 0, time.UTC)):
            return 11
        default:
            return 12
        }
    case gameVersion >= 29:
        return 11
    case gameVersion >= 27:
        switch {
        case date.Before(time.Date(2019, 5, 13, 1, 0, 0, 0, time.UTC)):
            return 10
        default:
            return 11
        }
    case gameVersion >= 25:
        return 9
    case gameVersion >= 24:
        return 8
    case gameVersion >= 22:
        return 7
    case gameVersion >= 21:
        return 6
    case gameVersion >= 20:
        return 5
    case gameVersion >= 18:
        return 4
    case gameVersion >= 12:
        return 3
    case gameVersion >= 10:
        return 10

    default:
        return 0
    }
}

As you can see, this is very fragile, and downright wrong, due to the fact that replay dates do not contain the timezone.

3. Store player ranks in replays

This would be huge !

This would solve 87.354% of the uses cases of an official API, I think.

Also, it would spare people like me from resorting to ... let's say not-very-savory ways to get this info from other unofficial sources.

4. This one might be trickier: access to pre-builds

Would you be open to set up a system, say a vetted community with access to pre-builds of the game before it goes live ?

The goal is to leave us time to prepare our parsers for changes in the replay file format.

Currently, whenever a new version is released with a change in the replay file format, all the community tools (ballchasing.com, calculated.gg, the open source parsers, the various mods, etc.) become broken.

Depending on the maintainer's timezone, this could happen at an inconvenient time.Also, it can take a little while to figure out the change and fix the parser accordingly.

Meanwhile, replays fail to parse and keep queuing up on the server, depriving the community from tools they rely on (many tournaments use the ballchasing.com API for their bookkeeping).

Once the fix is pushed, it would still take the server a while to reprocess the thousands of replays that were uploaded in the meantime.

That is all !

If you've reached this far, thank you again for your time & hopefully this post falls on receptive ears !

Also, thank you again for making this game, for keeping it alive for this long and for the time & effort you're putting in interacting and listening to the community ❤️

RocketLeagueRocks !

External link →
about 4 years ago - /u/Psyonix_Devin - Direct link

Thanks for the thoughtful post! Passing this along. :)