> For the complete documentation index, see [llms.txt](https://docs.otherside.xyz/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.otherside.xyz/platform-documentation/creation/unreal-development/release-notes/v40_0.md).

# Morpheus Platform Release v40.0

See [this guide](/platform-documentation/creation/unreal-development/tutorials/upgrade-the-editor.md) on how to update your existing project to a new editor release.

***

**Version released:** 18/05/2026

### Morpheus Pawn Actor no longer auto-destroys old pawn on possess

**Date of change:** 06/01/2026

**Affected Projects:** all/ODK

**Affected Features:** Pawn

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

Previously, possessing a new pawn via a `MorpheusPawnActor`, either using `PossessOwnedPawn`, or via the `AutoPossessPlayerOnClientAuthority` variable on the class would default to destroying the previously possessed pawn. This was due to an old setup that depended on this, but this assumption can cause confusion now, with actors being removed without explanation.

As a result of this change:

* `PossessOwnedPawn`'s `DestroyPreviousPawn` field now defaults to false (previously it defaulted to true)
* If `AutoPossessPlayerOnClientAuthority` is set to a value other than `Disabled`, it will still possess the player, but will not remove the old pawn.

**How to fix it?**

If you explicitly wanted to delete the old pawn upon possessing the new pawn, you will need to do the following:

* If calling `PossessOwnedPawn`, you can simply tick the `DestroyPreviousPawn` field
* If you were expecting the pawn to be destroyed automatically via `AutoPossessPlayerOnClientAuthority`, you will now instead need to destroy the pawn manually.

**How to test it?**

Check if your logic has any switching of morpheus pawn actors. If not, no work is required. If you are switching between morpheus pawn actors, review the behavior, and make sure that the posessed pawns are still handled as expected.

### Minor API changes to MontageComponent

**Date of change:** 15/12/2025

**Affected Projects:** all/ODK (the only one now, lol)

**Affected Features:** Montages

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

We have made some changes to the montage component, to make it more user-friendly. This includes enabling the montages in your montage data asset to define the crowd anim sequences without needing them to be provided elsewhere. We have also made some changes that are slightly breaking and worth calling out:

* `PlayMontageByName` and `StopMontage` were called out as “authoritative client only”, but didn’t actually block you from calling them on non-authoritative clients. It now prevents you from doing so, and gives a warning. This means that if you were calling them on other clients (which is not advised), they will no longer play animations. You should instead only control the montage on the authoritative client
* The `OnPlayMontage` event previously also was triggered when stopping a montage, “playing” a null montage. We have instead removed this behavior, so `OnPlayMontage` is only triggered when playing a new montage. We have instead introduced a separate `OnStopMontage` that is triggered when a montage is stopped, providing details of the stopped montage.

**How to test it?**

Play your game. If you see the following, you should investigate the breaking changes:

* Looping montages - likely due to not listening to `OnStopMontage`
* Montages not playing on non-auth clients - likely due to incorrectly triggering `PlayMontageByName` on the non-auth client

### Move custom packed struct from Action Gameplay Helper API into HitInfo Structs

**Date of change:** 12/12/2025

**Affected Projects:** All

**Affected Features:** Action Gameplay Helper API

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

APIs in the Shootable and Combat component that passed in a Morpheus packed struct as custom data have been changed. The custom data param has been removed, and moved into the HitInfo struct.

**How to fix it?**

Change Blueprint logic to pass the custom data into the struct instead.

### Removed legacy capability gameplay tags (not committed yet)

**Date of change:** 03/12/2025

**Affected Projects:** All

**Affected Features:** Capability gameplay tags

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

The default `DT_M2_GameplayTags` asset contained many legacy gameplay tags which are no longer used in the Morpheus platform, and have now been removed. If your project uses any content from the `M2Deprecated` plugin, or uses any of the Capability tags directly, you may need to re-add the removed tags.

**How to fix it?**

Download the standalone M2Deprecated plugin and add the `DT_M2_DeprecatedGameplayTags` asset to your project. This is a copy of the previous version of `DT_M2_GameplayTags` containing all the legacy tags.

In the `GameplayTags` section of the project settings, replace the DT\_M2\_GameplayTags entry with DT\_M2\_DeprecatedGameplayTags to restore the previous tags. Alternatively you can manually add the ones your require as a new asset, as detailed here: [Adding Gameplay Tags](/platform-documentation/creation/unreal-development/tutorials/reference/adding-gameplay-tags.md)

**How to test it?**

All previous gameplay tags will be available in the gameplay tag UI.

### Removed input configs

**Date of change:** 03/12/2025

**Affected Projects:** All

**Affected Features:** Input

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

The input mappings in the base engine are entirely unused now by the Morpheus Platform, so have been removed. If you have not made changes to the input mappings in your own project, but depend on them (e.g. if you’re referring to `M2Deprecated` content), the actions will stop working, and you will see warnings about the input actions being missing.

**How to fix it?**

If you depend on these old input actions, you can add them manually to your project.

* In your project’s `Config` folder, find or create a `DefaultInput.ini`
* In your ini file’s `[/Script/Engine.InputSettings]` section (add one if it is not present), add the removed config values:

Private & Shared/Engine/Internal Workflows/MSquared breaking changes/input\_mappings.txt

* Feel free to review and/or remove any you no longer need
* (If you already have values in this section, best to paste these values above the existing ones, to avoid your changes being stomped)
* Close your editor and reopen it
* The input mappings should now be visible in your `Project Settings -> Input`

**How to test it?**

Play your game - it should respond to inputs as expected, and not give warnings about missing inputs

### Removed MetricsManager default singleton and code class

**Date of change:** 01/12/2025

**Affected Projects:** All

**Affected Features:** Default singletons

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

`BPM_MetricsManager` and the base code class `JM_MetricsManager` have been removed. The `J_MetricsSubsystem:: GetMetricsManager` function has also been removed. `MetricsManagerClass` has been removed from the list in the World Settings.

The metrics manager class didn’t add any functionality, but it was possible to subclass it in a project and use the default singletons entry to spawn it.

**How to fix it?**

If you have subclassed `JM_MetricsManager` then simply reparent it to `MorpheusActor`. If your subclass was spawned by being set as the `MetricsManagerClass` in the singletons list, you can explicitly add it in the `Additional Singletons` array in the singletons settings. Calls to `GetMetricsManager` can be replaced with `GetActorOfClass`.

**How to test it?**

You blueprint should be spawned and function as before.

### M2Extras\_PubnubChat example integration moved to M2Deprecated

**Date of change:** 25/11/2025

**Affected Projects:** All

**Affected Features:** PubNub chat

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

The `M2Extras_PubnubChat` plugin contained a blueprint example of integrating Pubnub chat into a project. As this is no longer being actively tested or maintained, the existing example content has been moved into the M2Deprecated plugin which is available to download separately.

**How to fix it?**

If your project is directly using any of the content in the M2Extras\_PubnubChat plugin, the simplest solution is to copy those assets into your project before upgrading.

Alternatively, download the separate M2Deprecated plugin and copy it into your project’s Plugins directory - you blueprints should automatically reference the deprecated assets in the M2Deprecated plugin.

See the Morpheus Platform v39 documentation for details on integrating this example content. However, note that this documentation is no longer officially supported and may be out of date.

**How to test it?**

Pubnub chat continues to work in your project.

### ‘Soft’ deprecation of legacy systems

**Date of change:** Ongoing

**Affected Projects:** All

**Affected Features:** Various

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

The Morpheus platform contains legacy features that may be in use by projects, but which are overly opinionated and could be implemented more flexibly directly in the project. Deprecating them in Unreal itself causes warnings in the Blueprints which is not desirable for projects, so instead they are being ‘soft’ deprecated. The approach is to add a display name for the class or function with a `_DEPRECATED` suffix. This doesn’t affect the functionality in any way and the system will continue to work.

There is no timeline for fully deprecating the functionality, these systems will not be prioritised for further support and should be avoided. If you are using any, consider moving towards a project-side implementation.

The affected systems are:

* `J_CharacterBase` and `JM_CharacterBase`. Use `M2_CharacterBase` and `M2M_CharacterBase` directly instead.
* `JunoCoreUI`: `J_BaseHUD`, `M2_CoreWidget`, `M2_StandardButton` , `J_UISkinsSubsystem` and related. Use the vanilla Unreal HUD and standard widgets.
* Morpheus Chat system: `JM_ChatServer`, `MorpheusChatSenderComponent`, `MorpheusChatReceiverComponent` and related. See `BPMC_M2Example_TextChatComponent` for an example of a blueprint replacement.
* `JM_PlayerProfileComponent`: use `M2M_PlayerProfileComponent` directly
* `J_PlayerController`: use the vanilla `PlayerController` directly
* `M2_EnhancedInputSubsystem` and `M2_InputPrioritizationSubsystem` : use the vanilla Unreal input systems
* `JM_WorldTravelPortal`: use `M2_WorldTravelService` directly
* `M2M_HealthComponent`: see `BMPC_CombatExample_Health` for an example blueprint implementation
* Tutorials (`M2_TutorialManagerActorComponent` and related)
* Effect applicator (`JM_EffectManager` and related)
* Inventory and Equipment (`JM_InventoryComponent`, `JM_EquipmentComponent` and related)
* `J_NameplateComponent`
* `M2_NavigationPoolingSubsystem`
* `M2M_WeatherControl`
* Interaction and FocusCam (`M2_FocusCameraComponent`, `M2_InteractableComponent` and related)
* Legacy Roles system (`JM_RolesComponent`)

**How to fix it?**

Nothing needs fixing as a result of this change, however it is recommended to migrate away from any soft-deprecated systems.

**How to test it?**

Systems work as previously.

### Removed some default singletons

**Date of change:** 02/12/2025

**Affected Projects:** All

**Affected Features:** Default singletons

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

The `Morpheus Platform - Singletons` section of the World Settings contained many non-critical singletons, and singletons used by deprecated systems, that have now been removed from the list. These optional singletons can now be added as required, instead of being added to all maps.

The removed default singletons are:

* `AbilitySingletonClass` : default was `JM_AbilitySingleton` (used by deprecated ability system)
* `NotificationsSingletonClass` : default was `M2M_NotificationsSingleton` (required if using the Notifications system)
* `ConsoleCommandSingletonClass` : default was `JM_ConsoleCommandsSingleton` (adds a debug command)
* `LatencyInspectorSingletonClass` : default was `BPM_LatencyInspectorSingleton` (adds a rebug command for measuring latency)
* `MetricsManagerClass` : no longer required
* `CapabilitiesManagerClass` : default was `BPM_CapabilitiesManager`. This will need re-adding if you:
  * Selectively enable emotes per-role in `JM_PlayerEmotesComponent` with a role capability
  * Use `JM_CharacterBase` to enable voice chat functionality, or to force specific players into the foreground
  * Use `JM_ObserverCameraManager` to enable load/save camera functionality with the `ObserverSaveLoadCapability` on the role
  * Use `J_PlayerCameraManager` to enable observer mode with the `ObserverAccessCapability` on the role
  * Access the manager directly with `J_CapabilitiesSubsystem::GetCapabilitiesManager`

**How to fix it?**

If you still want to spawn any of these singletons, add them to the `Additional Singletons` array in the `Morpheus Platform - Singletons` section of the world settings.

**How to test it?**

Verify the required singletons are still spawned.

### JunoGameData references replaced by LiveConfig

**Date of change:** 25/11/2025

**Affected Projects:** All

**Affected Features:** LiveConfig

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

The legacy `JunoGameData.*` console commands have been removed in favour of the equivalent `M2.LiveConfig.*` commands. The new commands behave identically, only the prefix has changed.

Also in the Blueprint editor you can no longer use the keywords `Game Data Attribute` to search for live config nodes. Search directly for `Live Config` instead.

**How to fix it?**

Use the `M2.LiveConfig.*` console commands instead of `JunoGameData.*`, and use `Live Config` to find nodes in editor.

**How to test it?**

Console commands work as before.

### Moved JunoGenericLighting and JunoCore maps to M2Deprecated

**Date of change:** 24/11/2025

**Affected Projects:** All

**Affected Features:** Maps

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

The JunoGenericLighting and JunoCore maps have been moved into the M2Deprecated plugin, which is available to download separately. These maps just contained a default lighting setup, and some bot config. These actors have been copied directly in the affected maps in the platform for simplicity.

**How to fix it?**

If you’re using either of these maps, the simplest solution is to copy the actors from these maps directly into your own maps before upgrading. Alternatively, download the separate M2Deprecated plugin and copy it into your project’s Plugins directory - you maps should automatically reference the deprecated maps in the M2Deprecated plugin.

**How to test it?**

All actors are present in your maps.

### Renamed Mac device Profiles

**Date of change:** 21/11/2025

**Affected Projects:** Projects who have custom device profile overrides defined in ConsoleVariables.ini.

**Affected Features:** Graphics Settings / Device Profiles

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

Renamed profile `MacClient_Macbook` to `MacClient_LowSpec`

Renamed profile `MacClient_StudioUltra` to `MacClient_HighSpec`

**How to fix it?**

Replace any instances of `MacClient_Macbook` or `MacClient_StudioUltra` defined in ConsoleVariables.ini with the either `MacClient_LowSpec` or `MacClient_HighSpec`, respectively.

**How to test it?**

Load game on a mac device and verify any profile overrides have been set correctly.

### Removal of M2M\_PartyComponent and M2M\_PartyManager

**Date of change:** 24/11/2025

**Affected Projects:** All

**Affected Features:** Activities

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

The Party system has been marked as deprecated since v38, so has now been fully removed.

**How to fix it?**

If your project uses Parties, please remove or replace the use of the code classes before updating to this version. Projects will then need to implement their own functionality in project space if required.

**How to test it?**

Blueprints compile without error.

### Removal of Activities system

**Date of change:** 24/11/2025

**Affected Projects:** All

**Affected Features:** Activities

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

The Activities system has been marked as deprecated since v36, so has now been fully removed.

**How to fix it?**

If your project uses Activites, please remove or replace the use of the code classes before updating to this version. Projects will then need to implement their own functionality in project space if required.

**How to test it?**

Blueprints compile without error.

### RaycastableCrowd has been replaced with DynamicColliderProxySystem

**Date of change:** 14/11/2025

**Affected Projects:** All

**Affected Features:** Raycastable Crowd

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

The RaycastableCrowd has been replaced with a system with similar functionality, the DynamicColliderProxySystem. The crowd collider implementation of this is the MorpheusActorColliderProxySystem.

All raycastable crowd related classes and settings have been removed.

**How to fix it?**

You will need to set up the MorpheusActorColliderProxySystem in your game to match the functionality. Please see the full docs, but for a quick conversion to the new system:

* There’s no longer a RaycastableCrowd class that you need to specify with the settings of the raycastable crowd. Instead, you configure these settings in the WorldSettings.
* `BP_M2_AvatarColliderProxyActor` is the replacement for `BP_M2_AvatarRaycastableCrowdActor` .
* To configure the prioritization settings that used to be in the RaycastableActor class, you now need to create a PrioritizationSettings class with your settings in, and specify it in *Prioritization Settings Class* in WorldSettings.

**How to test it?**

Go into a level with crowd members (using the live config `game.PlayerClient.Rendering.NumInLOD0` to decrease the number of non-crowd members if necessary) and see if the correct crowd members have colliders, matching what your project was previously set up with. You can enable `bDebugVisibility` on the BP\_M2\_AvatarColliderProxyActor to help with this, or use the Unreal command `show COLLISION` .

### Remove JM\_StateSequenceComponent

**Date of change:** 13/11/2025

**Affected Projects:** All

**Affected Features:** JM\_StateSequenceComponent

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

`JM_StateSequenceComponent` has been removed as it’s not a core part of the platform, and can easily be built in a project Blueprint.

**How to fix it?**

Functionality will need to be rebuilt a project blueprint. It’s an array of {FromStateName, ToStateName, ULevelSequence}, and a replicated ToStateName. When receiving a new ToStateName, the corresponding level sequence between the old and new state is played.

**How to test it?**

The project behaves as previously.

### WebUI respects the URL allow list

**Date of change:** 06/11/2025

**Affected Projects:** All

**Affected Features:** WebUI

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

The M2 platform allows configuring external URL access policies, to enable projects to restrict access to unauthorised domains. This policy now also applies to the WebUI in-game browser.

Loading local files now requires the Allow All policy, to avoid exploits that bypass loading from a URL.

**How to fix it?**

Check the External URLs section of the your project’s admin dashboard. If you have filtering enabled, add any required domains to the allow list. If you’re using WebUI to show local files, you must change the policy to Allow All.

**How to test it?**

The web browser will still be able to open the page. If a request is blocked you will see a log message `LoadURL: Requested URL is denied by policy`.

### M2Deprecated, JunoSkypark and JunoVoxelWorld plugins removed

**Date of change:** 06/11/2025

**Affected Projects:** All

**Affected Features:** All deprecated content

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

The M2Deprecated plugin has now been removed from the platform by default, but is available to download as a separate plugin that can be re-added to your project. The deprecated content is no longer maintained, so has been removed to simplify the platform for new users.

Some of the blueprints in the separate M2Deprecated plugin relied on code that has also been removed. These blueprints have been fixed up to remove compile errors, but may not function as before. You can refer to the blueprints in the v39 editor release to see the original implementations.

JunoSkypark content has also been removed. These were mostly redirectors, and replacement core redirects are included in the downloadable M2Deprecated plugin. Follow the steps below if you encounter and issues with JunoSkypark references.

JunoSkypark has also contained a handful of code classes that have been removed. J\_GraffitiWallFunctionLibrary for the removed graffiti wall functionality, J\_Skypark\_LightSource which updated intensity based on an MPC and can be re-implemented in blueprint, and JM\_RepulsorArea which was used by the deprecated activity system.

JunoVoxelWorld was an unsupported experimental plugin and has been removed entirely.

**How to fix it?**

Access the M2Deprecated plugin via the plugins tab within the ODK Launcher. Drop the M2Deprecated plugin into your project, in `<ProjectRoot>/Plugins/`. It is now part of your own project, and you have full control over it.

The M2Deprecated plugin also contains core redirects for all of the redirector assets removed in the platform, so all existing asset references should continue to work. It’s recommended to resave every asset in your project, which will fix up the references.

**How to test it?**

Your project should compile and run as before, with no errors caused by missing assets.

### Changes to the `BPC_M2Example_NameplateComponent`

**Date of change:** 06/11/2025

**Affected Projects:** All

**Affected Features:** Nameplates

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

We have extended the functionality in `BPC_M2Example_NameplateComponent` to support globally disabling nameplates, as well as each individual nameplate hiding due to distance etc. (Details in [Nameplates](/platform-documentation/creation/unreal-development/features-and-tutorials/the-m2-example-plugin/nameplates.md))

For this reason, there are two changes to the component’s functionality to note:

* `SetWidgetEnabled` has been renamed to `SetIndividualWidgetEnaabled`, to reflect that this only refers to the distance etc. checks, and not whether it is actually enabled, which could be due to nameplates being disabled globally
* `IsEnabled` checks whether the nameplate should ultimately be visible or not, handling both the individual check, and the new global check

**How to fix it?**

No changes needed - the function rename should apply globally

### DefaultIconMap setup in deprecated UI skinning system

**Date of change:** 05/11/2025

**Affected Projects:** All

**Affected Features:** UI skinning icons

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

The default value for `J_InputIconConfig::DefaultIconMap` was an asset in the M2Deprecated plugin, which has now been removed (but can be downloaded separately). Because of this, the default value has been removed from the platform. If your project relied on the default `/M2Deprecated/M2Content/UI/Input/DA_InputIconMap` asset you will need to manually re-add this in a config file.

If you don’t use the skinning system, or the icon map, then no action is necessary.

**How to fix it?**

Add the `DefaultIconMap` to the `[/Script/JunoCoreUI.J_InputIconConfig]` section in your `<ProjectRoot>/Config/DefaultGame.ini` file, or add the section if it doesn’t exist:

`[/Script/JunoCoreUI.J_InputIconConfig] DefaultIconMap=/M2Deprecated/M2Content/UI/Input/DA_InputIconMap.DA_InputIconMap`

(This assumes you’ve downloaded the legacy M2Deprecated plugin and copied it directly into your project - the asset may be at a different the path if not.)

**How to test it?**

The UI skinning and icons will behave the same as before.

### Client origin API changes

**Date of change:** 20/10/2025

**Affected Projects:** All

**Affected Features:** Client Origin

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

The methods to change the client origin, used for net prioritisation, have changed. This includes:

* `PushClientOriginActor`
* `RemoveClientOriginActor`
* `ClientOriginMovement`

Net prioritisation now takes into account all client origin actors that are in the ClientOriginLocations set (see below). This no longer operates as a queue that you can push/remove from; you’ll need to directly clear the set if you want to change which actor is used as the client origin.

**How to fix it?**

Use:

* `AddClientOriginActor`
* `RemoveClientOriginActor`
* `SetClientOriginActors`
* `SetClientOriginActor`
* `GetClientOriginActors`

To directly set which actors you want to be used for net prioritisation at any given time.

**How to test it?**

Check that the correct actors are in your foreground, midground and background after you’ve made the changes above.

### UserCollections, Wallets, Currency, Transactions and Purchaseables systems removed

**Date of change:** 20/10/2025

**Affected Projects:**

**Affected Features:** UserCollections, Wallets, Currency, Transactions and Purchaseables systems

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

These systems have been deprecated in M2 for several releases, and relied on the User Collections web platform system which has been removed. As these systems are now non-functional they have been removed entirely.

**How to fix it?**

Projects should already have migrated away from these systems. Currency and transactions should be implemented in project space.

**How to test it?**

Blueprints compile without error.

### Removal of StorePlayerProfile async task

**Date of change:** 17/10/2025

**Affected Projects:** All

**Affected Features:** Player Profile system

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

The `StorePlayerProfile` async task node has been removed. This didn’t support saving the player avatar, and you can just call the underlying functions directly.

**How to fix it?**

Replace with calls to the Save functions on the `M2_WebServivesDataProvider` (see `BP_M2_ProfileDataProvider` for examples). It’s also possible to use the `M2_PlayerProfileSubsystem`.

**How to test it?**

The project should compile and profile name/avatar data should save correctly.

### Removal of profile pictures and legacy content from M2 player profiles

**Date of change:** 17/10/2025

**Affected Projects:** All

**Affected Features:** Player Profile system

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

`M2_PlayerProfile` now only contains a `Name` and `AvatarUrl`. It no longer contains legacy properties for Profile Images, Wallet, and User Collection items associated with your avatar. These have been previously deprecated, and it wasn’t possible to save new values to a user’s profile for these.

`JM_PlayerEmoteComponent` no longer supports `J_ProfileAsEmotePrimaryAsset` as profile images are no longer a core part of the M2 player profile. Profile picture emotes can be implemented in the project instead.

Functions and delegates related to profile images and user collections have been removed from `M2_PlayerProfileSubsystem`, `M2_WebPlatformUserProfileService` and `M2M_CharacterAssetComponent`. It was already impossible to update these values, so the API has now been removed.

`M2M_PlayerProfileComponent` no longer replicates a profile image. This can be implemented in the project instead.

**How to fix it?**

Use the `M2_PlayerProfile::AvatarUrl` property directly to retrieve the avatar, instead of using the `Url` property in the `Avatar` structure:

Remove any live config overrides for `Profile.DefaultProfileUrl` and `Profile.ProfileAsEmoteEnabled`

Profile pictures can be implemented in the project if required, by storing them in the KV Store with your own key. See `BP_M2_ProfileDataProvider` for an example - it would work the same as storing and loading the avatar URL:

Profile picture emotes will need implementing in the project. One method would be add a replicated image URL to each player, and showing a custom widget above a player when they trigger an emote.

**How to test it?**

The project compiles without errors, and no live config errors are present when playing in editor.

### Player Profile changes

**Date of change:** 15/10/2025

**Affected Projects:** All

**Affected Features:** Player Profile system

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

The default player profile implementation in `BP_M2_ProfileDataProvider` has been migrated to storing date in the M2 KVStore, and requires the `MP_M2_KVStoreService` to exist. This replaces the legacy profile API.

**How to fix it?**

The service should be enabled by default. If you’ve changed the `KV Store Service Class` in your world settings then you will need to also use your own `Profile Data Provider Class`. You can take a copy of `BP_M2_ProfileDataProvider` and update its uses of `MP_M2_KVStoreService` to use your own service.

**How to test it?**

Profile data (display name and avatar URL) should be retrieved correctly when loading into a world.

### KVStore Store delegate signature has changed

**Date of change:** 15/10/2025

**Affected Projects:** All

**Affected Features:** KVStore

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

The completion delegate passed into `M2_KVStoreService::Store` has a different signature. Previously it took a single Success bool, but now it takes a struct containing the same Success value plus the ID of the request triggered it (which is now passed back from Store function). This enables you to associate a response with a specific request.

**How to fix it?**

For delegate events, you should just need to break the new Result pin to get Success.

For delegate functions, update the signature to to take a `FM2_KVStoreServiceStoreResponse` instead of a bool, and split that to get Success.

**How to test it?**

Blueprints should compile and behave the same.

### Removal of M2 AvatarEditor code and assets

**Date of change:** 13/10/2025

**Affected Projects:** All

**Affected Features:** Avatar Editor

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

The deprecated M2 Avatar Editor C++ classes and blueprints have been removed, as they relied on legacy Web Platform features that are no longer available.

**How to fix it?**

Remove any references to `M2_AvatarEditorActor`, `M2_AvatarEditorComponent` and any of the `/M2Deprecated/AvatarEditor` assets from your project.

Remove any live config overrides for `AvatarEditor.*` values from your project’s `game.override.json` file, otherwise live config setup will fail with an error.

**How to test it?**

The project compiles and runs without errors.

### Removed the BA Welcome Screen by default

**Date of change:** 14/10/2025

**Affected Projects:** All

**Affected Features:** BlueprintAssist

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

We have now hidden the “BA Welcome Screen” popup from new projects, created via our starter project template.

**How to fix it?**

If you want information on how to use the Blueprint Assist plugin, please look into it independently.

If you want the the popup to display for your project, you can add the following section to your `DefaultEditorPerProjectUserSettings.ini`:

`[/Script/BlueprintAssist.BASettings_EditorFeatures] bShowWelcomeScreenOnLaunch=False`

### Removed the `EUW_RolesHierarchyViewer` utility widget

**Date of change:** 26/09/2025

**Affected Projects:** All

**Affected Features:** Roles

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

We have removed the `EUW_RolesHierarchyViewer` utility widget, and its dependent widgets, since it was noticed that this has been broken for about a year, and was only ever used for now-deprecated content. Since it has gone unnoticed for a year, we have chosen to remove it rather than fix it and keep it in deprecated content.

**How to fix it?**

N/A

**How to test it?**

N/A

### CrowdScale functionality removed from M2M CharacterBase

**Date of change:** 23/09/2025

**Affected Projects:** All

**Affected Features:** Character

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

Set/GetCrowdScale have been removed from M2M CharacterBase. This functionality is superceded by MorpheusAnimatedSkeletonComponent’s relative transform functionality.

The EnableResizingOfAnimatedCrowd LiveConfig has also been removed.

Resizing functionality in the deprecated AJM\_CharacterBase (with JM\_ReiszeableActorComponent) class is now broken.

**How to fix it?**

In any case where you would have set the crowd scale to match the lod0 actor’s scale, you can use Character.MorpheusAnimatedSkeletonComponent.SetSkeletalMeshRelativeTransform and set the scale property of the transform. This will affect the lod0 and crowd transform, so you don’t need to branch.

If you want to intentionally set the crowd scale of an actor to be different to the lod0 scale of an actor, then you’ll need to implement your own IMorpheusAnimatedSkeleton::ApplySkeletalMeshTransform in your character class. See the MorpheusAnimatedSkeletonComponent in the docs for details.

If you were using the deprecated AJM\_CharacterBase class, you should swap to using AM2\_CharacterBase and the BPMC\_M2Example\_ResizingComponent to continue using resizing functionality in the crowd.

**How to test it?**

Check your characters and resizing correctly in the crowd.

### Graphics Settings reduce maximum visible Carnival Meshes (MML)

**Date of change:** 22/09/2025

**Affected Projects:** All

**Affected Features:** Carnival Rendering

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

To aid in client performance, the maximum visible Carnival meshes have been limited based on the graphics settings used. No change is required by the Project. Can be overridden by project settings if desired.

| Graphics Settings | Max Carnival Meshes |
| ----------------- | ------------------- |
| Low               | 2500                |
| Medium            | 8750                |
| High              | 15000               |
| Epic              | 15000               |

**How to fix it?**

Override `r.Carnival.MaxVisibleModels` in projects settings following this documentation [Editing Project Settings](/platform-documentation/creation/unreal-development/tutorials/adding-project-settings-config-overrides.md#adddingprojectsettingsconfigoverrides-howtooverridecvars)

### Replicated animations and capsule moved into components

**Date of change:** 15/09/2025

**Affected Projects:** All

**Affected Features:** Characters

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

Functionality related to the replicated animated skeleton now exists in M2\_AnimatedModularCharacterComponent (e.g. the skeletal mesh transform applied to the crowd).

Functionality related to the replicated capsule now exists in M2\_ReplicatedCapsuleComponent.

Additionally, all actors that implement IMorpheusPooledActor will automatically be hidden, collision disabled, and tick disabled when they enter the pool, and the inverse when they return from the pool, so long as the parent MorpheusPooledActor implementation is called. There is no need to perform these actions manually now.

**How to fix it?**

Instead of the skeletal mesh transform and capsule component data existing in your character class directly, these now exist in Character.AnimatedModularCharacterComponent and Character.ReplicatedCapsuleComponent. You’ll need to update these references.

**How to test it?**

Project should build and characters should function as normal.

### Deprecate M2\_WebSocketConnection

**Date of change:** 15/09/2025

**Affected Projects:** All

**Affected Features:** WebSockets

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

We have deprecated `M2_WebSocketConnection` in favour of two alternatives: `M2_JsonWebSocketConnection` and `M2_StringWebSocketConnection`. The class had previously been deprecated, but not in a way that was communicated to downstream users.

As a result of this, the `Connect` node of the old `M2_WebSocketConnection` class will now result in warnings, and you will not be able to add further calls.

**How to fix it?**

Switch to using whichever out of `M2_JsonWebSocketConnection` and `M2_StringWebSocketConnection` is more appropriate for your use case. For instruction on how to use them, see [WebSockets](/platform-documentation/creation/unreal-development/features-and-tutorials/web-services/web-socket-connections.md)

**How to test it?**

Your logic compiles as normal with no warnings. If you needed to modify your logic, check your websockets still connect and send messages as expected.

### Deprecated the use of Pawn Sets

**Date of change:** 09/09/2025

**Affected Projects:** all

**Affected Features:** Animated Crowd

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

**#1:**

Pawn sets are no longer required to define a morpheus actor’s render target actor or crowd. Instead, if you have a render target actor defined in the details panel, it will be used, and if crowd is enabled, its details will be inferred automatically from the render target actor.

(Documentation on this process will be written soon)

There are two breaking changes that will need to be noted as a result of this:

* `BPM_M2Example_PlayerCharacter` no longer calls `ApplyPawnSet`. If your character extends this class and relies on a specific pawn set, this logic will need to be re-added, or handled without using pawn sets
* Instead of defining the montages known by the crowd in the pawn set’s Crowd Data Asset, we can provide the list in our actor class (see `GetAnimNameToSequenceMap`). This has been done already in `BP_M2Example_PlayerCharacter`.
  * If your morpheus actor extends `BPM_M2Example_PlayerCharacter`, but your character does not extend `BP_M2Example_PlayerCharacter`, or you have added additional montages than the list existing in `DA_SkeletalCrowdData_LoD1`, you will need to override this function and provide the mappings you need (or the character will be unable to emote in the crowd)

**#2:**

Since pawn sets are no longer required, we have now deprecated all the pawn sets except for `DA_Pawns` (which is still our default pawn set), moving them into `M2Deprecated`. If you reference any of these assets in your project, you will need to enable the `M2Deprecated` plugin to access them, and move them into your project.

* `DA_Origin_Pawns_Approachability`
* `DA_Pawns_AudioMixer`
* `DA_Pawns_Observer`
* `DA_Pawns_ObserverDirector`
* `DA_Presenter`

**#3:**

Since we no longer call `ApplyPawnSet` to initialize your character (for classes extending `BPM_M2Example_PlayerCharacter`), it it possible for the render target actor to be spawned earlier in the process. If you e.g. listened to `OnRenderTargetUpdated`, and didn’t also check the current render target, the callback may not trigger, if bound after the initial render target was already set.

**How to test it?**

Easiest way to verify that it is working as expected would be:

* PIE with 2 clients, and `PlayerClient.Rendering.NumInLOD0` set to 0. That way the other client you are looking at will be a crowd member
* Walk around - both characters should appear and animate as expected
* Emote - the crowd member should animate when emoting.

If you have a presenter or observer role in your project, check that you can still switch to it correctly.

### Remove M2\_ExampleAudioProcessor and its LiveConfig value `VoiceChat.ExampleProcessorEnabled`

**Date of change:** 02/09/2025

**Affected Projects:** All

**Affected Features:** Crowd Audio

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

Removed the M2\_ExampleAudioProcessor as it was always disabled and even if it was enabled it was doing nothing. It was also causing a crash as a result of accessing live config (not thread-safe) from the crowd audio thread.

This also resulted in removing the already deprecated live config value `VoiceChat.ExampleProcessorEnabled` from the `game` config

**How to fix it?**

Ensure that you aren’t relying on the live config value `VoiceChat.ExampleProcessorEnabled` and if so, you can add a new live config value for your specific usage.

**How to test it?**

Crowd audio is working as expected.

### Undefined anim vars now default to 0/false

**Date of change:** 01/09/2025

**Affected Projects:** All

**Affected Features:** Animation

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

We have now provided explicit behavior to an edge case that previously resulted in undefined behavior:

If you define a variable in your animation blueprint which is not actually registered in your anim vars component - previously this would result in an undefined result (i.e. if you use a `IsDead` bool, but don’t register it in your anim vars component, the result could either be true or false). Now, it will always fall back to 0 (false for bools).

If you had unregistered variables previously, it could be that they were defaulting to the right value accidentally, in which case this change may result in their behavior changing. If so, you would see errors along the lines of:

`LogAnimatedCrowd: Warning: UAnimatedCrowdComponent::ValidateAnimVars: Crowd expected to support anim var with name IsSprinting, but this could not be found. Please check your anim var names. LogAnimatedCrowd: Warning: UAnimatedCrowdComponent::ValidateAnimVars: Crowd expected to support anim var with name InCombatMode, but this could not be found. Please check your anim var names.`

**How to fix it?**

If you are seeing the above warnings, you should address them. See [Custom Animation Variables](/platform-documentation/creation/unreal-development/features-and-tutorials/avatars/bespoke-character-animations.md) for details on how to register custom anim variables.

**How to test it?**

When you play the game with crowd members (easiest way would be to set the `PlayerClient.Rendering.NumInLOD0` override to 0 and test with a second client), you shouldn’t see any warnings along the lines of:

`LogAnimatedCrowd: Warning: UAnimatedCrowdComponent::ValidateAnimVars: Crowd expected to support anim var with name IsSprinting, but this could not be found. Please check your anim var names. LogAnimatedCrowd: Warning: UAnimatedCrowdComponent::ValidateAnimVars: Crowd expected to support anim var with name InCombatMode, but this could not be found. Please check your anim var names.`

If you do, please verify whether these variables are needed in your ABP, or need to be registered in your anim vars component.

### Introduced min LOD checks for projects targeting mobile platforms

**Date of change:** 25/08/2025

**Affected Projects:** Only projects targeting mobile devices, e.g. IOS/Android

**Affected Features:** Cooking

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

To help avoid performance issues on projects targeting mobile platforms, we have added some automated checks and logic to enforce that skeletal meshes and static meshes have sufficient LODs.

If you attempt to cook for a project that targets Android or IOS, and has fewer LODs than the configured minimum (in `Project Settings | M2 World Builder` - 7 for skeletal meshes, 4 for static meshes), it will be flagged as an error. If you are cooking from the editor, a popup will show for each flagged asset.

For more details on this, see [Automatic Mesh Validation](/platform-documentation/creation/unreal-development/features-and-tutorials/helpers-and-extras/automatic-mesh-validation.md)

**How to fix it?**

* The ideal solution would be that if you have any such meshes that need fixing up, that you address them. Any meshes that were flagged when you attempt to cook should be looked at. You can either manually add LOD levels, or alternatively, if you save the asset, it will automatically generate the required number of LODs for you.
* If you aren’t intending to build for mobile platforms, you can modify your “supported platforms” list. This can be done in your `.uproject` file. Any `IOS` or `Android` ones can be removed.
* If you don’t want the checks to be applied, you can turn them off by going to `Project Settings | M2 World Builder | Mesh Validation`, and un-checking `ValidateMeshes`.

**How to test it?**

Attempt to cook your project. Cooks should succeed for your target platform.

### Removed MorpheusConnection OnMorpheusActorCheckedOutBP Implementable Event

**Date of change:** 21/08/2025

**Affected Projects:** All, although unlikely to could’ve been used by downstream projects

**Affected Features:** MorpheusConnection delegates

**Does this breaking change need publishing for external users?** Yes

**What’s broken and why?**

The BP implementable event `OnMorpheusActorCheckedOutBP` on the `MorpheusConnection` has been replaced with a Blueprint Assignable Delegate `OnMorpheusActorAdded` and `OnMorpheusActorRemoved`

**How to fix it?**

Instead of using `OnMorpheusActorChecekdOutBP` you can now assign to the delegate `OnMorpheusActorAdded`

**How to test it?**

Ensure that the `OnMorpheusActorAdded` delegate is being called when MorpheusActors spawn in the world.

### Deprecating J\_CharacterMovementComponent and JM\_AnimVarsComponent

The following is a significant breaking change in upgrading to release v39. If you are using the simplified base classes (i.e. not the deprecated classes with e.g. the `Origin` or `J_` prefixes), you will be affected, and will need to take action.

If you have extended the deprecated classes, and are using your own anim instance (ABP), you will likely also be affected (see [Modified ABP\_M2\_Human](#modified-abp_m2_human)). In that case, you will need to make sure your ABP is correctly reflected in your crowd, explained in the [If you want to keep using the deprecated classes (only recommended as a temporary solution)](#if-you-want-to-keep-using-the-deprecated-classes-only-recommended-as-a-temporary-solution) section

### Does this affect me?

Have a look through the [What's changed, and why?](#whats-changed-and-why) section. Some sections may not be relevant to your project; if so, feel free to skip them.

If your character extends e.g. `M2_CharacterBase`, `BP_M2_PlayerCharacter` or `BP_M2Example_PlayerCharacter`, you will be affected at least by the change to the character movement component, even if you are not using any of the deprecated functionality. You will see the following popup when you open your character class. More details on this in [Resolving the corrupted CharacterMovementComponent](#resolving-the-corrupted-charactermovementcomponent).

![](/files/25e1f0b01450f5bf149dd4d4090da7f148e33d7c)

If any of these parts are relevant to your project, see [How to fix](#how-to-fix).

### What's changed, and why?

The following changes have been made to the `M2` character and morpheus actor (`M2_CharacterBase` and `M2M_CharacterBase`), meaning that if you are using blueprints based off of those classes, you will be impacted. If you are still using the deprecated character (extending e.g. `J_` classes or `Origin` classes), you will not be affected by this.

#### Deprecated Anim Vars Component

The existing `JM_AnimVarsComponent` has now been deprecated, in favour of a stripped back `M2M_AnimVarsComponent`.

* The following anim vars have been removed:
  * `IsWalking`
  * `IsDoubleJumping`
  * `HasBeenLaunched`
  * `HasLowGravity`
  * `HasZeroGravity`
  * `IsMovingInLowGravity`
  * `IsThrustingUp`
  * `IsThrustingDown`
  * `IsBouncing`
  * `IsSliding`
  * `IsAiming`
* The following anim vars have been modified: (These have been moved into being custom anim vars. For more details, see [Changes to gait speeds](#changes-to-gait-speeds)& [Changes to "combat mode"](#changes-to-combat-mode))
  * `IsJogging`
  * `IsSprinting`
  * `IsInCombatMode`
  * `IsDead`

In the deprecated `J_AnimInstance`, these are still accessible via the `DeprecatedAnimVars` variable

#### Modified ABP\_M2\_Human

`ABP_M2_Human`, our default anim instance, has been reparented from `J_AnimInstance` to `M2_AnimInstance`, and so no longer uses the deprecated anim vars. The old anim vars are still in use in the deprecated `ABP_M2_Human_OId`.

#### Deprecated Character Movement Component

The existing `J_CharacterMovementComponent` has now been deprecated, in favour of using the native default `CharacterMovementComponent`.

* The following features have been removed:
  * The “Custom Movement Mode Primary Asset” system (see [Changes to "custom movement"](#changes-to-custom-movement))
  * Some minor helper functions, like `AddGravityMultiplier` and `AddGaitSpeedMultiplier`
    * These could easily be added in the blueprint level in downstream projects if desired.
* The following features have been modified:
  * “Gait speeds” (see [Changes to gait speeds](#changes-to-gait-speeds))
  * “Combat mode” (see [Changes to "combat mode"](#changes-to-combat-mode))
* Due to `M2_CharacterBase`'s `Character Movement` class being changed (from `J_CharacterMovementComponent` to `CharacterMovementComponent`), unfortunately assets extending `M2_CharacterBase` will have their component corrupted. If this affects your character, you will see the following popup when attempting to play or open your asset.
  * For resolving this, see [Resolving the corrupted CharacterMovementComponent](#resolving-the-corrupted-charactermovementcomponent)

![](/files/e622326cfe1332180dc2538e35428c6586c84295)

#### Changes to gait speeds

Gait speeds” are now no longer used as a core concept, and the `BPC_CharacterMoveSpeedComponent` has been deprecated. If you want to change your character’s walk speed, you can do so directly by calling your character movement component. We have an example of this in `BP_M2_PlayerCharacter` (for more details, see [The Example Character](/platform-documentation/creation/unreal-development/features-and-tutorials/the-m2-example-plugin/the-example-character.md))

![](/files/a0354d58f1427f59e4dd233d2483255fb52b294a)

#### Changes to "combat mode"

Similar to above, `IsInCombatMode` and `IsDead` have been converted to BP custom anim vars, and are used in our `M2Extras: CombatExample` plugin

![](/files/026e8eb7ec21b423cf7447d1ca4fa359daba0c03)

#### **Changes to "custom movement"**

The deprecated “Custom Movement Mode Primary Asset” system is no longer used. It has not been documented, and has not been actively maintained by MSquared for years.

Note that Unreal’s custom movement modes are still available. Custom physics will need to be provided if so, in the `UpdateCustomMovement` event on your pawn

![](/files/5ff820c70460aba6534f357c55fef8fed6abcb28)

For reference - the node on the left is exclusive to the `J_CharacterMovementComponent`, and so has been deprecated and removed from our base class. The node on the right is native Unreal's way of handling custom movement, and will still be available

![](/files/d175da392fcdabcfe383b833b137c75c779259a0)

A basic representative example of applying phyics to your custom movement mode in the native Unreal way

#### A diagram of the relevant classes

Knowing the interaction of these classes is not essential, but this information has been provided if you want to know more about how the classes interact.

This diagram shows the changes to the assorted classes, and how they are related:

* `JM_AnimVarsComponent` has had a new base class introduced: `M2M_AnimVarsComponent`, which `M2M_CharacterBase` now points to
* `J_AnimInstance` has had a new base class introduced: `M2_AnimInstance`, which `ABP_M2_Human` now points to.
* `BPM_M2Example_PlayerCharacter` now uses a BP-level `BPMC_M2_AnimVarsComponent`, based off of the simplified base class, instead of using the deprecated anim vars.
* The deprecated BP classes (e.g. the `_Origin_` ones) will still point to the `J_` classes)

![](/files/b4f5cf77abf421c4b159935baf89120a19f4ecb4)

A diagram outlining the various movement and animation components, and how they interact

### How to fix

#### Resolving the corrupted CharacterMovementComponent

NOTE: This breaking change is best fixed with knowledge of the project prior to upgrading. Please either check this flow before starting the upgrade, so you can make appropriate notes, or have access to a version of the project prior to the upgrade to hand, to easily compare between them.

The most significant action required is resolving the corrupted character movement component in classes extending `M2_CharacterBase`. You can fix it by doing the following:

* Open your actor class.
* If you see the following popup, that means your movement component was corrupted, and has been regenerated automatically.
  * (This is due to the parent class changing its default `CharacterMovementComponent` to be the base component rather than previously setting it to `J_CharacterMovementComponent`).

![](/files/4adf741d79dc6254f47e3ad37ac26befddf2dfe2)

Review your auto-generated character movement component class. Since the movement component had to be regenerated, any manual changes to your previous movement component will have been reset.

* Unfortunately, you won’t be able to compare changes via the diff, since the diffed version will have also been corrupted. Therefore, the best approach to get your changes to your character movement component class would be to either:
  * Make note of your changes to the movement component prior to the upgrade. You will be able to see any changes from the defaults since they will have the “undo arrow” by the property. Some edge cases to be aware of: `FaceLastAccelerationDirection` may be off, due to the `J_CharacterMovementComponent` making changes to this automatically. This should probably be set to true once moving off the `J_CharacterMovementComponent`. Also, make note of the `GaitSpeeds` values. `Jog` would be the default walk speed used, and you may want to re-add sprint to your project.
    * ![](/files/8d2ccefcb7770c30c74e96dac126e4b04ae03aa8)
  * Open a version of the project prior to the upgrade, to compare side-by-side, and add any changes back to the upgraded version of your class.
* **Save your asset** once you have reviewed your character. Even if you did not need to modify your movement component, the regenerated asset will need to be saved.

#### If you accept the simplified base classes (recommended)

Our recommended approach would be to use the simplified components. Most of the deprecated anim variables, movement component additions and the like are not widely used, and could be re-added in downstream projects if desired.

If you accept the new base classes, and are using the `M2_CharacterBase`, `M2M_CharacterBase` and `ABP_M2_Human` already, all you will need to resolve would be the corrupted movement component (see [Resolving the corrupted CharacterMovementComponent](#resolving-the-corrupted-charactermovementcomponent)).

If there are parts of the old functionality that you want to reintroduce into your project, this can be done at the blueprint level. A potential example would be if you want an equivalent to "gait speeds". We have an example flow of handling this in our `M2Example` plugin - including setting the movement speed on the native Unreal `CharacterMovementComponent`, and introducing a custom anim var to replicate the state and animate it for both regular and crowd characters. See [Changes to gait speeds](#changes-to-gait-speeds)

#### If you want to keep using the deprecated classes (only recommended as a temporary solution)

If you want to use the deprecated anim vars, there are a number of places you will need to check:

These components are tightly interlinked, so we strongly recommend switching wholesale, or moving all the componets wholesale back to the deprecated classes. (e.g. if you use the deprecated character movement component, but don't update the anim instance or anim vars, some animations may be missing, or other issues will be encountered)

* In your BPM, check the `AnimVarsComponentClass`. Make sure that it extends `JM_AnimVarsComponent`, or some child of that.

![](/files/99e89750fbc08242e12cefbf57655f7a77cda9b2)

* In your pawn, check your `Character Movement`'s details panel. Set it back to `J_CharacterMovementComponent`. (If you want to keep values from before the breaking change, you will need to copy them across as outlined in [Resolving the corrupted CharacterMovementComponent](#resolving-the-corrupted-charactermovementcomponent), since this step will recreate the component)

![](/files/02da91f303e6f61a4529e972bfcc55f9825a26fd)

* In your pawn, check the mesh’s `AnimClass`. It will need to be set to an animation blueprint that extends `J_AnimInstance` instead of `M2_AnimInstance`

![](/files/6ffdb4a18b60404253fa090b3e2dff3dfb2b1abd)

* Check your pawn set. In its crowd entry, it will need to point to the a `SkeletalAnimatedCrowdData` that has the right anim instance

![](/files/befa6cd71749c559e68e4898dbf93ed4f260be12)

### How to test it?

Open your character asset. Then PIE to verify that your character begins play, and moves as expected. If you see the `Asset had a corrupted CharacterMovementComponent` popup in either of the above steps, you will need to go through the [How to fix](#how-to-fix) process.

We recommend also checking the animated crowd (e.g. by testing with multiple clients and setting the`PlayerClient.Rendering.NumInLOD0` live config override to 0), to ensure that it is also animating as expected.

If you previously used the `J_CharacterMovementComponent`, and are not using it any more, you may have compile errors if calling methods that are not present in `CharacterMovementComponent`. You should also search for attempts to cast to `J_CharacterMovementComponent` in your project. If there were any, they will fail.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.otherside.xyz/platform-documentation/creation/unreal-development/release-notes/v40_0.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
