CrimsonMotionWarping

Character owners only
This plugin drives Unreal's Motion Warping, which only builds a warping adapter for ACharacter. A non-character pawn logs an error and the component stays inert. The character adapter is also the only one that reconstructs correctly during client prediction replay, so there is no supported non-character path.

Motion Warping distorts real authored root motion to land a character on a target, which keeps weight shift and foot planting intact in a way an interpolated SetActorLocation never does. What it has no opinion about is how far. The engine scales root motion by distance-to-target divided by remaining-animation-distance with no clamp of any kind, so a lunge authored to travel 200cm will stretch to 2000cm and slingshot the player across the arena.

This plugin wraps the engine's warping rather than replacing it. Your existing montages and Motion Warping notifies keep working unchanged; the plugin simply computes a better warp target, so the engine's own skew math never receives one outside the animation's authored intent.

What it fixes

SituationStock Motion WarpingWith this plugin
Target beyond the animation's reachStretches without limitClamped to an authored band, reported as ClampedTooFar
Warp target name typoModifier disables itself, plays unwarped, Verbose log only, never re-enablesBlueprint compile error, asset validation error, and a runtime warning
Where the character stopsOn the target's originAt a standoff derived from both capsule radii
Warp path crosses a wallWarps through itShortened to the blocking hit, reported as ClampedByGeometry
Warp target left over from a previous montageSilently warps to the old targetWarned, and released by three independent nets
Turn speedSpread across the whole warp windowBounded by Max Turn Seconds

What's included

SystemKey typesPurpose
Warping componentUCrimsonMotionWarpingComponentResolves and plants warps, owns the target leases and the missing-target warning
Profile assetUCrimsonWarpProfileThe per-attack-family policy a designer authors
Ability nodeUCrimsonAbilityTask_WarpToTarget, UCrimsonWarpTaskFactoryThe single Blueprint node, Crimson Warp To Target
ResultFCrimsonWarpResolveResult, ECrimsonWarpOutcomeThe full derivation behind a warp, not just its answer
Target contractICrimsonWarpTargetProvider (CrimsonCommon)Implement to supply targets without depending on this plugin
Blueprint libraryUCrimsonMotionWarpingLibraryPreview a warp without planting anything
ValidationAsset validator plus compile-time node checksTurns Motion Warping's silent failures into errors
DiagnosticsCrimson.MotionWarping.Debug, Crimson.MotionWarping.DevToolsIn-world range rings and a live PIE inspector

Plugin dependencies

GroupDependencyNeeded for
Crimson pluginsCrimsonCommonLogging macros, and ICrimsonWarpTargetProvider
Engine modulesMotionWarpingUMotionWarpingComponent, UMotionWarpingUtilities
Engine modulesGameplayAbilitiesUAbilityTask, FGameplayAbilityTargetData
Engine modulesGameplayTasksUGameplayTask, the ability task's base
Engine modulesGameplayTagsThe profile's target purpose tag
Engine modulesDeveloperSettingsProject settings
Engine modulesNetCore (private)FVector_NetQuantize100 on the wire
Engine modulesProjects (private)Gameplay tag ini registration
Engine modulesDataValidation (editor)The montage validator
No dependency on CrimsonCamera
Automatic targeting runs entirely through ICrimsonWarpTargetProvider, which lives in CrimsonCommon. Lock-on implements it; so can your own AI targeting component. This plugin includes nothing from CrimsonCamera.

Where to go next

Which path do I choose?
Setting this up for the first time: Quick Start.
Already running and tuning how it feels: How-To: Tune Reach and Standoff and How-To: Control Turn Speed.
One attack needs different numbers: How-To: Override Values Per Attack.
Something is not warping and you want to know why: How-To: Diagnose a Warp.
You want the model rather than the recipe: Concept: How Reach Is Derived.