Changelog
[0.3.2] - 2026-07-13​
It's important that you rebake any
UNCelldata (use the commandlet) as calculations and existing data needs to be rebuilt.
Added​
UNOrganComponentnow have bothContext TagandTag Counterrequirements.UNOrganComponentDirection 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), orDynamic Centroid(the running centroid of already-placed cells, falling back to the start bone before the first cell is placed).Quick Assemblyworkflow on the World Assembly editor-mode toolbar: select a targetUNOrganComponentfrom a dropdown and start/cancel an assembly operation in place, with an optionalAuto Assemblymode that re-runs on a configurable timer. AddsWorld Assembly (User)settingsLoad Level Instances,Auto Assembly, andAuto Assembly Timer.NEXUS.WorldAssembly.Flag.Hotpathassembly flag for creating pathing feedback post assembly in both theANCellLevelInstanceas well as junctions.INCellJunctionFillerinterface for filler objects to implement to get callbacks when used to fill empty junctions.UNPickerSettingsproject settings (Project Settings > NEXUS > Picker, stored inDefaultNexusGame.ini) exposing point-projection configuration:Trace Complex,Nav Query Extent,Nav Agent Radius, andNav Agent Height.
Changed​
UNWorldAssemblySubsystem::IsReady()nowUNWorldAssemblySubsystem::IsReady(bool bWaitOnStreaming = true)defaulting to waiting for level streaming to complete.ANCellProxynow hold and pass toANCellLevelInstanceinformation aboutUNCellJunctionComponentand their linkage.FNMersenneTwisterDouble/Float/Integer minimum default values now properly negative by default.FNMultiplayerUtils::GetPlayerIdentifiernow returns-1when thePlayerStateis not available.ANPooledActorrenamedANPooledActorBase.- Clients with
BeginPlayflaggedUNOrganComponentswill not generate without authority. FNGameplayTagCounterConstraintdefaults the comparison value to0if the tag is not found.FNGameplayTagCounterno longer floors counts at zero; the mutation API (Add/Subtract/Increment/Decrement) now produces signed values, keeping operations losslessly reversible and consistent withGetDifference/Combine.- Created
UNMersenneTwisterObjectto hold a twister to be used for deterministic random in a wider scope, Blueprint-exposed under theNEXUS|Core|Randomcategory (Seed,Random Bool,Random Bools,Random Integer In Range). - Consolidated
TwistedtoNextconcept/naming. - Cell junction
Requirementsnow respected, weights for junctions are automatically doubled when they areRequired. UNTextRenderComponentnow warns about replication instead of setting it, with a toggle.UNMultiplayerLibrary::KickPlayeris nowBlueprintAuthorityOnly; the Blueprint node only executes on the authority.
Fixed​
- Crash when displaying collision visualizer twice in a level.
ANWorldAssemblyRelaynow properly responds toIsReady(ANCellLevelInstancesnow register appropriately when on clients)- Macros for PostEngineInit for modules now function properly during teardown.
- Bounds and Center on
FNRawMeshnow initialized at creation (no more garbage memory comparisons). FNMultiplayerUtilsplayer-lookup helpers now guard against a nullAGameStateBase, andHasWorldAuthority(const UWorld*)guards against a nullUWorld, preventing crashes during world startup/teardown and on clients before initial replication.FNHashUtils::djb2now hashes the string's UTF-8 encoding instead of truncating eachTCHARto its low byte, so non-ASCII characters that share a low byte (e.g.Ωand©) no longer collide andFNSeedGenerator::SeedFromStringgains full character information from non-Latin seed phrases. Pure-ASCII input hashes are unchanged.CellLinkDetails.bConnectedwill only be true connecting to another Cell.UNMultiplayerTestSubsystemnow always removes itsBeginStandaloneLocalPlaydelegate binding when stopping, including on the editor teardown path where the previous guard skipped cleanup.UNBlueprintValidatornow guards against a nullBlueprintcast and nullNodeentries while iterating graph nodes, matchingUNLevelBlueprintValidator.
Removed​
- Junctions no longer store if they are inside of a hull.
ANPooledActorfrom the placement pallete.ANCellLevelInstanceno longer maintains state before the choice to place it in the graph.FNPickerUtilsstatic projection configuration (CollisionQueryParams,NavQueryExtent,NavAgentProperties) replaced byUNPickerSettings.
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​
FNAssemblyGraphNodesnow have a deterministic seed stored along side their generation, accesible atINCellInitializedtime.Bad Neighborstag grouping forUNTissue, preventing adjacent cell placement.NEXUS.WorldAssembly.Flag.AlwaysRelevantbehavioral tag.TagCountersconstraints and operations toUNTissue.- Required
ContextTagsoption onUNTissueentries. - Both
FNActorPoolandUNActorPoolSubsystemgained the ability toReturnAll/ReturnAllActors. FNActorPoolSettingsnow has aSupportFlagssection, includingReturnAll.- Added accessors to a global mutable copy of the
Tag Countersand theContext Tagsof a generation, with supporting Blueprint functionality. - Added
Maximum Node DepthandDirectional ConstraintstoUNTissuedefinitions. Direction Tolerancesetting (default 15-degrees, project-wide and per-operation) controlling how close a candidate's bearing must be to aUNTissueDirectional Constraintto be placed.UNActorPoolSubsystem::GetActorPoolStats()returns Spawned/Available details for a targetFNActorPool.FNReportListBlocknow available in reports.- Option in
World Assemblyproject settings to enable output of status messages from operations to the log, normally only visible in the developer overlay. FNActorPoolsupportsOnDeferredConstructionslow-invoking with flag.- Quick
Has Tag ?andHas Exact Tag ?helper nodes forFGameplayTags.
Changed​
FNRawMeshcollision meshes used inside of assembly operation tasks bake out their transforms.ANCellActor::AuthorTimeActorsare no longer factored into spatial calculations forUNCells.- GameplayTags renamed
NEXUS.WorldAssembly.BuiltIn.*toNEXUS.WorldAssembly.Behavior.*. OutputTagswas moved to a more encompassingContextTags.FNGameplayTagCounterdoes not allow for negative counter values.FNWorldAssemblyEdMode::RenderCellJunctionPenetrationDistancenow always renders the distance underneath theUNCellJunctionComponent.WorldAssemblyEdModeCollision Visualizer now tracks for changes in the level, accounting for its offset.- Reworked
FNEditorInputProcessorto not compare pointers, instead look at screen position and button presses to determine if the same. - Cleaned up
IsPointInsideOrOnforFNOrientedBoxPickerto be less-math. UNDynamicRefSubsystem::GetCount(NDR_None)will return0instead of-1.UNDynamicRefSubsystemnow holds registered objects as weak references; it no longer keeps aUObjectalive simply by referencing it, and entries are pruned lazily as objects are destroyed.
Fixed​
ANCellActoris no longer dirtied simply being opened.UNOrganComponent::Seedproperly overrides Organs' assembly operation seed when value is not-1.- Side-car
NCellasset is not loaded during cook process, restoring determinism. UNOrganComponentcustom-visualizerGeneratebutton now refreshes accordingly after operations have finished.PktJittersetting now properly applied to clients inMultiplayer Test.HasSupportFlag_ReturnAllnow properly queriesSupportFlag.- Protect against
NSpawnActorBlueprintAsyncActionoccuring afterUWorldteardown. FNRectanglePickerno longer crashes in hollow mode whenMinimumDimensionsequalsMaximumDimensions;FNRectanglePickerParams::GetValidRangesnow falls back to the full rectangle instead of returning an empty range that was indexed out of bounds.UNDynamicRefSubsystemno longer broadcastsOnAdded/OnAddedByNamewhen re-adding an object already present (a no-opAddUnique), keeping the add/remove delegate pairing symmetric.- DynamicRefs developer overlay no longer leaks
UNDynamicRefObjectlist-view wrappers for objects destroyed without removal;UNDynamicRefObjectnow prunes stale entries so emptied wrappers are cleaned up. UNGetActorBlueprintAsyncActionnow guards against a nullUNActorPoolSubsystemwhen unbinding its pool-created callback, matchingUNSpawnActorBlueprintAsyncAction.UNGetActorBlueprintAsyncActionandUNSpawnActorBlueprintAsyncActionnow 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 allowingAActorto 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​
FNDeveloperUtilsandUNDeveloperLibrarynow haveIsBuildDemo()methods to supportIS_BUILD_DEMOdefinitions from build targets.- Pickers all now have a
Twistedmethod to support passing aFNMersenneTwister. ANDebugPointActorfor quick point debugging.NexusCore,NDynamicRefs,NGuardian,NUIall have Unit and Performance-based testing.NValidationMacrosto support providing easy to use validation for Blueprint-facing methods.NGuardiannow supports automatically setting its baseline after a defined period (default 15 seconds).NCellside-car data file now has an action button, that when clicked in the Content Browser will select the source world/level.FGameplayTagsupport toNDynamicRefs.GenerateandCleanupconsole commands forUNWordAssemblySubsystem.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
_0suffix to make auto-incrementing cleaner in map placement. ANSamplesPawnnow replicates movement.- Synthetic graph navigation has been expanded to being a synthetic-ish event and now works with every asset editor.
NActorPooltests now run in PIE worlds.- Forces
ANPooledActorto beabstract. - Updated project-wide to enforcing
American Englishfor spelling. FNActorPool::DoesSupportInterfacerenamed toFNActorPool::ImplementsPoolItemInterfaceFNActorPool::HasInvokeUFunctionFlagrenamed toFNActorPool::ShouldInvokeUFunctionsFNActorPool::GetInCountrenamed toFNActorPool::GetAvailableCountFNActorPool::GetOutCountrenamed toFNActorPool::GetSpawnedCountUNActorPoolObject::DoesSupportInterfacerenamed toUNActorPoolObject::ImplementsPoolItemInterfaceUNActorPoolObject::HasInvokeUFunctionFlagrenamed toUNActorPoolObject::ShouldInvokeUFunctionsUNActorPoolObject::GetInCountrenamed toUNActorPoolObject::GetAvailableCountUNActorPoolObject::GetOutCountrenamed toUNActorPoolObject::GetSpawnedCount- All
intnow replaced withint32to be explicit. NGuardianSubsystemnow does writing of reports using async tasks.FNActorPool::OnDestroyedByActorPooltoFNActorPool::OnReleasedFromActorPoolto better reflect actual doingUNKillZoneComponent::UnknownBehaviourto define behavior when an AActor is not known or able to be processed.FNActorPoolpreallocates more appropriately for its In/Out arrays.- Started using pattern in Widgets where
BindWidgetmembers are validated inNativeConstructoronly. - Moved
Multiplayer TestintoNexusTooling. - Renamed
NEXUS: ProcGenplugin toNEXUS: World Assembly(NexusProcGen→NexusWorldAssembly,NexusProcGenSamples→NexusWorldAssemblySamples,NProcGen*class prefix →NWorldAssembly*).CoreRedirectsinDefaultEngine.inihandle package + class renames so existing assets continue to load. FNLevelUtils::DetermineLevelBoundsnow 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::Diffnow uses a consumed model to calculate changes (no more copying of entries around)FNOrganGraphBuilderTasknow uses a frontier model to create a node-based graph.NPoseAssetFixernow prompts with a total number of Pose Assets its about to operate on allowing for cancelling; will not prompt in commandlet.NEXUS.WorldAssembly.BuiltIn.UniqueandNEXUS.WorldAssembly.BuiltIn.MustHavetags automatically applied to respective groups.
Fixed​
UNEditorUtilityWidget::DelayedConstructTaskno longer divides by a zero geometry size when the widget hasn't been laid out yet, which previously leftUnitScaleas NaN/inf.FNDrawDebugHelpers::DrawString,FNPrimitiveFont::DrawPDI, andFNPrimitiveFont::DrawBatchStringnow take the string asconst FString&, allowing literals and rvalues to be passed.FNPoseAssetFixer::OutOfDateAnimationSourcewill no longer allow operation on/All, select a subfolder.UNSamplesLevelActorandUNSamplesDisplayActornow properly build at runtime.- Fixed crash in
FNWeightedIntegerArraywhere removing could end up out of bounds. - Fixed
FNSpherePickerscenarios where points could be ever-so-slightly out of theMaximumRadius. FNRawMesh::CreateDynamicMeshno 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::DisallowConfigFileFromStagingandFNEditorUtils::AllowConfigFileForStagingnow properly use the project name.FNActorPoolnow properly marks createdAActoras root-object.UNActorPoolSubsystemwill no longer crash returning null actors, and returns false when the actor is destroyed, as it doesnt get returned to the pool.UNMultiplayerTestSubsystemnow concretely shutdown process handles, not relying on natural causes.UNActorPoolSubsystemcrash where a tickableFNActorPoolgets invoked during world teardown.FNActorPoolcrash when applying settings whereUWorlddoes not exist.FNActorPoolcrash when dealing with MaximumActorCount=0, now minimum of 1.FNActorPool::Returnnow rejects actors whose class does not match the pool'sTemplate, and rejects actors already present in the pool (non-Shipping builds only) — previously these would silently polluteInActorsor be handed back twice from subsequentGet()/Spawn()calls.FNRawMeshcrash when calculating center with no verticies.FNActorPoolprotect against the odd change that an actor is requsted and needs to be created when the pools world is being torn down.FNActorPoolspawning with designated rotation now properly applies.INActorPoolItemnow handles invocation during teardown gracefully.FNMersenneTwister::VectorNormalizednow provides-1to1component values.UNTextRenderComponentnow guards away from visuals on Dedicated Servers, but still replicates data to clients.- Deferred deletion of sidecar
NCelldata asset to next tick when renaming, speculative crash fix. FNMersenneTwisternow is cross-platform guaranteed, regardless of compiler to produce same results.
Removed​
Server_*variant methods onNTextRenderComponentstreamlining method calls; useSet*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​
ANSamplesLevelActornow hasbShowLevelNameandbShowLogoproperties to control whether the level name and logo are shown.ANSamplesDisplayActortitle settings now hasbShowTitleHorizontalRuleallowing for the title to be drawn with or without a horizontal rule.ANSamplesDisplayActortitle settings now hasTitleTextPaddingallowing for the title to have some padding from the edges.Window > Log > Clean Logs Folderwill remove much of the chaff in the projects saved/logs folder.NexusPickerdistributions now support finding the nearest point on a NavMesh (V1) via projection mode, withFNPickerUtils::NavQueryExtentcontrolling the distance from the NavMesh volume projectable.FNOrientedBoxPickerfor generating points in a box with rotation.FNEditorSlateUtilsandFNSlateUtils.- #117
Collision Visualizeradded toTools -> Debug. - #120
FNArcPickerfor generating points in an arc distribution. - #70 Add
Create Actor Pool Setbutton toUNActorPoolsEditorUtilityWidgetto create anUNActorPoolSetbased on the currently found pools in PIE. Invoke UFunctionsflag toUNActorPoolSettingsto enableUFUNCTIONinvoking on non-interfacedAActors, specifically invokingOnCreatedByActorPool,OnSpawnedFromActorPool,OnReturnToActorPool, andOnDestroyedByActorPool(when enabled) namedUFUNCTIONon theAActorif it does not implement theINActorPoolIteminterface.UNActorPoolsDeveloperOverlaynow has tooltips with detailed information about the behavior of the associatedFNActorPool.
Changed​
NEXUS: Fixershas been collapsed into a more generalizedNEXUS: Toolingplugin, this is where all your base Unreal Editor tooling has been shifted as well (from the editor side ofNEXUS: Core).- Menu entries were streamlined and repositioned to better fit into the UE ecosystem.
NexusDynamicReferencesmodule renamedNexusDynamicRefsavoid unnecessarily long names, this change includes all associated classes and methods.UNDeveloperOverlayWidgethas been renamed toUNDeveloperOverlayand moved to theNEXUS: UIplugin.- All
NexusPickerfunctionality has been changed to take variants ofFNPickerParamsstructs to consolidate options; this is a breaking change without any direct upgrade path. - #122
NexusBlockoutnow contain simplified collision primitives and UVs. ENActorPoolFlags::ReturnToStorageLocationrenamed toENActorPoolFlags::ReturnToStorageto match expansion to fullFTransfromset.UNDeveloperSubsystemrenamed toUNGuardianSubsystemand moved toNexusGuardianplugin.ANPooledActornow hasOnCreatedByActorPoolEvent,OnSpawnedFromActorPoolEvent,OnReturnToActorPoolEvent, andOnDestroyedByActorPoolEventbindable events.UNActorPoolsDeveloperOverlaynow prefixes pool bars with a color representing theAActorinterface and invoke state.UNActorPoolsDeveloperOverlaynow responds toN.ActorPools.DeveloperOverlay.UpdateRateconsole variable.
Fixed​
- Ensure that a
UNDelayedEditorTaskremoves itself fromUAsyncEditorDelaycomplete event when released. - Added exception for
UDataValidationChangelisttoUNEngineContentValidatoras when submitting with the Revision Control window the changelist object would prevent validation. FNCirclePicker::IsPointInsideOrOnandUNCirclePickerLibrary::IsPointInsideOrOnnow correctly returntruewhen the point is inside a rotated circle.FNBoxPickerandFNRectanglePickerno longer have regions unintentionally excluded in the distribution.ANSamplesLevelActornow properly flags theSM_SkySpherenot to have any collisions, stopping a warning when building NavMesh.- #125 Issue with
NPoseAssetFixernot working on external plugin content. UNActorPoolSubsystemnow properly placesUNActorPoolSetgenerated actors in the correct world, no longer leaving some in limbo.
Removed​
UNWidgetEditorUtilityWidgetno longer used to wrap content widgets, individuals should extend offUNEditorUtilityWidgetinstead.FNActorPoolhalf-height calculations and offset (useFActorPoolSettings::SpawnTransform).
0.2.6 - 2026-01-20​
Added​
Windows > NEXUS > Actor Poolsa tab for monitoring the pressure on theUNActorPoolSubsystemin realtime.FNDeveloperUtils::GetRootSetObjects()/FNDeveloperUtils::DumpRootSetToLog()to help with debugging world tear down issues.FNMultiplayerUtils::GetPing()UNTextRenderComponenticon in editor.UNEditorUtilityWidgetpersistent flag can be used to automatically restore state across map changes (as the widgets are recreated).FNWidgetUtilsto support converting from serialized to slate space.
Changed​
- Many enumerations have been modernized to
enum class, leaving only a fewenumwhere necessary. - Console command
NEXUS.ActorPools.TrackStatsrenamed toN.ActorPools.TrackStats. - Extracted test logic from
ANSamplesDisplayActorinto its own test object. UNActorPoolSubsystemnow respectsUnknownBehaviourinUNActorPoolsSettingsto determine what to do when anAActoris returned to the system when aFNActorPooldoes not exist for it.UNTextRenderComponentwill now ensure that its owningAActoronBeginPlayis 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
mainbranch 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 thereleasebranch. - 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
NexusFixersplugin.
0.2.4 - 2026-01-06​
Added​
FNTestUtils::PrePerformanceTest()andFNTestUtils::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
FNMethodScopeTimerimproved, as well as fixed TEXT() macro not being closed.
Removed​
- Unnecessary TODOs in non-experimental plugins.
0.2.3 - 2025-12-21​
Added​
- Automatic
UNActorPoolSetloading configurable in projectActor Pool Settings - Glyph based
FNPrimitiveFontsupporting renderingFStringthroughPDI(FNPrimitiveDrawingUtils::DrawString) and other drawing interfaces (FNDrawDebugHelpers::DrawDebugString). - Support for
FNDrawDebugHelpers::DrawDebugStringviaUNDeveloperLibrary::DrawDebugString. UNMultiplayerLibraryexposingFNMultiplayerUtilssupport forPlayerIdentifier.
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
UNCellJunctionComponentto a single parent. UNCellJunctionComponentwill now draw indicators for the unit size as well as their actual size.- The
NCellActorwill rename itself to reflect the map name that it creates data for. - The
Is Hostand? Is HostBlueprint methods have had their display names changed toIs Serverand? Is Serverrespectively. N_SETTINGS_BASEnow offers aGetMutablenon-const accessor, copyingN_EDITOR_SETTINGS_BASE.- Renamed
FNSeedGenerator::SeedFromTexttoFNSeedGenerator::SeedFromString. - Lowered warning level to
Logwhen creating a newFNActorPoolthat already exists in a nestedUNActorPoolSet.
Fixed​
- Selecting the
NCellActorno 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_LOGandNE_LOGmacros were removed in favor of using the baseUE_LOGmacro, providing better integration IDE's UE tooling.
0.2.2 - 2025-09-24​
Added​
FNActorPoolSettings::Flagsnow has a defaultedAPF_SetNetDormancyflag.
Changed​
- Optimized
FNActorPoolactor creation to quarter the costs in Editor and Development builds. FNActorPool::CreateActornow takes an optional count to support bulk creation.
0.2.1 - 2025-09-23​
Added​
- Native calls to fill arrays with results of
NMersenneTwistermethods. - Additional blockout shapes for torus' and some larger cuboids.
Changed​
- Exposed
FNMethodScopeTimerfor external linking/usage. - Optimized some
NMersenneTwisterdistribution calls. - Explicit
ManualStopoption to bothFNTestScopeTimerandFNTestScopeTimer. - Clarified flags for Actor Pools created during tests.
Removed​
- Internal distribution resets in the
NMersenneTwister.
0.2.0 - 2025-09-19​
Added​
NEngineContentValidatorthrows configurable severity when any content inside theEnginefolder is saved.- VLOG support for all pickers.
- #65 Option to automatically profile multiplayer test clients and standalone server.
- #64 Utilize
DefaultTransformoption onFNActorPoolSettingsas the return location and the scale when spawning. - #63 Add
ServerOnlyflag by default toFNActorPoolSettings. - #62 Added support for nesting
UNActorPoolSet. - #31 Added a watermark option to
NSamplesDisplayActor. - #45 Configurable default
NActorPoolsettings 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::AllowConfigFileForStagingandFNEditorUtils::DisallowConfigFileForStaging. - Add safety check when creating actor pools that we are not getting passed a
nullptr. INActorPoolItemnow has a dynamic multicast delegate (OnActorOperationalStateChanged) that fires when changing states.UNActorPoolLibrarysupporting methods to bind toINActorPoolItemdelegate.- Configurable distribution inner & outer visualizer colors in
Editor Preferences > NEXUS > Core (User) Externaltool section to Unreal defaultTools > Profilemenu withNetworkProfilerwhen present.- Samples content now contains
ANSamplesHUDandANSamplesPawnto support making documentation easier. UNDeveloperSubsystemin non-release builds allowing for monitoring of object counts and providing details.stats NActorPoolscommand to show stats (if tracking enabled).- Manual
AddReference/RemoveReferenceaccess onUNDynamicReferencesSubsystem. - Custom
cpp.hintfile in the plugin folder to mitigate Visual Studio's parser from incorrectly flagging UE macros as not found.
Fixed​
ANSamplesDisplayActorno longer causes headless servers to crash.FNActorPoolwill properly time-slice their strategies.FGCScopeGuardguards like a boss during tests now.- Crashes when trying to Pan a non-blueprint editor that uses the blueprint editor (Curves, etc.).
UNActorPoolSpawnerComponentwill properly now allow BP editing of some variables.
Changed​
- [#48] Use
HideCategoriesinstead of using a layout customizer pattern. - Corrected a comparison link at bottom of
CHANGELOG. - Renamed
InstanceObjectstoDelayedEditorTasktypes. - Validators now have a combined configuration / strictness level in
Project Settings. - Performance testing framework can now use
GCScopeGaurdwhen doing measured tests. - Properly renamed validators with the N prefix.
SplineLevelReferencewill only be visible whenAPSD_Splineis selected as theDistributiononUNActorPoolSpawnerComponent.- Renamed
bDontDestroyStaticActors/bDontDestroyNonInterfacedActorstobIgnoreStaticActors/bIgnoreNonInterfacedActors. FNActorPoolSettingsnow uses a bitmaskFlagsconfiguration option instead of a long list of boolean flags.- Clarified all
inttoint32to standardize with Unreal platform definitions. - Disabled
Automatically Set Usage in Editorflag onM_NDebug,M_NDebugTextandM_NWireframematerials. - General spelling and grammar fixes to
CHANGELOG.md. - Altered
NSamplesDisplayActorto support replication. Inside or Onabbreviated toIO.- Miscellaneous fixes and tweaks to support rolling out documentation.
- Optimized
FNActorPoolto use a cachedIsStubMode()for clients using a server-only pool. - Moved
Leak Checkduration setting to user level preference. - Clearly defined usage of
FNMetaUtilsstatic methods in helper macros. NEXUS: Material Libraryrenamed toNEXUS: Blockout.- External documentation now supports comma-delimited multiple entries.
Removed​
bAllowCreateMoreObjectsbecame obsolete onFNActorPoolSettings.- Extra
bRequiresDeferredConstructiononFNActorPool, 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 Consolerenamed toNEXUS: Developer Menustill not functioning stub.NEXUS: ProcGenhas some initial structural work done, but is still not functional.
0.1.1 - 2025-08-01​
Changed​
- Resolves issues with
Shippingbuild configuration (accidental reference toFunctionalTestingmodules inCore). - Resolves issues with
Shippingbuild configuration forNSamplesDisplayActor, in shipping builds the test portions will not function. - Replaced
NTextRenderActorfunctionality withNTextRenderComponentfunctionality.
0.1.0 - 2025-07-31​
Added​
NActorPoolsGeneralized pooling system for Actors.NCoreFunctionality used by all NEXUS plugins in the framework.NDynamicReferencesMethod for referring to runtime Actors without knowing them.NFixersA collection of tools for fixing content in the Unreal Editor.NMaterialLibraryLibrary of Materials commonly used.NMultiplayerFunctionality and tools that are useful when developing multiplayer games.NPickerSelection functionality for points and other items.NUIComponents for creating a user interface based on UMG/Slate.