Local teleportation at a configurable distance using a configurable hotkey. You teleport in the direction you are going. next steps are vfx from skills and stamina/spirit usage.
# Phase for Crimson Desert — v1.3
Press **V** to blink forward through walls. Configurable distance, QPC-driven slowmo on fire, instant-feel teleport via combined absolute + collision-sweep writes. Targeting now uses your **velocity vector** by default — if you’re moving in a direction, that’s where you blink, regardless of camera pitch / body lag.
Targets **`CrimsonDesert.exe v1.07.00`**.
## What’s new in v1.3 (2026-05-17)
– **`UseVelocityDirection=1` (new default)** — reads your actor’s current velocity vector at fire time and blinks along that. No more “I’m looking east but it sent me south” because of body-rotation lag. As long as you’re holding W (or any move key), blink goes where you’re going.
– Direction priority chain (highest first): **Velocity → ActorHeading → CameraDirection → MovementFacing**. Each falls through to the next if it can’t produce a valid direction. So if you stand still and press V, velocity falls through to actor-heading and you still blink along your body facing.
– New `VelMinSpeed=0.5` knob — minimum horizontal m/s for velocity-direction to count as “moving”. Below that, falls through.
– All earlier modes still work — set `UseVelocityDirection=0` to fall back to v1.2 actor-heading behaviour.
– Internals: 7-byte-stomp dt-scale gate on the 250 Hz writer (skips writes during interpolation half-ticks), AOB-resolved Cave A / Cave B hooks chain cleanly with FreedomFlyer and other physics-hook mods.
## Requirements
– **Crimson Desert** patched to **v1.07.00**.
– **Ultimate ASI Loader** (or any equivalent) installed in `bin64/`. See <https://github.com/ThirteenAG/Ultimate-ASI-Loader/releases>.
## Install
1. Copy `bin64/Phase.asi` and `bin64/Phase.ini` into your `/bin64/` folder.
2. Launch the game. Phase writes a log to `bin64/Phase.log` once it’s loaded.
3. Press **V** in-world to blink. (Hotkey is configurable — see INI.)
## Usage
– **Sprint forward + V** → blink in sprint direction.
– **Strafe right + V** → blink right.
– **Walk backward + V** → blink backward.
– **Stand still + V** → blink along body facing (velocity fell through to actor-heading).
– During the blink there’s a brief slowmo (~400 ms at 8% speed by default) — that’s the QPC time-scale hook.
Wall-clip is **always on** during the suppression window (no INI flag) — combined writes to entity+0x90 (current pos) and entity+0x1A0 (prev pos for swept collision) make the teleport survive walls without dropping you through the world.
## Configuration
Edit `bin64/Phase.ini`. Changes are picked up live (~2 s re-read interval).
| Key | Default | Notes |
|—|—|—|
| `Enabled` | 1 | Master switch. |
| `Hotkey` | `0x56` (V) | Trigger key. |
| `HotkeyMod` | 0 | Optional second key; 0 = none. |
| `BlinkDist` | 12.0 | Teleport distance in game units. |
| `BlinkUpBias` | 0.7 | Optional vertical lift on blink (cm above current Y). |
| `CooldownMs` | 800 | Min ms between blinks. |
| `SuppressFrames` | 30 | Physics frames the wall-clip / instant-teleport writes run. |
| `UseVelocityDirection` | 1 | **v1.3** — read velocity at +0xC0/+0xC8 and aim along it. Recommended. |
| `VelMinSpeed` | 0.5 | m/s threshold. Below this, velocity falls through to next priority. |
| `UseActorHeading` | 1 | v1.2 fallback — aim along body yaw quat at +0x60/+0x68. |
| `UseCameraDirection` | 0 | Not wired yet — stub. Leave at 0. |
| `FacingPollMs` | 16 | Movement-facing tracker poll interval. |
| `FacingMinDelta` | 0.003 | Min per-poll position delta for facing update. |
| `UseInvisibility` | 0 | Legacy Blink mechanic. Off — the visibility chain isn’t reliable. |
| `SlowmoEnabled` | 1 | QPC time-scale dip during blink. |
| `SlowmoMinScale` | 0.08 | Time scale at the dip. 0.08 = 8% speed. |
| `RampInMs` / `PlateauMs` / `RampOutMs` | 50 / 400 / 100 | Slowmo timing envelope. |
| `LocalContinuityMax` | 80 | Cross-actor pollution guard — max allowed jump in trusted local pos. |
| `LocalContinuityTimeoutMs` | 15000 | Reset trusted baseline after this many ms with no accepted sample. |
VK code reference: <https://learn.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes>
## Compatibility
Phase chains onto existing hooks at Cave A (`+0x28CB34E` v1.07 RVA) and Cave B (`+0x37FD50B`). Coexists with FreedomFlyer and similar movement mods — Phase detects a prior `E9` JMP at either site and chains into that mod’s cave instead of yanking it.
The actor-velocity field at `+0xC0/+0xC8` is on the same physics body Cave A captures — no extra hook or struct chain needed.
## Troubleshooting
– **Blink doesn’t fire / “pos not valid – skipped”:** the trusted-local-pos baseline hasn’t seeded yet. Move around for a couple of seconds; Phase needs Cave A to fire a few times before it trusts the read.
– **Blink direction feels off:** check `Phase.log` — each fire prints `dir=velocity` / `dir=actor-heading` / `dir=camera` / `dir=movement`. If you expected velocity but got actor-heading, your speed was below `VelMinSpeed`. Lower the threshold or move faster before pressing V.
– **Game runs unmodded after install:** ASI Loader isn’t loading. Verify `winmm.dll` / `dxgi.dll` / similar loader DLL is in `bin64/`. If using OptiScaler, move `Phase.asi` into `bin64/plugins/` instead.
– **Phase.log shows “BYTES MISMATCH”:** game version isn’t v1.07.00, OR another mod has stomped the hook site without using the standard chain protocol. Disable other mods one at a time to identify which.
## Building from source
cd /source
cl /O2 /LD /EHsc Phase.cpp /link /OUT:Phase.dll
ren Phase.dll Phase.asi
“`
Requires MSVC’s x64 build tools (any recent Visual Studio Build Tools install works). Drop the resulting `Phase.asi` next to `Phase.ini` in your game’s `bin64/`.
Source depends on `../../player_base.hpp` (the AOB-resolved player-static slot resolver shared with SuperJump and Miner).





