Tags: FFXIV Reverse Engineering
Syndicated to:
This has been a relatively quiet couple of months, there’s no huge headlining features but instead I focused on improving the foundations of the project!
If you don’t know what Kawari is, it’s a modern FFXIV server emulator. Compared to other projects, we actively target the current patch in the Global region.
Version and region support #
I was informed recently that the non-Global regions were actually up-to-date! They also used the same set of opcodes in their clients, meaning that supporting them in Kawari is easy. In response this, I loosened our region requirements and only require that we match patch versions.

Thanks to thedax, Kawari was updated to patch 7.51, 7.51h1 and 7.51h2.
Instanced content #
I spent some time looking at arenas such as E8N. If you spawned into similar arenas, you may have noticed you actually couldn’t fall off. Instead, your character walked on (what we assume to be) a fail-safe floor. That bug is now fixed and your character now dies when falling off!
For certain content such as The Occult Crescent and Bozja, players now spawn in the expected location instead of a random entrance circle somewhere on the map.
Striking dummies can now be spawned from the UI when in Explorer Mode.
Battle #
I spent some time fixing our action and battle packets, fixing a ton of incorrect or outdated assumptions in the process. Thanks to worstaquaplayer for the help (especially on the more obscure parts of the battle system!) and nosalt899 for contributing Chronofoil captures of retail battles that I used to verify everything.
When a player initiates a spell, that cast should now appear to other players correctly. I also discovered we didn’t send a correct Haste stat so the client-side display of cast times (like in tooltips) were incorrectly stated as being instantaneous.
Our navmesh generation was riddled with numerous bugs that caused NPCs to get stuck, ignore doors or simply happen to be on a part of the map that was excluded from the navmesh. I finally sat down recently and fixed almost every remaining problem with our generator, so you should notice enemies behaving a lot nicer!
Two tasks we’ll need to tackle at some point will be dynamic obstacles and functional doors, look forward to that 🙂
Public areas #
All locations are now considered when teleporting to Aetherytes, specifically the different spots you can end up in on retail to spread players around so they don’t overlap. In addition, if a pop range (the destination object used to place players, more generic than just Aetherytes) has multiple points we will also randomize which one is used.
I have finally included a complete drop-in for a public area from the retail game: the Central Shroud. FFXIV is designed in a such a way that almost everything exists on the client-side. The two relevant exceptions here are battle NPC information and gathering point locations, probably removed because it would make botting even easier. But this drop-in solves that, including the necessary information to replicate the NPCs and gathering points:

This is meant to facilitate easier testing, I’m not planning on accepting drop-ins for other public areas just yet. If you’re curious on how this is done, I simply flew over area in retail and used our Packet Analyzer to create the JSON1. You can do this yourself for your favorite area and use it without having to modify Kawari!
Smaller things #
Added support for the Dye action.
Newly gathered items are now recorded in the gathering log.
It’s also useful to spawn striking dummies anywhere (screenshots, testing, etc.) so I added a !strikingdummy command to plop one down.
I quietly sunsetted support for LauncherTweaks, a tool that allowed you to replace the official launcher’s webpage with ours. This has slowly been bitrotting and I haven’t had the time or energy to fix it. It does mean the only supported launcher is Astra for now, although the “no launcher” experience had been improved as noted in the last report.
Ecosystem #
I’ve been knee-deep in spawn packets and upstreamed everything I discovered back to the FFXIVClientStructs. The first part is this change focused on spawning objects, and then this change for NPCs and players.
Gathering points have a special representation in the client that’s now better documented so the object spawning code is easier to read.
The last of the packet changes are PrepareZoningPacket and ActorSetPosPacket.
Thanks to worstaquaplayer for nerdsniping me, but I added a ton of API for EObj animations which is important to understanding for Kawari for animating certain objects, enemies and map effects. You’ll see the fruits of this labor soon!
My changes for EXDSchema were fixing up the EObj sheet columns and linking to LegacyQuest in JournalGenre.
Kawari is open source and we regularly accept contributions big and small ♥️ If you are stuck on something, or are unsure if it’s in scope for Kawari don’t hesitate to open an issue or join our chatroom.
Compared to other methods, this can be done post-mortem via Chronofoil captures which is huge for preservation as it doesn’t require a running client (or can work without Dalamud, technically.) ↩︎

Comments
Nothing yet. Say the first thing.
Sign in to join the conversation.