> 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/odk-docs/breaking-changes/odk-v10-upgrade-guide/v10.0.md).

# v10.0

#### Removed ProfileShowAllTabs

Date of change: 12/05/2026

Affected Features: ODK overlay

What’s broken and why?

We no longer support custom visibility tabs within the overlay. Behavior now defaults to that of `ProfileShowAllTabs` being permanently set to true. If you have a use case for displaying only a custom subset of overlay tabs, please reach out to your nearest ODK liaison.

How to fix it?

Delete any override references to `ProfileShowAllTabs` within your live config overrides.

#### Tidy up BP\_ODK\_NameplateWorldService

Date of change: 11/05/2026

Affected Features: Nameplates

What’s broken and why?

Have taken the opportunity to tidy up the `BP_ODK_NameplateWorldService`.\
\
\- The event dispatcher name has been updated to `OnNameplateVisibilityUpdated`.\
\- `RequestHideNameplate` and `RequestShowNameplate` have been renamed `RequestHideNameplates` and `RequestShowNameplates`.\
\- `GetShowNameplate` has been renamed `GetNameplateVisibility`.\
\- Has `GetValidatedBlockingStack` been removed as it is now redundant.\
\- `StackUpdated` has been removed as it is now redundant.

How to fix it?

Use the renamed functions.

#### Removed photo album assets

Date of change: 05/05/2026

Affected Features: Photo Album

What’s broken and why?

We have removed the photo album assets as they are now redundant. The photo album is now part of the web app.

#### Default singletons defined in ini files

Date of change: 30/4/26

Affected Features: Singletons

What’s broken and why?

We have moved where default singletons are defined from the `BP_ODK_BootflowWorldService` to the M2Content.ini file inside the ODK plugin.

How to fix it?

If you have modified a maps `AdditionalSingletons` or `NonMorpheusSingletons` in the world settings you will need to take note of the singletons you have manually added/removed, click the "Reset From Config" button and then add back your noted changes.

#### Default required singleton classes reset

Date of change: 30/04/2026

Affected Features: Singletons

What’s broken and why?

Legacy projects will have some stale singletons within their world settings that no longer exist anymore. These stale singletons can confuse the bootflow process and prevent world startup.

If you see this error then you likely have some bad singleton config:

`LogBootflow: Warning: Bootflow extra info: Waiting for singletons`

How to fix it?

If you see empty entries within your world settings bootflow settings, please remove them:

<figure><img src="/files/SArQr99MQbUdFHAW5uMS" alt=""><figcaption></figcaption></figure>

If you haven't manually added any singletons yourself, then you can use the "Reset To Config" button to reset your world to the default recommended singleton list

<figure><img src="/files/YWV1Rh7J9TAvwR8gIpem" alt=""><figcaption></figcaption></figure>

####

#### Removed Deprecated/Unused files

Date of change: 28/04/2026

Affected Features: Currency, Bootflow, Web Services, UI

What’s broken and why?

We have made a pass at cleaning up deprecated, unused files from the codebase. The list of areas is as follows:

* Currency/Purchaseables (including the `J_CurrencyTypePrimaryAsset` and the `M2_PurchaseablePrimaryAsset`)
* Activities System & Effect Applicators (including the `J_ApplicatorEffectPrimaryAsset`)
* The "prop spawner component" (`J_PropClassPrimaryAsset`)
* Tutorials prompts
* User Data Store and Web Platform Key Value Store (should now use the KV Store World Service)
* Deprecated bootflow steps
* Deprecated Http/Json helpers
* Deprecated Morpheus Actor and Combat functions
* "Timed interaction" helper functions

How to fix it?

Beyond the features no longer being present (if you were using these assets, they will need to be removed), you may also hit errors if you added the removed primary asset types in your asset manager. (Go to `Project Settings -> Game -> Asset Manager`, and clean up any `Primary Asset Types to Scan` that refer to the above classes). If you did not change settings here, you can safely ignore this:

How to test it?

Your project should run without new errors.

#### Sentinel API Changes

Date of change: 27/04/2026

Affected Features: Sentinels

What’s broken and why?

We are introducing worker clients to do offloaded gameplay and NPCs and as a result, we are limiting sentinels to do gameplay validation only hence changing their API.

* `SwitchMorpheusAuthorityWithSentinel` node is now gone. Preferred to use `HasSentinelAuthority` instead
* `GetOwningClientConnection` was already deprecated. It has been deleted in this CL. Use `GetAuthoritativeClientConnection` instaed
* `GetDedicatedSentinelConnection` helper removed. Use `GetSentinelConnection` and cast to a `DedicatedSentinelConnection` instead. Server only as before.

How to fix it?

See above.

#### BPM\_ControlPanelBase default visibility change

Date of change: 28/04/2028

Affected Features: Control panels

What’s broken and why?

The `HidePanelInGame` instance variable within `BPM_ControlPanelBase` has been flipped to true to default hide control panels in game. Control panels are typically only used by elevated roles, and to prevent accidentially leaving panels accessible for standard access, we now default hide them.

How to fix it?

For any control panel that you wish to maintain as default visible for all, toggle the `HidePanelInGame` instance variable on an instances.

#### Removal of Redirectors >6months old

Date of change: 08/04/2026

Affected Features: Anything that relied on the redirectors

What’s broken and why?

Assets that relied on a redirector thats been remove may no longer load or have errors in the BP.

How to fix it?

After identifying erroneous asset

Option 1:

* Open the project in the previous release editor.
* Located each asset and run 'Update Redirector References' (found by r-clicking on its parent folder in the Content Drawer).

Option 2:

* Re-add the redirectors in Config\DefaultEngine.ini under \[CoreRedirects] (list below)
* Located each asset and run 'Update Redirector References' (found by r-clicking on its parent folder in the Content Drawer).

How to test it?

Run editor, loads all your maps and attempt to run 'Play in Editor'.

Cooking the maps will also log errors (and fail the cook) if any asset is broken.

<details>

<summary>Redirectors</summary>

+ClassRedirects=(OldName="/Script/JunoModularCharactersTests.J\_ModularCharactersTestGymActor",NewName="/Script/M2Content.M2\_ModularCharactersTestGymActor") +ClassRedirects=(OldName="/JunoTownhall/UI/Core/HUDLayers/WBP\_TH\_HUDLayer.WBP\_TH\_HUDLayer",NewName="/M2Content/UI/Core/HUDLayers/WBP\_HUDLayer.WBP\_HUDLayer",MatchWildcard=false) +ClassRedirects=(OldName="/JunoTownhall/UI/Core/HUDLayers/WBP\_TH\_OverlayHUDLayer.WBP\_TH\_OverlayHUDLayer",NewName="/M2Content/UI/Core/HUDLayers/WBP\_OverlayHUDLayer.WBP\_OverlayHUDLayer",MatchWildcard=false) +ClassRedirects=(OldName="/Script/M2Content.J\_HUD",NewName="/Script/M2Content.M2\_HUDLayer") +ClassRedirects=(OldName="/Script/JunoTownhall.J\_HUD",NewName="/Script/M2Content.M2\_HUDLayer") +ClassRedirects=(OldName="/Script/JunoTownhall.J\_SettingAsset",NewName="/Script/M2Content.J\_SettingAsset") +ClassRedirects=(OldName="/Script/JunoTownhall.J\_SettingExecutor",NewName="/Script/M2Content.J\_SettingExecutor") +ClassRedirects=(OldName="/Script/JunoTownhall.J\_SettingEntry",NewName="/Script/M2Content.J\_SettingEntry") +ClassRedirects=(OldName="/Script/JunoTownhall.J\_SettingGroup",NewName="/Script/M2Content.J\_SettingGroup") +ClassRedirects=(OldName="/Script/JunoTownhall.J\_SettingWidget",NewName="/Script/M2Content.J\_SettingWidget") +ClassRedirects=(OldName="/Script/JunoTownhall.J\_SettingControl",NewName="/Script/M2Content.J\_SettingControl") +ClassRedirects=(OldName="/Script/JunoTownhall.J\_SettingSliderControl",NewName="/Script/M2Content.J\_SettingSliderControl") +ClassRedirects=(OldName="/Script/JunoTownhall.J\_SettingToggleControl",NewName="/Script/M2Content.J\_SettingToggleControl") +ClassRedirects=(OldName="/Script/JunoTownhall.J\_SettingsList",NewName="/Script/M2Content.J\_SettingsList") +ClassRedirects=(OldName="/Script/JunoTownhall.J\_SettingsPanel",NewName="/Script/M2Content.J\_SettingsPanel") +ClassRedirects=(OldName="/Script/JunoTownhall.J\_ChatDisplay",NewName="/Script/M2Content.J\_ChatDisplay") +ClassRedirects=(OldName="/Script/JunoTownhall.J\_ChatEntry",NewName="/Script/M2Content.J\_ChatEntry") +ClassRedirects=(OldName="/Script/JunoTownhall.J\_ChatMessageIndicator",NewName="/Script/M2Content.J\_ChatMessageIndicator") +ClassRedirects=(OldName="/Script/JunoTownhall.J\_ToggleSetting",NewName="/Script/M2Content.J\_ToggleSetting") +ClassRedirects=(OldName="/Script/JunoTownhall.J\_SliderSetting",NewName="/Script/M2Content.J\_SliderSetting") +ClassRedirects=(OldName="/Script/M2Content.J\_PurchaseableSubsystem",NewName="/Script/M2Content.J\_CurrencySubsystem") +ClassRedirects=(OldName="/Script/M2Content.JM\_PurchaseableManager",NewName="/Script/M2Content.M2M\_PurchaseableManager") +ClassRedirects=(OldName="/Script/M2PlayerProfile.M2\_AsyncTaskStorePlayerProfile",NewName="/Script/M2Services.M2\_AsyncTaskStorePlayerProfile") +ClassRedirects=(OldName="/Script/M2PlayerProfile.M2\_PlayerProfileSubsystem",NewName="/Script/M2Services.M2\_PlayerProfileSubsystem") +ClassRedirects=(OldName="/Script/M2PlayerProfile.M2M\_PlayerProfileComponent",NewName="/Script/M2Services.M2M\_PlayerProfileComponent") +ClassRedirects=(OldName="/Script/M2PlayerProfile.M2\_UserIDReplicationComponent",NewName="/Script/M2Services.M2\_UserIDReplicationComponent") +ClassRedirects=(OldName="/Script/JunoModeration.J\_ModerationSubsystem",NewName="/Script/M2Services.M2\_ModerationSubsystem") +StructRedirects=(OldName="/Script/JunoTownhall.J\_SettingData",NewName="/Script/M2Content.J\_SettingData") +StructRedirects=(OldName="/Script/JunoTownhall.ToggleValue",NewName="/Script/M2Content.ToggleValue") +EnumRedirects=(OldName="/Script/JunoTownhall.EJ\_EntryType",NewName="/Script/M2Content.EJ\_EntryType") +PackageRedirects=(OldName="/JunoTownhall/Core/AI/...",NewName="/M2Content/AI/",MatchWildcard=true) +StructRedirects=(OldName="/Game/Developers/alexmoon/AnimModifires/FeetAnimationModifierBP/BoneModifierST",NewName="/M2Content/Animations/AnimModifires/FeetAnimationModifierBP/BoneModifierST") +PackageRedirects=(OldName="/Game/Developers/alexmoon/AnimModifires/FeetAnimationModifierBP/BoneModifierST",NewName="/M2Content/Animations/AnimModifires/FeetAnimationModifierBP/BoneModifierST") +PackageRedirects=(OldName="/Game/Developers/alexmoon/AnimModifires/FeetAnimationModifierBP/FeetAnimationModifierBP",NewName="/M2Content/Animations/AnimModifires/FeetAnimationModifierBP/FeetAnimationModifierBP") +PackageRedirects=(OldName="/Game/Developers/alexmoon/AnimModifires/AnimModify\_Rotation",NewName="/M2Content/Animations/AnimModifires/AnimModify\_Rotation") +PackageRedirects=(OldName="/Game/Developers/alexmoon/AnimModifires/FeetAnimationModifierBP/RootMotionDirections",NewName="/M2Content/Animations/AnimModifires/FeetAnimationModifierBP/RootMotionDirections") +PackageRedirects=(OldName="/Game/Developers/AriPanzer/MirroringProfile\_UE5Mannequin",NewName="/M2Content/Animations/MirroringProfile\_UE5Mannequin") +PackageRedirects=(OldName="/JunoGeneral/UI/Skin/...",NewName="/M2Content/UI/Skin/",MatchWildcard=true) +EnumRedirects=(OldName="/Script/JunoTownhall.EUIModeContext",NewName="/Script/M2Content.EUIModeContext") +PackageRedirects=(OldName="/JunoTownhall/Core/EUIModeContext",NewName="/M2Content/UI/Core/EUIModeContext") +PropertyRedirects=(OldName="/Script/M2Content.J\_SettingsPanel.SettingGroupClass",NewName="/Script/M2Content.J\_SettingPanel.DefaultSettingsGroupClass") +PropertyRedirects=(OldName="/Script/M2Content.J\_SettingsPanel.SettingCategoryClass",NewName="/Script/M2Content.J\_SettingPanel.DefaultSettingsCategoryClass") +PropertyRedirects=(OldName="/Script/M2Content.J\_SettingsPanel.SettingsListClass",NewName="/Script/M2Content.J\_SettingPanel.DefaultSettingsListClass") +PropertyRedirects=(OldName="/M2Content/Audio/System/Music/BP\_Audio\_MusicController.BP\_Audio\_MusicControllerComponent",NewName="/M2Content/Audio/System/Music/BP\_Audio\_MusicController.BPC\_Audio\_MusicController") +PropertyRedirects=(OldName="/Script/M2Content.M2M\_PlayerSpawnerSingleton.PlayerMorpheusActor",NewName="/Script/M2Content.M2M\_PlayerSpawnerSingleton.PlayerMorpheusActorClass") +PropertyRedirects=(OldName="/Script/M2Content.M2\_SplashScreenImage.bIsClickable",NewName="/Script/M2Content.M2\_SplashScreenImage.bForceClickToSkip") +FunctionRedirects=(OldName="/Script/M2Content.J\_EquipmentQuickbarWidget.NotifyEquipmentUpdated",NewName="/Script/M2Content.M2\_ItemQuickbarWidget.NotifyQuickbarSlotsUpdated") +FunctionRedirects=(OldName="/Script/M2Content.M2\_PlaceModeQuickbarWidget.NotifyPlacementItemsUpdated",NewName="/Script/M2Content.M2\_ItemQuickbarWidget.NotifyQuickbarSlotsUpdated") +ClassRedirects=(OldName="/Script/JunoGeneral.J\_GameInstance",NewName="/Script/M2Content.M2\_GameInstance") +ClassRedirects=(OldName="/Script/JunoGeneral.J\_GameMode",NewName="/Script/M2Content.M2\_GameMode") +ClassRedirects=(OldName="/Script/JunoGeneral.J\_GameState",NewName="/Script/M2Content.M2\_GameState") +ClassRedirects=(OldName="/Script/M2Content.J\_GameInstance",NewName="/Script/M2Content.M2\_GameInstance") +ClassRedirects=(OldName="/Script/M2Content.J\_GameMode",NewName="/Script/M2Content.M2\_GameMode") +ClassRedirects=(OldName="/Script/M2Content.J\_GameState",NewName="/Script/M2Content.M2\_GameState") +ClassRedirects=(OldName="/Script/M2Content.JM\_PlayerInitObj",NewName="/Script/M2Content.M2M\_PlayerSpawnerSingleton") +ClassRedirects=(OldName="/Script/M2Content.J\_SingletonSpawnerComponent",NewName="/Script/M2Content.M2\_SingletonSpawnerComponent") +PropertyRedirects=(OldName="/M2Content/Core/BP\_M2\_PlayerCharacterBase.BP\_TH\_CharacterMoveSpeedComponent",NewName="/M2Content/Core/BP\_M2\_PlayerCharacterBase.BPC\_CharacterMoveSpeedComponent") +PropertyRedirects=(OldName="J\_EmotePrimaryAsset.EmoteSoundBase",NewName="J\_EmotePrimaryAsset.EmoteSound") +PropertyRedirects=(OldName="J\_EmotePrimaryAsset.SuperEmoteSoundBase",NewName="J\_EmotePrimaryAsset.SuperEmoteSound") +StructRedirects=(OldName="/Script/M2ContentEditor.M2AnimNode\_PhizMocapPose",NewName="/Script/M2ContentEditor.M2AnimNode\_MocapPose") +ClassRedirects=(OldName="/Script/M2ContentEditor.M2AnimGraphNode\_PhizMocapPose",NewName="/Script/M2ContentEditor.M2AnimGraphNode\_MocapPose") +FunctionRedirects=(OldName="/Script/M2Content.JM\_EquipmentComponent.AddItemNameToEquipment",NewName="/Script/M2Content.JM\_EquipmentComponent.AddItemNameToAssignmentSlots") +FunctionRedirects=(OldName="/Script/M2Content.JM\_EquipmentComponent.GetLoadedEquipmentAssets",NewName="/Script/M2Content.JM\_EquipmentComponent.GetLoadedItems") +FunctionRedirects=(OldName="/Script/M2Content.JM\_EquipmentComponent.AddItemKeyToEquipment",NewName="/Script/M2Content.JM\_EquipmentComponent.AddItemKeyToAssignmentSlots") +FunctionRedirects=(OldName="/Script/M2Content.JM\_EquipmentComponent.GetEquipmentSlotItemKeys",NewName="/Script/M2Content.JM\_EquipmentComponent.GetSlotItemKeys") +FunctionRedirects=(OldName="/Script/M2Content.JM\_EquipmentComponent.UnequipItemByKey",NewName="/Script/M2Content.JM\_EquipmentComponent.UnassignItemByKey") +FunctionRedirects=(OldName="/Script/M2Content.JM\_EquipmentComponent.GetEquippedItems",NewName="/Script/M2Content.JM\_EquipmentComponent.GetAssignedItems") +PropertyRedirects=(OldName="/Script/M2Content.JM\_EquipmentComponent.OnEquipmentLoaded",NewName="/Script/M2Content.JM\_EquipmentComponent.OnItemsLoaded") +PropertyRedirects=(OldName="/Script/M2Content.JM\_EquipmentComponent.OnEquipmentUpdated",NewName="/Script/M2Content.JM\_EquipmentComponent.OnItemsUpdated") +FunctionRedirects=(OldName="/Script/M2Content.J\_ItemExecutorBase.NotifyAbilityActivated",NewName="/Script/M2Content.J\_ItemExecutorBase.NotifyAbilityFinished") +FunctionRedirects=(OldName="/Script/M2Content.M2\_ItemVisualsBase.TearDown\_BP",NewName="/Script/M2Content.M2\_ItemVisualsBase.TearDown\_Event") +StructRedirects=(OldName="/Script/M2Content.J\_ItemToggleProperty",NewName="/Script/M2Content.M2\_ItemToggleProperty") +ClassRedirects=(OldName="/Script/M2Content.M2\_InventoryMetadataComponent",NewName="/Script/M2Content.M2M\_InventoryMetadataComponent") +PropertyRedirects=(OldName="M2\_ItemQuickbarWidget.QuickbarComponentClass", NewName="M2\_ItemQuickbarWidget.QuickbarViewClass") +ClassRedirects=(OldName="/Script/M2Content.M2\_PlaceModeQuickbarWidget",NewName="/Script/M2Content.M2\_QuickbarWrapperWidget") +PackageRedirects=(OldName="/M2Content/Props/BPM\_WeatherControls",NewName="/M2Content/Core/TimeOfDay/BPM\_TimeOfDayControls") +ClassRedirects=(OldName="/M2Content/Props/BPM\_WeatherControls",NewName="/M2Content/Core/TimeOfDay/BPM\_TimeOfDayControls") +PackageRedirects=(OldName="/M2Content/Maps/ExampleMap/...",NewName="/M2Example/Maps/",MatchWildcard=true) +ClassRedirects=(OldName="/M2Content/Maps/ExampleMap/...",NewName="/M2Example/Maps/",MatchWildcard=true) +PackageRedirects=(OldName="/M2Content/AI/BTT\_StoreSuperEmoteIndex",NewName="/M2Content/AI/BTT\_StoreSuperEmoteName") +ClassRedirects=(OldName="/M2Content/AI/BTT\_StoreSuperEmoteIndex.BTT\_StoreSuperEmoteIndex\_C",NewName="/M2Content/AI/BTT\_StoreSuperEmoteName.BTT\_StoreSuperEmoteName\_C") +FunctionRedirects=(OldName="/Script/M2Content.M2\_CharacterInhibitorComponent.OnCaptureHold",NewName="/Script/M2Content.M2\_CharacterInhibitorComponent.QueueReleaseFromCapture") +FunctionRedirects=(OldName="/Script/M2Content.M2\_CharacterInhibitorComponent.OnCaptureRelease",NewName="/Script/M2Content.M2\_CharacterInhibitorComponent.ReleaseFromCapture") +FunctionRedirects=(OldName="/Script/M2Content.M2\_CharacterCaptureComponent.Hold",NewName="/Script/M2Content.M2\_CharacterCaptureComponent.QueueRelease") +EnumRedirects=(OldName="/Script/M2Content.EM2\_CharacterCaptureState",ValueChanges=(("ReleaseQueued","QueuedForRelease"))) +PackageRedirects=(OldName="/M2Content/UI/Settings/SettingAssets...",NewName="/M2Content/UI/Settings/SettingData",MatchWildcard=true) +PackageRedirects=(OldName="/M2Content/UI/Settings/WBP\_Settings",NewName="/M2Content/UI/Settings/WBP\_M2\_Settings") +PropertyRedirects=(OldName="/Script/M2Content.J\_PawnSetAsset.BasePawn",NewName="/Script/M2Content.J\_PawnSetAsset.OverrideAuthPawnClass") +PropertyRedirects=(OldName="/Script/M2Content.M2M\_AvatarShapeRulesComponent.ShootableChannel",NewName="/Script/M2Content.M2M\_AvatarPhysicsAssetComponent.InteractionQueryChannel") +ClassRedirects=(OldName="/Script/M2Content.M2M\_AvatarShapeRulesComponent",NewName="/Script/M2Content.M2M\_AvatarPhysicsAssetComponent") +PropertyRedirects=(OldName="/Script/M2Content.M2M\_AvatarPhysicsAssetComponent.ShootableQueryChannel",NewName="/Script/M2Content.M2M\_AvatarPhysicsAssetComponent.InteractionQueryChannel") +PropertyRedirects=(OldName="/Script/M2Content.M2M\_AvatarPhysicsAssetComponent.ShootableColliderChannel",NewName="/Script/M2Content.M2M\_AvatarPhysicsAssetComponent.InteractionColliderChannel") +FunctionRedirects=(OldName="/Script/M2Content.J\_BootflowSubsystem.HandleAuthActorSpawned",NewName="/Script/M2Content.J\_BootflowSubsystem.HandleAuthActorSpawned\_JM") +FunctionRedirects=(OldName="/Script/M2Content.J\_BootflowSubsystem.HandleAuthPawnSpawned",NewName="/Script/M2Content.J\_BootflowSubsystem.HandleAuthPawnSpawned\_JM") +FunctionRedirects=(OldName="/Script/M2Content.J\_BootflowSubsystem.GetAuthActor",NewName="/Script/M2Content.J\_BootflowSubsystem.GetAuthActor\_JM") +PropertyRedirects=(OldName="/Script/M2Content.M2\_MocapCoordinatorComponent.bShowMoveAiReceiverMesh",NewName="/Script/M2Content.M2\_MocapCoordinatorComponent.bShowMocapReceiverMesh") +PropertyRedirects=(OldName="/Script/M2Content.M2\_MocapCoordinatorComponent.bShowDummyMainMesh",NewName="/Script/M2Content.M2\_MocapCoordinatorComponent.bShowRetargetedPoseMesh") +PropertyRedirects=(OldName="/Script/M2Content.M2\_MocapCoordinatorComponent.MoveAiReceiverAnimClass",NewName="/Script/M2Content.M2\_MocapCoordinatorComponent.MocapReceiverAnimClass") +PackageRedirects=(OldName="/M2Content/WebPlatform/BP\_M2\_WPRoleDataProvider",NewName="/M2Content/WebPlatform/BP\_M2\_RoleDataProvider") +ClassRedirects=(OldName="/M2Content/WebPlatform/BP\_M2\_WPRoleDataProvider.BP\_M2\_WPRoleDataProvider\_C",NewName="/M2Content/WebPlatform/BP\_M2\_RoleDataProvider.BP\_M2\_RoleDataProvider\_C") +PackageRedirects=(OldName="/M2Content/WebPlatform/BP\_M2\_WPProfileDataProvider",NewName="/M2Content/WebPlatform/BP\_M2\_ProfileDataProvider") +ClassRedirects=(OldName="/M2Content/WebPlatform/BP\_M2\_WPProfileDataProvider.BP\_M2\_WPProfileDataProvider\_C",NewName="/M2Content/WebPlatform/BP\_M2\_ProfileDataProvider.BP\_M2\_ProfileDataProvider\_C") +PackageRedirects=(OldName="/M2Content/WebPlatform/BP\_M2\_WPKeyValueStoreService",NewName="/M2Content/WebPlatform/BP\_M2\_KVStoreService") +ClassRedirects=(OldName="/M2Content/WebPlatform/BP\_M2\_WPKeyValueStoreService.BP\_M2\_WPKeyValueStoreService\_C",NewName="/M2Content/WebPlatform/BP\_M2\_KVStoreService.BP\_M2\_KVStoreService\_C") +StructRedirects=(OldName="/M2Content/WebPlatform/ApiModels/SM2\_WP\_KvStoreReadItem.SM2\_WP\_KvStoreReadItem",NewName="/M2Content/WebPlatform/ApiModels/S\_M2\_KvStoreReadItem.S\_M2\_KvStoreReadItem") +ObjectRedirects=(OldName="/M2Content/WebPlatform/ApiModels/SM2\_WP\_KvStoreReadItem.SM2\_WP\_KvStoreReadItem",NewName="/M2Content/WebPlatform/ApiModels/S\_M2\_KvStoreReadItem.S\_M2\_KvStoreReadItem") +PackageRedirects=(OldName="/M2Content/WebPlatform/ApiModels/SM2\_WP\_KvStoreReadItem",NewName="/M2Content/WebPlatform/ApiModels/S\_M2\_KvStoreReadItem") +StructRedirects=(OldName="/M2Content/WebPlatform/ApiModels/SM2\_WP\_KvStoreReadKey.SM2\_WP\_KvStoreReadKey",NewName="/M2Content/WebPlatform/ApiModels/S\_M2\_KvStoreReadKey.S\_M2\_KvStoreReadKey") +ObjectRedirects=(OldName="/M2Content/WebPlatform/ApiModels/SM2\_WP\_KvStoreReadKey.SM2\_WP\_KvStoreReadKey",NewName="/M2Content/WebPlatform/ApiModels/S\_M2\_KvStoreReadKey.S\_M2\_KvStoreReadKey") +PackageRedirects=(OldName="/M2Content/WebPlatform/ApiModels/SM2\_WP\_KvStoreReadKey",NewName="/M2Content/WebPlatform/ApiModels/S\_M2\_KvStoreReadKey") +StructRedirects=(OldName="/M2Content/WebPlatform/SM2\_PendingProfileQuery.SM2\_PendingProfileQuery",NewName="/M2Content/WebPlatform/S\_M2\_PendingProfileQuery.S\_M2\_PendingProfileQuery") +ObjectRedirects=(OldName="/M2Content/WebPlatform/SM2\_PendingProfileQuery.SM2\_PendingProfileQuery",NewName="/M2Content/WebPlatform/S\_M2\_PendingProfileQuery.S\_M2\_PendingProfileQuery") +PackageRedirects=(OldName="/M2Content/WebPlatform/SM2\_PendingProfileQuery",NewName="/M2Content/WebPlatform/S\_M2\_PendingProfileQuery") +StructRedirects=(OldName="/M2Content/WebPlatform/SM2\_UserContext.SM2\_UserContext",NewName="/M2Content/WebPlatform/S\_M2\_UserContext.S\_M2\_UserContext") +ObjectRedirects=(OldName="/M2Content/WebPlatform/SM2\_UserContext.SM2\_UserContext",NewName="/M2Content/WebPlatform/S\_M2\_UserContext.S\_M2\_UserContext") +PackageRedirects=(OldName="/M2Content/WebPlatform/SM2\_UserContext",NewName="/M2Content/WebPlatform/S\_M2\_UserContext") +PackageRedirects=(OldName="/M2Content/WorldBuilderLaunch/WBC\_WBL\_StatusDisplayInterface",NewName="/M2Content/WorldBuilderLaunch/BPI\_WBL\_StatusDisplayInterface") +ClassRedirects=(OldName="/M2Content/WorldBuilderLaunch/WBC\_WBL\_StatusDisplayInterface.WBC\_WBL\_StatusDisplayInterface\_C",NewName="/M2Content/WorldBuilderLaunch/BPI\_WBL\_StatusDisplayInterface.BPI\_WBL\_StatusDisplayInterface\_C") +FunctionRedirects=(OldName="/Script/M2Content.M2\_NotificationsFunctionLibrary.RemoveNotificationsById",NewName="/Script/M2Content.M2\_NotificationsFunctionLibrary.RemoveActiveNotificationById") +FunctionRedirects=(OldName="/Script/M2Content.M2M\_NotificationsSingleton.RemoveNotificationsById",NewName="/Script/M2Content.M2M\_NotificationsSingleton.RemoveActiveNotificationById") +PackageRedirects=(OldName="/M2Unreal/...",NewName="/M2Core/",MatchWildcard=true) +ClassRedirects=(OldName="/Script/M2Unreal...",NewName="/Script/M2Core.",MatchWildcard=true) +ClassRedirects=(OldName="/Script/JunoCoreUI.J\_HUDLayer",NewName="/Script/JunoCoreUI.J\_HUDLayerBase") +StructRedirects=(OldName="/Script/M2Unreal...",NewName="/Script/M2Core.",MatchWildcard=true) +ClassRedirects=(OldName="/Script/JunoAvatars.J\_AvatarSchemeSet",NewName="/Script/JunoModularCharacters.J\_AvatarSchemeSet") +PackageRedirects=(OldName="/Script/JunoAvatars",Removed=true) +EnumRedirects=(OldName="EJ\_InteractionPromptType",ValueChanges=(("MultipleButtons","BasicMenu"))) +PackageRedirects=(OldName="/Script/M2TextChat",NewName="/Script/M2Social") +ClassRedirects=(OldName="/Script/M2Social.M2\_TextChatComponent",NewName="/Script/M2Social.M2M\_TextChatComponent") +ClassRedirects=(OldName="/Script/M2TextChat.M2\_TextChatComponent",NewName="/Script/M2Social.M2M\_TextChatComponent") +ClassRedirects=(OldName="/Script/JunoCoreUI.M2\_StandardButton",NewName="/Script/JunoCoreUI.M2\_StandardButtonWidgetBase") +ClassRedirects=(OldName="/Script/JunoCoreUI.M2\_StandardButtonMenu",NewName="/Script/JunoCoreUI.M2\_StandardButtonListWidget") +ClassRedirects=(OldName="/Script/JunoCoreUI.M2\_StandardGroupEntryButton",NewName="/Script/JunoCoreUI.M2\_StandardGroupEntryButtonWidget") +ClassRedirects=(OldName="/Script/JunoCoreUI.M2\_StandardButtonMenuWidget",NewName="/Script/JunoCoreUI.M2\_StandardButtonListWidget") +FunctionRedirects=(OldName="/Script/JunoCoreUI.M2\_StandardButtonBaseData.Initialize",NewName="/Script/JunoCoreUI.M2\_StandardButtonBaseData.InitializeOnClient") +ClassRedirects=(OldName="/Script/M2ObjectInteraction.M2\_LoSTargetingStrategy",NewName="/Script/M2ObjectInteraction.M2\_ScreenCenterPriorityTargetingStrategy") +EnumRedirects=(OldName="/Script/M2ObjectInteraction.EM2\_InteractionCloseMenuOnSelectionOverride",NewName="/Script/M2ObjectInteraction.EM2\_InteractionOverride") +FunctionRedirects=(OldName="/Script/M2ObjectInteraction.M2\_InteractableComponent.AddNonParentOption",NewName="/Script/M2ObjectInteraction.M2\_InteractableComponent.AddInteractionOption") +FunctionRedirects=(OldName="/Script/M2ObjectInteraction.M2\_InteractableComponent.RemoveNonParentOption",NewName="/Script/M2ObjectInteraction.M2\_InteractableComponent.RemoveInteractionOption") +PropertyRedirects=(OldName="M2\_StandardButtonBaseData.Icon",NewName="IconLeft1") +StructRedirects=(OldName="/Script/M2Tags.M2\_UserTagPlayers",NewName="/Script/M2Tags.M2\_MorpheusActorSet") +PropertyRedirects=(OldName="J\_SkinPrimaryAsset.SkinSettings",NewName="J\_SkinPrimaryAsset.CustomSkinSettings"B) +FunctionRedirects=(OldName="/Script/M2ObjectInteraction.M2\_InteractableHandlerComponent.GetCurrentMousedOverInteractable",NewName="/Script/M2ObjectInteraction.M2\_InteractableHandlerComponent.GetCurrentMousedOverInteractables") +ClassRedirects=(OldName="/Script/M2ObjectInteraction.M2\_TargetingStrategy",NewName="/Script/M2ObjectInteraction.M2\_InteractionTargetingStrategy") +ClassRedirects=(OldName="/Script/M2ObjectInteraction.M2\_DefaultTargetingStrategy",NewName="/Script/M2ObjectInteraction.M2\_CursorLineTraceTargetingStrategy") +PropertyRedirects=(OldName="/Script/M2ObjectInteraction.M2\_InteractableHandlerComponent.OnInteractionRequested",NewName="/Script/M2ObjectInteraction.M2\_InteractableHandlerComponent.OnOptionSelected") +ClassRedirects=(OldName="/Script/JunoCoreUI.J\_JunoCoreWidget",NewName="/Script/JunoCoreUI.M2\_CoreWidget") +FunctionRedirects=(OldName="/Script/JunoModularCharacters.JM\_ModularCharacterComponent.LoadInteropCharacterFromProfile",NewName="/Script/JunoModularCharacters.JM\_ModularCharacterComponent.LoadAvatarFromM2Profile") +StructRedirects=(OldName="/Script/JunoUtils.M2\_JsonValueWrapper",NewName="/Script/M2HttpUtilities.M2\_JsonValueWrapper") +ClassRedirects=(OldName="/Script/JunoUtils.M2\_JsonFunctionLibrary",NewName="/Script/M2HttpUtilities.M2\_JsonFunctionLibrary") +ClassRedirects=(OldName="/Script/JunoUtils.M2\_DownloadJsonNode",NewName="/Script/M2HttpUtilities.M2\_DownloadJsonNode") +ClassRedirects=(OldName="/Script/JunoUtils.M2\_K2Node\_JsonObjectToStruct",NewName="/Script/M2HttpUtilities.M2\_K2Node\_JsonObjectToStruct") +EnumRedirects=(OldName="/Script/JunoUtils.M2\_JsonValueType",NewName="/Script/M2HttpUtilities.M2\_JsonValueType")) +PropertyRedirects=(OldName="J\_ModularCharacterComponent.OnMeshUpdated\_BP",NewName="J\_ModularCharacterComponent.OnBaseMeshUpdated") +FunctionRedirects=(OldName="/Script/JunoModularCharacters.JM\_ModularCharacterComponent.ResetSkeleton",NewName="/Script/JunoModularCharacters.JM\_ModularCharacterComponent.SetPostProcessAnimBlueprint") +FunctionRedirects=(OldName="/Script/M2HttpUtilities.M2\_JsonFunctionLibrary.GetJsonValueNull",NewName="/Script/M2HttpUtilities.M2\_JsonFunctionLibrary.GetJsonValueAsNull") +FunctionRedirects=(OldName="/Script/M2HttpUtilities.M2\_JsonFunctionLibrary.GetJsonValueInteger",NewName="/Script/M2HttpUtilities.M2\_JsonFunctionLibrary.GetJsonValueAsInteger") +FunctionRedirects=(OldName="/Script/M2HttpUtilities.M2\_JsonFunctionLibrary.GetJsonValueNumber",NewName="/Script/M2HttpUtilities.M2\_JsonFunctionLibrary.GetJsonValueAsNumber") +FunctionRedirects=(OldName="/Script/M2HttpUtilities.M2\_JsonFunctionLibrary.GetJsonValueBoolean",NewName="/Script/M2HttpUtilities.M2\_JsonFunctionLibrary.GetJsonValueAsBoolean") +FunctionRedirects=(OldName="/Script/M2HttpUtilities.M2\_JsonFunctionLibrary.GetJsonValueString",NewName="/Script/M2HttpUtilities.M2\_JsonFunctionLibrary.GetJsonValueAsString") +FunctionRedirects=(OldName="/Script/M2HttpUtilities.M2\_JsonFunctionLibrary.GetJsonValueNumberString",NewName="/Script/M2HttpUtilities.M2\_JsonFunctionLibrary.GetJsonValueAsNumberString") +FunctionRedirects=(OldName="/Script/M2HttpUtilities.M2\_JsonFunctionLibrary.GetJsonValueObject",NewName="/Script/M2HttpUtilities.M2\_JsonFunctionLibrary.GetJsonValueAsObject") +ClassRedirects=(OldName="/Script/JunoUtils.J\_DataAsset",NewName="/Script/JunoUtils.M2\_DataAsset") +FunctionRedirects=(OldName="/Script/JunoCoreUI.M2\_CoreUIFunctionLibrary.WidgetConnectedToHUD",NewName="/Script/JunoCoreUI.M2\_CoreUIFunctionLibrary.IsWidgetAddedToViewport") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/BP\_ControlPanelWidget",NewName="/M2Extras\_ControlPanels/BP\_ControlPanelWidget") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/BP\_ControlPanelWidget",NewName="/M2Extras\_ControlPanels/BP\_ControlPanelWidget") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/BPC\_ControlPanelAutoOpener",NewName="/M2Extras\_ControlPanels/BPC\_ControlPanelAutoOpener") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/BPC\_ControlPanelAutoOpener",NewName="/M2Extras\_ControlPanels/BPC\_ControlPanelAutoOpener") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/BPC\_ControlPanelBuilder",NewName="/M2Extras\_ControlPanels/BPC\_ControlPanelBuilder") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/BPC\_ControlPanelBuilder",NewName="/M2Extras\_ControlPanels/BPC\_ControlPanelBuilder") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/BPFL\_ControlsFunctionLibrary",NewName="/M2Extras\_ControlPanels/BPFL\_ControlsFunctionLibrary") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/BPFL\_ControlsFunctionLibrary",NewName="/M2Extras\_ControlPanels/BPFL\_ControlsFunctionLibrary") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/BPI\_ControlValuesProvider",NewName="/M2Extras\_ControlPanels/BPI\_ControlValuesProvider") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/BPI\_ControlValuesProvider",NewName="/M2Extras\_ControlPanels/BPI\_ControlValuesProvider") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/BPM\_ControlPanelBase",NewName="/M2Extras\_ControlPanels/BPM\_ControlPanelBase") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/BPM\_ControlPanelBase",NewName="/M2Extras\_ControlPanels/BPM\_ControlPanelBase") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/BPM\_ControlPanelPlayerComponent",NewName="/M2Extras\_ControlPanels/BPM\_ControlPanelPlayerComponent") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/BPM\_ControlPanelPlayerComponent",NewName="/M2Extras\_ControlPanels/BPM\_ControlPanelPlayerComponent") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/BPMC\_ControlPanelProvider",NewName="/M2Extras\_ControlPanels/BPMC\_ControlPanelProvider") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/BPMC\_ControlPanelProvider",NewName="/M2Extras\_ControlPanels/BPMC\_ControlPanelProvider") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/BPML\_ControlPanelMacros",NewName="/M2Extras\_ControlPanels/BPML\_ControlPanelMacros") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/BPML\_ControlPanelMacros",NewName="/M2Extras\_ControlPanels/BPML\_ControlPanelMacros") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/ControlPanelHandler/BPM\_ControlPanelsHandler",NewName="/M2Extras\_ControlPanels/ControlPanelHandler/BPM\_ControlPanelsHandler") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/ControlPanelHandler/BPM\_ControlPanelsHandler",NewName="/M2Extras\_ControlPanels/ControlPanelHandler/BPM\_ControlPanelsHandler") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/ControlPanelHandler/WBP\_ControlPanelSet",NewName="/M2Extras\_ControlPanels/ControlPanelHandler/WBP\_ControlPanelSet") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/ControlPanelHandler/WBP\_ControlPanelSet",NewName="/M2Extras\_ControlPanels/ControlPanelHandler/WBP\_ControlPanelSet") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/ControlPanelHandler/WBP\_ControlPanelSetElement",NewName="/M2Extras\_ControlPanels/ControlPanelHandler/WBP\_ControlPanelSetElement") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/ControlPanelHandler/WBP\_ControlPanelSetElement",NewName="/M2Extras\_ControlPanels/ControlPanelHandler/WBP\_ControlPanelSetElement") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/ControlPanelHandler/WBP\_ControlPanelSetsMenu",NewName="/M2Extras\_ControlPanels/ControlPanelHandler/WBP\_ControlPanelSetsMenu") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/ControlPanelHandler/WBP\_ControlPanelSetsMenu",NewName="/M2Extras\_ControlPanels/ControlPanelHandler/WBP\_ControlPanelSetsMenu") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/ControlPanelHandler/WBP\_ControlPanelsHandlerOptions",NewName="/M2Extras\_ControlPanels/ControlPanelHandler/WBP\_ControlPanelsHandlerOptions") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/ControlPanelHandler/WBP\_ControlPanelsHandlerOptions",NewName="/M2Extras\_ControlPanels/ControlPanelHandler/WBP\_ControlPanelsHandlerOptions") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/Examples/BPM\_AllControlMethodsExample",NewName="/M2Extras\_ControlPanels/Examples/BPM\_AllControlMethodsExample") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/Examples/BPM\_AllControlMethodsExample",NewName="/M2Extras\_ControlPanels/Examples/BPM\_AllControlMethodsExample") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/Examples/BPM\_ControllablePropertyComponentsExample",NewName="/M2Extras\_ControlPanels/Examples/BPM\_ControllablePropertyComponentsExample") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/Examples/BPM\_ControllablePropertyComponentsExample",NewName="/M2Extras\_ControlPanels/Examples/BPM\_ControllablePropertyComponentsExample") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/Examples/BPM\_ControlPanel\_WidgetsExample",NewName="/M2Extras\_ControlPanels/Examples/BPM\_ControlPanel\_WidgetsExample") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/Examples/BPM\_ControlPanel\_WidgetsExample",NewName="/M2Extras\_ControlPanels/Examples/BPM\_ControlPanel\_WidgetsExample") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/Examples/BPM\_ManipulateControlWidgetsExample",NewName="/M2Extras\_ControlPanels/Examples/BPM\_ManipulateControlWidgetsExample") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/Examples/BPM\_ManipulateControlWidgetsExample",NewName="/M2Extras\_ControlPanels/Examples/BPM\_ManipulateControlWidgetsExample") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/Examples/WBP\_ControlPanelGymInfo",NewName="/M2Extras\_ControlPanels/Examples/WBP\_ControlPanelGymInfo") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/Examples/WBP\_ControlPanelGymInfo",NewName="/M2Extras\_ControlPanels/Examples/WBP\_ControlPanelGymInfo") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/SaveGame/BP\_ControlPresetsSaveGame",NewName="/M2Extras\_ControlPanels/SaveGame/BP\_ControlPresetsSaveGame") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/SaveGame/BP\_ControlPresetsSaveGame",NewName="/M2Extras\_ControlPanels/SaveGame/BP\_ControlPresetsSaveGame") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/SaveGame/WBP\_ControlPresetLoadPreset",NewName="/M2Extras\_ControlPanels/SaveGame/WBP\_ControlPresetLoadPreset") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/SaveGame/WBP\_ControlPresetLoadPreset",NewName="/M2Extras\_ControlPanels/SaveGame/WBP\_ControlPresetLoadPreset") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/SaveGame/WBP\_ControlPresetSavePreset",NewName="/M2Extras\_ControlPanels/SaveGame/WBP\_ControlPresetSavePreset") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/SaveGame/WBP\_ControlPresetSavePreset",NewName="/M2Extras\_ControlPanels/SaveGame/WBP\_ControlPresetSavePreset") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/BPFL\_ControlPanel\_SkinUtilities",NewName="/M2Extras\_ControlPanels/UI/BPFL\_ControlPanel\_SkinUtilities") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/BPFL\_ControlPanel\_SkinUtilities",NewName="/M2Extras\_ControlPanels/UI/BPFL\_ControlPanel\_SkinUtilities") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/BPI\_CP\_WindowContentProvider",NewName="/M2Extras\_ControlPanels/UI/BPI\_CP\_WindowContentProvider") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/BPI\_CP\_WindowContentProvider",NewName="/M2Extras\_ControlPanels/UI/BPI\_CP\_WindowContentProvider") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_Base",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_Base") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_Base",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_Base") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_ButtonGroup",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_ButtonGroup") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_ButtonGroup",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_ButtonGroup") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_ButtonSequence",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_ButtonSequence") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_ButtonSequence",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_ButtonSequence") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_ButtonToggle",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_ButtonToggle") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_ButtonToggle",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_ButtonToggle") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_ButtonTrigger",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_ButtonTrigger") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_ButtonTrigger",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_ButtonTrigger") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_ButtonTriggers",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_ButtonTriggers") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_ButtonTriggers",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_ButtonTriggers") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_Checkbox",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_Checkbox") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_Checkbox",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_Checkbox") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_CheckboxFlags",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_CheckboxFlags") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_CheckboxFlags",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_CheckboxFlags") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_ColorSwatches",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_ColorSwatches") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_ColorSwatches",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_ColorSwatches") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_Dropdown",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_Dropdown") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_Dropdown",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_Dropdown") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_Slider",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_Slider") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_Slider",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_Slider") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_Spinbox",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_Spinbox") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_Spinbox",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_Spinbox") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_TEMPLATECOPYME",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_TEMPLATECOPYME") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_TEMPLATECOPYME",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_TEMPLATECOPYME") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_TextboxMultiline",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_TextboxMultiline") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_TextboxMultiline",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_TextboxMultiline") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_TextBoxSingleline",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_TextBoxSingleline") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_TextBoxSingleline",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_TextBoxSingleline") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_Vector",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_Vector") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/ControlWidgets/WBP\_CP\_Control\_Vector",NewName="/M2Extras\_ControlPanels/UI/ControlWidgets/WBP\_CP\_Control\_Vector") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/Docking/BPI\_DockableWidget",NewName="/M2Extras\_ControlPanels/UI/Docking/BPI\_DockableWidget") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/Docking/BPI\_DockableWidget",NewName="/M2Extras\_ControlPanels/UI/Docking/BPI\_DockableWidget") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/Elements/WBP\_CP\_Button",NewName="/M2Extras\_ControlPanels/UI/Elements/WBP\_CP\_Button") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/Elements/WBP\_CP\_Button",NewName="/M2Extras\_ControlPanels/UI/Elements/WBP\_CP\_Button") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/Elements/WBP\_CP\_ButtonGroup",NewName="/M2Extras\_ControlPanels/UI/Elements/WBP\_CP\_ButtonGroup") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/Elements/WBP\_CP\_ButtonGroup",NewName="/M2Extras\_ControlPanels/UI/Elements/WBP\_CP\_ButtonGroup") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/Elements/WBP\_CP\_EditableText",NewName="/M2Extras\_ControlPanels/UI/Elements/WBP\_CP\_EditableText") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/Elements/WBP\_CP\_EditableText",NewName="/M2Extras\_ControlPanels/UI/Elements/WBP\_CP\_EditableText") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/Elements/WBP\_CP\_GenericExpandableArea",NewName="/M2Extras\_ControlPanels/UI/Elements/WBP\_CP\_GenericExpandableArea") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/Elements/WBP\_CP\_GenericExpandableArea",NewName="/M2Extras\_ControlPanels/UI/Elements/WBP\_CP\_GenericExpandableArea") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/Elements/WBP\_CP\_SlateWidgetContainer",NewName="/M2Extras\_ControlPanels/UI/Elements/WBP\_CP\_SlateWidgetContainer") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/Elements/WBP\_CP\_SlateWidgetContainer",NewName="/M2Extras\_ControlPanels/UI/Elements/WBP\_CP\_SlateWidgetContainer") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/Elements/WBP\_CP\_TemporaryTextMessage",NewName="/M2Extras\_ControlPanels/UI/Elements/WBP\_CP\_TemporaryTextMessage") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/Elements/WBP\_CP\_TemporaryTextMessage",NewName="/M2Extras\_ControlPanels/UI/Elements/WBP\_CP\_TemporaryTextMessage") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/Elements/WBP\_CP\_TextMessage",NewName="/M2Extras\_ControlPanels/UI/Elements/WBP\_CP\_TextMessage") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/Elements/WBP\_CP\_TextMessage",NewName="/M2Extras\_ControlPanels/UI/Elements/WBP\_CP\_TextMessage") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/WBP\_ControlContainer",NewName="/M2Extras\_ControlPanels/UI/WBP\_ControlContainer") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/WBP\_ControlContainer",NewName="/M2Extras\_ControlPanels/UI/WBP\_ControlContainer") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/WBP\_ControlPanel",NewName="/M2Extras\_ControlPanels/UI/WBP\_ControlPanel") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/WBP\_ControlPanel",NewName="/M2Extras\_ControlPanels/UI/WBP\_ControlPanel") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/WBP\_ControlPanel\_Movable",NewName="/M2Extras\_ControlPanels/UI/WBP\_ControlPanel\_Movable") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/WBP\_ControlPanel\_Movable",NewName="/M2Extras\_ControlPanels/UI/WBP\_ControlPanel\_Movable") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/WBP\_ControlPanelDock",NewName="/M2Extras\_ControlPanels/UI/WBP\_ControlPanelDock") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/WBP\_ControlPanelDock",NewName="/M2Extras\_ControlPanels/UI/WBP\_ControlPanelDock") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/WBP\_ControlPanelDockEntry",NewName="/M2Extras\_ControlPanels/UI/WBP\_ControlPanelDockEntry") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/WBP\_ControlPanelDockEntry",NewName="/M2Extras\_ControlPanels/UI/WBP\_ControlPanelDockEntry") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/WBP\_CP\_Content\_Header",NewName="/M2Extras\_ControlPanels/UI/WBP\_CP\_Content\_Header") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/WBP\_CP\_Content\_Header",NewName="/M2Extras\_ControlPanels/UI/WBP\_CP\_Content\_Header") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/WBP\_CP\_Content\_Label",NewName="/M2Extras\_ControlPanels/UI/WBP\_CP\_Content\_Label") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/WBP\_CP\_Content\_Label",NewName="/M2Extras\_ControlPanels/UI/WBP\_CP\_Content\_Label") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/WBP\_CP\_Content\_PanelContainer",NewName="/M2Extras\_ControlPanels/UI/WBP\_CP\_Content\_PanelContainer") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/UI/WBP\_CP\_Content\_PanelContainer",NewName="/M2Extras\_ControlPanels/UI/WBP\_CP\_Content\_PanelContainer") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_BoolCheckbox",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_BoolCheckbox") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_BoolCheckbox",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_BoolCheckbox") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_BoolToggleButton",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_BoolToggleButton") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_BoolToggleButton",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_BoolToggleButton") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_ButtonGroup",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_ButtonGroup") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_ButtonGroup",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_ButtonGroup") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_ButtonSequence",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_ButtonSequence") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_ButtonSequence",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_ButtonSequence") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_CheckboxFlags",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_CheckboxFlags") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_CheckboxFlags",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_CheckboxFlags") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_Dropdown",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_Dropdown") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_Dropdown",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_Dropdown") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_FloatSlider",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_FloatSlider") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_FloatSlider",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_FloatSlider") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_FloatSpinbox",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_FloatSpinbox") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_FloatSpinbox",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_FloatSpinbox") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_IntSlider",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_IntSlider") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_IntSlider",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_IntSlider") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_IntSpinBox",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_IntSpinBox") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_IntSpinBox",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_IntSpinBox") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_RGBSwatches",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_RGBSwatches") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_RGBSwatches",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_RGBSwatches") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_TextBoxMultiLine",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_TextBoxMultiLine") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_TextBoxMultiLine",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_TextBoxMultiLine") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_TextBoxSingleLine",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_TextBoxSingleLine") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_TextBoxSingleLine",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_TextBoxSingleLine") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_Trigger",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_Trigger") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_Trigger",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_Trigger") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_TriggerGroup",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_TriggerGroup") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_TriggerGroup",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_TriggerGroup") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_VectorSpinboxes",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_VectorSpinboxes") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BP\_M2\_WidgetProvider\_VectorSpinboxes",NewName="/M2Extras\_ControlPanels/WidgetProviders/BP\_M2\_WidgetProvider\_VectorSpinboxes") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BPI\_WidgetProvider\_GroupsReceiver",NewName="/M2Extras\_ControlPanels/WidgetProviders/BPI\_WidgetProvider\_GroupsReceiver") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BPI\_WidgetProvider\_GroupsReceiver",NewName="/M2Extras\_ControlPanels/WidgetProviders/BPI\_WidgetProvider\_GroupsReceiver") +PackageRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BPI\_WidgetProvider\_OptionsReceiver",NewName="/M2Extras\_ControlPanels/WidgetProviders/BPI\_WidgetProvider\_OptionsReceiver") +ClassRedirects=(OldName="/M2Core/JunoInteraction/ControlPanel/WidgetProviders/BPI\_WidgetProvider\_OptionsReceiver",NewName="/M2Extras\_ControlPanels/WidgetProviders/BPI\_WidgetProvider\_OptionsReceiver") +PackageRedirects=(OldName="/M2Core/JunoMillicast/BP\_MillicastScreen\_Base",NewName="/M2Core/Millicast/BP\_MillicastScreen\_Base") +ClassRedirects=(OldName="/M2Core/JunoMillicast/BP\_MillicastScreen\_Base.BP\_MillicastScreen\_Base\_C",NewName="/M2Core/Millicast/BP\_MillicastScreen\_Base.BP\_MillicastScreen\_Base\_C") +PackageRedirects=(OldName="/M2Core/JunoMillicast/BP\_MillicastChannel",NewName="/M2Core/Millicast/BP\_MillicastChannel") +ClassRedirects=(OldName="/M2Core/JunoMillicast/BP\_MillicastChannel.BP\_MillicastChannel\_C",NewName="/M2Core/Millicast/BP\_MillicastChannel.BP\_MillicastChannel\_C") +PackageRedirects=(OldName="/M2Core/JunoMillicast/BP\_MillicastCapture",NewName="/M2Core/Millicast/BP\_MillicastCapture") +ClassRedirects=(OldName="/M2Core/JunoMillicast/BP\_MillicastCapture.BP\_MillicastCapture\_C",NewName="/M2Core/Millicast/BP\_MillicastCapture.BP\_MillicastCapture\_C")

+PackageRedirects=(OldName="/ODK/Depreciated",NewName="/ODK/Deprecated",MatchSubstring=true) +ClassRedirects=(OldName="/ODK/Depreciated",NewName="/ODK/Deprecated",MatchSubstring=true) +ClassRedirects=(OldName="/M2Deprecated/LegacyContent/Core/BPC\_CharacterMoveSpeedComponent.BPC\_CharacterMoveSpeedComponent\_C",NewName="/ODK/Movement/BPC\_ODK\_MoveSpeedComponent.BPC\_ODK\_MoveSpeedComponent\_C")

</details>

#### Wallet View - BindToWalletViewTokenAdded delegate signature update

Date of change: 10/04/2026

Affected Features: BPMC\_ODK\_WalletComponent > WalletViews

What’s broken and why?

The signature for the OnTokenBalanceAdded Event Dispatcher has been updated to include an initial add boolean. This was necessary to inform the developer if the token is part of the wallet initialization, where currently owned tokens are added, or if it is a newly added token.

How to fix it?

Update any bindings to OnTokenBalanceAdded to include the already existing BP\_ODK\_Token and a new Initial Add boolean.

#### Wallet View - BindToWalletViewTokenBalanceUpdated delegate signature update

Date of change: 09/04/2026

Affected Features: BPMC\_ODK\_WalletComponent > WalletViews

What’s broken and why?

The signature for the OnTokenBalanceUpdated Event Dispatcher has been updated to include the previous balance. This was necessary to inform the developer if the balance update was positive or negative.

How to fix it?

Update any bindings to OnTokenBalanceUpdated to include the already existing BP\_ODK\_Token and a new PreviousBalance float.

#### LoadCharacterFromUrl no longer supports websocket URLs

Date of change: 27/03/2026

Affected Features: MML Avatars

What’s broken and why?

It was possible to load MML avatars from a websocket `wss://` URL with the `LoadCharacterFromUrl` node. This was undocumented, adds extra complexity and is unnecessary, as avatar models aren't dynamic. Other MML objects are unaffected and can use websockets as usual.

How to fix it?

All characters MMLs should be statically served from `https://` URLs instead.

#### Moving UI mode logic from the Player Controller onto the BPC\_ODK\_UIModeComponent

Date of change: 25/03/2026

Affected Features: UI mode

What’s broken and why?

We wanted to clean up the UI mode logic to make is simpler and have less of a footprint. We have move logic off the BP\_ODK\_PlayerControllerBase and moved it onto the BPC\_ODK\_UIModeComponent.

How to fix it?

The main thing that may be broken will be any bindings to the old OnUIModeChangeRequest event on BPC\_ODK\_UIModeComponent. It has now been renamed OnUIModeUpdated.\
\
You may have overriden some of the old functions on the BP\_ODK\_PlayerControllerBase regarding UI mode. If this is the case, you will need to create a derived class of BP\_ODK\_PlayerControllerBase and implement your logic inside the relevant functions. You can then configure your player controller to use your derived component class via the UIModeComponentClass property.

#### Movement Mode Id change from FName to DA\_ODK\_MovementModeId

Date of change: 24/03/2026

Affected Features: Movement

What’s broken and why?

We have decided to change the movement mode id type to make it more discoverable and reduce the chance of incorrect configuration through spelling mistakes with FNames. This includes the `HandleMovementModeUpdated` event on the `BPC_ODK_MovementModeComponentBase` component.

How to fix it?

If you interact with movement mode logic, simply use one of the the new movement mode id data assets instead of your existing FNames

#### DisconnectWebsocket calls now cancel all event listeners on that websocket

Date of change: 16/03/2026

Affected Features: M2\_WebPlatformRealtimeService

What’s broken and why?

Calling `M2_WebPlatformRealtimeService::DisconnectWebsocket` to explicitly disconnect a websocket will cancel any delegates added by calls to `ListenToResourceType`. This is to make the behaviour consistent with delegates added by `SendMessage` which were already being cancelled.

How to fix it?

If you call `DisconnectWebsocket` and then re-use it, you will need to set up any delegates again.

#### Removal of BPC\_PlayerEmoteVFXHandler

Date of change: 16/03/2026

Affected Features: Emotes

What’s broken and why?

The component is not needed now that we do not use JM\_PlayerEmotesComponent

How to fix it?

The component still exists in our deprecaited folder. Copy this into your project if you need it as it will be deleted at a later date.

#### No longer reading wallet emotes in emote component

Date of change: 16/03/2026

Affected Features: Emotes

What’s broken and why?

This functionality is no longer needed due to configuration of emotes in the web app.

How to fix it?

If you were using this functionality, you will need to manually grab emotes in the users wallet and then pipe that into the emote component using a custom source.

#### Removal of overlay and social buttons

Date of change: 13/03/2026

Affected Features: UI

What’s broken and why?

WBP\_OverlayButton and WBP\_SocialButton have been removed.

How to fix it?

Recreate similar assets

#### M2\_AnimInstance AnimVarsComponent member changed to AnimVarsProvider Interface

Date of change: 12/03/2026

Affected Features: AnimVars and Animation Blueprints

What’s broken and why?

Animation blueprints based off M2\_AnimInstance that were reading the AnimVarsComponent will no longer compile.

This change is done to abstract the UObjects containing the AnimVars via interfaces so that we aren't restricted to drive from `MorpheusAnimVarsComponent` and can use the native `ActorComponent` to provide AnimVars to the Animation Blueprint. This is also done to facilitate the integration of Mass Entity into Morpheus and Animated Crowd.

How to fix it?

Instead of getting the AnimVarsComponent, get the AnimVarsProvider interface and cast to an AnimVarsComponent

How to test it?

The Animation blueprint is working as expected

#### Legacy camera classes replaced with ODK versions

Date of change: 09/03/2026

Affected Features: Camera control

What’s broken and why?

As part of removing dependencies on the legacy `M2Deprecated` plugin, some camera-related classes have been moved into the ODK, and project may need to update references (the existing classes still exist, so redirectors haven't been added).

How to fix it?

Replace these references:

* `BP_PlayerCameraManagerBase` -> `BP_ODK_PlayerCameraManagerBase`
* `BPC_M2_CameraControlComponent` -> `BPC_ODK_CameraControlComponent`
* `BPC_M2_CameraControlInterface` -> `BPC_ODK_CameraControlInterface`

#### OverShoulderCam removed from ODK

Date of change: 03/03/2026

Affected Features: Camera controls

What’s broken and why?

The over-the-shoulder camera mode option has been removed from `WBP_Settings_Controls_Game` and related assets, because it's currently unused and relies heavily on many assets in the removed M2Deprecated plugin.

How to fix it?

If you're currently using the ODK's over-the-shoulder implementation, copy the required assets from the M2Deprecated plugin directly into your own project.

#### Legacy BP\_Y\_Jumpad\_Base triggers may have moved

Date of change: 24/02/2026

Affected Features: Launch pads

What’s broken and why?

The deprecated `BP_Y_Jumpad_Base` blueprint has been reparented to remove dependencies on the M2Deprecated plugin. It's possible that this may affect the transform on the Trigger component of any child classes in your project.

How to fix it?

If the jump pads aren't functioning, check the transform of the trigger and volume and adjust as required.

#### HUD class simplification - removal of deprecated components

Date of change: 24/02/2026

Affected Features: HUD

What’s broken and why?

`BP_ODK_HUD` used to derive from the deprecated `BP_Origin_HUD` which contained several deprecated components. It now derives from a simpler base class with `BPC_TutorialPromptsManager`, `BPC_GlobalMessageReceiver`, `J_EmoteWidgetManager` and `J_WidgetVisibilityChecker` removed, as they're likely not used in any projects.

One side effect is that any legacy tutorial widgets present in your HUD (e.g. `WBP_TutorialPrompts`) may not behave correctly.

How to fix it?

These components can be re-added in your own derived HUD class if required. Legacy tutorial widgets may need removing entirely if they're appearing incorrectly. Any calls to parent functions on the old base class may cause compile errors, which can be fixed by re-adding the correct call to the parent function.

#### Image Cache World Service GetImageForUrl callback signature change

Date of change: 24/02/2026

Affected Features: Image Cache

What’s broken and why?

`GetImageForUrl` now takes a context object that is provided as a parameter in it's deleged.

How to fix it?

Any usage of `GetImageForUrl` will need an additional object param adding to it.\
\
Persistence World Service Callbacks signature changes.

#### Persistence World Service Callbacks signature changes

Date of change: 03/02/2026

Affected Features: Persistence

What’s broken and why?

1. For more usability, we added the key corresponding to the grabbed value to the `BP_ODK_PersistenceWorldService` read callbacks as a parameter.
2. Renamed `OnValueLoaded` to `OnValueRead` to better indicate that the value can be queried and read multiple times

How to fix it?

1. Add a string parameter to you callback functions.\
   ![](/files/tpUv8E2d6rRQUijKB2BK) -> ![](/files/H5BJsnNyUVnSkNnhtd98)
2. Reattach your callbacks to the `OnValueRead` event pin

#### Removal of functions on BP\_ODK\_PlayerCharacterBase

Date of change: 21/01/2026

Affected Features: ODK Render Target

What’s broken and why?

Some logic on the `BP_ODK_PlayerCharacterBase` needed to be moved for better accessibility and logic clarity.\
\
Functions removed:\
`GetScaledInitialGravityScale`\
`GetMovementOrientation`\
`SetZoomEnabled`

How to fix it?

`GetScaledInitialGravityScale` has been completely removed. You can use GravityScale off the character movement component.

To fix `GetMovementOrientation` removal, you should use `GetControlRotation`

To fix `SetZoomEnabled` removal, you should use `AddToZoomDisableStack` and `RemoveFromZoomDisableStack` on `BPC_ODK_CameraControlComponent`.

#### Removal of Game Settings Logic on ODK Player Render Target

Date of change: 12/01/2026

Affected Features: Game Settings

What’s broken and why?

Functions `GetControllerSensitivity`, `HandleCustomSettingChanged` and `InitializeGameSettings` have been removed from `BP_ODK_PlayerCharacterBase`. Game setting logic will now be performed by `BP_ODK_GameSettingsWorldService`.

How to fix it?

Use the `BP_ODK_GameSettingsWorldService` for accessing and updating game settings.

#### Persistence API update to allow for wider KV store access

Date of change: 08/01/2026

Affected Features: Persistence

What’s broken and why?

Nothing will be broken but you may have issues in the future regarding persistence if this is not rectified.

How to fix it?

You will need to switch your "KV Store Service Class" in your world settings to `BP_ODK_KVStoreService` .

#### Koda Cam and Photo Album Refactor

Date of change: 16/12/2025

Affected Features: Koda Cam

What’s broken and why?

Koda cam photos, once taken, will be automatically uploaded to remote storage. Unreal will no longer start the minting process for koda cam photos. Instead, the overlay will be used to view and mint photos. `WBP_ODK_PhotoAlbum` will be deprecated soon. The API on `BPC_ODK_ScreenshotComponent` has been updated to reflect these changes. Some functions have been removed although it is unlikely your project uses them. Currently there is no need for Unreal projects to grab remotely stored photo data. We do plan to support this soon if your project needs this.

How to fix it?

You will no longer be able to mint screenshots or display stored screenshots in Unreal.

#### Removal of the Progression System

Date of change: 15/12/2025

Affected Features: Progression System

What’s broken and why?

We have removed all assets concerning the granting of XP. This is due to a wish to only allow XP granting to certain events. We will most likely be adding this feature back in future when we can more easily limit it's usage.\
\
Removed classes:\
`BP_ODK_ProgressionWorldService`\
`BP_ODK_XPTask`

How to fix it?

You will not be able to grant XP anymore so simply patching up your assets so they compile will suffice.

#### Emote Filtering and Sorting Update

Date of change: 05/11/2025

Affected Features: Emotes

What’s broken and why?

We wanted to provide a better API for sorting emotes on the emote wheel and for configuring what emotes are available in certain game states. Functions concerning overriding the emote selection on `BPMC_ODK_EmotesComponent` have been updated and renamed to give more clarity and functionality. The function is now called `PushCustomEmoteSource`. This function now has an additional parameter to configure how emotes are sorted whilst this custom source is active.\
\
We also wanted to take the change to remove functionality that is most likely no longer relevant. This includes removal of the function `GetFilteredEmotes` from the `BPMC_ODK_EmotesComponent`. This function will likely never be used by downstream developers.

How to fix it?

If you were using `GetFilteredEmotes`, you should be able to create your own version of the function filtering on `GetAllPlayableEmotes` on `BPMC_ODK_EmotesComponent`.

#### Removed PlayGlitchVFX from BP\_ODK\_PlayerCharacterBase

Date of change: 15/10/2025

Affected Features: Glitch Visual Effect

What’s broken and why?

We want to reduce logic footprint of our base render target. Playing a specific visual effect in a function on the base character isn't ideal as most project will not be playing this visual effect.

How to fix it?

If you were calling `PlayGlitchVFX`, a component has been added to our base render target that allows for easy playing of niagara effects: `BPC_ODK_NiagaraEffectsManagerComponent`. This is an example of how it can be used to show the "Glitch" effect.

<figure><img src="/files/HUlHitWrkoFWPI5p1kR5" alt=""><figcaption></figcaption></figure>

####

#### Initialize Web Browser API Update

Date of change: 02/10/2025

Affected Features: Web Browser

What’s broken and why?

On order to facilitate earlier loading of the web browser, we have modified the Initialize function on the `BP_ODK_WebBrowserWorldService` to take a morpheus actor parameter.

How to fix it?

Pass in the player morpheus actor to this function if you are calling this explicitly in your own project blueprint logic.

#### Persistence API Update

Date of change: 02/10/2025

Affected Features: Persistence / Key Value Store

What’s broken and why?

We wanted to streamline the ODK persistence world service API. RegisterInterest functions will now perform a "read" event and then also "subscribe" to further updates. The removes the need for developers to call both "read" and "subscribe" methods separately.

Additionally, we wanted to remove some of its dependencies on the MSquared web platform layer. As such, we have deprecated `BP_ODK_WPProfileDataProvider`. It can be removed from you map settings and replaced with `BP_ODK_ProfileDataProvider`.

How to fix it?

The API has slightly changed on our RegisterInterest functions on the ODK persistence world service. You will simply need to add a bool to the arguments of your callback delegates.

#### HandleBootflowStarted removed from BP\_ODK\_PlayerCharacterBase

Date of change: 07/10/2025

Affected Features: Player Character Render Target

What’s broken and why?

This function is obsolete as the bootflow will have started when `BP_ODK_PlayerCharacterBase` is created. Just use `BeginPlay`.

How to fix it?

If you have overridden this function, move your logic into begin play.

#### Roles Component refactor

Date of change: 26/09/2025

Affected Features: Roles, Resizing

What’s broken and why?

The current Role Component (JM Roles Component) is being deprecated and we have to replace it with a new, more streamlined version. As a result, the Resizing Component has also been reworked and simplified. The new Roles Component will also be less rigid than before, allowing users to attach any data they want to their roles in the form of a M2 Data Asset.

How to fix it?

In each of your levels, open the World Settings and search for 'Role'. There is one new section - Morpheus Platform > Roles > Role List Provider. Make sure this is set to `BP_M2_RoleDataProvider`. This is also where you will supply your role data table, once created. There is another Roles section in the World Settings - Morpheus Platform (Deprecated) -> Roles. This section is no longer used, and can be cleared, as seen below:

<figure><img src="/files/h3sjD9b6YlTaLqOpQ96r" alt=""><figcaption></figcaption></figure>

You will need to create a data table using the `S_ODK_RoleProperties` structure. This will hold:

1. Role Name (required)
2. Granted Capabilities (required)
3. Pawn LOD level data (optional)
4. Additional Properties - M2 Data Asset containing any addition data you wish to attach to the role (optional)

<figure><img src="/files/PDsp7y4Wy37RTPBPKRrb" alt=""><figcaption></figcaption></figure>

You can convert your old roles tables over, but remember that if you have rows that are based on others in your old table, you will need to move all the data from the base role and the inheriting role over into the new singular row. The only base capability we recommend adding to all players is `Capabilities.VoiceChat.Enabled` to allow users to have access to voice chat.

Once you've created your roles table, you can set that roles table as the default roles table for all levels across your project, by adding a reference to the DT within your `M2DefaultContent.ini`:

```
[/Script/M2Content.M2_WorldRolesComponent]
RolesDataTable=<DT_PATH>
```

If you were using any of the other properties on the old structure, for example `Associated Colour`, you would need to include this in the M2 Data Asset you create to attach to the role and handle the use of this as appropriate (an example later using a float can be found later in this document). The names of these rows will be your role names. We recommend using the settings menu to allow players to switch between available roles, however you can initiate the change by calling `BPMC_ODK_RolesComponent::RequestRoleChange` .

<figure><img src="/files/4XFkuIVgmZUGJLCysm6h" alt=""><figcaption></figcaption></figure>

An example of using the Roles Component to swap a users role, in this case to 'Player'.

Any Morpheus Actor that was based on `BPM_ODK_PlayerCharacter` will now have the new Roles and Resize component. Any calls to change role on these will need to be swapped to calling Request Role Change on the Roles Component. Pass in the role name you want, and the component will check to see if the role is valid for this user and swap them over, handling the Capabilities changes and Pawn Override for you. On Role Updated will be fired on the Morpheus Actor, returning the new role/data and the previous role/data. Here you can pull any data you need from your M2 Data Asset for the role. We have an example use of this in `BPM_ODK_ExampleCombatCharacter`, see below.

Resizing is now simplified - you now set the relative size you want by calling Set Scale on the Resizing Component. Setting it to 1.0 will return them to normal size. Note that if you have multiple things that can affect the player size, you will need to track these yourself.

<figure><img src="/files/OD4S3AU02HcjkCE6YSLB" alt=""><figcaption></figcaption></figure>

Above is an example of the new flow on role change, pulling your own data from the role properties, and using the Resize component.

#### Input Action Binding Delegate Update

Date of change: 11/09/2025

Affected Features: Input

What’s broken and why?

We have updated the parameters available on callbacks when binding to input actions through the `BPC_ODK_InputComponent`. The concerned input action is now passed in as a parameter.

How to fix it?

Simply add an input action param to your existing callbacks.

**Dynamic Interaction Component**

Date of change: 08/09/2025

Affected Features: Interaction Component

What’s broken and why?

The `BPC_ODK_InteractionComponent` that was attached to the `BP_ODK_PlayerCharacterBase` has been removed and is now added at runtime. This allows the component to be overridden by downstream projects.

How to fix it?

If you were using a direct reference to this component, simply use the `GetComponentByClass` function to retrieve the component.

**Update to Launch API**

Date of change: 08/09/2025

Affected Features: Launch Movement Mode

What’s broken and why?

We have updated the launch interface and some surrounding functions to group launch parameters into a struct.

How to fix it?

Where your logic has broken, make a new `S_ODK_LaunchParams` struct and hook up the `HasCustomAirControl` and `CustomAirControl` values you were using previously.

\
**Obtaining a Player's Primary Wallet Address**

Date of change: 04/09/2025

Affected Features: Wallet

What’s broken and why?

A couple of adjustment have been done to the wallet initialization flow. These changes should not impact downstream projects. As part of these changes, a small bit of cleaning was added to `BPMC_ODK_WalletComponent`. We now have accessors for the primary wallet and all linked wallets for the player. Please not that both of these accessors are also available on the `BPMC_ODK_PlayerProfileComponent`.

How to fix it?

Instead of using the old property `WalletAddress`, please use the accessor `GetPrimaryWallet`.

**Avatar Logic Centralization**

Date of change: 03/09/2025

Affected Features: Avatars/Yuga Characters

What’s broken and why?

We have centralised logic that was previously spread across the `BP_ODK_PlayerCharacterBase` and `BPM_ODK_PlayerCharacterBase` onto a new component `BPC_ODK_AvatarComponent` component that gets dynamically created on `BP_ODK_PlayerCharacterBase`. This component can be overridden by setting the `AvatarComponentClass` property on `BP_ODK_PlayerCharacterBase`. The `BPC_ODK_AvatarComponent` is where the bulk of avatar functionality will now be performed. `BPMC_AvatarInfo` has been renamed `BPMC_ODK_AvatarComponent` and is now used purely to replicate the `AvatarType` property.\
\
This setup is required as morpheus components can not be added dynamically to actors. Deriving and overriding component logic can only be done using standard actor component.

How to fix it?

Any modifications to the logic that used to exist on the `BP_ODK_PlayerCharacterBase` or `BPM_ODK_PlayerCharacterBase` will need to be moved. We would recommend deriving a new component from `BPC_ODK_AvatarComponent` and overriding `AvatarComponentClass` on `BP_ODK_PlayerCharacterBase` to use the new component class.

**Moving Away from MSquared Player Profiles**

Date of change: 03/09/2025

Affected Features: Player Profiles

What’s broken and why?

The ODK is divorcing itself from MSquared player profile systems. `BPMC_ODK_ProfileOverlayHandling` has been renamed `BPMC_ODK_PlayerProfileComponent`. It can be used to access: player name, avatar token id, profile picture and linked wallets.

How to fix it?

The `BPMC_ODK_PlayerProfileComponent` has delegates and accessor functions similar to the old MSquared player profile component so should be a relatively painless switch over.

**New ODK Singleton Spawning**

Date of change: 02/09/2025

Affected Features: World Singletons

What’s broken and why?

The `BP_ODK_BootflowSingleton` is now responsible for spawning all base ODK morpheus and non-morpheus singletons. This allows the ODK to add and remove singletons without the need for downstream projects to update their world settings.

How to fix it?\
\
Add `BP_ODK_BootflowSingleton` to "Additional Singletons" in world settings if it is not there already.

The following should be removed from "Additional Singletons":\
\- `BPM_ObserverHUDControls`\
\- `BPM_ObserverCameraControls`\
\
The following should be removed from "Non Morpheus Singletons":\
\- `BP_glTFMaterialIndex`\
\- `BP_MillicastCapture`\
\- `BP_ODKCarnivalMaterialStore`

**Attachments Refactor**

Date of change: 26/08/2025

Affected Features: Attachments

What’s broken and why?

We wanted to simplify how developers configure attachments so have moved configuration off the singleton defined on the world settings and onto the `BPMC_ODK_AttachmentsComponent`.

How to fix it?

Data tables are now where you can configure attachments. These data tables can be added to the `AttachmentsDataTables` property on `BPMC_ODK_AttachmentsComponent`. `DT_ODK_KodaCamAttachments` is an example of how to setup the table.\
\
The `BP_AttachmentManagerODK` has been removed. You will need to remove it from your world settings.\
`PDA_AttachmentList` has been moved to depreciated. Please delete any derived PDAs from your projects.\
\
`BPMC_ODK_AttachmentsComponent` now takes attachment ids as Names rather than strings.

#### Movement Props Cleanup

Date of change: 22/08/2025

Affected Features: Movement props

What’s broken and why?

Blueprint props that allow players to enter new movement modes were quite untidy. We have taken the oppertunity to make each props purpose more clear and tidy the logic. This may impact movement props in your project levels. You may need to switch to using a different blueprint prop that is more appropriate for your use case. We now offer these props in the ODK:\
\
`BP_ODK_Launcher` - Launches the player into the air on a path to a destination.\
`BP_ODK_GrindingRail` - Allow you to define a curve for the player to grind along.\
`BP_ODK_BouncePad` - Will launch the player into the air but will use the "bounce" movement mode. The player will be put into a tumbling animation.\
`BP_ODK_AirLift` - Will put the player into the "air lift" movement mode.\
\
One note here, the blueprint interefaces `BPI_ODK_Bounce` and `BPI_ODK_Launch` have been implemented on `BPC_ODK_MovementComponent` and removed from `BP_ODK_PlayerCharacterBase`.


---

# 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, and the optional `goal` query parameter:

```
GET https://docs.otherside.xyz/odk-docs/breaking-changes/odk-v10-upgrade-guide/v10.0.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
