Grunt 0.1.9 (Codename S) Is Available Now

Header for the blog post, with a Halo grunt in the background and text that says “Grunt 0.1.9 Is Available Now”

The 0.1.9 release is an important one for several reasons, but mainly because it completes the journey on documenting the core Halo Infinite API. That’s right, you now have a fully-documented library that will continue evolving, but you no longer have to guess what data type is where.

NuGet download link for OpenSpartan.Grunt

NuGet download link for OpenSpartan.Grunt with download counter

This release includes the following changes:

  • Complete API surface documentation. All of the calls and data models have proper XML comments associated with them (which means - documentation on docs.gruntapi.com as well). This also means that there are no longer compiler warnings (shall you venture down that path) when trying to build the library locally or on the GitHub Actions runner.
  • Duplicative files and data models are removed, making sure that the same data is not captured by two (or more) different classes. There is one for everything. That means that classes like RankRecap now refer to a shared Csr-bound property rather than its own thing with exactly the same data. This was a side-effect of how I was generating entities from all the JSON responses as I was exploring the API, and as it evolves, more cleanup will be done.
  • Speaking of which, MatchCsr is now just Csr.
  • Playlist now properly inherits AssetBase and doesn’t re-implement the same set of properties again.
  • PlaylistRotationEntry also properly implements AssetBase now.
  • AuthoringAssetVersion now also implements AssetBase properly, without property repetition.
  • AuthoringAssetRating? Yea, also implements AssetBase properly.
  • Different object properties (that still require exploration as to what they are) are now mapped to dynamic entities. What this means is that at runtime you no longer need to convert the object to something more readable - you can just rely on a dynamically-inferred implementation that I hope at some point in the future to replace with an actual class (right now I just don’t know what those are).
  • More arrays got swapped for more LINQ-friendly List<T> properties.
  • HaloInfinite343MicrosoftStoreTitle is not MicrosoftStoreMapping.
  • Most properties are now properly nullable, where applicable. That means they can be set to null.
  • You can now get the playlist configuration via GameCmsGetMultiplayerPlaylistConfiguration. With this function you can see what rules are applicable to different playlists, like the VM size, VM content configuration type, TrueMatch settings, and more. This function REST call is not referenced in the master settings endpoint but was used on the Halo Waypoint website.
  • You can also now get the emblem mapping (emblem to nameplate to color) via GameCmsGetEmblemMapping.
  • Did you ever wonder how to get matchmade medals? Well wonder no more, because you can get them via StatsGetPlayerServiceRecord (this will get the full service record for a player, medals included) and GameCmsGetMedalMetadata to get the types of medals and their related metadata to map to. Fun fact - medals are just one giant sprite sheet.
  • HaloInfinite343SteamStoreTitle and HaloInfiniteSteamStoreTitle are now both SteamStoreMapping.
  • GameVariant is no more. GenericAsset is its successor.
  • GrantedCurrency is also no more. Instead, you have CurrencyAmount.
  • Different endpoint authentication methods are now properly represented in AuthenticationMethod so you don’t have to guess by their integer representation.
  • General stylistic code cleanup to make it more readable and consistent with StyleCop requirements.

Providing Feedback#

Let me know on GitHub or Twitter.