Skip to main content

Changelog

[0.3.2] - 2026-07-13​

It's important that you rebake any UNCell data (use the commandlet) as calculations and existing data needs to be rebuilt.

Added​

  • UNOrganComponent now have both Context Tag and Tag Counter requirements.
  • UNOrganComponent Direction Mode (ENOrganDirectionConstraintMode) selecting the reference point a cell's directional constraint measures candidate bearings from, per-organ: Start Bone (default, the original behavior), Organ Center (the volume's geometric center, falling back to the start bone when unbounded), or Dynamic Centroid (the running centroid of already-placed cells, falling back to the start bone before the first cell is placed).
  • Quick Assembly workflow on the World Assembly editor-mode toolbar: select a target UNOrganComponent from a dropdown and start/cancel an assembly operation in place, with an optional Auto Assembly mode that re-runs on a configurable timer. Adds World Assembly (User) settings Load Level Instances, Auto Assembly, and Auto Assembly Timer.
  • NEXUS.WorldAssembly.Flag.Hotpath assembly flag for creating pathing feedback post assembly in both the ANCellLevelInstance as well as junctions.
  • INCellJunctionFiller interface for filler objects to implement to get callbacks when used to fill empty junctions.
  • UNPickerSettings project settings (Project Settings > NEXUS > Picker, stored in DefaultNexusGame.ini) exposing point-projection configuration: Trace Complex, Nav Query Extent, Nav Agent Radius, and Nav Agent Height.

Changed​

  • UNWorldAssemblySubsystem::IsReady() now UNWorldAssemblySubsystem::IsReady(bool bWaitOnStreaming = true) defaulting to waiting for level streaming to complete.
  • ANCellProxy now hold and pass to ANCellLevelInstance information about UNCellJunctionComponent and their linkage.
  • FNMersenneTwister Double/Float/Integer minimum default values now properly negative by default.
  • FNMultiplayerUtils::GetPlayerIdentifier now returns -1 when the PlayerState is not available.
  • ANPooledActor renamed ANPooledActorBase.
  • Clients with BeginPlay flagged UNOrganComponents will not generate without authority.
  • FNGameplayTagCounterConstraint defaults the comparison value to 0 if the tag is not found.
  • FNGameplayTagCounter no longer floors counts at zero; the mutation API (Add/Subtract/Increment/Decrement) now produces signed values, keeping operations losslessly reversible and consistent with GetDifference/Combine.
  • Created UNMersenneTwisterObject to hold a twister to be used for deterministic random in a wider scope, Blueprint-exposed under the NEXUS|Core|Random category (Seed, Random Bool, Random Bools, Random Integer In Range).
  • Consolidated Twisted to Next concept/naming.
  • Cell junction Requirements now respected, weights for junctions are automatically doubled when they are Required.
  • UNTextRenderComponent now warns about replication instead of setting it, with a toggle.
  • UNMultiplayerLibrary::KickPlayer is now BlueprintAuthorityOnly; the Blueprint node only executes on the authority.

Fixed​

  • Crash when displaying collision visualizer twice in a level.
  • ANWorldAssemblyRelay now properly responds to IsReady (ANCellLevelInstances now register appropriately when on clients)
  • Macros for PostEngineInit for modules now function properly during teardown.
  • Bounds and Center on FNRawMesh now initialized at creation (no more garbage memory comparisons).
  • FNMultiplayerUtils player-lookup helpers now guard against a null AGameStateBase, and HasWorldAuthority(const UWorld*) guards against a null UWorld, preventing crashes during world startup/teardown and on clients before initial replication.
  • FNHashUtils::djb2 now hashes the string's UTF-8 encoding instead of truncating each TCHAR to its low byte, so non-ASCII characters that share a low byte (e.g. Ω and ©) no longer collide and FNSeedGenerator::SeedFromString gains full character information from non-Latin seed phrases. Pure-ASCII input hashes are unchanged.
  • CellLinkDetails.bConnected will only be true connecting to another Cell.
  • UNMultiplayerTestSubsystem now always removes its BeginStandaloneLocalPlay delegate binding when stopping, including on the editor teardown path where the previous guard skipped cleanup.
  • UNBlueprintValidator now guards against a null Blueprint cast and null Node entries while iterating graph nodes, matching UNLevelBlueprintValidator.

Removed​

  • Junctions no longer store if they are inside of a hull.
  • ANPooledActor from the placement pallete.
  • ANCellLevelInstance no longer maintains state before the choice to place it in the graph.
  • FNPickerUtils static projection configuration (CollisionQueryParams, NavQueryExtent, NavAgentProperties) replaced by UNPickerSettings.

Core Redirects​

[CoreRedirects]
+PropertyRedirects=(OldName="/Script/NexusWorldAssembly.NOrganComponent.bUnbounded",NewName="/Script/NexusWorldAssembly.NOrganComponent.bUnbound")
+ClassRedirects=(OldName="/Script/NexusActorPools.NPooledActor",NewName="/Script/NexusActorPools.NPooledActorBase")

0.3.1 - 2026-06-07​

Added​

  • FNAssemblyGraphNodes now have a deterministic seed stored along side their generation, accesible at INCellInitialized time.
  • Bad Neighbors tag grouping for UNTissue, preventing adjacent cell placement.
  • NEXUS.WorldAssembly.Flag.AlwaysRelevant behavioral tag.
  • TagCounters constraints and operations to UNTissue.
  • Required ContextTags option on UNTissue entries.
  • Both FNActorPool and UNActorPoolSubsystem gained the ability to ReturnAll/ReturnAllActors.
  • FNActorPoolSettings now has a SupportFlags section, including ReturnAll.
  • Added accessors to a global mutable copy of the Tag Counters and the Context Tags of a generation, with supporting Blueprint functionality.
  • Added Maximum Node Depth and Directional Constraints to UNTissue definitions.
  • Direction Tolerance setting (default 15-degrees, project-wide and per-operation) controlling how close a candidate's bearing must be to a UNTissue Directional Constraint to be placed.
  • UNActorPoolSubsystem::GetActorPoolStats() returns Spawned/Available details for a target FNActorPool.
  • FNReportListBlock now available in reports.
  • Option in World Assembly project settings to enable output of status messages from operations to the log, normally only visible in the developer overlay.
  • FNActorPool supports OnDeferredConstruction slow-invoking with flag.
  • Quick Has Tag ? and Has Exact Tag ? helper nodes for FGameplayTags.

Changed​

  • FNRawMesh collision meshes used inside of assembly operation tasks bake out their transforms.
  • ANCellActor::AuthorTimeActors are no longer factored into spatial calculations for UNCells.
  • GameplayTags renamed NEXUS.WorldAssembly.BuiltIn.* to NEXUS.WorldAssembly.Behavior.*.
  • OutputTags was moved to a more encompassing ContextTags.
  • FNGameplayTagCounter does not allow for negative counter values.
  • FNWorldAssemblyEdMode::RenderCellJunctionPenetrationDistance now always renders the distance underneath the UNCellJunctionComponent.
  • WorldAssemblyEdMode Collision Visualizer now tracks for changes in the level, accounting for its offset.
  • Reworked FNEditorInputProcessor to not compare pointers, instead look at screen position and button presses to determine if the same.
  • Cleaned up IsPointInsideOrOn for FNOrientedBoxPicker to be less-math.
  • UNDynamicRefSubsystem::GetCount(NDR_None) will return 0 instead of -1.
  • UNDynamicRefSubsystem now holds registered objects as weak references; it no longer keeps a UObject alive simply by referencing it, and entries are pruned lazily as objects are destroyed.

Fixed​

  • ANCellActor is no longer dirtied simply being opened.
  • UNOrganComponent::Seed properly overrides Organs' assembly operation seed when value is not -1.
  • Side-car NCell asset is not loaded during cook process, restoring determinism.
  • UNOrganComponent custom-visualizer Generate button now refreshes accordingly after operations have finished.
  • PktJitter setting now properly applied to clients in Multiplayer Test.
  • HasSupportFlag_ReturnAll now properly queries SupportFlag.
  • Protect against NSpawnActorBlueprintAsyncAction occuring after UWorld teardown.
  • FNRectanglePicker no longer crashes in hollow mode when MinimumDimensions equals MaximumDimensions; FNRectanglePickerParams::GetValidRanges now falls back to the full rectangle instead of returning an empty range that was indexed out of bounds.
  • UNDynamicRefSubsystem no longer broadcasts OnAdded/OnAddedByName when re-adding an object already present (a no-op AddUnique), keeping the add/remove delegate pairing symmetric.
  • DynamicRefs developer overlay no longer leaks UNDynamicRefObject list-view wrappers for objects destroyed without removal; UNDynamicRefObject now prunes stale entries so emptied wrappers are cleaned up.
  • UNGetActorBlueprintAsyncAction now guards against a null UNActorPoolSubsystem when unbinding its pool-created callback, matching UNSpawnActorBlueprintAsyncAction.
  • UNGetActorBlueprintAsyncAction and UNSpawnActorBlueprintAsyncAction now complete (with a null result) and tear down when their soft class fails to load, instead of leaving the Blueprint latent node hung.

Removed​

  • FNActorPool::HasFlag_ShouldFinishSpawning, was allowing AActor to be left in bad states when disabled.

DefaultGameplayTags Redirects​

[/Script/GameplayTags.GameplayTagsSettings]
+GameplayTagRedirects=(OldTagName="NEXUS.WorldAssembly.BuiltIn.Starter", NewTagName="NEXUS.WorldAssembly.Behavior.Starter")
+GameplayTagRedirects=(OldTagName="NEXUS.WorldAssembly.BuiltIn.StarterOnly", NewTagName="NEXUS.WorldAssembly.Behavior.StarterOnly")
+GameplayTagRedirects=(OldTagName="NEXUS.WorldAssembly.BuiltIn.NotStarter", NewTagName="NEXUS.WorldAssembly.Behavior.NotStarter")
+GameplayTagRedirects=(OldTagName="NEXUS.WorldAssembly.BuiltIn.Finisher", NewTagName="NEXUS.WorldAssembly.Behavior.Finisher")
+GameplayTagRedirects=(OldTagName="NEXUS.WorldAssembly.BuiltIn.FinisherOnly", NewTagName="NEXUS.WorldAssembly.Behavior.FinisherOnly")
+GameplayTagRedirects=(OldTagName="NEXUS.WorldAssembly.BuiltIn.NotFinisher", NewTagName="NEXUS.WorldAssembly.Behavior.NotFinisher")
+GameplayTagRedirects=(OldTagName="NEXUS.WorldAssembly.BuiltIn.Unique", NewTagName="NEXUS.WorldAssembly.Behavior.Unique")
+GameplayTagRedirects=(OldTagName="NEXUS.WorldAssembly.BuiltIn.RequiredAny", NewTagName="NEXUS.WorldAssembly.Behavior.RequiredAny")
+GameplayTagRedirects=(OldTagName="NEXUS.WorldAssembly.BuiltIn.BadNeighbors", NewTagName="NEXUS.WorldAssembly.Behavior.BadNeighbors")

0.3.0 - 2026-05-31​

Added​

  • FNDeveloperUtils and UNDeveloperLibrary now have IsBuildDemo() methods to support IS_BUILD_DEMO definitions from build targets.
  • Pickers all now have a Twisted method to support passing a FNMersenneTwister.
  • ANDebugPointActor for quick point debugging.
  • NexusCore, NDynamicRefs, NGuardian, NUI all have Unit and Performance-based testing.
  • NValidationMacros to support providing easy to use validation for Blueprint-facing methods.
  • NGuardian now supports automatically setting its baseline after a defined period (default 15 seconds).
  • NCell side-car data file now has an action button, that when clicked in the Content Browser will select the source world/level.
  • FGameplayTag support to NDynamicRefs.
  • Generate and Cleanup console commands for UNWordAssemblySubsystem.ing on

Changed​

  • Performance tests now use automation latent commands to attempt to stabalize the world prior to running tests.
  • Block meshes now end in _0 suffix to make auto-incrementing cleaner in map placement.
  • ANSamplesPawn now replicates movement.
  • Synthetic graph navigation has been expanded to being a synthetic-ish event and now works with every asset editor.
  • NActorPool tests now run in PIE worlds.
  • Forces ANPooledActor to be abstract.
  • Updated project-wide to enforcing American English for spelling.
  • FNActorPool::DoesSupportInterface renamed to FNActorPool::ImplementsPoolItemInterface
  • FNActorPool::HasInvokeUFunctionFlag renamed to FNActorPool::ShouldInvokeUFunctions
  • FNActorPool::GetInCount renamed to FNActorPool::GetAvailableCount
  • FNActorPool::GetOutCount renamed to FNActorPool::GetSpawnedCount
  • UNActorPoolObject::DoesSupportInterface renamed to UNActorPoolObject::ImplementsPoolItemInterface
  • UNActorPoolObject::HasInvokeUFunctionFlag renamed to UNActorPoolObject::ShouldInvokeUFunctions
  • UNActorPoolObject::GetInCount renamed to UNActorPoolObject::GetAvailableCount
  • UNActorPoolObject::GetOutCount renamed to UNActorPoolObject::GetSpawnedCount
  • All int now replaced with int32 to be explicit.
  • NGuardianSubsystem now does writing of reports using async tasks.
  • FNActorPool::OnDestroyedByActorPool to FNActorPool::OnReleasedFromActorPool to better reflect actual doing
  • UNKillZoneComponent::UnknownBehaviour to define behavior when an AActor is not known or able to be processed.
  • FNActorPool preallocates more appropriately for its In/Out arrays.
  • Started using pattern in Widgets where BindWidget members are validated in NativeConstructor only.
  • Moved Multiplayer Test into NexusTooling.
  • Renamed NEXUS: ProcGen plugin to NEXUS: World Assembly (NexusProcGen → NexusWorldAssembly, NexusProcGenSamples → NexusWorldAssemblySamples, NProcGen* class prefix → NWorldAssembly*). CoreRedirects in DefaultEngine.ini handle package + class renames so existing assets continue to load.
  • FNLevelUtils::DetermineLevelBounds now by default ignores transient actors, but has an option to include them.
  • DynamicRef Overlay now just holds WeakPtrs to the objects.
  • NGuardian system now has a tick rate configurable in settings (defaults to 1s).
  • When a thumbnail is captured for the NCell in the level editor, it now propogates to the NCell side-car data file as well (but with data visible in the thumbnail)
  • FNObjectSnapshotUtils::Diff now uses a consumed model to calculate changes (no more copying of entries around)
  • FNOrganGraphBuilderTask now uses a frontier model to create a node-based graph.
  • NPoseAssetFixer now prompts with a total number of Pose Assets its about to operate on allowing for cancelling; will not prompt in commandlet.
  • NEXUS.WorldAssembly.BuiltIn.Unique and NEXUS.WorldAssembly.BuiltIn.MustHave tags automatically applied to respective groups.

Fixed​

  • UNEditorUtilityWidget::DelayedConstructTask no longer divides by a zero geometry size when the widget hasn't been laid out yet, which previously left UnitScale as NaN/inf.
  • FNDrawDebugHelpers::DrawString, FNPrimitiveFont::DrawPDI, and FNPrimitiveFont::DrawBatchString now take the string as const FString&, allowing literals and rvalues to be passed.
  • FNPoseAssetFixer::OutOfDateAnimationSource will no longer allow operation on /All, select a subfolder.
  • UNSamplesLevelActor and UNSamplesDisplayActor now properly build at runtime.
  • Fixed crash in FNWeightedIntegerArray where removing could end up out of bounds.
  • Fixed FNSpherePicker scenarios where points could be ever-so-slightly out of the MaximumRadius.
  • FNRawMesh::CreateDynamicMesh no longer crashes on non-triangle based meshes, now returns default and errors.
  • NDynamicRefs events fired when removing object from the fast-path when it was not actually previously added.
  • FNEditorUtils::DisallowConfigFileFromStaging and FNEditorUtils::AllowConfigFileForStaging now properly use the project name.
  • FNActorPool now properly marks created AActor as root-object.
  • UNActorPoolSubsystem will no longer crash returning null actors, and returns false when the actor is destroyed, as it doesnt get returned to the pool.
  • UNMultiplayerTestSubsystem now concretely shutdown process handles, not relying on natural causes.
  • UNActorPoolSubsystem crash where a tickable FNActorPool gets invoked during world teardown.
  • FNActorPool crash when applying settings where UWorld does not exist.
  • FNActorPool crash when dealing with MaximumActorCount=0, now minimum of 1.
  • FNActorPool::Return now rejects actors whose class does not match the pool's Template, and rejects actors already present in the pool (non-Shipping builds only) — previously these would silently pollute InActors or be handed back twice from subsequent Get()/Spawn() calls.
  • FNRawMesh crash when calculating center with no verticies.
  • FNActorPool protect against the odd change that an actor is requsted and needs to be created when the pools world is being torn down.
  • FNActorPool spawning with designated rotation now properly applies.
  • INActorPoolItem now handles invocation during teardown gracefully.
  • FNMersenneTwister::VectorNormalized now provides -1 to 1 component values.
  • UNTextRenderComponent now guards away from visuals on Dedicated Servers, but still replicates data to clients.
  • Deferred deletion of sidecar NCell data asset to next tick when renaming, speculative crash fix.
  • FNMersenneTwister now is cross-platform guaranteed, regardless of compiler to produce same results.

Removed​

  • Server_* variant methods on NTextRenderComponent streamlining method calls; use Set* methods directly.

Core Redirects​

[CoreRedirects]
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorOperationalState",ValueChanges=(("Destroyed","Released")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolFlags",ValueChanges=(("BroadcastDestroy","BroadcastRelease")))
+ClassRedirects=(OldName="/Script/NexusMultiplayer.UNMultiplayerLibrary",NewName="/Script/NexusCore.UNMultiplayerLibrary")
+ClassRedirects=(OldName="/Script/NexusMultiplayer.UNTextRenderComponent",NewName="/Script/NexusUI.UNTextRenderComponent")

0.2.7 - 2026-02-22​

Added​

  • ANSamplesLevelActor now has bShowLevelName and bShowLogo properties to control whether the level name and logo are shown.
  • ANSamplesDisplayActor title settings now has bShowTitleHorizontalRule allowing for the title to be drawn with or without a horizontal rule.
  • ANSamplesDisplayActor title settings now has TitleTextPadding allowing for the title to have some padding from the edges.
  • Window > Log > Clean Logs Folder will remove much of the chaff in the projects saved/logs folder.
  • NexusPicker distributions now support finding the nearest point on a NavMesh (V1) via projection mode, with FNPickerUtils::NavQueryExtent controlling the distance from the NavMesh volume projectable.
  • FNOrientedBoxPicker for generating points in a box with rotation.
  • FNEditorSlateUtils and FNSlateUtils.
  • #117Collision Visualizer added to Tools -> Debug.
  • #120 FNArcPicker for generating points in an arc distribution.
  • #70 Add Create Actor Pool Set button to UNActorPoolsEditorUtilityWidget to create an UNActorPoolSet based on the currently found pools in PIE.
  • Invoke UFunctions flag to UNActorPoolSettings to enable UFUNCTION invoking on non-interfaced AActors, specifically invoking OnCreatedByActorPool, OnSpawnedFromActorPool, OnReturnToActorPool, and OnDestroyedByActorPool (when enabled) named UFUNCTION on the AActor if it does not implement the INActorPoolItem interface.
  • UNActorPoolsDeveloperOverlay now has tooltips with detailed information about the behavior of the associated FNActorPool.

Changed​

  • NEXUS: Fixers has been collapsed into a more generalized NEXUS: Tooling plugin, this is where all your base Unreal Editor tooling has been shifted as well (from the editor side of NEXUS: Core).
  • Menu entries were streamlined and repositioned to better fit into the UE ecosystem.
  • NexusDynamicReferences module renamed NexusDynamicRefs avoid unnecessarily long names, this change includes all associated classes and methods.
  • UNDeveloperOverlayWidget has been renamed to UNDeveloperOverlay and moved to the NEXUS: UI plugin.
  • All NexusPicker functionality has been changed to take variants of FNPickerParams structs to consolidate options; this is a breaking change without any direct upgrade path.
  • #122 NexusBlockout now contain simplified collision primitives and UVs.
  • ENActorPoolFlags::ReturnToStorageLocation renamed to ENActorPoolFlags::ReturnToStorage to match expansion to full FTransfrom set.
  • UNDeveloperSubsystem renamed to UNGuardianSubsystem and moved to NexusGuardian plugin.
  • ANPooledActor now has OnCreatedByActorPoolEvent, OnSpawnedFromActorPoolEvent, OnReturnToActorPoolEvent, and OnDestroyedByActorPoolEvent bindable events.
  • UNActorPoolsDeveloperOverlay now prefixes pool bars with a color representing the AActor interface and invoke state.
  • UNActorPoolsDeveloperOverlay now responds to N.ActorPools.DeveloperOverlay.UpdateRate console variable.

Fixed​

  • Ensure that a UNDelayedEditorTask removes itself from UAsyncEditorDelay complete event when released.
  • Added exception for UDataValidationChangelist to UNEngineContentValidator as when submitting with the Revision Control window the changelist object would prevent validation.
  • FNCirclePicker::IsPointInsideOrOn and UNCirclePickerLibrary::IsPointInsideOrOn now correctly return true when the point is inside a rotated circle.
  • FNBoxPicker and FNRectanglePicker no longer have regions unintentionally excluded in the distribution.
  • ANSamplesLevelActor now properly flags the SM_SkySphere not to have any collisions, stopping a warning when building NavMesh.
  • #125 Issue with NPoseAssetFixer not working on external plugin content.
  • UNActorPoolSubsystem now properly places UNActorPoolSet generated actors in the correct world, no longer leaving some in limbo.

Removed​

  • UNWidgetEditorUtilityWidget no longer used to wrap content widgets, individuals should extend off UNEditorUtilityWidget instead.
  • FNActorPool half-height calculations and offset (use FActorPoolSettings::SpawnTransform).

0.2.6 - 2026-01-20​

Added​

  • Windows > NEXUS > Actor Pools a tab for monitoring the pressure on the UNActorPoolSubsystem in realtime.
  • FNDeveloperUtils::GetRootSetObjects() / FNDeveloperUtils::DumpRootSetToLog() to help with debugging world tear down issues.
  • FNMultiplayerUtils::GetPing()
  • UNTextRenderComponent icon in editor.
  • UNEditorUtilityWidget persistent flag can be used to automatically restore state across map changes (as the widgets are recreated).
  • FNWidgetUtils to support converting from serialized to slate space.

Changed​

  • Many enumerations have been modernized to enum class, leaving only a few enum where necessary.
  • Console command NEXUS.ActorPools.TrackStats renamed to N.ActorPools.TrackStats.
  • Extracted test logic from ANSamplesDisplayActor into its own test object.
  • UNActorPoolSubsystem now respects UnknownBehaviour in UNActorPoolsSettings to determine what to do when an AActor is returned to the system when a FNActorPool does not exist for it.
  • UNTextRenderComponent will now ensure that its owning AActor on BeginPlay is replicated.

Core Redirects​

[CoreRedirects]
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorOperationalState",ValueChanges=(("AOS_Undefined","Undefined")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorOperationalState",ValueChanges=(("AOS_Created","Created")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorOperationalState",ValueChanges=(("AOS_Enabled","Enabled")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorOperationalState",ValueChanges=(("AOS_Disabled","Disabled")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorOperationalState",ValueChanges=(("AOS_Destroyed","Destroyed")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolStrategy",ValueChanges=(("APS_Create","Create")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolStrategy",ValueChanges=(("APS_CreateLimited","CreateLimited")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolStrategy",ValueChanges=(("APS_CreateRecycleFirst","CreateRecycleFirst")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolStrategy",ValueChanges=(("APS_CreateRecycleLast","CreateRecycleLast")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolStrategy",ValueChanges=(("APS_Fixed","Fixed")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolStrategy",ValueChanges=(("APS_FixedRecycleFirst","FixedRecycleFirst")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolStrategy",ValueChanges=(("APS_FixedRecycleLast","FixedRecycleLast")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolFlags",ValueChanges=(("APF_None","None")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolFlags",ValueChanges=(("APF_SweepBeforeSettingLocation","SweepBeforeSettingLocation")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolFlags",ValueChanges=(("APF_ReturnToStorageLocation","ReturnToStorageLocation")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolFlags",ValueChanges=(("APF_DeferConstruction","DeferConstruction")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolFlags",ValueChanges=(("APF_ShouldFinishSpawning","ShouldFinishSpawning")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolFlags",ValueChanges=(("APF_ServerOnly","ServerOnly")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolFlags",ValueChanges=(("APF_BroadcastDestroy","BroadcastDestroy")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolFlags",ValueChanges=(("APF_SetNetDormancy","SetNetDormancy")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolFlags",ValueChanges=(("APF_DefaultSettings","DefaultSettings")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolSpawnerDistribution",ValueChanges=(("APSD_Point","Point")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolSpawnerDistribution",ValueChanges=(("APSD_Radius","Radius")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolSpawnerDistribution",ValueChanges=(("APSD_Sphere","Sphere")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolSpawnerDistribution",ValueChanges=(("APSD_Box","Box")))
+EnumRedirects=(OldName="/Script/NexusActorPools.ENActorPoolSpawnerDistribution",ValueChanges=(("APSD_Spline","Spline")))
+EnumRedirects=(OldName="/Script/NexusFixersEditor.ENValidatorSeverity",ValueChanges=(("NVS_Disable","Disable")))
+EnumRedirects=(OldName="/Script/NexusFixersEditor.ENValidatorSeverity",ValueChanges=(("NVS_Warning","Warning")))
+EnumRedirects=(OldName="/Script/NexusFixersEditor.ENValidatorSeverity",ValueChanges=(("NVS_WarningButValid","WarningButValid")))
+EnumRedirects=(OldName="/Script/NexusFixersEditor.ENValidatorSeverity",ValueChanges=(("NVS_Error","Error")))
+EnumRedirects=(OldName="/Script/NexusFixersEditor.ENValidatorSeverity",ValueChanges=(("NVS_Message","Message")))
+EnumRedirects=(OldName="/Script/NexusProcGen.ENCellJunctionType",ValueChanges=(("CJT_TwoWaySocket","TwoWaySocket")))
+EnumRedirects=(OldName="/Script/NexusProcGen.ENCellJunctionType",ValueChanges=(("CJT_OneWaySocket","OneWaySocket")))
+EnumRedirects=(OldName="/Script/NexusProcGen.ENCellJunctionRequirements",ValueChanges=(("CJR_Required","Required")))
+EnumRedirects=(OldName="/Script/NexusProcGen.ENCellJunctionRequirements",ValueChanges=(("CJR_AllowBlocking","AllowBlocking")))
+EnumRedirects=(OldName="/Script/NexusProcGen.ENCellJunctionRequirements",ValueChanges=(("CJR_AllowEmpty","AllowEmpty")))
+EnumRedirects=(OldName="/Script/NexusProcGen.ENCellVoxel",ValueChanges=(("CVD_Empty","Empty")))
+EnumRedirects=(OldName="/Script/NexusProcGen.ENCellVoxel",ValueChanges=(("CVD_Occupied","Occupied")))
+EnumRedirects=(OldName="/Script/NexusProcGen.ENOrganGenerationTrigger",ValueChanges=(("OGT_GenerateOnLoad","GenerateOnLoad")))
+EnumRedirects=(OldName="/Script/NexusProcGen.ENOrganGenerationTrigger",ValueChanges=(("OGT_GenerateOnDemand","GenerateOnDemand")))
+EnumRedirects=(OldName="/Script/NexusProcGen.ENOrganGenerationTrigger",ValueChanges=(("OGT_GenerateAtRuntime","GenerateAtRuntime")))
+EnumRedirects=(OldName="/Script/NexusProcGen.EBuildMethod",NewName="/Script/NexusProcGen.ENullBuildMethod")
+EnumRedirects=(OldName="/Script/NexusCore.ENActorComponentLifecycleStart",ValueChanges=(("ACLS_BeginPlay","BeginPlay")))
+EnumRedirects=(OldName="/Script/NexusCore.ENActorComponentLifecycleStart",ValueChanges=(("ACLS_InitializeComponent","InitializeComponent")))
+EnumRedirects=(OldName="/Script/NexusCore.ENActorComponentLifecycleEnd",ValueChanges=(("ACLE_UninitializeComponent","UninitializeComponent")))
+EnumRedirects=(OldName="/Script/NexusCore.ENActorComponentLifecycleEnd",ValueChanges=(("ACLE_EndPlay","EndPlay")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_North","North")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_NorthNorthEast","NorthNorthEast")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_NorthEast","NorthEast")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_EastNorthEast","EastNorthEast")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_East","East")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_EastSouthEast","EastSouthEast")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_SouthEast","SouthEast")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_SouthSouthEast","SouthSouthEast")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_South","South")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_SouthSouthWest","SouthSouthWest")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_SouthWest","SouthWest")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_WestSouthWest","WestSouthWest")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_West","West")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_WestNorthWest","WestNorthWest")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_NorthWest","NorthWest")))
+EnumRedirects=(OldName="/Script/NexusCore.ENCardinalDirection",ValueChanges=(("CD_NorthNorthWest","NorthNorthWest")))
+EnumRedirects=(OldName="/Script/NexusCoreEditor.ENUpdatesChannel",ValueChanges=(("NUC_GithubRelease","GithubRelease")))
+EnumRedirects=(OldName="/Script/NexusCoreEditor.ENUpdatesChannel",ValueChanges=(("NUC_GithubMain","GithubMain")))
+EnumRedirects=(OldName="/Script/NexusCoreEditor.ENUpdatesChannel",ValueChanges=(("NUC_Custom","Custom")))

0.2.5 - 2026-01-11​

Changed​

  • The main branch of the GitHub repository is now the base point of development; tags are still created for specific release versions, with those points in time being commited to the release branch.
  • Code cleanup is driven by SonarQube static analysis and suggestions.
  • Status check reports for GitHub actions are now marked on individual commits.

Fixed​

  • Add proper editor menu cleanup for the NexusFixers plugin.

0.2.4 - 2026-01-06​

Added​

  • FNTestUtils::PrePerformanceTest() and FNTestUtils::PostPerformanceTest() for reusable performance testing steps.

Changed​

  • Update detection now bumps the ignored version to the installed version if it is greater than the saved version.
  • Exposed all log categories for external reference.

Fixed​

  • Accuracy of FNMethodScopeTimer improved, as well as fixed TEXT() macro not being closed.

Removed​

  • Unnecessary TODOs in non-experimental plugins.

0.2.3 - 2025-12-21​

Added​

  • Automatic UNActorPoolSet loading configurable in project Actor Pool Settings
  • Glyph based FNPrimitiveFont supporting rendering FString through PDI (FNPrimitiveDrawingUtils::DrawString) and other drawing interfaces (FNDrawDebugHelpers::DrawDebugString).
  • Support for FNDrawDebugHelpers::DrawDebugString via UNDeveloperLibrary::DrawDebugString.
  • UNMultiplayerLibrary exposing FNMultiplayerUtils support for PlayerIdentifier.

Changed​

  • Altered GitHub actions to dispatch tests based on the initial Unit test, as well as fixed up additional warnings thrown by EGS UE.
  • Allow adding multiple UNCellJunctionComponent to a single parent.
  • UNCellJunctionComponent will now draw indicators for the unit size as well as their actual size.
  • The NCellActor will rename itself to reflect the map name that it creates data for.
  • The Is Host and ? Is Host Blueprint methods have had their display names changed to Is Server and ? Is Server respectively.
  • N_SETTINGS_BASE now offers a GetMutable non-const accessor, copying N_EDITOR_SETTINGS_BASE.
  • Renamed FNSeedGenerator::SeedFromText to FNSeedGenerator::SeedFromString.
  • Lowered warning level to Log when creating a new FNActorPool that already exists in a nested UNActorPoolSet.

Fixed​

  • Selecting the NCellActor no longer adds it to the current selection, instead clearing and making it the sole selected.
  • Tickable subsystems with conditional ticks now properly respect their conditional tick settings.

Removed​

  • N_LOG and NE_LOG macros were removed in favor of using the base UE_LOG macro, providing better integration IDE's UE tooling.

0.2.2 - 2025-09-24​

Added​

  • FNActorPoolSettings::Flags now has a defaulted APF_SetNetDormancy flag.

Changed​

  • Optimized FNActorPool actor creation to quarter the costs in Editor and Development builds.
  • FNActorPool::CreateActor now takes an optional count to support bulk creation.

0.2.1 - 2025-09-23​

Added​

  • Native calls to fill arrays with results of NMersenneTwister methods.
  • Additional blockout shapes for torus' and some larger cuboids.

Changed​

  • Exposed FNMethodScopeTimer for external linking/usage.
  • Optimized some NMersenneTwister distribution calls.
  • Explicit ManualStop option to both FNTestScopeTimer and FNTestScopeTimer.
  • Clarified flags for Actor Pools created during tests.

Removed​

  • Internal distribution resets in the NMersenneTwister.

0.2.0 - 2025-09-19​

Added​

  • NEngineContentValidator throws configurable severity when any content inside the Engine folder is saved.
  • VLOG support for all pickers.
  • #65 Option to automatically profile multiplayer test clients and standalone server.
  • #64 Utilize DefaultTransform option on FNActorPoolSettings as the return location and the scale when spawning.
  • #63 Add ServerOnly flag by default to FNActorPoolSettings.
  • #62 Added support for nesting UNActorPoolSet.
  • #31 Added a watermark option to NSamplesDisplayActor.
  • #45 Configurable default NActorPool settings via project settings (Projct Settings > Nexus > Actor Pools).
  • #47 Add update channel support to the framework.
  • Ability to determine if a game is running inside a multiplayer test via both utility and blueprint library methods.
  • Support programatically allowing/disallow config files to be staged via FNEditorUtils::AllowConfigFileForStaging and FNEditorUtils::DisallowConfigFileForStaging.
  • Add safety check when creating actor pools that we are not getting passed a nullptr.
  • INActorPoolItem now has a dynamic multicast delegate (OnActorOperationalStateChanged) that fires when changing states.
  • UNActorPoolLibrary supporting methods to bind to INActorPoolItem delegate.
  • Configurable distribution inner & outer visualizer colors in Editor Preferences > NEXUS > Core (User)
  • External tool section to Unreal default Tools > Profile menu with NetworkProfiler when present.
  • Samples content now contains ANSamplesHUD and ANSamplesPawn to support making documentation easier.
  • UNDeveloperSubsystem in non-release builds allowing for monitoring of object counts and providing details.
  • stats NActorPools command to show stats (if tracking enabled).
  • Manual AddReference / RemoveReference access on UNDynamicReferencesSubsystem.
  • Custom cpp.hint file in the plugin folder to mitigate Visual Studio's parser from incorrectly flagging UE macros as not found.

Fixed​

  • ANSamplesDisplayActor no longer causes headless servers to crash.
  • FNActorPool will properly time-slice their strategies.
  • FGCScopeGuard guards like a boss during tests now.
  • Crashes when trying to Pan a non-blueprint editor that uses the blueprint editor (Curves, etc.).
  • UNActorPoolSpawnerComponent will properly now allow BP editing of some variables.

Changed​

  • [#48] Use HideCategories instead of using a layout customizer pattern.
  • Corrected a comparison link at bottom of CHANGELOG.
  • Renamed InstanceObjects to DelayedEditorTask types.
  • Validators now have a combined configuration / strictness level in Project Settings.
  • Performance testing framework can now use GCScopeGaurd when doing measured tests.
  • Properly renamed validators with the N prefix.
  • SplineLevelReference will only be visible when APSD_Spline is selected as the Distribution on UNActorPoolSpawnerComponent.
  • Renamed bDontDestroyStaticActors / bDontDestroyNonInterfacedActors to bIgnoreStaticActors / bIgnoreNonInterfacedActors.
  • FNActorPoolSettings now uses a bitmask Flags configuration option instead of a long list of boolean flags.
  • Clarified all int to int32 to standardize with Unreal platform definitions.
  • Disabled Automatically Set Usage in Editor flag on M_NDebug, M_NDebugText and M_NWireframe materials.
  • General spelling and grammar fixes to CHANGELOG.md.
  • Altered NSamplesDisplayActor to support replication.
  • Inside or On abbreviated to IO.
  • Miscellaneous fixes and tweaks to support rolling out documentation.
  • Optimized FNActorPool to use a cached IsStubMode() for clients using a server-only pool.
  • Moved Leak Check duration setting to user level preference.
  • Clearly defined usage of FNMetaUtils static methods in helper macros.
  • NEXUS: Material Library renamed to NEXUS: Blockout.
  • External documentation now supports comma-delimited multiple entries.

Removed​

  • bAllowCreateMoreObjects became obsolete on FNActorPoolSettings.
  • Extra bRequiresDeferredConstruction on FNActorPool, replaced with a flag.

Core Redirects​

+PropertyRedirects=(OldName="/Script/NexusActorPools.NActorPoolSettings.ReturnMoveLocation",NewName="/Script/NexusActorPools.NActorPoolSettings.StorageLocation")
+PackageRedirects=(OldName="/NexusMaterialLibrary/",NewName="/NexusBlockout/MaterialLibrary/",MatchSubstring=true)

Experimental​

  • NEXUS: Developer Console renamed to NEXUS: Developer Menu still not functioning stub.
  • NEXUS: ProcGen has some initial structural work done, but is still not functional.

0.1.1 - 2025-08-01​

Changed​

  • Resolves issues with Shipping build configuration (accidental reference to FunctionalTesting modules in Core).
  • Resolves issues with Shipping build configuration for NSamplesDisplayActor, in shipping builds the test portions will not function.
  • Replaced NTextRenderActor functionality with NTextRenderComponent functionality.

0.1.0 - 2025-07-31​

Added​

  • NActorPools Generalized pooling system for Actors.
  • NCore Functionality used by all NEXUS plugins in the framework.
  • NDynamicReferences Method for referring to runtime Actors without knowing them.
  • NFixers A collection of tools for fixing content in the Unreal Editor.
  • NMaterialLibrary Library of Materials commonly used.
  • NMultiplayer Functionality and tools that are useful when developing multiplayer games.
  • NPicker Selection functionality for points and other items.
  • NUI Components for creating a user interface based on UMG/Slate.