redstrate.com/content/blog/walking-the-unwalkable/index.md
Joshua Goins bda2ade16f
All checks were successful
Deploy / Deploy Website (push) Successful in 2m8s
Add new blog post
2025-06-21 18:56:31 -04:00

48 lines
3.3 KiB
Markdown

---
title: "Accessing the inaccessible in FFXIV"
date: 2025-06-21
draft: false
tags:
- FFXIV
- Reverse Engineering
summary: "A GitHub issue in a certain Dalamud plugin caught my attention, they were talking about accessing cutscene areas in FFXIV."
bluesky_url: ""
mastodon_url: ""
---
A GitHub issue in a certain Dalamud plugin caught my attention, they wanted to access cutscene areas in FFXIV. This sounds like a pretty cool problem to solve, because as far as I know these are *still* inaccessible even with current modding tools[^1].
![This specific area is only seen in a cutscene.](garlemald.webp)
In the game, zones are mapped to integer identifiers. For example, Amdapor Keep is given an ID of `167`. Whenever you enter an instance of that dungeon, the World server tells you `167`[^2] and your client is tasked with translating that to something useful. **Strings like `ex3/bg/ex3/01_nvt_n4/evt/n4e5/` are not sent**, so we can't easily substitute paths here.
Every explorable area in the game has an ID attached to it, and this ID can be cross-referenced to find other useful data like names (so the map can display "Amdapor Keep" for example.) As you can probably guess, non-playable areas are _usually_ excluded from this listing and never given an ID[^3]. The game can't send you to these places, even if it wants to.
You still extract them using modding tools, and view them outside of the game... but that's boring! Instead, I created a way to replace zones in-game, effectively letting you unlock normally inaccessible areas:
{{< tube "https://tube.ryne.moe/videos/embed/iTFm2JiF3b4ccbPUmfVc3J" >}}
A new tool is available in [XIVModTools](https://codeberg.org/redstrate/XIVModTools) and it's very simple. Give it your game and level path, and it spits out a modified EXD file which will replace `exd/territorytype_1.exd`:
```shell
$ cargo run --bin add-zone -- --game-path "~/.xlcore/ffxiv/game" --level-path "ex2/02_est_e3/evt/e3e6/level/e3e6"
1298
```
The number it spits out is the replaced zone ID which we will need later, so keep track of it. I used Penumbra to replace these files, but anything will work. If you use Penumbra, **make sure you have Advanced > Wait for Plugins on Startup checked** because this file loads very early.
Now we need to have the server tell the client to load this zone, and the safest option is to use [Kawari](https://github.com/redstrate/Kawari). It allows us to load the zone with one command and won't fuss about it being invalid:
```shell
//gm teri 1298
```
While it's "safe" to connect to the official servers with the modified file, **I would appreciate people not doing that**. I plan on making this tool add new zones, instead of replacing the last one. The last zones are usually blank, invalid and unused but it would be cool to add entirely new zones.
Enjoy and let me know of any cool areas you found!
[^1]: Naturally someone will come out of the woodwork to explain how they actually did this ten years ago but never told anybody. But this was still a fun learning experience!
[^2]: Along with other important information that's not relevant here, of course. Like weather rates, obfuscation modes and so on.
[^3]: It's not true for all of these areas. For example, a certain cutscene area in Endwalker has an ID of 989. You can walk around in it, but the map is completely bugged and it has no name.