133 lines
5.7 KiB
Markdown
133 lines
5.7 KiB
Markdown
---
|
|
title: "Kawari Progress Report 12 - Viewing"
|
|
date: 2025-07-05
|
|
draft: false
|
|
tags:
|
|
- FFXIV
|
|
- Reverse Engineering
|
|
series:
|
|
- Kawari Progress Report
|
|
summary: "We have implemented quite a few game features now, and I feel like Kawari is close to completing it's goal as a FFXIV exploration tool."
|
|
bluesky_url: ""
|
|
mastodon_url: ""
|
|
---
|
|
|
|
This is quite a large update, thank you to our contributors making this list huge! We have implemented quite a few game features now, and I feel like Kawari is close to completing it's goal as a FFXIV exploration tool.
|
|
|
|
# Features
|
|
|
|
Currency (just gil) and EXP are now supported, and these are sent to the client.
|
|
|
|
Thanks to thedax, the Aetheryte and Aethernet network is now mostly functional. We still have trouble making the Aetherytes in the starting town show up though.
|
|
|
|
Unlocks (Actions, Emotes, etc), unlocked Aetherytes, EXP, item glamours and their condition are now persistent and saved on log out.
|
|
|
|
The inn bed is now 99% functional, but we are still missing the waking up animation. Fun fact: the Dreamfitting feature works completely offline and doesn't seem to contact SqEx servers at all.
|
|
|
|

|
|
|
|
The Unending Journey is now functional, which means **we can now play most FFXIV cutscenes offline**! Here it is in action:
|
|
|
|
{{< tube "https://tube.ryne.moe/videos/embed/gJ1ASyoR6m4d7ZTP93nR3m" >}}
|
|
|
|
Gil shops are partially implemented, allowing you to buy items. They seem to share a common Lua script, so now it's a matter of mapping them. Here is one in New Gridania:
|
|
|
|
{{< tube "https://tube.ryne.moe/videos/embed/rtHNnibGxJxNBWSNx97V77" >}}
|
|
|
|
Thanks to thedax, the Lobby server now performs the same version and hash checking as retail. You can turn it off with a config option, of course:
|
|
|
|
```yaml
|
|
enforce_validity_checks: false
|
|
```
|
|
|
|
The welcome message displayed on login can now be customized in the config:
|
|
|
|

|
|
|
|
I have begun implementing the packet obsfucation that's on retail. It can obsfucate player names properly, but that's about it for now:
|
|
|
|

|
|
|
|
The code is based off of Perchbird's [Unscrambler](https://github.com/perchbirdd/Unscrambler), but we obsfucate instead of deobsfucate here.
|
|
|
|
# Multiplayer
|
|
|
|
Other player's emotes are networked now (they do not interrupt yet):
|
|
|
|

|
|
|
|
Sheathing and unsheathing weapons are now networked, but the animation does not play properly.
|
|
|
|
The various display flags for equipment (e.g. hiding headgear) is now shown to other players, and yourself.
|
|
|
|
# Commands
|
|
|
|
You can now reload global scripts like `Global.lua` which are only loaded on start-up with the new `!reload` debug command. This makes authoring new events, commands, etc much easier.
|
|
|
|
I added the `!finishevent` debug command to forcefully tell the client to stop it's current event. This is useful if you got stuck while talking to something.
|
|
|
|
Thanks to thedax, `//gm teri_info` is now supported and can list useful information about your current zone:
|
|
|
|

|
|
|
|
I added the `!item <name>` debug command to give you an item by name, like our `!equip` command.
|
|
|
|
I added support for the `//gm gil` command to give yourself gil. Thanks to thedax, you can now remove gil using `//gm collect` (just from yourself, for now.)
|
|
|
|
Thanks to thedax, you can now inspect the current player using `!inspect`:
|
|
|
|

|
|
|
|
I added the `!completeallquests` command, allowing you to use features otherwise unavailable. Like for example, the Toybox:
|
|
|
|

|
|
|
|
# Scripting
|
|
|
|
When encountering an unscripted event, it's now shown in chat and the server log:
|
|
|
|

|
|
|
|
It's now possible to send an arbitrary number of parameters for event scenes, which are needed to implement some complex events.
|
|
|
|
It's now possible to read the player's inventory in Lua, we are also planning to let you modify it.
|
|
|
|
# Bugfixes
|
|
|
|
When encountering Lua errors, the server should now panic less.
|
|
|
|
Most zones should work again (in terms of exiting zone lines, aetherytes, etc) thanks to improved LGB support in Physis.
|
|
|
|
Action scripts are now executed at the end of it's actual cast time, which makes Teleporting look just a _little_ better.
|
|
|
|
Fixed the display of your character's classjob levels in the Character window.
|
|
|
|
Better handling of invalid packets, which should prevent almost - if not all - packet parsing errors.
|
|
|
|
Invalid zone IDs are now accepted, which is useful for exploring zones like [in my blog post]({{< ref "walking-the-unwalkable" >}}).
|
|
|
|
It's no longer possible to connect with an older client, which never worked anyway.
|
|
|
|
The correct starting weapon for your selected class is now equipped, instead of it always being a GLA weapon.
|
|
|
|
The way the server loads LGBs is more accurate, by fetching the list of LGBs directly from the game files. This doesn't fix anything specifically, though.
|
|
|
|
Thanks to thedax, the Lobby server returns more relevant error messages now.
|
|
|
|
# Updates
|
|
|
|
Thanks to thedax, Kawari is updated to support 7.25h2 and 7.25h3. I bet we will see a fourth hotfix before 7.3!
|
|
|
|
# Tooling
|
|
|
|
I created Packet Analyzer, which re-uses Kawari's existing and already comprehensive packet parsing to allow you to view Chronofoil captures:
|
|
|
|

|
|
|
|
You can try it out [on the web](https://analyze.xiv.zone/) now, and the source code is available [here](https://codeberg.org/redstrate/PacketAnalyzer). This has already been used to develop some of the changes showcased here, and I'm continuing to figure out the ideal workflow 🙂
|
|
|
|
Thanks to NotNite, grabbing _both_ the static (`.lib`) and dynamic (`.dll`) versions of Oodle on Windows is no longer nessecary! The documentation was also updated to reflect this.
|
|
|
|
# Community
|
|
|
|
I [opened a chatroom](https://matrix.to/#/#kawari-welcome:pyra.sh) for development talk/informal discussions, since our GitHub is very rigid (and I would like to keep it that way!)
|