Table of Contents

Alpha2 11.0.11.0

Download

Breaking changes:

Logger's GetLogger method now requires specific type associated with the logger to be explicitly specified. Which means that instead of just calling LogManager.GetLogger(), you'll need to call generic LogManager.GetLogger<T>() or type parameter overload LogManager.GetLogger(type_here).

Other changes:

  • Various performance improvements, but especially for libraries with a lot of achievements.
  • Achievement updating can be now globally enabled/disabled via library manager or controlled per integration in each plugin's library settings.
  • Achievement fetching is now done as the last step of library update. Achievement update process also now prioritizes the original library plugin before trying other sources.
  • GameAchievementTypes and GameAchievementTrophies data collections exposed in the SDK.
  • GetAchievementsArgs now contains causation property.
  • Added GetKnownEmulators method to Emunight's SDK which returns all known emulator definitions.
  • Custom import exclusion handling is now controlled via new HasCustomExclusionHandling option instead of being tied to HasCustomGameImport. Meaning that Playnite will create built-in exclusion on game removal even for libraries with custom import if this option is not set.

Alpha2 11.0.10.0

Download

Major user facing additions:

Achievements support was added.

This is currently relatively simple system without customization options or stats views and other features achievement addicts need, but they are planned for future beta releases.

Currently supported by Steam and GOG plugins shipping with the alpha.

Emulation support has been added via new Emunight plugin that ships with the alpha.

Emulation support will be provided as separately distributed plugin in P11. Mainly for following reasons:

  • We can update emulation features faster without need to make entirely new Playnite update.
  • It's great use case for "dogfooding" the SDK. I already maintain some integration plugins, and that helped in that regard, but emulation support is more involved in what it needs from the SDK and already made the SDK better.
  • Having emulation support built-in was making Playnite harder to maintain. Emulation games have to be often treated differently to "native" games and this was causing havoc in the code based. Now that emulated games are just another plugin's games, it's way easier to handle.

There are some core concepts that differ from how it worked P10:

  • You no longer scan via an emulator but via a platform. This gives us an ability to scan platform specific games using faster, more optimized methods. Rather then doing simple checksum scan that we are doing in P10.
    • This is currently only implemented for PlayStation 1, 2 and 3 platforms, but will be expanded in beta releases of the plugin.
    • Default import settings are now tied to a platform rather an emulator. Which for example makes it easier to globally change emulator for all games from specific platform. Or allows you to import games even without having emulators imported yet.
  • Custom emulator profiles are no more. There's now straight distinction between known pre-configured emulators and manually configured custom ones.
    • This solves big issue in P10 where it was not possible to add new profiles without re-importing the entire emulator from scratch. Which happens with RetroArch for example when new cores are added. These will now became available automatically without having to do anything.

As with core Playnite library data, there's currently no support for data import from existing P10. This is currently planned for beta releases.

Steam plugin is now on feature parity with P10 version.

Filtering has been improved with options to include and exclude specific items.

SDK improvements

  • Plugin dependency system was implemented:

    • Current implementation example is available via new Emunight emulation plugin. It gives other plugins access to game emulation data, like imported ROM files and emulators.
    • As a provider plugin:
      • If you want to share your data structures with other plugins. You need to explicitly mark them as shared via shared_modules list in extension.toml. This should be list of dll file names that will be loaded from your plugin's install folder and those dll instances will be shared with all plugin's depending on your plugin.
      • You need to also somehow share these structures with consumer plugins. How you do that is up to you, but publishing separate nuget package with shared data structures and interfaces is probably best approach (and is what Emunight plugin is doing).
    • As a consumer plugin:
      • See Emunight's example here
    • CallPluginAsync method and OnPluginCallRequestAsync callback for push based communication.
    • GenerateCallbackAsync method and OnPluginCallbackAsync callback for pull based communication.
  • Support for plugins to provide game achievements was added. See Steam and GOG plugins for implementation examples.

    • This is implemented via plugin's GetAchievementsAsync method.
    • It gets called during library updates and on game session exit for games from libraries you mark as supported via new AchievementsSettings property on plugin class. A user can also manually update achievements from game menu.
  • Some callbacks now carry more info about the callback in their args object. This includes data about what initiated the callback (usually plugin's ID) and for what reason. There's BuiltInCausations class you can use to detect most common built-in causations.

    • This also means that you can pass causation reason yourself when for example calling methods from data collections.
  • Added InfoIndicatorIcon control into SDK. This is the same control that Playnite uses in the UI to indicate extra notes, restart requirement etc. Check SettingsView.xaml from example plugin for how to use it.

  • Added built-in filtering implementations to make it easier to provide filters without writing it all from scratch. These currently are:

    • BasicItemsListFilterer implements items list filter with option to exclude/include individual items
    • BasicDateTimeFilterer provides filter for DateTime range
    • BasicStringFilterer provides string input based filtering
    • TestBasicItemsListFilterer is provided as an example use in the example plugin.
  • ChooseDialogItem and ChooseDialogImageItem now have Metadata property added if you need to store extra info with each item without creating completely new inherited type.

  • CallPluginAsync now returns MethodExecuteResult instead of raw object response from target plugin. The call now automatically catches exceptions and passes an error in MethodExecuteResult response.

  • GetLogger(string loggerName, string logFile) overload was added in case you want to choose specific log file instead of default one stored in plugin's data folder.

  • CreatePowerShellRuntime method was added. This gives you IPowerShellRuntime instance with ability to run arbitrary PowerShell scripts.

  • UpdateLibraryWithGamesAsync method was added. This is similar to existing ImportGame(s)Async for importing new games on demand, with major distinction that it runs the whole library procedure with the import. Including achievement and metadata downloads after the import for newly imported games.

  • CollectionChanged on IPluginLibraryCollection is no longer .NET event and instead requires handler registration via Register and Unregister methods.

  • Built-in ScriptGameAction now provides option to specify script's working directory via WorkingDir property.

  • ImportGamesAsync now gets library's import settings in its arguments.

  • OnWindowItemDropAsync callback was added. You can use this if you want to provide custom handling of file/directory being dropped into Playnite window.

  • AddGameToExclusionsAsync method was added. You can implement this if you want custom handling for game exclusions. It gets called when user removes game(s) and chooses to add them to exclusion list during that process.

  • New PostInitializationAsync method was added. This gets called after all plugins InitializeAsync method was called. It also carries info about plugins that failed to load.

  • Changed plugin icon handling. Now has to be set via icon, client_app_icon and library_icon values from extension.toml

Alpha 11.0.9.0

  • Fixed game uninstall cancellation not working
  • Added NumericUpDown and NullableNumericUpDown UI controls to the SDK (this was done in older versions already, I forgot to mention it)

Download

Alpha 11.0.8.0

  • Fixed built-in plugin not working correctly

Download

Alpha 11.0.7.0

  • Fixed game installation cancellation not working
  • Fixed exe icon extraction not working during metadata downloads
  • Fixed OnShowFieldSaveIndicatorChanged callback not working on game edit handlers
  • Click actions in menu items now has input argument with source item
  • Reworked thread safety in library collections

Download

Alpha 11.0.6.0

  • Fixed web view deadlock when custom user agent is used

Download

Alpha 11.0.5.0

  • Added negate and AND/OR filtering options (by Jeshibu)

Download

Alpha 11.0.4.0

  • GameRelations collection added into Library API
  • Renamed OnGamesMergedAsync callback to OnGamesLinkedAsync

Download

Alpha 11.0.3.0

  • Fixed issue with game edit dialog wrongly warning about unsaved changes.
  • Added support for opening of mvvm based views in separate windows via OpenWindowViewAsDialogAsync and OpenWindowViewAsync. Examples added to the plugin template.
  • Added GetNewInstance method to custom library collections. This will always return new object instance no matter if cache is enabled on collection or not.
  • CreateWindow and GetLastActiveWindow moved to root API from dialogs API.
  • Merged 10.52 SDK changes.
  • Fixed some argument classes having internal constructors.
  • Fixed Playnite preventing system from going to sleep.
  • Some small UI tweaks and fixes.

Download

Alpha 11.0.2.0

  • Massively updated and documented plugin template with examples of new APIs
  • Fixed startup on systems without VC++ redist installed
  • Fixed typo in the API for "Sources" library collection
  • Fixed IPlayniteApi not being mockable

Download

Alpha 11.0.1.0

  • Fixed safe startup error showing on every start

Download

Alpha 11.0.0.0

Download