# Morpheus Platform Release v35

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

***

**Version Released:** 20/02/2025

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

{% tabs %}
{% tab title="Release notes" %}
**Nameplate simplification**

Nameplates have been simplified, allowing for a Blueprint-only implementation. An example has been provided in M2 Example.

**AI State Tree support for bots**

[AI State Trees](https://dev.epicgames.com/documentation/en-us/unreal-engine/state-tree-in-unreal-engine) can now be used and MSquared-specific documentation is available here: <https://docs.msquared.io/creation/unreal-development/features-and-tutorials/bots#using-state-tree>
{% endtab %}

{% tab title="Breaking changes" %}
**SkeletalCrowd supports dynamic addition of meshes at runtime**

**What’s broken and why?**

* `SkeletalCrowdMeshStore` mesh list is now ignored - meshes are now processed and useable by `SkeletalCrowdComponent` on demand at runtime. This shouldn’t break anything, but may mean processing of meshes is happening at a different time in the fame.
* This change in turn has simplified a lot of setup required to get meshes added during `BeginPlay`, and means we can remove the `ISkeletalCrowdMeshProviderInterface` and all uses of it
* All code related to avatars and attachments has been updated to handle this

**How to fix it?**

`ISkeletalCrowdMeshProviderInterface` is removed. If code/BP was previously using this it can now be removed. When creating an `FAnimatedCrowdMemberInitializer` using one of these (formerly) provided meshes:

* For skeletal meshes there is nothing to do
* For static meshes, previously the crowd got its attachment information from the mesh store data, which in turn was supplied from the mesh provider interface. This no longer exists. Therefore it must be passed in using the new `StaticMeshSocket` and `StaticMeshTransform` members on the `FAnimatedCrowdMemberInitializer` .

Similarly, `CharacterAssetComponent`’s `AddedCrowdStaticMeshesOverride` array has changed type. It is no longer a list of static meshes, but a list of `M2_StaticMeshAttachment` types (including socket, transform and custom data as well). Code / BP usage of this array will need fixing up, or ideally, changing to use the `AddAttachment` function which is the preferred path.

**Carnival Model Component**

**What’s broken and why?**

Blueprint functions to manually add and remove carnival meshes.

**How to fix it?**

To manually add a mesh (e.g. attachment) to a Carnival model, you can use the `UJ_ModularCharacterComponent` as usual.

**How to test it?**

Carnival characters and attachments should work as usual.

**Made the example map use new simplified character classes**

**What’s broken and why?**

The base classes used by the example map, and the example plugin have been reparented, so that they use less of the deprecated content (e.g. the interaction system). The example map’s functionality should remain largely unchanged, but any classes extending off the M2Example bases that depend on features in M2Deprecated may not work.

The changes to the example content are as follows:

* The ExampleMap now uses its own `BP_M2Example_BotBehaviorStore`, instead of the default one
  * This uses a different chat behavior
* `WBP_M2Example_TextChat` has been retargeted to use the `BPMC_M2Example_TextChatComponent` instead of the deprecated text chat component. If you are using this widget without using the other example classes, this may fail.
* `BPM_Example_PlayerCharacter` has been reparented to a simplified base class. This removes some functionality, such as the deprecated interaction system
* `BP_Example_PlayerCharacter` has been reparented to `BP_M2_PlayerCharacter`. This replaces some features, such as nameplates, and removes some deprecated functionality

NOTE: This change does not affect users exclusively using the content in M2Deprecated, e.g. `WBP_Origin_HUD` and `BP_Origin_PlayerCharacter`, only those using content in the `M2Example` plugin.

**How to fix it?**

If you have assets extending example content, but that depends on deprecated content, you will need to either migrate away from using the deprecated content, or reparent your assets onto the deprecated base classes, e.g. `BP_Origin_PlayerCharacter`.

**How to test it?**

Check whether your core classes extend any of the following:

* `BP_M2_PlayerCharacter`
* `BP_Example_PlayerCharacter`
* `BPM_Example_PlayerCharacter`

And check whether your UI includes `WBP_M2Example_TextChat`. If these are true, you may need to update their usage, if there are any compile errors, or deprecated features stop working.

**Made M2\_WorldBuilderUXSubsystem::bUpdateRequired read only**

**What’s broken and why?**

`UpdateRequired` was previously `BlueprintReadWrite`, but is not intended to be modified externally in blueprints. It has therefore now been made `BlueprintReadOnly`. Any downstream uses where it was set should be removed.

**Change to Persistence Subsystem Read Query**

**What’s broken and why?**

The response after reading from the KVStore has been minorly adapted to also return information about whether a key exists within the store. Instead of a map of key and value strings, it’s replaced with a struct that also contains a success boolean that indicates whether that key exists.

This means that the On Persistent Value Query Complete delegate will execute for both successfully found keys and non-successfully found keys.

**How to fix it?**

If you’re relying on the above delegate to execute only for successfully found keys, you will need to use Get Session Value String in your custom event to add an additional check for whether the key exists or not, before continuing with any logic.

**How to test it?**

Persistence systems should operate as normal.
{% endtab %}
{% endtabs %}
