KorvayneGuides
Unreal Engine

Unreal integration

Blueprint-first teams should interact with a small Unreal wrapper, not with raw DLL exports. The wrapper loads Korvayne once, sets context, and exposes simple nodes.

File placement

For packaged Windows builds, place anticheat.dll, anticheat.lic, and anticheat.ini next to the executable that loads the game.

Windows\YourGame.exe
Windows\YourGame\Binaries\Win64\YourGame-Win64-Shipping.exe

If the shipping binary is the real process, place the files next to that binary.

Startup load

A startup module, subsystem, or plugin should load the DLL once early in the game lifecycle.

void* H = FPlatformProcess::GetDllHandle(TEXT("anticheat.dll"));
if (!H)
{
    // Log a clear startup error for the studio.
}

The provided sample wrapper resolves exports from the DLL. It should fail visibly in logs if the DLL is missing, the license is invalid, or the platform is not Windows x64.

Blueprint surface

Blueprint users should get named nodes or components, for example:

  • Korvayne Start
  • Korvayne Set Player Id
  • Korvayne Set Session Id
  • Korvayne Set Telemetry Token
  • Protected Float - Get / Set
  • Protected Int - Get / Set
  • Korvayne Protect Save
  • Korvayne Verify Save
  • Korvayne Report Shot

Goal: the person building gameplay in Blueprints should not pass memory addresses, call C functions, or understand import libraries.

Protected saves

Serialize the save game object normally, then protect the resulting byte array before writing. Verify the file before deserializing on load.

TArray<uint8> Plain = SerializeMySave();
FString Context = FString::Printf(TEXT("player=%s;slot=profile;schema=1"), *PlayerId);

ACTGuard::ProtectSaveFile(TCHAR_TO_UTF8(*Path), Plain.GetData(), Plain.Num(), TCHAR_TO_UTF8(*Context));

TArray<uint8> Verified;
int32 Rc = ACTGuard::VerifySaveFile(TCHAR_TO_UTF8(*Path), TCHAR_TO_UTF8(*Context), Verified);

If verification fails, reject the load or restore a backup. Do not deserialize unverified bytes.

Report shots

Aim behavior is not automatic in drop-in mode. The SDK does not read mouse input, target positions, or visibility state by itself. The Unreal wrapper should expose one Blueprint node that the weapon, ability, or hit-resolution graph calls after the local player's shot is resolved.

Korvayne Report Shot
  Aim Speed Per Ms
  Reaction Ms
  Had Line Of Sight
  Hit
Blueprint valueWhere to get it
Aim Speed Per MsSave the local controller/camera rotation from the previous weapon tick, compare it with the rotation when the shot fires, then divide by elapsed milliseconds.
Reaction MsWhen your targeting, overlap, trace, or visibility logic first marks an enemy as visible, save Now. On shot, send the time difference in milliseconds.
Had Line Of SightUse the same line trace or hit-validation boolean your weapon already trusts for the shot.
HitUse the final local weapon result after damage/hit resolution, not a prediction from before the trace finishes.

Blueprint-only rule: if these values are not available in the graph yet, skip this node for now. Do not feed placeholder values every frame; handle/module/hook/debugger/ValueGuard checks still work without shot reports.

  • Call it once per local human-player shot after hit and line-of-sight are known.
  • Do not call it for AI pawns, remote replicated players, spectators, or replay playback.
  • Keep behavior_response = report while collecting clean baseline logs.

The SDK turns those reports into advisory AimSnap, Triggerbot, or Wallhack evidence when the supplied shot values cross simple built-in thresholds.

EvidenceCurrent condition
AimSnapHit shot with Aim Speed Per Ms > 8.0.
TriggerbotThree hit shots with reaction time below 60ms; normal reactions above 120ms reset the counter.
WallhackHit shot while Had Line Of Sight is false.

Telemetry for these events is controlled by [TelemetryEvents] aim_behavior; local action is controlled by [Enforcement] behavior_response. Keep this report-only until real player baselines are reviewed.

Packaging checks

  1. Package the game for Windows x64.
  2. Run the Dropper or copy the three runtime files next to the final executable.
  3. Start the game and confirm anticheat.log appears.
  4. Run common launchers, overlays, capture tools, and any title-specific QA handle tests.
  5. Only then add ValueGuard nodes to selected gameplay values.