CrimsonMotionWarping
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.CrimsonMotionWarping makes lunges, dashes and gap-closers land correctly: one ability node picks the target, keeps the warp within the distance the animation was authored for, stops the character at striking distance instead of inside the enemy, and turns Motion Warping's silent setup mistakes into visible errors. 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
| Situation | Stock Motion Warping | With this plugin |
|---|---|---|
| Target beyond the animation's reach | Stretches without limit | Clamped to an authored band, reported as ClampedTooFar |
| Warp target name typo | Modifier disables itself, plays unwarped, Verbose log only, never re-enables | Blueprint compile error, asset validation error, and a runtime warning |
| Where the character stops | On the target's origin | At a standoff derived from both capsule radii |
| Warp path crosses a wall | Warps through it | Shortened to the blocking hit, reported as ClampedByGeometry |
| Warp target left over from a previous montage | Silently warps to the old target | Warned, and released by three independent nets |
| Turn speed | Spread across the whole warp window | Bounded by Max Turn Seconds |
What's included
| System | Key types | Purpose |
|---|---|---|
| Warping component | UCrimsonMotionWarpingComponent | Resolves and plants warps, owns the target leases and the missing-target warning |
| Profile asset | UCrimsonWarpProfile | The per-attack-family policy a designer authors |
| Ability node | UCrimsonAbilityTask_WarpToTarget, UCrimsonWarpTaskFactory | The single Blueprint node, Crimson Warp To Target |
| Result | FCrimsonWarpResolveResult, ECrimsonWarpOutcome | The full derivation behind a warp, not just its answer |
| Target contract | ICrimsonWarpTargetProvider | Implement to supply targets without depending on this plugin |
| Blueprint library | UCrimsonMotionWarpingLibrary | Preview a warp without planting anything |
| Validation | Asset validator plus compile-time node checks | Turns Motion Warping's silent failures into errors |
| Diagnostics | Crimson.MotionWarping.Debug, Crimson.MotionWarping.DevTools | In-world range rings and a live PIE inspector |
Plugin dependencies
| Group | Dependency | Needed for |
|---|---|---|
| Crimson plugins | None | Fully standalone |
| Engine modules | MotionWarping | UMotionWarpingComponent, UMotionWarpingUtilities |
| Engine modules | GameplayAbilities | UAbilityTask, FGameplayAbilityTargetData |
| Engine modules | GameplayTasks | UGameplayTask, the ability task's base |
| Engine modules | GameplayTags | The profile's target purpose tag |
| Engine modules | DeveloperSettings | Project settings |
| Engine modules | NetCore (private) | FVector_NetQuantize100 on the wire |
| Engine modules | Projects (private) | Gameplay tag ini registration |
| Engine modules | DataValidation (editor) | The montage validator |
ICrimsonWarpTargetProvider, an interface this plugin owns. Whatever picks targets in your project - a lock-on component, an AI targeting component, a Blueprint actor component - implements that interface, and this plugin never references it directly. (CrimsonCore - requires all Crimson plugins) ships UCrimsonCoreLockOnWarpTargetProvider, which answers with the camera lock-on target.Where to go next
Source/CrimsonCore/{Public,Private}/Integration/MotionWarping/: UCrimsonCoreLockOnWarpTargetProvider answers ICrimsonWarpTargetProvider with the camera lock-on target, and UCrimsonCoreLockOnWarpTargetSubsystem adds it to receiver pawns. To wire it yourself, see CrimsonCommon -> Concept: Connecting Crimson Plugins; for what CrimsonCore installs, see CrimsonCore -> Concept: The Integration Layer.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.