# hiddenoffset/ravenfield-external-trainer architecture

> Architecture diagram of the GitHub repository hiddenoffset/ravenfield-external-trainer, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-30). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/hiddenoffset/ravenfield-external-trainer
- Repository: https://github.com/hiddenoffset/ravenfield-external-trainer
- Video tour (about a minute): https://gitdiagram.com/hiddenoffset/ravenfield-external-trainer/video

## Overview

Ravenfield Trainer is an external Windows trainer for Ravenfield EA39. Its main loop locates the game process and UnityPlayer module, resolves game addresses, and applies hotkey-controlled stat and weapon changes through process-memory reads and writes. Separately, the loop gathers enemy actors, projects living enemies to client coordinates, and updates a click-through dot overlay. The README also lists movement, weapon, and ESP toggles; the excerpts show their orchestration in main.cpp, but not every implementation detail. Edges reflect explicit README statements or sampled source references.

Main entry points: [`trainer/main.cpp`](https://github.com/hiddenoffset/ravenfield-external-trainer/blob/master/trainer/main.cpp) (Hotkey loop), [`trainer/esp.cpp`](https://github.com/hiddenoffset/ravenfield-external-trainer/blob/master/trainer/esp.cpp) (Actor scan and filters), [`trainer/overlay.cpp`](https://github.com/hiddenoffset/ravenfield-external-trainer/blob/master/trainer/overlay.cpp) (Dot overlay), [`trainer/process.cpp`](https://github.com/hiddenoffset/ravenfield-external-trainer/blob/master/trainer/process.cpp) (Pointer resolution)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_runtime["Trainer runtime"]
  node_entry["Hotkey loop<br/>[main.cpp]"]
  node_discovery["Process discovery<br/>[process.cpp]"]
  node_stats["Stat and weapon toggles<br/>[main.cpp]"]
  node_movement["Movement toggles<br/>[main.cpp]"]
end

subgraph group_memory["Game memory"]
  node_addresses["Game address map<br/>[addresses.h]"]
  node_resolve["Pointer resolution<br/>[process.cpp]"]
  node_modifiers["Memory modifiers"]
  node_read["Typed memory reads<br/>[mem.h]"]
end

subgraph group_esp["Enemy ESP"]
  node_actor["Actor scan and filters<br/>[esp.cpp]"]
  node_projection["World projection<br/>[esp.cpp]"]
  node_math["Projection types<br/>[math_types.h]"]
end

subgraph group_window["Window overlay"]
  node_overlay["Dot overlay<br/>[overlay.cpp]"]
  node_gamewindow["Game window tracking<br/>[process.cpp]"]
end

node_user(("Trainer user"))
node_game["Ravenfield EA39"]
node_os["Windows desktop"]

node_user -->|"presses hotkeys"| node_entry
node_entry -->|"finds process"| node_discovery
node_discovery -->|"locates process"| node_game
node_entry -->|"opens and accesses"| node_game
node_entry -->|"resolves addresses"| node_resolve
node_resolve -->|"uses pointer chains"| node_addresses
node_entry -->|"dispatches toggles"| node_stats
node_entry -->|"dispatches toggles"| node_movement
node_stats -->|"reads and writes"| node_game
node_movement -->|"modifies stats"| node_game
node_modifiers -->|"resolves pointers"| node_resolve
node_modifiers -->|"writes memory"| node_game
node_entry -->|"collects enemy dots"| node_actor
node_actor -->|"reads actor data"| node_read
node_actor -->|"uses game offsets"| node_addresses
node_actor -->|"projects enemy positions"| node_projection
node_projection -->|"uses vector types"| node_math
node_entry -->|"finds game window"| node_gamewindow
node_gamewindow -->|"enumerates windows"| node_os
node_entry -->|"updates dot overlay"| node_overlay
node_overlay -->|"creates and paints window"| node_os
node_overlay -->|"tracks client bounds"| node_gamewindow

click node_entry "https://github.com/hiddenoffset/ravenfield-external-trainer/blob/master/trainer/main.cpp"
click node_discovery "https://github.com/hiddenoffset/ravenfield-external-trainer/blob/master/trainer/process.cpp"
click node_addresses "https://github.com/hiddenoffset/ravenfield-external-trainer/blob/master/trainer/addresses.h"
click node_resolve "https://github.com/hiddenoffset/ravenfield-external-trainer/blob/master/trainer/process.cpp"
click node_modifiers "https://github.com/hiddenoffset/ravenfield-external-trainer/blob/master/trainer/memory/address_modifier.cpp"
click node_read "https://github.com/hiddenoffset/ravenfield-external-trainer/blob/master/trainer/mem.h"
click node_stats "https://github.com/hiddenoffset/ravenfield-external-trainer/blob/master/trainer/main.cpp"
click node_movement "https://github.com/hiddenoffset/ravenfield-external-trainer/blob/master/trainer/main.cpp"
click node_actor "https://github.com/hiddenoffset/ravenfield-external-trainer/blob/master/trainer/esp.cpp"
click node_projection "https://github.com/hiddenoffset/ravenfield-external-trainer/blob/master/trainer/esp.cpp"
click node_math "https://github.com/hiddenoffset/ravenfield-external-trainer/blob/master/trainer/math_types.h"
click node_overlay "https://github.com/hiddenoffset/ravenfield-external-trainer/blob/master/trainer/overlay.cpp"
click node_gamewindow "https://github.com/hiddenoffset/ravenfield-external-trainer/blob/master/trainer/process.cpp"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_entry,node_discovery,node_stats,node_movement,node_user toneBlue
class node_addresses,node_resolve,node_modifiers,node_read toneAmber
class node_actor,node_projection,node_math toneMint
class node_overlay,node_gamewindow toneRose
class node_game,node_os toneIndigo
```

## Components

### Trainer runtime

- [Hotkey loop](https://github.com/hiddenoffset/ravenfield-external-trainer/blob/master/trainer/main.cpp): `trainer/main.cpp`
- [Process discovery](https://github.com/hiddenoffset/ravenfield-external-trainer/blob/master/trainer/process.cpp): `trainer/process.cpp`
- [Stat and weapon toggles](https://github.com/hiddenoffset/ravenfield-external-trainer/blob/master/trainer/main.cpp): `trainer/main.cpp`
- [Movement toggles](https://github.com/hiddenoffset/ravenfield-external-trainer/blob/master/trainer/main.cpp): `trainer/main.cpp`

### Game memory

- [Game address map](https://github.com/hiddenoffset/ravenfield-external-trainer/blob/master/trainer/addresses.h): `trainer/addresses.h`
- [Pointer resolution](https://github.com/hiddenoffset/ravenfield-external-trainer/blob/master/trainer/process.cpp): `trainer/process.cpp`
- [Memory modifiers](https://github.com/hiddenoffset/ravenfield-external-trainer/blob/master/trainer/memory/address_modifier.cpp): `trainer/memory/address_modifier.cpp`
- [Typed memory reads](https://github.com/hiddenoffset/ravenfield-external-trainer/blob/master/trainer/mem.h): `trainer/mem.h`

### Enemy ESP

- [Actor scan and filters](https://github.com/hiddenoffset/ravenfield-external-trainer/blob/master/trainer/esp.cpp): `trainer/esp.cpp`
- [World projection](https://github.com/hiddenoffset/ravenfield-external-trainer/blob/master/trainer/esp.cpp): `trainer/esp.cpp`
- [Projection types](https://github.com/hiddenoffset/ravenfield-external-trainer/blob/master/trainer/math_types.h): `trainer/math_types.h`

### Window overlay

- [Dot overlay](https://github.com/hiddenoffset/ravenfield-external-trainer/blob/master/trainer/overlay.cpp): `trainer/overlay.cpp`
- [Game window tracking](https://github.com/hiddenoffset/ravenfield-external-trainer/blob/master/trainer/process.cpp): `trainer/process.cpp`

### Other components

- **Trainer user**
- **Ravenfield EA39**
- **Windows desktop**

## Connections

- Trainer user → Hotkey loop: presses hotkeys (evidence: `README.md`)
- Hotkey loop → Process discovery: finds process (evidence: `trainer/main.cpp`)
- Process discovery → Ravenfield EA39: locates process (evidence: `trainer/process.cpp`)
- Hotkey loop → Ravenfield EA39: opens and accesses (evidence: `trainer/main.cpp`)
- Hotkey loop → Pointer resolution: resolves addresses (evidence: `trainer/main.cpp`)
- Pointer resolution → Game address map: uses pointer chains (evidence: `trainer/addresses.h`)
- Hotkey loop → Stat and weapon toggles: dispatches toggles (evidence: `trainer/main.cpp`)
- Hotkey loop → Movement toggles: dispatches toggles (evidence: `README.md`)
- Stat and weapon toggles → Ravenfield EA39: reads and writes (evidence: `trainer/main.cpp`)
- Movement toggles → Ravenfield EA39: modifies stats (evidence: `README.md`)
- Memory modifiers → Pointer resolution: resolves pointers (evidence: `trainer/memory/address_modifier.cpp`)
- Memory modifiers → Ravenfield EA39: writes memory (evidence: `trainer/memory/address_modifier.cpp`)
- Hotkey loop → Actor scan and filters: collects enemy dots (evidence: `trainer/main.cpp`)
- Actor scan and filters → Typed memory reads: reads actor data (evidence: `trainer/esp.cpp`)
- Actor scan and filters → Game address map: uses game offsets (evidence: `trainer/esp.cpp`)
- Actor scan and filters → World projection: projects enemy positions (evidence: `trainer/esp.cpp`)
- World projection → Projection types: uses vector types
- Hotkey loop → Game window tracking: finds game window (evidence: `trainer/main.cpp`)
- Game window tracking → Windows desktop: enumerates windows (evidence: `trainer/process.cpp`)
- Hotkey loop → Dot overlay: updates dot overlay (evidence: `trainer/main.cpp`)
- Dot overlay → Windows desktop: creates and paints window (evidence: `trainer/overlay.cpp`)
- Dot overlay → Game window tracking: tracks client bounds (evidence: `trainer/overlay.cpp`)
