# WoW Forever Map: guide for agents

https://foreverwowmap.com is a world map for **World of Warcraft: Forever** (Blizzard's Classic+, 2026). It shows HD terrain, flight masters, boats and zeppelins, dungeons and raids, town services (innkeepers, trainers, vendors, quest givers and so on), gathering spawn points, and routes.

It is a static site. Everything runs in the visitor's browser: routes are read from the link, and search and pathfinding run in the page. **There is no server API.** To use the map, write a link (below) and open it or give it to the user. An in-page interface for agents is being designed separately; until it is documented here, don't assume one exists.

## Coordinates

Waypoints use **in-game zone coordinates**: the numbers `/way` (TomTom) and coordinate add-ons show, 0 to 100 across and down the zone's map, with the origin at the top-left. Each waypoint names its map by **UiMap ID** (table at the end). The map converts them exactly as the game client does.

Use the map a player would be standing in. Cities have their own maps, so `Orgrimmar (1454) 45.3 63.7` and `Durotar (1411) 44.5 3.7` are the same spot. Don't use retail coordinates: zones were remade after Cataclysm.

Good coordinate sources: Wowhead's Forever pages (`wowhead.com/forever/...`), in-game `/way` or a coordinate add-on, and this map (hover shows the zone and coordinates; every popup has **Copy /way**).

## Route links

The main way for an agent to use the map. Write the route as text:

```
https://foreverwowmap.com/#r-<uiMapID>[<type>]-<x*100>-<y*100>[-Label-Words]-<uiMapID>[<type>]-<x*100>-<y*100>[-Label-Words]...
```

- Letters, digits and hyphens only.
- `x*100` and `y*100` are whole numbers: 61.2 becomes `6120`, 5.07 becomes `507`.
- `<type>` is an optional single lowercase letter glued to the map ID (`1420q`). See the pin types below. Without one, the waypoint is "go to". Old links without types still work.
- Words after a waypoint's three numbers are its label, joined with spaces. Each label word needs at least one letter (otherwise it is read as a number); punctuation is dropped (`Grom'gol` becomes `Gromgol`).
- Waypoints are visited in order. Consecutive pins on one continent are joined by a path that follows walkable terrain. Legs between continents (boats, zeppelins, some portals) are not drawn.

### Example: Undercity flight master, a quest in Brill, The Sepulcher

```
https://foreverwowmap.com/#r-1458f-6310-4830-Undercity-1420q-6097-5270-Brill-1421-4560-4240-The-Sepulcher
```

| # | Map | Type | x | y | Label |
|---|---|---|---|---|---|
| 1 | 1458 Undercity | f flight | 63.10 | 48.30 | Undercity |
| 2 | 1420 Tirisfal Glades | q quest | 60.97 | 52.70 | Brill |
| 3 | 1421 Silverpine Forest | g go to (default) | 45.60 | 42.40 | The Sepulcher |

### Example: quest pickup in Deathknell, turn in at Brill, zeppelin to Durotar, Razor Hill

```
https://foreverwowmap.com/#r-1420q-3198-6498-Deathknell-1420t-6097-5270-Brill-1420f-6060-5890-Zeppelin-to-Orgrimmar-1411-5263-4243-Razor-Hill
```

Deathknell (1420, 31.98, 64.98), Brill (1420, 60.97, 52.70), the Orgrimmar zeppelin tower near Brill (1420, 60.6, 58.9), Razor Hill (1411, 52.63, 42.43). The zeppelin leg crosses continents, so no line is drawn between the last two pins.

### Readable form

foreverwowmap.com also keeps `=` and `;` in links, so this form works there (and in the import box):

```
https://foreverwowmap.com/?r=1458:63.1,48.3:Undercity:f;1420:60.97,52.7:Brill:q
```

Each waypoint is `uiMapID:x,y[:label[:type]]`, separated by `;`. The 4th field is the type letter or its name (`quest`, `turnin`, ...). Prefer the `#r-` form when the link may pass through a host or chat app that drops other characters.

## Pin types

| Letter | JSON name | Meaning | Icon |
|---|---|---|---|
| q | `quest` | Pick up a quest | Yellow ! |
| t | `turnin` | Turn in a quest | Yellow ? |
| g | `goto` | Go to / travel to (default) | Arrow or pin |
| k | `kill` | Kill or collect | Sword |
| i | `interact` | Interact with or use something | Hand or gear |
| f | `travel` | Take a flight, boat or zeppelin | Flight / boat |
| h | `hearth` | Use the hearthstone | Hearthstone |
| n | `note` | A note | Note |

## Import and export (JSON)

The **Route** tab ("Custom routes") exports routes as a file and imports files or pasted text in these forms:

1. The route file:

   ```json
   {"format": "foreverwowmap-route", "version": 1,
    "waypoints": [{"uiMapID": 1420, "x": 60.97, "y": 52.7, "label": "Brill", "type": "quest"}]}
   ```

2. A bare array of waypoints: `[{"uiMapID": 1420, "x": 60.97, "y": 52.7}]`.
3. TomTom lines, one per waypoint: `/way #1420 60.97 52.70 Brill` (also `/way Tirisfal Glades 61 52.7 Brill`, or `/way 61 52.7` for the current map).

JSON schema of the route file:

```json
{
  "type": "object",
  "required": ["waypoints"],
  "properties": {
    "format": {"const": "foreverwowmap-route"},
    "version": {"const": 1},
    "waypoints": {
      "type": "array",
      "items": {
        "type": "object",
        "required": ["uiMapID", "x", "y"],
        "properties": {
          "uiMapID": {"type": "integer"},
          "x": {"type": "number", "minimum": 0, "maximum": 100},
          "y": {"type": "number", "minimum": 0, "maximum": 100},
          "label": {"type": "string"},
          "type": {"enum": ["quest", "turnin", "goto", "kill", "interact", "travel", "hearth", "note"], "default": "goto"}
        }
      }
    }
  }
}
```

## Quest data for building quest routes

The map shows only where quest givers stand (Services layer, off by default). It does not show quest objectives or chains. To plan quest routes, get the data from **QuestieDB**, the database add-on that Questie loads (Questie itself holds only code):

- Source: https://github.com/Questie/QuestieDB (releases include `QuestieDB-<version>-Forever.zip`, the same files the add-on installs). It is also installed and updated together with Questie (https://github.com/Questie/Questie) through CurseForge or Wago.
- Installed copy on Windows: `C:\Program Files (x86)\World of Warcraft\_forever_\Interface\AddOns\QuestieDB\`. Read the files; don't change anything in the game folder.

How the Forever data is stored (checked against QuestieDB 1.1.1, commit `4dbb824`, on 2026-11-15):

- `QuestieDB_Forever.toc` holds the data as metadata lines `## X-<Type>-<id>-<field>: <value>`, where `<Type>` is `Quest`, `Npc`, `Object` or `Item`, and the value is base64 CBOR. `## X-Mode: baked` means the fixed corrections are already applied.
- `X-<Type>-IDS` lists the IDs (base64 of zlib-compressed CBOR). `X-<Type>-<id>-S` holds an entity's scalar fields; each table-typed field has its own line `X-<Type>-<id>-<field number>`.
- Field numbers, names and types are in `src/meta/questMeta.lua`, `npcMeta.lua`, `objectMeta.lua` and `itemMeta.lua`.
- Long values are split: the main line's value is `~N~`, and the parts are `<key>-1` to `<key>-N`. Join them before decoding.
- CBOR comes from Lua tables: byte strings are text, and a table keyed 1..n decodes as a list, so list position i (from 0) means key i+1. Spawn tables are keyed by AreaTable zone ID, so a spawn list decodes with position i meaning area i+1. Points are `{x, y}` in 0-100 zone coordinates; `{-1, -1}` means inside an instance with no point.
- Map AreaTable IDs to UiMap IDs with the add-on's `support/Forever/Zones/areaIdToUiMapId.lua` (base table plus an override table). Dungeon zones and entrances are in `support/Forever/Zones/dungeons.lua`. The client's UiMapAssignment table (https://wago.tools/db2/UiMapAssignment?build=1.60.1.70938, `AreaID` column) gives the same link from the game side.
- Faction- and class-dependent fixes (for example where Horde and Alliance turn in the same quest) are Lua scripts in `src/corrections/Forever/`, applied at login. Pick the character's faction and class when reading them.

Join IDs across the types yourself: a quest's `startedBy` (field 2) and `finishedBy` (field 3) list the NPCs, objects and items that start and end it, and an NPC's `spawns` (field 7) or an object's `spawns` (field 4) give where they are. Questie's data is community-maintained and Forever is new, so expect gaps in the new zones.

**License:** QuestieDB's `LICENSE.md` says contributions made after 2026-10-21 are GPLv3, but older content (most of the database, imported from Questie) has no agreed license and should be treated as "all rights reserved". Use it for your own planning; don't republish the data.

## Data sources and licenses

Full notices: https://foreverwowmap.com/LICENSES.txt

- **Blizzard client data** (terrain tiles, zone outlines, icons, dungeon maps, UiMap tables), Forever client build 1.60.1.70938, via wago.tools. World of Warcraft is (c) Blizzard Entertainment.
- **Leatrix Maps**: flight masters, dungeons, raids, boats, zeppelins, portals, spirit healers. Facts only; no code or art.
- **QuestieDB**: NPC service positions. See its license note above. Positions only; no code.
- **GatherLite** (MIT): gathering nodes, whose coordinates GatherLite built from Wowhead's Forever data.
- **Shortest Path Forever** (GPL-3.0-or-later): the walkable terrain grid used for route paths.
- Leaflet 1.9.4 (BSD 2-Clause) draws the map.

## UiMap IDs

| ID | Map | Kind | Parent |
|---|---|---|---|
| 1461 | Arathi Basin | orphan | Arathi Highlands |
| 1415 | Eastern Kingdoms | continent | Azeroth |
| 1414 | Kalimdor | continent | Azeroth |
| 2521 | Zephras Isle | zone | Azeroth |
| 1416 | Alterac Mountains | zone | Eastern Kingdoms |
| 1417 | Arathi Highlands | zone | Eastern Kingdoms |
| 1418 | Badlands | zone | Eastern Kingdoms |
| 1419 | Blasted Lands | zone | Eastern Kingdoms |
| 1428 | Burning Steppes | zone | Eastern Kingdoms |
| 1430 | Deadwind Pass | zone | Eastern Kingdoms |
| 1426 | Dun Morogh | zone | Eastern Kingdoms |
| 1431 | Duskwood | zone | Eastern Kingdoms |
| 1423 | Eastern Plaguelands | zone | Eastern Kingdoms |
| 1429 | Elwynn Forest | zone | Eastern Kingdoms |
| 1424 | Hillsbrad Foothills | zone | Eastern Kingdoms |
| 1455 | Ironforge | city | Eastern Kingdoms |
| 1432 | Loch Modan | zone | Eastern Kingdoms |
| 1433 | Redridge Mountains | zone | Eastern Kingdoms |
| 2548 | Riverglades | zone | Eastern Kingdoms |
| 1427 | Searing Gorge | zone | Eastern Kingdoms |
| 1421 | Silverpine Forest | zone | Eastern Kingdoms |
| 1453 | Stormwind City | city | Eastern Kingdoms |
| 1434 | Stranglethorn Vale | zone | Eastern Kingdoms |
| 1435 | Swamp of Sorrows | zone | Eastern Kingdoms |
| 1425 | The Hinterlands | zone | Eastern Kingdoms |
| 1420 | Tirisfal Glades | zone | Eastern Kingdoms |
| 1458 | Undercity | city | Eastern Kingdoms |
| 1422 | Western Plaguelands | zone | Eastern Kingdoms |
| 1436 | Westfall | zone | Eastern Kingdoms |
| 1437 | Wetlands | zone | Eastern Kingdoms |
| 1459 | Alterac Valley | orphan | Hillsbrad Foothills |
| 1440 | Ashenvale | zone | Kalimdor |
| 1447 | Azshara | zone | Kalimdor |
| 1439 | Darkshore | zone | Kalimdor |
| 2524 | Darkspear Islands | orphan | Kalimdor |
| 1457 | Darnassus | city | Kalimdor |
| 1443 | Desolace | zone | Kalimdor |
| 1411 | Durotar | zone | Kalimdor |
| 1445 | Dustwallow Marsh | zone | Kalimdor |
| 1448 | Felwood | zone | Kalimdor |
| 1444 | Feralas | zone | Kalimdor |
| 1450 | Moonglade | zone | Kalimdor |
| 2482 | Mount Hyjal | zone | Kalimdor |
| 1412 | Mulgore | zone | Kalimdor |
| 1454 | Orgrimmar | city | Kalimdor |
| 2652 | Shen'dralas | zone | Kalimdor |
| 1451 | Silithus | zone | Kalimdor |
| 1442 | Stonetalon Mountains | zone | Kalimdor |
| 1446 | Tanaris | zone | Kalimdor |
| 1438 | Teldrassil | zone | Kalimdor |
| 1413 | The Barrens | zone | Kalimdor |
| 1441 | Thousand Needles | zone | Kalimdor |
| 1456 | Thunder Bluff | city | Kalimdor |
| 1449 | Un'Goro Crater | zone | Kalimdor |
| 1452 | Winterspring | zone | Kalimdor |
| 1460 | Warsong Gulch | orphan | The Barrens |
| 947 | Azeroth | world |  |
