# Morpheus Platform Release v37

See [this guide](https://docs.msquared.io/creation/unreal-development/tutorials/upgrade-the-editor) on how to update your existing project to a new editor release.

***

**Version released:** 23/05/2025

{% hint style="info" %}
Please note v37 removes support for any build on v33.0.3 on Pixel Streaming.
{% endhint %}

{% tabs %}
{% tab title="Release notes" %}
{% hint style="warning" %}
**IMPORTANT NOTICE**

We currently expect **v37 to be the final major release before MSquared transitions to Unreal 5.5**, which is anticipated to bring significant improvements.

To minimize disruption, we strongly recommend **upgrading your project to v37** in preparation for this change.
{% endhint %}

**Performance guarantees**

Our platform undergoes regular scale tests, and we are now publishing our [Performance Guarantees](https://docs.msquared.io/creation/unreal-development/tutorials/upgrade-the-editor/release-notes).

**New Unreal-based text chat**

A new, less complex text chat solution which works at scale and does not require PubNub is now available: <https://docs.msquared.io/creation/unreal-development/features-and-tutorials/communication/unreal-text-chat>

**Embedded browser now works on Mac**

Support for WebUI on native clients has been expanded and it will now work on Mac, rather than just Windows.

**Embedded browser logs to UE stdout**

Debugging issues with the embedded web browser was challenging as it was not displaying any logging information when an issue occurred inside the browser process. These logs have been redirected and will display in Unreal's console / log files as expected.

**UserID Tracker Subsystem**

Regularly MSquared users needed to keep lists of clients who are involved in some gameplay functionality and needs to account for players reconnecting to the deployment. Maintaining a list of MAs wasn't sufficient as the client would be allocated a new MorpheusActor when they rejoined. To remove the need of each project having to roll out its own map between user IDs and MorpheusActors, we have a new subsytem which will do this for you: <https://docs.msquared.io/creation/unreal-development/features-and-tutorials/helpers-and-extras/the-user-id-replication-component#userid-tracker-subsystem>

**Quality of life improvements**

There's a large number of quality of life tasks which have been done for this release, which should lead to a more streamlined experience inside Unreal. Among them are:

* Unreal Editor will now only require a single login.
* The new map modal has been cleaned up.
* Bot behaviors are now easier to set up.
  {% endtab %}

{% tab title="Breaking changes" %}
**UX Subsystem delegates rename and function signature changes**

**What’s broken and why?**

We have removed references to launch context from the World Builder UX Subsystem in favour of using world Id.

The following blueprint exposed functions, delegates and variables have been renamed:

* `OnLaunchContextQueryHandled` > `OnWorldQueryHandled`
* `OnBeginLaunchContextImageDownload` > `OnBeginWorldImageDownload`
* `OnLaunchContextInfoUpdated` > `OnWorldInfoUpdated`
* `LaunchContextDescription` > `WorldDescription`
* `LaunchContextName` > `WorldName`
* `UpdateLaunchContextInfo` > `UpdateWorldInfo`

The following function signatures have also been changed:

* `UpdateWorldInfo`
  * ➖ OrganizationId (FString)
  * ➖ ProjectId (FString)
  * ➖ LaunchContextId (FString)
  * ➕ WorldId (FString)

**How to fix it?**

Users should search for all occurrances of the old named functios, variables and delegates usage and resolve any blueprint compilation errors by making replacements according to the mapping above

**How to test it?**

You will know when your blueprints are compiling again

**Removing SetAnimatedCrowdIsHidden function**

**What’s broken and why?**

`SetAnimatedCrowdIsHidden(...)` blueprint callable function to locally check hidden status for crowd on a morpheus actor has been removed.

**How to fix it?**

Use the blueprint callable function `SetHiddenLocally(...)` of `UMorpheusActorRenderTargetComponent`

**How to test it?**

Calling `SetHiddenLocally(...)` and `IsHiddenLocally()` instead of `UMorpheusActorRenderTargetComponent` will change the local visibility of the morpheus actor, regardless of the render target.

**Deleted Unused Loudspeaker Prop “BP\_LoudspeakerVolume\_VisualFeedback”**

**What’s broken and why?**

The asset `BP_LoudspeakerVolume_VisualFeedback.uasset` has been removed from the M2 Example plugin as it contained multiple references to deprecated content and was overly complex as an example of using the global audio channel.

**How to fix it?**

If you require specific functionality from this prop, copy it into your project or use `BP_LoudspeakerVolume_MicStand_VisualFeedback` in M2 Deprecated.

Otherwise we have `BP_LoudSpeaker_Example` which can be found in the Example Map which is a more up to date and simplified example of how to implement this functionality.

**Changing UserID Tracker Subsystem from a GameInstance subsystem to a World Subsystem**

**What’s broken and why?**

The getter for the UserID Tracker Subsystem as a `GameInstance Subsystem` will no longer work.

**How to fix it?**

Change the getter for the UserID Tracker Subsystem to get it as a `World Subsystem` instead.

**How to test it?**

Ensure that the `Get World Subsystem` node returns the UserID tracker subsystem correctly and that the UserID Tracker Subsystem is tracking users as expected.

**Removed unused Niagra System “NS\_CombatTest\_NDC\_Beam”**

**What’s broken and why?**

The “NS\_CombatTest\_NDC\_Beam” particle system we were not using has been removed from our content.

**How to fix it?**

Duplicate the asset and fix up references if needed. If you have not created your own assets using our particles, it is highly unlikely this will affect you as there were not references to the asset in our codebase.

**Removed unused PlayerController “BP\_M2\_PlayerController”**

**What’s broken and why?**

Created and never used, this has been replaced by `BP_M2Example_PlayerController` in our example content.

**How to fix it?**

It is unlikely you will have referenced this asset, but if you have either duplicate this into project space before taking the update or re-base onto `BP_M2Example_PlayerController` .

**How to test it?**

Ensure functionality remains intact

**Changed Launch Context as the pubnub channel name to World Id**

**What’s broken and why?**

We have renamed the live config variables and default channel naming behaviour in order to use the worldId:

* `Social.Chat.LaunchContextId` → `Social.Chat.World`
* `Social.Chat.LaunchContextSource` → `Social.Chat.WorldSource`
* `Social.Chat.Editor.LaunchContextId` → `Social.Chat.Editor.World`
* `Social.Chat.Editor.LaunchContextSource` → `Social.Chat.Editor.WorldSource`

The pubnub channel will now be named `<world Id>` and will use the value found in the domain settings at runtime by default for both editor and deployments.

*We recommend you use these settings unless you need to specify a specific channel name for use as it gates chat by the world that is being used and allows pubnub chat to be used in editor with no additional configuration.*

The `WorldSource` (previously `LaunchContextSource`) options have been changed to:

* `LiveConfig` - Changeable at runtime for ALL players in a world
* `CommandLine` - Static at runtime and set when the client is launched
* `Domain` - (default) Changeable at runtime for each client

**How to fix it?**

If users have not previously modified the live config variables listed above in the following files then nothing needs to be done.

* `M2LiveConfig/Config/deployment.schema.json` - Check for var modifications
* `<project>/Config/LiveConfig/Overrides/deployment.override.json` - Check for var existence

If you have previously modified the live config variables, you will need to modify the `WorldSource`\
value to one of the below, depending on your usecase

* Empty or `Domain` - this will set the pubnub channel name to your local world ID. To use this, you must have "Use Local World in PIE" enabled in your editor's sign in settings
* `LiveConfig` - will grab the `world` value from live config (e.g. the one set at `Social.Chat.Editor.World`
* `CommandLine` - will grab the CLI launch arg worldId value (least likely to be used)

If any modifications have been made, please tranfer the values set in the old live config variables to each equivalent new variable according to the mapping above.

**How to test it?**

Launch a deployment or PIE and send a message. If the message is successfully sent the sender will see it appear in the chat widget and this has been successful.

**Renamed the web platform world services**

**What’s broken and why?**

We have renamed the MSquared world service classes, to better match our conventions:

* `BP_M2_WPKeyValueStoreService` → `BP_M2_KVStoreService`
* `BP_M2_WPProfileDataProvider` → `BP_M2_ProfileDataProvider`
* `BP_M2_WPRoleDataProvider` → `BP_M2_RoleDataProvider`

The references have been fixed up, and the world settings’ default config has been updated MSquared-side. However, If you modified the world service classes in your project’s own config, referencing the old names, they will need to be updated

**How to fix it?**

If you see missing classes in your world settings, check for the old file names in your project’s config and update them, or alternatively select the right files in the dropdown.

If you modified the world service classes in your project’s own config,

**How to test it?**

Go to your world settings, and search for “services”. The three named world services should still be present.

<figure><img src="https://1456550285-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoWTlPaoHd1McSakqMigu%2Fuploads%2Fgit-blob-97f8bb169f46a8d1dcc1370c26817e36fadb3f2a%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

**Flipped bCheckIfRolesDataTableIsValid to “false” by default**

**What’s broken and why?**

This is unlikely to affect most projects. If you are still using the legacy Roles (now located in the `Morpheus Platform - Deprecated|Roles` section of our World Settings), which we deprecated in a previous release, you will find the default value of `bCheckIfRolesDataTableIsValid` has changed from True to False. This is because we no longer require this check in the currently supported Roles system and leaving this legacy setting enabled could cause confusion when warnings are given to customers using the new system.

**How to fix it?**

Go to `Morpheus Platform - Deprecated|Roles` in the affected map and change `bCheckIfRolesDataTableIsValid` to True.

**How to test it?**

Warning should be given if no Roles table provided

**Disabled email-based fallback sign in**

**What’s broken and why?**

Previously we were able to use multiple methods of signing in, but now the only accepted method of authentication is SSO. We had a widget that would pop up on failed sign in that would give the option to sign in with email or password. Now this option is not provided and if SSO fails, users will not be able to enter via alternative means.

**How to fix it?**

There is no fix for this. If this is required functionality, please reach out.

**Replaced references to BPM\_VideoScreen in BP\_MillicastCapture**

**What’s broken and why?**

Under Scene Capture > Show Only Actors in BP\_MillicastCapture we no longer use BPM\_VideoScreen, having replaced it with the non-deprecated BPM\_VideoPlayer asset.

**How to fix it?**

If you use BPM\_VideoScreen still, you will need to re-add this to your list of actors to be shown. This can be done on instances of your BP\_MillicastCapture or a locally modifiable duplicate of this asset.

**How to test it?**

Confirm functionality remains as before.

**Deprecated old “user data” and Key Value/persistence APIs**

**What’s broken and why?**

The following systems have been deprecated, in favour of our single KV Store system (<https://docs.msquared.io/creation/unreal-development/features-and-tutorials/online-services/kv-store-service>):

* UserDataStore
* WebPlatformKeyValueStoreService (not to be confused with the still present `M2_KeyValueStoreWorldService`, renamed to `M2_KVStoreService`)
* `M2_PersistenceSubsystem`
  * Since we are no longer using this system, the now irrelevant bootflow steps `HandleUserDataReady` and `HandleInitialValuesReceived` have been deprecated too.

**How to fix it?**

Please move to the new system as soon as convenient. Your existing logic won’t break, but you will get compiler warnings, and you won’t be able to use the deprecated nodes past their current usage in your project.

If you were using the persistence subsystem, we have a guide for ease of migration: [My project is using the now-deprecated Persistence Subsystem. How can I migrate across?](https://docs.msquared.io/creation/unreal-development/features-and-tutorials/online-services/kv-store-service#my-project-is-using-the-now-deprecated-persistence-subsystem.-how-can-i-migrate-across)

**How to test it?**

Your logic does not have compiler warnings for using the old systems

**Changes to the KV Store implementation**

**What’s broken and why?**

There have been a few changes to the example KV Store service (`BP_M2_WPKeyValueStoreService`) and its related files, that would require some attention, if it is currently being used:

* `SM2_WP_KvStoreObject` has been removed, and `SM2_WP_KvStoreReadItem` has been updated to treat the `object` as a generic Json Object.

  * This makes the struct more flexible, supporting other json value types, rather than just `JsonObject` for the fields within the `object` field, e.g. `Data`

  <figure><img src="https://1456550285-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoWTlPaoHd1McSakqMigu%2Fuploads%2Fgit-blob-5b28e70be07cfebbb5fa74def012ced0363b8597%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>
* We now no longer reject “non-json” string values, instead treating them as “json string values”. e.g. a string `Hello` will now be treated as the json value `"Hello"`, rather than being rejected.
  * This improves the UX for generic KVStore usage, enabling stores more akin to `Store(”KeyName”, “ExampleValue”)`, rather than needing `Store("KeyName", { "Value": "Examplevalue"})`

**How to fix it?**

* If you referenced `SM2_WP_KvStoreObject`, or `SM2_WP_KvStoreReadItem`, please update your logic accordingly, e.g. by following the example in `BP_M2_WPKeyValueStoreService::ParseReadResponseItem`

<figure><img src="https://1456550285-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoWTlPaoHd1McSakqMigu%2Fuploads%2Fgit-blob-1d2418e9402a0ae43e85879ec20654d4eac119c0%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

* If your logic depended on non-json strings being rejected, please update the `KVStoreServiceClass` to a custom implementation of your choice, using `BP_M2_WPKeyValueStoreService` as a starting point

<figure><img src="https://1456550285-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoWTlPaoHd1McSakqMigu%2Fuploads%2Fgit-blob-0e3fa049ef763fe5b552e470b51f6bee7db7f7ba%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

**How to test it?**

Everything should compile correctly

**Example Moderation Component now uses Example Crowd Audio Component**

**What’s broken and why?**

Previously `BPMC_M2Example_ModerationComponent` used our legacy Crowd Audio component (`BPMC_CrowdAudio`) when sending transcripts to a moderator. As we are simplifying the CrowdAudio component but want to leave the legacy version intact, we have replaced the reference here to `BPMC_M2Example_CrowdAudioComponent` .

**How to fix it?**

This issue will only affect users that are using `BPMC_M2Example_ModerationComponent` with a legacy character class, or that still use the `BPMC_CrowdAudio` .

If you use `BPMC_CrowdAudio`, you will need to duplicate `BPMC_M2Example_ModerationComponent` replace all references to `BPMC_M2Example_CrowdAudioComponent` with `BPMC_CrowdAudio` and then replace your moderation component with this duplicated and modified version.

It should be noted that we will not be maintaining `BPMC_CrowdAudio` any further, so if you want a higher level of support it is recommended you switch to the example component as the legacy one will be removed when the M2 Deprecated plugin is removed.

**How to test it?**

Ensure moderation functionality is maintained after following the above steps and you are still able to receive transcriptions.

**Removed Interaction widget from Example HUD**

**What’s broken and why?**

The Example HUD created when starting a new project from a template no longer features the deprecated Interaction widget. This will also affect anyone directly using the engine version of `WBP_M2Example_HUD`

**How to fix it?**

We highly recommend you do not use the M2 Interaction system as this is deprecated. If you are dependent on this and relied on it in this HUD, you will need to re-add the `M2Deprecated/M2Core/M2ObjectInteraction/WBP_M2_FullInteractionMenu` widget to your HUD

**How to test it?**

Ensure that desired interaction functionality is still present

**Changed AutoProfiler SessionData Fields**

**What’s broken and why?**

Previously, all `ActorCommandExecutorTasks` in the AutoProfiler SessionData would be called with the same optional parameter. This meant that Carnival would attempt to load avatars with the name of sublevels to load and the world would attempt to load a sublevel with an MML URL. Now the SessionData requires the specific task and parameter for each `ActorCommandExecutorTask`. The original “Optional Parameter” field has been removed in order to improve this.

**How to fix it?**

`ActorCommandExecutorTasks` in any AutoProfiler SessionData assets will need to be reconfigured by filling in the new fields.

<figure><img src="https://1456550285-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoWTlPaoHd1McSakqMigu%2Fuploads%2Fgit-blob-d4612bb8b632d193956ff1322a311dbfec822b10%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

**How to test it?**

The AutoProfiler should function as expected prior to this change and should not interfere with other `ActorCommandExecutorTasks` .

**Removed the world travel portal from `WorldTravelDestination_P`**

**What’s broken and why?**

The `WorldTravelDestination_P` test map has had its world travel portal removed. This is because it used the now deprecated interaction system, and the map has been updated to use the simplified character, which doesn’t use said system. This means that if you do try and access that world, you will not be able to world travel using the portal

<figure><img src="https://1456550285-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoWTlPaoHd1McSakqMigu%2Fuploads%2Fgit-blob-a8537a2f58c3743cdb5af11bba559ca64d9fccae%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

**How to fix it?**

In the unlikely case that you were using `WorldTravelDestination_P`, you will need to use alternative approaches to world travel out of the map. e.g. instead of interacting with the world travel portal, you can instead use the `WorldTravel.TravelToWorld [WorldId]` console command

**Removed Walk binding from IMC\_CharacterMovement**

**What’s broken and why?**

As we no longer have a walking animation in our default Animation Blueprint, we have removed the corresponding key binding

**How to fix it?**

You will need to use an Input Mapping Context in your project that maps IA\_CharacterWalk to an input (previously the Ctrl keyboard button)

**How to test it?**

Implement the above and ensure character moves as expected when button is used

**Get BPCharacter removed from ABP\_M2\_Human.uasset**

**What’s broken and why?**

The function “Get BPCharacter” in ABP\_M2\_Human is no longer available. It has been removed as there are no references to it within the Morpheus Platform and it’s presence creates a dependency on deprecated content.

**How to fix it?**

If you rely on this within the default ABP you can either duplicate the asset to preserve your current version, or duplicate the new version and add the following:

<figure><img src="https://1456550285-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoWTlPaoHd1McSakqMigu%2Fuploads%2Fgit-blob-1ec54f462943ccda69ef8d2bfe2429a16d46c093%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

Please not that due to the lack of Child ABP’s, duplicating this asset means you will have to repeat this any time you wish to take further ABP updates from our default class.

**How to test it?**

Follow the steps above if applicable and ensure functionality is consistent.

**Analytics BP API Removed**

**What’s broken and why?**

Analytics API that was deprecated in v34 has now been removed in full. Please see the [release notes on v34](https://docs.msquared.io/creation/unreal-development/tutorials/upgrade-the-editor/release-notes#m-platform-release-v34.1.1) for further information.

**How to fix it?**

Customers are expected to replace any usage of this API with their own analytics integration. See <https://docs.msquared.io/integrations/3rd-party-analytics#setting-up-mixpanel-analytics> for an example integration.

**M2 Human ABP simplified and multiple states removed**

**What’s broken and why?**

The base ABP for M2 projects, ABP\_M2\_Human, has been reworked, resulting in a more streamlined ABP with improved combat animations using assets from Lyra and less custom M2 behaviour overall.

The following functionality has been removed from the ABP:

* Double jump
* Walking
* Launch
* Low gravity
* Bounce
* Zero G
* Non-combat head turning
* Multiple random idle animations

The old ABP is now ABP\_M2\_Human\_Old in the Deprecated plugin.

**How to fix it?**

If your project relied on the above removed animation behaviour, you can temporarily set your characters to use the ABP\_M2\_Human\_Old ABP (in the Deprecated plugin) instead. This will be removed in a future release, so if you rely on this behaviour, we recommend copying the logic you rely on from this old ABP to your own ABP class.

**How to test it?**

Test all your gameplay and observe whether the animations are behaving as expected.

**Check replicability of blueprint properties at compile time**

**What’s broken and why?**

In the blueprint editor, it’s possible but erroneous to mark an Event Dispatcher as “Replicated”. That causes an Ensure to fire in PIE, and maybe in standalone.

This change makes that mistake visible by introducing a blueprint compile error.

**How to fix it?**

Disable replication for Event Dispatchers in blueprints.

**How to test it?**

Only affects blueprint compilation - if everything cooks then all is well.

**Removed AudioControls and AudioMixManager from default Singletons**

**What’s broken and why?**

The Audio Controls Class and Audio Mix Manager Class is no longer present in the default Singletons list in World Settings. This is because we are deprecating the BP content used for these.

<figure><img src="https://1456550285-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoWTlPaoHd1McSakqMigu%2Fuploads%2Fgit-blob-a686df258b6ad727364510f3568dcd824bbaa5ba%2Fimage.png?alt=media" alt=""><figcaption></figcaption></figure>

**How to fix it?**

You will need to add `BPM_AudioControls` and `BPM_M2_Audio_MixManager` as additional singletons to your World Settings for any map you intend to use these in.

**How to test it?**

Ensure your world still has access to this functionality after adding them manually.

**Crowd audio changes to schema and removal of echo cancellation and dynamic occlusion**

**What’s broken and why?**

* Echo Cancellation has been removed as an option from crowd audio settings.
* Dynamic Occlusion has been removed as an option from crowd audio settings.
* PreprocessorSettings has been split into NoiseSettings and VolumeNormalisationSettings.
* Some ObserverSettings have been separated into OcclusionSettings.
* Some parameters have changed their category in LiveConfig.

**How to fix it?**

Echo cancellation and dynamic occlusion are no longer supported features. It’s unlikely your project was using them in a noticeable way, but if they were, please reach out to @Samuel Silvester.

If your project has any live config overrides to crowd audio settings, check the latest morpheus.schema.json to make sure your live config overrides still match the schema. Make sure that your editor sessions run without any schema warnings or errors, or your live config overrides will not be respected.

If your project has modified any crowd audio settings in BPs, double check to make sure these are still applied correctly.

**How to test it?**

Run editor sessions and ensure no live config errors or warnings are output.

Ensure that the crowd audio in your world is still functioning as intended.
{% endtab %}
{% endtabs %}
