Timeline behavior:
- Natural end of playback now clamps to Duration and holds values there
(no auto-rewind, no simulation reset) — symmetric between editor and
gameplay. New Restart button does the rewind+replay sequence explicitly.
- Pause now freezes character movement too (new SetSimulationPaused on
the PlayerController stops AI ticks without restoring saved transforms
the way StopSimulation does).
- Simulate toolbar button is wired through the timeline: with at least one
track, it toggles Play/Pause; without tracks it falls back to direct
StartSimulation/StopSimulation. Label stays "Simulate"/"Stop" so it
doesn't duplicate the timeline panel's own Play button.
- SetKeyTime re-sorts keys; clicking a key selects the animated actor
exclusively (ClearSelection first) so splines release their handles.
- Seek now invalidates LastAppliedValues: a manual property edit between
two seeks used to leak onto the next key because the cache made the
next seek skip the write.
- Keyframe colors are saturated: vivid blue / orange / green / yellow
instead of the washed-out pastels.
Scene load robustness:
- New LoadActorClassRobust chains TryLoadClass, LoadPackage+retry,
LoadObject, StaticLoadClass — covers cold BP post-load races that made
actors silently fail to spawn on the first PIE of a session.
- Failed class loads and null-spawn actors now log Error with class path
and location; a Warning/Log recap lands at the end of every load.
- Actors that end up hidden or invalid after the pipeline get their own
Warning/Error lines for post-mortem diagnosis.
Base level handling:
- New bIsDefault flag on FPS_Editor_BaseLevelEntry. The entry marked
default is loaded automatically at editor startup (when no pending
scenario is queued) and as fallback when a scenario saved without a
base level ("Unfiled" folder) is opened.
- Removed the hardcoded "None" option from the base level popup — the
project defines its own default entry instead (e.g. renamed to "None").
- Previous behavior of LoadBaseLevelAsSublevel("Unfiled") is gone; the
bogus sublevel load used to leave the loading screen stuck.
Spline visuals:
- SetRenderCustomDepth is now off by default and only turned on while the
spline is selected — project outline post-process materials no longer
highlight every loaded spline.
- ImportFromCustomProperties forces SetHandlesVisible(false) and
SetSelected(false) after setting points (both PS_Editor and
PS_BehaviorEditor versions) so loaded splines start in the deselected
visual state.
AI in editor:
- Spawned pawns now get their AI disabled synchronously right after
SpawnActor (in addition to the existing next-tick fallback) so the BT
can't drive the character for the 1-frame gap between spawn and timer.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- All UFUNCTION/UPROPERTY Category prefix changed from "PS Editor" to "ASTERION|PS_Editor"
- Components ClassGroup changed to "ASTERION|PS Editor" (sub-hierarchy in Add Component menu)
- Create Spawnable Blueprint: defer asset loading until menu click
(was loading all meshes on right-click, causing 30s freeze)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- ScheduleNetworkRebuild() called after AddPoint, RemovePoint, SetAllPointLocations
- 0.5s debounce timer avoids redundant rebuilds during rapid editing
- AI NPCs now detect and follow splines placed in the editor immediately
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Refactor spline system to use IPS_Editor_SplineEditable interface:
- New interface in Spline/PS_Editor_SplineEditable.h with all editing methods
- APS_Editor_SplineActor and APS_BehaviorEditor_AISpline both implement it
- All ~40 Cast<APS_Editor_SplineActor> replaced with Cast<IPS_Editor_SplineEditable>
- UndoManager SplinePointAction uses TWeakObjectPtr<AActor> + interface cast
- Any actor implementing the interface works with full editor spline editing
Spline visibility:
- SetVisualizationVisible() hides tube/handles/cube in gameplay (data stays for AI)
- SceneLoader calls it when stripping editor components
- SplineMatOccluded material added (unused for now, PP occlusion planned)
Other improvements:
- Snap spline CP to ground on placement (downward raytrace)
- Play button works without BaseLevel (uses current editor map)
- AISpline triggers SplineNetwork::RebuildNetwork on BeginPlay (next tick)
- PS_BehaviorEditor marked EnabledByDefault: false (only active in PROSERVE)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New plugin that bridges PS_Editor and PS_AI_Behavior:
- APS_BehaviorEditor_AISpline inherits from APS_AI_Behavior_SplinePath
(detected by SplineNetwork, usable by BT tasks)
- Implements IPS_Editor_PointPlaceable (click-to-place flow)
- Full tube visualization + handles (adapted from PS_Editor_SplineActor)
- SpawnableComponent (catalogue category "AI") + EditableComponent
- Editable AI properties: SplineCategory, bBidirectional, SplineWalkSpeed, Priority
- Custom serialization for spline points + AI properties
- No modifications to PS_Editor or PS_AI_Behavior plugins
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>