Overhaul site
I'm way too lazy to write this commit message, sorry.
This commit is contained in:
parent
7ce262ffe3
commit
0c890dee30
48 changed files with 521 additions and 270 deletions
21
config.toml
21
config.toml
|
@ -1,21 +0,0 @@
|
|||
languageCode = "en-us"
|
||||
title = "docs.xiv.zone"
|
||||
theme = "mytheme"
|
||||
summaryLength = 30
|
||||
disableHugoGeneratorInject = true
|
||||
enableEmoji = true
|
||||
baseURL = "https://docs.xiv.zone/"
|
||||
|
||||
[privacy]
|
||||
[privacy.disqus]
|
||||
disable = true
|
||||
[privacy.googleAnalytics]
|
||||
disable = true
|
||||
[privacy.instagram]
|
||||
disable = true
|
||||
[privacy.twitter]
|
||||
disable = true
|
||||
[privacy.vimeo]
|
||||
disable = true
|
||||
[privacy.youtube]
|
||||
disable = true
|
20
config.yaml
Normal file
20
config.yaml
Normal file
|
@ -0,0 +1,20 @@
|
|||
baseURL: 'https://docs.xiv.zone/'
|
||||
copyright: 'This content is licensed under a Creative Commons Attribution-ShareAlike 4.0.'
|
||||
defaultContentLanguage: 'en'
|
||||
disableHugoGeneratorInject: true
|
||||
enableRobotsTXT: true
|
||||
languageCode: 'en-us'
|
||||
summarylength: 30
|
||||
|
||||
markup:
|
||||
tableOfContents:
|
||||
ordered: true
|
||||
startLevel: 1
|
||||
goldmark:
|
||||
parser:
|
||||
wrapStandAloneImageWithinParagraph: false
|
||||
|
||||
title: 'XIV Docs'
|
||||
theme: 'mytheme'
|
||||
timeZone: 'UTC'
|
||||
paginate: 20
|
|
@ -1,56 +1,13 @@
|
|||
This is my collection of everything I know, and that I collected on FFXIV inner workings. This information was previously hosted in my ffxiv-info repository on GitHub, but moved here to it's own website.
|
||||
---
|
||||
title: "Home"
|
||||
---
|
||||
|
||||
Developers, please look at the end of each page for example implementations that I know of. I find it incredibly useful to look at them, especially if I'm stuck on implementing something. If you have a project that you want to add to the list or suggest any kind of edit, don't hesitate to [email me](https://redstrate.com/about) or [fix it yourself](https://git.sr.ht/~redstrate/docs.xiv.zone)!
|
||||
A garden of knowledge on FFXIV, a certain critically acclaimed MMO.
|
||||
|
||||
# Executables
|
||||
# See Also
|
||||
|
||||
**Note:** These are actually referring to their 64-bit counterparts, e.g. `ffxivboot.exe` is `ffxivboot64.exe`.
|
||||
|
||||
## Boot
|
||||
|
||||
* [ffxivboot.exe](executable/ffxivboot) - Launcher for the launcher.
|
||||
* [ffxivupdater.exe](executable/ffxivupdater) - Game patcher.
|
||||
* [ffxivlauncher.exe](executable/ffxivlauncher) - Boot/game launcher.
|
||||
|
||||
## Game
|
||||
|
||||
* [ffxiv.exe](executable/ffxiv) - Game executable.
|
||||
|
||||
## Other
|
||||
|
||||
* [ffxivinstaller.exe](executable/ffxivinstaller) - Retail game client installer.
|
||||
|
||||
# Concepts/Techniques
|
||||
|
||||
* [Logging into Official Servers](concept/logging-in-official) - Logging into the official game servers.
|
||||
* [Logging into Sapphire](concept/logging-in-sapphire) - Logging into unofficial Sapphire servers.
|
||||
* [SqexArg](concept/sqexarg) - Encrypted game arguments (sqexarg).
|
||||
* [Equipment](concept/equipment) - All about reading equipment data ala TexTools.
|
||||
* [Dalamud](concept/dalamud) - Launching Dalamud without the help of XIVQuickLauncher.
|
||||
* [Building Dalamud plugins on Linux](concept/dalamud-plugin-dev) - Building Dalamud plugins on Linux, without Visual Studio.
|
||||
|
||||
# File Formats
|
||||
|
||||
## Excel
|
||||
|
||||
* [.exd](format/exd) - Excel data.
|
||||
* [.exh](format/exh) - Excel header.
|
||||
* [.exl](format/exl) - Excel list.
|
||||
|
||||
## Graphics
|
||||
|
||||
* [.mdl](format/mdl) - Game model.
|
||||
* [.shpk](format/shpk) - Shader packages.
|
||||
|
||||
## SqPack
|
||||
|
||||
* [.index/index2](format/sqpack-index) - Game Data Index file.
|
||||
* [.dat](format/sqpack-dat) - Compressed game data.
|
||||
|
||||
## Other
|
||||
|
||||
* [.patch](format/patch) - ZiPatch files.
|
||||
* [.fiin](format/fiin) - File info.
|
||||
* [xiv.dev](https://xiv.dev) - Another XIV developer wiki
|
||||
* [dalamud.dev](https://dalamud.dev) - Dalamud developer documentation
|
||||
|
||||
# Credits
|
||||
|
||||
|
|
16
content/community-projects/_index.md
Normal file
16
content/community-projects/_index.md
Normal file
|
@ -0,0 +1,16 @@
|
|||
---
|
||||
title: "Community Projects"
|
||||
---
|
||||
|
||||
{{< note "This documentation is incomplete." >}}
|
||||
|
||||
FFXIV for some reason has a budding ecosystem of interesting open source projects and libraries.
|
||||
|
||||
# Launchers
|
||||
|
||||
Alternative programs for the [official launcher]({{< ref "/executable/ffxivlauncher" >}}).
|
||||
|
||||
| Name | Description | Website |
|
||||
| --- | --- | --- |
|
||||
| XIVQuickLauncher | A faster launcher for our favorite critically acclaimed MMO, with various available addons and enhancements to the game! | https://goatcorp.github.io/ |
|
||||
| Astra | A FFXIV launcher that supports profiles, multiple accounts and Dalamud plugins. | https://xiv.zone/astra/ |
|
|
@ -6,7 +6,7 @@ Believe it or not, it's actually very easy to develop with Dalamud on Linux sinc
|
|||
|
||||
For example, in [JetBrain's Rider](https://www.jetbrains.com/rider/) you can open any Dalamud project and have it build out of the box.
|
||||
|
||||
## The .NET SDK
|
||||
# The .NET SDK
|
||||
|
||||
You need the .NET SDK of course, which is in many package managers:
|
||||
|
||||
|
@ -14,13 +14,13 @@ You need the .NET SDK of course, which is in many package managers:
|
|||
* Arch Linux: `dotnet-sdk`
|
||||
* Gentoo Linux: `dotnet-sdk` or `dotnet-sdk-bin`
|
||||
|
||||
## Fixing DalamudLibPath
|
||||
# Fixing DalamudLibPath
|
||||
|
||||
Depending on the plugin, it might already have sensible paths to the Dalamud library folder. The [SamplePlugin](https://github.com/goatcorp/SamplePlugin/blob/master/SamplePlugin/SamplePlugin.csproj#L33) is an example of this. If it doesn't, or you don't use XIVQuickLauncher/XIV.Core then you need to manually edit the path. Tweak the `<DalamudLibPath>` folder to the location where your `Dalamud.dll` and files sit, and you'll know when you're successful when .NET stops screaming.
|
||||
|
||||
If for some reason your build of Dalamud is not a developer-enabled one, check the [Dalamud release server](https://kamori.goats.dev/Dalamud/Release/VersionInfo?track=) for a download URL.
|
||||
|
||||
## The devPlugin path
|
||||
# The devPlugin path
|
||||
|
||||
Remember that when entering the dev plugin path in the Dalamud settings, to prepend it with `Z:` and take care of your slashes so they make sense under Wine.
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
title: "Launching Dalamud"
|
||||
---
|
||||
|
||||
If you're developing your own launcher, you might be interested in integrating Dalamud support. Here's a detailed
|
||||
If you're developing your own launcher, you might be interested in integrating [Dalamud](https://github.com/goatcorp/Dalamud) support. Here's a detailed
|
||||
walk-through of setting up a proper Dalamud environment.
|
||||
|
||||
# Grabbing .NET Runtime
|
||||
|
|
|
@ -2,9 +2,9 @@
|
|||
title: "Equipment"
|
||||
---
|
||||
|
||||
**Note:** This section is currently incomplete, and may be missing information for weapons, demihumans, other races and slot types.
|
||||
{{< note "This documentation is incomplete nd may be missing information for weapons, demihumans, other races and slot types." >}}
|
||||
|
||||
This is useful for people implementing similar TexTools or FFXIV Explorer functionality, and it's actually trivial to do so. Before you can do so, you must be able to read [Excel data sheets](formats/exd).
|
||||
This is useful for people implementing similar TexTools or FFXIV Explorer functionality, and it's actually trivial to do so. Before you can do so, you must be able to read [Excel data sheets]({{< ref "format/exd" >}}).
|
||||
|
||||
# Read item data
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
title: "Logging into Official Servers"
|
||||
---
|
||||
|
||||
**Note:** This article currently only covers logging in via non-Steam Square Enix accounts.
|
||||
{{< note "This only covers logging in via non-Steam Square Enix accounts right now." >}}
|
||||
|
||||
Logging into the official FFXIV servers is actually very simple, and all you need is the ability to send/receive HTTP requests, parse JSON responses and read some files off of the disk.
|
||||
|
||||
|
@ -12,13 +12,13 @@ You'll also notice the variable `{unique_id}` used in some of the User Agents. T
|
|||
|
||||
# Checking the Gate Status
|
||||
|
||||
First you must check the gate status, which tells if the servers are under maintenance. The legitimate launcher will not allow you to log in if the gate is closed. **Square Enix does not expect legitimate users to enter servers under maintenance**, not that you even can.
|
||||
First you must check the gate status from the [Frontier server]({{< ref "server/frontier" >}}), which tells if the servers are under maintenance. The legitimate launcher will not allow you to log in if the gate is closed. **Square Enix does not expect legitimate users to enter servers under maintenance**, not that you even can.
|
||||
|
||||
**GET** `https://frontier.ffxiv.com/worldStatus/gate_status.json`
|
||||
|
||||
The response is a simple JSON as follows:
|
||||
|
||||
```
|
||||
```json
|
||||
{
|
||||
"status": 1
|
||||
}
|
||||
|
@ -28,9 +28,9 @@ If the `status` is 1, the gate is open and you're free to log in. Any other valu
|
|||
|
||||
# Boot Update Check
|
||||
|
||||
You also need to ensure that the boot components of the game are properly updated.
|
||||
You also need to ensure that the boot components of the game are properly updated by contacting the [boot patch server]({{< ref "server/patch" >}}).
|
||||
|
||||
**Note:** This is not a typo, and this endpoint is actually in plaintext HTTP. Seriously.
|
||||
{{< note "This is not a typo, and this endpoint is actually in plaintext HTTP..." >}}
|
||||
|
||||
**GET** `http://patch-bootver.ffxiv.com/http/win32/ffxivneo_release_boot/{boot_version}`
|
||||
* User Agent: `FFXIV PATCH CLIENT` (macOS: `FFXIV-MAC PATCH CLIENT`)
|
||||
|
@ -39,7 +39,7 @@ You also need to ensure that the boot components of the game are properly update
|
|||
|
||||
If you receive an empty response, then you don't need to update any of your boot components and proceed to the next step. However if your boot components are out of date, you will receive a list of patches to update.
|
||||
|
||||
## Getting STORED
|
||||
# Getting STORED
|
||||
|
||||
**GET** `https://ffxiv-login.square-enix.com/oauth/ffxivarr/login/top`
|
||||
* Query items:
|
||||
|
@ -59,7 +59,7 @@ If you receive an empty response, then you don't need to update any of your boot
|
|||
|
||||
The response is actually fully formed HTML, most likely better suited for the real launcher where it's a web browser. However, if you have regex available, you can query the variables needed for later.
|
||||
|
||||
**Note:** If you're logging in with a Steam service account, you can find your username using `<input name=""sqexid"" type=""hidden"" value=""(?<sqexid>.*)""\/>`.
|
||||
{{< note "If you're logging in with a Steam service account, you can find your username using `<input name=""sqexid"" type=""hidden"" value=""(?<sqexid>.*)""\/>`." >}}
|
||||
|
||||
To get the `_STORED_` value, use `\t<\s*input .* name="_STORED_" value="(?<stored>.*)">` and use the second captured variable. You also need to the store the full URL of this request (including all of the queries) for use in the next request.
|
||||
|
||||
|
@ -140,7 +140,7 @@ You'll want to store this completed hash as the variable `{boot_hash}` for the n
|
|||
|
||||
Square Enix expects the launcher to pass it's "security check" next, and this request will also check for if any game updates are required too.
|
||||
|
||||
**Note:** `{game_version}` is referring to the version stored in `$GAME_DIR/game/ffxivgame.ver`.
|
||||
{{< note "`{game_version}` is referring to the version stored in `$GAME_DIR/game/ffxivgame.ver`." >}}
|
||||
|
||||
**POST** `https://patch-gamever.ffxiv.com/http/win32/ffxivneo_release_game/{game_version}/{SID}`
|
||||
* X-Hash-Check: `enabled`
|
||||
|
@ -157,15 +157,16 @@ ex1\t{ex1_version}\n
|
|||
...
|
||||
```
|
||||
|
||||
Please note that the client must report **all** of it's installed expansions. The base game version is already reported in the request URL itself, so you should start at "ex1". Each entry in this body is seperated by newlines, except for the last entry. Yes, the `\t` in the body is referring to the tab character.
|
||||
Please note that the client must report **all** of it's installed expansions. The base game version is already reported in the request URL itself, so you should start at "ex1". Each entry in this body is separated by newlines, except for the last entry. Yes, the `\t` in the body is referring to the tab character.
|
||||
|
||||
Once you send this request, there may or may not be a response body. First you'll want to check for the response header called `X-Patch-Unique-Id`, if this found then you've actually successfully registered a session! If this is missing, you may have triggered the anti-tamper check, or the game requires an update.
|
||||
|
||||
The `{true_SID}` is now the value of the `X-Patch-Unique-ID` field. Congratulations, you now logged into the game!
|
||||
|
||||
## Launching the game
|
||||
# Launching the game
|
||||
|
||||
Now you can launch the game! See [ffxiv.exe]({{< ref "executable/ffxiv" >}}) for more arguments.
|
||||
|
||||
Now you can launch the game! See [ffxiv.exe](executable/ffxiv) for more arguments. For a quick rundown:
|
||||
* Set `DEV.TestSID` to `{true_SID}`.
|
||||
* Set `DEV.MaxEntitledExpansionID` to `{max_expansion}`.
|
||||
* Set `SYS.Region` to `{region}`.
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
title: "Logging into Sapphire Servers"
|
||||
---
|
||||
|
||||
Luckily Sapphire has a much, much easier login process than the official servers, which only consist of one or two requests.
|
||||
[Sapphire](https://github.com/SapphireServer/Sapphire/) has a much, much easier login process than [the official servers]({{< ref "concept/logging-in-official" >}}), which only consist of one or two requests.
|
||||
|
||||
# Logging in
|
||||
|
||||
|
|
|
@ -2,13 +2,9 @@
|
|||
title: "SqexArg"
|
||||
---
|
||||
|
||||
I also recommend reading the relevant [xiv.dev page on SqexArg](https://xiv.dev/sqexarg).
|
||||
|
||||
## Purpose
|
||||
|
||||
This is the "encrypted argument" format used by a lot of FFXIV programs and is used in place of regular plaintext command line arguments. However, this is barely a security measure and just prevents easily snooping stuff like your login token. Despite this, the SqexArg format is well known, reversible and easily breakable.
|
||||
|
||||
## Format
|
||||
# Format
|
||||
|
||||
When viewing the command line arguments for, say [ffxiv.exe](executable/ffxiv) you will see it's only something like this:
|
||||
|
||||
|
@ -39,7 +35,7 @@ Let's break them down:
|
|||
* checksum
|
||||
* This is also covered in a later section, but this is always one character long and located at the end of the string.
|
||||
|
||||
## Encryption Algorithm
|
||||
# Encryption Algorithm
|
||||
|
||||
The resulting bytes when you decode the base64 string is going to Blowfish ECB encrypted.
|
||||
|
||||
|
@ -51,7 +47,7 @@ The resulting bytes when you decode the base64 string is going to Blowfish ECB e
|
|||
|
||||
**Note:** In the new Steam launcher update, Square Enix has actually switched to a more sane version of Blowfish ECB without their weird changes. Please look at [XIVQuickLauncher for the changes](https://github.com/goatcorp/FFXIVQuickLauncher/blob/master/src/XIVLauncher.Common/Encryption/BlockCipher/Blowfish.cs) required, as I have not tested this yet.
|
||||
|
||||
### Key
|
||||
## Key
|
||||
|
||||
The key used for encrypting/decrypting the encrypted arguments is just your **system's uptime clock**. All FFXIV executables just call `GetTickCount()`, and theres about ~50 or so ticks of freedom before the game or launcher considers it invalid. There is a specific transformation you need to do in order to fetch a valid key though:
|
||||
|
||||
|
@ -66,7 +62,7 @@ sprintf(buffer, "%08x", key);
|
|||
|
||||
To make this easier, here is a couple of platform-specific implementations of `TickCount()`. Thank you Wine for being easily searchable, as this is what Wine is actually doing under the hood to emulate `GetTickCount()`, so these are exact and have been tested on Astra for all platforms.
|
||||
|
||||
#### Windows
|
||||
### Windows
|
||||
|
||||
```
|
||||
uint32_t TickCount() {
|
||||
|
@ -74,7 +70,7 @@ uint32_t TickCount() {
|
|||
}
|
||||
```
|
||||
|
||||
#### macOS
|
||||
### macOS
|
||||
|
||||
```
|
||||
uint32_t TickCount() {
|
||||
|
@ -89,7 +85,7 @@ uint32_t TickCount() {
|
|||
}
|
||||
```
|
||||
|
||||
#### Linux
|
||||
### Linux
|
||||
|
||||
```
|
||||
uint32_t TickCount() {
|
||||
|
@ -101,7 +97,7 @@ uint32_t TickCount() {
|
|||
}
|
||||
```
|
||||
|
||||
### Checksum
|
||||
## Checksum
|
||||
|
||||
If you're just interested in decrypting game arguments, this is not essential. This is presumably used as a checksum
|
||||
when the game checks your encrypted string.
|
||||
|
@ -118,18 +114,22 @@ static char GetChecksum(unsigned int key) {
|
|||
}
|
||||
```
|
||||
|
||||
## Decrypting
|
||||
# Decrypting
|
||||
|
||||
You can try the [dedicated argcracker](https://sr.ht/~redstrate/novus/#argcracker) in Novus for this purpose. It allows you to easily
|
||||
crack any SqexArg enabled program assuming you have access to the string.
|
||||
|
||||
## Notes
|
||||
# Notes
|
||||
|
||||
Every instance where SqexArg is used, the first argument is always `T`, where `T` is set to the value of `ticks` (as shown above). I'm not sure what the purpose of this really is, maybe for verifying the checksum?
|
||||
|
||||
The arguments (before encoding of course) must be formatted as `" /%1 =%2"`. The extra space is required, even at the beginning of the arguments. Make sure that any spaces in your string is double padded as well.
|
||||
|
||||
## Implementations
|
||||
# See Also
|
||||
|
||||
* [SqexArg on xiv.dev](https://xiv.dev/sqexarg)
|
||||
|
||||
# Implementations
|
||||
|
||||
* [XIVQuickLauncher (C#)](https://github.com/goatcorp/FFXIVQuickLauncher/blob/master/src/XIVLauncher.Common/Encryption/ArgumentBuilder.cs)
|
||||
* [Astra (C++)](https://git.sr.ht/~redstrate/astra/tree/main/item/launcher/core/include/encryptedarg.h)
|
||||
|
|
|
@ -1,8 +1,10 @@
|
|||
---
|
||||
title: "ffxiv.exe"
|
||||
title: "Client (ffxiv.exe)"
|
||||
---
|
||||
|
||||
This is the actual game executable, and theres two versions - one for DX9 and DX11. You'll almost always be using the DX11 version, called `ffxiv_dx11.exe`.
|
||||
This is the game client executable.
|
||||
|
||||
{{< note "There are two separate executables for DirectX 11 and DirectX 9. The DX11 version is named `ffxiv_dx11.exe`. The DX9 version will be removed in a future update." >}}
|
||||
|
||||
# Arguments
|
||||
|
||||
|
@ -27,8 +29,9 @@ This is the actual game executable, and theres two versions - one for DX9 and DX
|
|||
* DEV.LobbyPort0X
|
||||
* This is the port number of the Nth lobby available to the client, these are numbered 0-9. If empty, this will default to the official Square Enix lobbies.
|
||||
|
||||
**Note:** For benchmark versions of the game, there is a whole host of graphical options available as game arguments - but this seems to be missing in the retail version.
|
||||
{{< info "For benchmark versions of the game, there is a whole host of graphical options available as game arguments - but this seems to be missing in the retail version." >}}
|
||||
|
||||
# Alternative Implementations
|
||||
|
||||
None.
|
||||
* [SaBOTender (C#)](https://github.com/shalzuth/SaBOTender)
|
||||
* Implements very basic networking capabilities.
|
||||
|
|
|
@ -1,14 +1,12 @@
|
|||
---
|
||||
title: "ffxivboot.exe"
|
||||
title: "Boot (ffxivboot.exe)"
|
||||
---
|
||||
|
||||
{{< note "This documentation is incomplete." >}}
|
||||
|
||||
This executable handles launching [ffxivlauncher.exe](executable/ffxivlauncher), and also patching "boot files" (aka anything inside of the GameInstall/boot folder).
|
||||
|
||||
# Arguments
|
||||
|
||||
None(?) that I've found yet.
|
||||
|
||||
# Alternative Implementations
|
||||
|
||||
* [XIVQuickLauncher (C#)](https://github.com/goatcorp/FFXIVQuickLauncher/blob/master/src/XIVLauncher.Common/Game/Launcher.cs)
|
||||
* [Astra (C++)](https://git.sr.ht/~redstrate/astra/tree/main/item/launcher/src/squareboot.cpp)
|
||||
* [XIVQuickLauncher (C#)](https://github.com/goatcorp/FFXIVQuickLauncher/blob/master/src/XIVLauncher.Common/Game/Launcher.cs)
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
title: "ffxivinstaller.exe"
|
||||
title: "Installer (ffxivinstaller.exe)"
|
||||
---
|
||||
|
||||
This is not a standard InstallShield installer (at least to my knowledge) but seems to a self-extracting executable and then some form of InstallShield executable.
|
||||
|
|
|
@ -1,17 +1,39 @@
|
|||
---
|
||||
title: "ffxivlauncher.exe"
|
||||
title: "Launcher (ffxivlauncher.exe)"
|
||||
---
|
||||
|
||||
{{< note "This documentation is incomplete." >}}
|
||||
|
||||
This is the program that logins into the official servers and launches the game.
|
||||
|
||||
# History
|
||||
|
||||
There are two different versions of the launcher, one "old" and one "new".
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
The old launcher has been there since launch, but was on the path to be retired since the new launcher design was used. It seems as of Patch 6.5, the old launcher can no longer be used and all users must use the new design.
|
||||
|
||||
# Internals
|
||||
|
||||
The launcher is actually a website, and the launcher is served by the [Frontier server]({{< ref "/server/frontier" >}}) on URLs such as https://frontier.ffxiv.com/version_4_0_win/index.html?1559390056785.
|
||||
|
||||
In order for the launcher to actually launch anything useful, it uses JavaScript callbacks into native code.
|
||||
|
||||
For details on how logging into the Square Enix servers work, see the [relevant page on this concept]({{< ref "/concept/logging-in-official" >}}).
|
||||
|
||||
# Arguments
|
||||
|
||||
**Note:** Just like the other executables, it requires you to pass these using the [SqexArg](concept/sqexarg) format.
|
||||
{{< note "Like the other executables, it requires you to pass these using the [SqexArg](concept/sqexarg) format." >}}
|
||||
|
||||
- ExecuteArg
|
||||
- ExecuteArg (**Required**)
|
||||
- This is a strange argument. This appears to be a random gibberish of numbers:
|
||||
|
||||
`/T =1000000 /ExecuteArg =14431503 /UserPath =C:/users/yourname/Documents/My Games/FINAL FANTASY XIV - A Realm Reborn`
|
||||
|
||||
In reality, decompiling the launcher reveals that they are literally sprintf'ing in this format:
|
||||
In reality, decompiling the launcher reveals that they are sprintf'ing in this format:
|
||||
|
||||
`%02d%02d%02d%02d`
|
||||
|
||||
|
@ -23,10 +45,11 @@ title: "ffxivlauncher.exe"
|
|||
- UserPath
|
||||
- Your usual path to your FFXIV data folder in Documents.
|
||||
|
||||
|
||||
# Alternative Implementations
|
||||
|
||||
* [XIVQuickLauncher (C#)](https://github.com/goatcorp/FFXIVQuickLauncher)
|
||||
* [Astra (C++)](https://sr.ht/~redstrate/astra/)
|
||||
* [XIVQuickLauncher (C#)](https://github.com/goatcorp/FFXIVQuickLauncher)
|
||||
* [XIVCore (C#)](https://github.com/goatcorp/XIVLauncher.Core)
|
||||
* [XIV-on-Mac (Swift)](https://github.com/marzent/XIV-on-Mac)
|
||||
* [microlaunch (Rust)](https://github.com/eorzeatools/microlaunch)
|
||||
* [L4-cpp (C++)](https://github.com/WorkingRobot/L4-cpp)
|
||||
|
|
|
@ -1,12 +1,14 @@
|
|||
---
|
||||
title: "ffxivupdater.exe"
|
||||
title: "Updater (ffxivupdater.exe)"
|
||||
---
|
||||
|
||||
**Note:** This is unconfirmed information, as I'm still progressing through my reverse engineering work. If you have any idea what this updater is doing, please contact me :-)
|
||||
{{< note "This documentation is incomplete." >}}
|
||||
|
||||
This is the program that actually processes the [patch files]({{< ref "format/patch" >}}) and applies them to the game or boot data.
|
||||
|
||||
# Arguments
|
||||
|
||||
**Note:** Just like the other executables, it requires you to pass these using the [SqexArg](concept/sqexarg) format.
|
||||
{{< note "Just like the other executables, it requires you to pass these using the [SqexArg](concept/sqexarg) format." >}}
|
||||
|
||||
- BootVersion
|
||||
- The version of the boot component.
|
||||
|
@ -29,7 +31,8 @@ title: "ffxivupdater.exe"
|
|||
- This is the usual UserPath arugment, pointing to your FFXIV-ARR Documents directory.
|
||||
|
||||
# Processes
|
||||
During update execution, the launcher(?) copies the updater executable into your `UserPath/downloads` directory, where it is then ran. I'm assuming this is to work around a Windows limitation where you can't update the executable on disk, so it has to be ran from a location where it could "update" itself.
|
||||
|
||||
During update execution, the [launcher]({{< ref "executable/ffxivlauncher" >}}) copies the updater executable into your `UserPath/downloads` directory, where it is then ran. I'm assuming this is to work around a Windows limitation where you can't update the executable on disk, so it has to be ran from a location where it could "update" itself.
|
||||
|
||||
## ShowMode 2
|
||||
|
||||
|
@ -46,20 +49,20 @@ The first one appears very minimal but might be the one used when it's not downl
|
|||
The second one appears to be the regular "downloading" patch mode, considering it says "downloadsize" right there.
|
||||
The last one would appear to be when it's actually applying the patches, as it has "remaintime" as well as "speed".
|
||||
|
||||
# IPC
|
||||
## IPC
|
||||
|
||||
It appears that ffxivlauncher.exe and ffxivupdater.exe is communicating exclusively through Win32 IPC (SendMessage). I haven't deciphered the actual messages yet, but here is a few interesting ones I've seen used:
|
||||
It looks like this communicates exclusively through Win32 IPC (SendMessage). I haven't deciphered all of the messages yet, but here is a few interesting ones I've seen used:
|
||||
|
||||
## 0x7fc
|
||||
* 0x7fc
|
||||
|
||||
The format is `{version:\"%s\",ID:%d}`. I'm guessing this means "install this patch", version obviously corresponds to the patch version, and maybe ID is the jumble of alphanumeric characters in the directory names of the ffxivpatch folder?
|
||||
The format is `{version:\"%s\",ID:%d}`. I'm guessing this means "install this patch", version obviously corresponds to the patch version, and maybe ID is the jumble of alphanumeric characters in the directory names of the ffxivpatch folder?
|
||||
|
||||
0xbd4 - unknown
|
||||
* 0xbd4 - unknown
|
||||
|
||||
0x81a - unknown
|
||||
* 0x81a - unknown
|
||||
|
||||
# Alternative Implementations
|
||||
|
||||
* [XIVQuickLauncher (C#)](https://github.com/goatcorp/FFXIVQuickLauncher/tree/master/src/XIVLauncher.Common/Game/Patch)
|
||||
* [physis (Rust)](https://git.sr.ht/~redstrate/physis/tree/main/item/src/patch.rs)
|
||||
* [XIVQuickLauncher (C#)](https://github.com/goatcorp/FFXIVQuickLauncher/tree/master/src/XIVLauncher.Common/Game/Patch)
|
||||
* [libxiv (C++)](https://git.sr.ht/~redstrate/libxiv/tree/main/item/src/patch.cpp)
|
||||
|
|
26
content/format/cfg.md
Normal file
26
content/format/cfg.md
Normal file
|
@ -0,0 +1,26 @@
|
|||
---
|
||||
title: "Configuration File (.cfg)"
|
||||
---
|
||||
|
||||
{{< note "This documentation is incomplete." >}}
|
||||
|
||||
A plaintext configuration file.
|
||||
|
||||
# Structure
|
||||
|
||||
The file is plaintext, which is easy to parse. The file is split into categories, which are surrounded by `<` and `>`. Within those categories are key-value pairs which are separated by tab characters (`\t`).
|
||||
|
||||
```
|
||||
<FINAL FANTASY XIV Boot Config File>
|
||||
|
||||
<Version>
|
||||
Version 3
|
||||
Language 1
|
||||
Region 2
|
||||
```
|
||||
|
||||
Keep in mind that categories can exist without any key-value pairs, as shown above.
|
||||
|
||||
# Alternative Implementations
|
||||
|
||||
* [Physis (Rust)](https://git.sr.ht/~redstrate/physis/tree/main/item/src/cfg.rs)
|
53
content/format/chardat.md
Normal file
53
content/format/chardat.md
Normal file
|
@ -0,0 +1,53 @@
|
|||
---
|
||||
title: "Character Creation Data (.dat)"
|
||||
---
|
||||
|
||||
{{< note "This documentation is incomplete." >}}
|
||||
|
||||
Saved data from the character creation screen.
|
||||
|
||||
# Structure
|
||||
|
||||
There seems to be a few different versions of this format. Below is version 4:
|
||||
|
||||
## Version 4
|
||||
|
||||
| Offset | Type | Purpose |
|
||||
| ------ | ----- | ------ |
|
||||
| 0x00 | 32-bit integer | Magic, should be 0x2013FF14. |
|
||||
| 0x04 | 32-bit integer | The version of the file, in this case "4". |
|
||||
| 0x08 | 32-bit integer | Checksum of the data. |
|
||||
| 0x0C | 32-bit integer | Unknown. |
|
||||
| 0x0D | 8-bit unsigned integer | The character's race. |
|
||||
| 0x0E | 8-bit unsigned integer | The character's gender. |
|
||||
| 0x0F | 8-bit unsigned integer | The character's age. |
|
||||
| 0x10 | 8-bit unsigned integer | The character's age. 1 is "Normal", 3 is "Old" and 4 is "Young". |
|
||||
| 0x11 | 8-bit unsigned integer | The character's height from 0-255. |
|
||||
| 0x12 | 8-bit unsigned integer | The character's subrace. |
|
||||
| 0x13 | 8-bit unsigned integer | The character's head. |
|
||||
| 0x14 | 8-bit unsigned integer | The character's hair. |
|
||||
| 0x15 | 8-bit unsigned integer | If the character has hair highlights. |
|
||||
| 0x16 | 8-bit unsigned integer | The character's skin tone. |
|
||||
| 0x17 | 8-bit unsigned integer | The character's right eye color. |
|
||||
| 0x18 | 8-bit unsigned integer | The character's hair color. |
|
||||
| 0x19 | 8-bit unsigned integer | The character's hair highlights color. |
|
||||
| 0x1A | 8-bit unsigned integer | The character's facial features. |
|
||||
| 0x1B | 8-bit unsigned integer | If the character has limbal eyes. |
|
||||
| 0x1C | 8-bit unsigned integer | The character's eyebrows. |
|
||||
| 0x1D | 8-bit unsigned integer | The character's left eye color. |
|
||||
| 0x1E | 8-bit unsigned integer | The character's eyes. |
|
||||
| 0x1F | 8-bit unsigned integer | The character's nose. |
|
||||
| 0x20 | 8-bit unsigned integer | The character's jaw. |
|
||||
| 0x21 | 8-bit unsigned integer | The character's mouth. |
|
||||
| 0x22 | 8-bit unsigned integer | The character's lip/tone/fur/pattern. |
|
||||
| 0x23 | 8-bit unsigned integer | The character's tail. |
|
||||
| 0x24 | 8-bit unsigned integer | The character's face paint. |
|
||||
| 0x25 | 8-bit unsigned integer | The character's bust size from 0-255. |
|
||||
| 0x26 | 8-bit unsigned integer | The character's face paint color. |
|
||||
| 0x27 | 8-bit unsigned integer | The character's voice. |
|
||||
| 0x28 | 8-bit unsigned integer | Unknown. |
|
||||
| 0x29 | 32-bit unsigned integer | Timestamp? |
|
||||
|
||||
# Alternative Implementations
|
||||
|
||||
* [Physis (Rust)](https://git.sr.ht/~redstrate/physis/tree/main/item/src/chardat.rs)
|
11
content/format/cmp.md
Normal file
11
content/format/cmp.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Chara Make Parameters (.cmp)"
|
||||
---
|
||||
|
||||
{{< note "This documentation is incomplete." >}}
|
||||
|
||||
Describes various character parameters such as minimum and maximum height.
|
||||
|
||||
# Alternative Implementations
|
||||
|
||||
* [Physis (Rust)](https://git.sr.ht/~redstrate/physis/tree/main/item/src/cmp.rs)
|
|
@ -1,15 +1,17 @@
|
|||
---
|
||||
title: "EXD"
|
||||
title: "Excel Data (.exd)"
|
||||
---
|
||||
|
||||
**Note:** To prevent confusion, "Excel" as described has nothing to do with Microsoft's Excel.
|
||||
{{< info "'Excel' here has nothing to do with Microsoft's Excel." >}}
|
||||
{{< note "This documentation is incomplete." >}}
|
||||
|
||||
**Note:** This documentation is incomplete.
|
||||
The data file for an Excel sheet.
|
||||
|
||||
I recommend reading the ["Excel Data" section](https://xiv.dev/game-data/file-formats/excel#excel-data-.exd) on xiv.dev's Excel docs.
|
||||
|
||||
## Alternative Implementations
|
||||
# Alternative Implementations
|
||||
|
||||
* [Physis (Rust)](https://git.sr.ht/~redstrate/physis/tree/main/item/src/exd.rs)
|
||||
* [xivModdingFramework (C#)](https://github.com/TexTools/xivModdingFramework/tree/master/xivModdingFramework/Exd)
|
||||
* [Lumina (C#)](https://github.com/NotAdam/Lumina/blob/master/src/Lumina/Data/Files/Excel/ExcelDataFile.cs)
|
||||
* [libxiv (C++)](https://git.sr.ht/~redstrate/libxiv/tree/main/item/src/exdparser.cpp)
|
||||
|
|
|
@ -1,16 +1,16 @@
|
|||
---
|
||||
title: "EXH"
|
||||
title: "Excel Header (.exh)"
|
||||
---
|
||||
|
||||
**Note:** To prevent confusion, "Excel" as described has nothing to do with Microsoft's Excel.
|
||||
|
||||
**Note:** This documentation is incomplete.
|
||||
{{< info "'Excel' here has nothing to do with Microsoft's Excel." >}}
|
||||
{{< note "This documentation is incomplete." >}}
|
||||
|
||||
I recommend reading the ["Excel Header" section](https://xiv.dev/game-data/file-formats/excel#excel-header-.exh) on xiv.dev's Excel docs.
|
||||
|
||||
This is a schema file describing the column and row layout of an Excel sheet (such as `Achievement`). You **are required to parse** this before reading `.exd` files, as it contains important information on building a path and reading columns.
|
||||
|
||||
## Alternative Implementations
|
||||
# Alternative Implementations
|
||||
|
||||
* [Physis (Rust)](https://git.sr.ht/~redstrate/physis/tree/main/item/src/exh.rs)
|
||||
* [Lumina (C#)](https://github.com/NotAdam/Lumina/blob/master/src/Lumina/Data/Files/Excel/ExcelHeaderFile.cs)
|
||||
* [libxiv (C++)](https://git.sr.ht/~redstrate/libxiv/tree/main/item/src/exhparser.cpp)
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
---
|
||||
title: "EXL"
|
||||
title: "Excel List (.exl)"
|
||||
---
|
||||
|
||||
**Note:** To prevent confusion, "Excel" as described has nothing to do with Microsoft's Excel.
|
||||
{{< info "'Excel' here has nothing to do with Microsoft's Excel." >}}
|
||||
|
||||
I recommend reading the ["Excel List" section](https://xiv.dev/game-data/file-formats/excel#excel-list-.exl) on xiv.dev's Excel docs.
|
||||
|
||||
This is simply a text file containing a list of comma-separated strings, where each line is separated by a newline:
|
||||
Describes Excel sheets that exist in the game data. A good example is is `exd/rool.exl` which contains many references to the game data. It's a text file containing a list of comma-separated strings, where each line is separated by a newline:
|
||||
|
||||
```
|
||||
EXLT,2
|
||||
|
@ -16,13 +16,12 @@ content/DeepDungeon2Achievement,-1
|
|||
content/DeepDungeon2Gacha,-1
|
||||
```
|
||||
|
||||
This describes Excel sheets that exist in the game data, hence why it's called dubbed an "Excel List". The easiest one to parse is `exd/rool.exl` as it contains a bunch of Excel sheets to test a parser on.
|
||||
|
||||
With an Excel List parsed, you can then build a path to a [Excel header or .exh](format/exh). To do so, simply move all characters to lowercase and append `.exh` at the end:
|
||||
|
||||
`Achievement,209` -> `exh/achievement.exh`
|
||||
|
||||
## Alternative Implementations
|
||||
# Alternative Implementations
|
||||
|
||||
* [Physis (Rust)](https://git.sr.ht/~redstrate/physis/tree/main/item/src/exl.rs)
|
||||
* [Lumina (C#)](https://github.com/NotAdam/Lumina/blob/master/src/Lumina/Data/Files/Excel/ExcelListFile.cs)
|
||||
* [libxiv (C++)](https://git.sr.ht/~redstrate/libxiv/tree/main/item/src/exlparser.cpp)
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
# .fiin
|
||||
---
|
||||
title: "File Info (.fiin)"
|
||||
---
|
||||
|
||||
I don't know the actual purpose of this file, but it was a fun reverse-engineering exercise. These are usually listed like `fileinfo.fiin` (like in `/boot`) and start with a header like this:
|
||||
I don't know the actual purpose of this file, it seems to contain SHA1 of certain files. The filename is usually `fileinfo.fiin` (like in `/boot`) and start with a header like this:
|
||||
|
||||
```
|
||||
struct FileInfoHeader {
|
||||
|
@ -39,6 +41,7 @@ struct FileInfoEntry {
|
|||
|
||||
This file appears to have SHA1 hashes, but for what purpose I do not know.
|
||||
|
||||
## Alternative Implementations
|
||||
# Alternative Implementations
|
||||
|
||||
* [Physis (Rust)](https://git.sr.ht/~redstrate/physis/tree/main/item/src/fiin.rs)
|
||||
* [libxiv (C++)](https://git.sr.ht/~redstrate/libxiv/tree/main/item/src/fiinparser.cpp)
|
||||
|
|
11
content/format/log.md
Normal file
11
content/format/log.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Chat Log (.log)"
|
||||
---
|
||||
|
||||
{{< note "This documentation is incomplete." >}}
|
||||
|
||||
A binary store of recent chat logs.
|
||||
|
||||
# Alternative Implementations
|
||||
|
||||
* [Physis (Rust)](https://git.sr.ht/~redstrate/physis/tree/main/item/src/log.rs)
|
|
@ -1,9 +1,12 @@
|
|||
---
|
||||
title: "MDL"
|
||||
title: "Model (.mdl)"
|
||||
---
|
||||
|
||||
**Note:** This documentation is incomplete.
|
||||
{{< note "This documentation is incomplete." >}}
|
||||
|
||||
## Alternative Implementations
|
||||
A visual model.
|
||||
|
||||
# Alternative Implementations
|
||||
|
||||
* [Physis (Rust)](https://git.sr.ht/~redstrate/physis/tree/main/item/src/mdl.rs)
|
||||
* [libxiv (C++)](https://git.sr.ht/~redstrate/libxiv/tree/main/item/src/mdlparser.cpp)
|
||||
|
|
11
content/format/mtrl.md
Normal file
11
content/format/mtrl.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Material (.mtrl)"
|
||||
---
|
||||
|
||||
{{< note "This documentation is incomplete." >}}
|
||||
|
||||
A visual material.
|
||||
|
||||
# Alternative Implementations
|
||||
|
||||
* [Physis (Rust)](https://git.sr.ht/~redstrate/physis/tree/main/item/src/mtrl.rs)
|
|
@ -1,11 +1,14 @@
|
|||
---
|
||||
title: "ZiPatch"
|
||||
title: "ZiPatch (.patch)"
|
||||
---
|
||||
|
||||
**Note:** This documentation is incomplete.
|
||||
{{< note "This documentation is incomplete." >}}
|
||||
|
||||
Contains various deltas to be applied on top of existing game or boot data.
|
||||
|
||||
I recommend reading the ["ZiPatch" section](https://xiv.dev/data-files/zipatch) on xiv.dev.
|
||||
|
||||
## Alternative Implementations
|
||||
# Alternative Implementations
|
||||
|
||||
* [Physis (Rust)](https://git.sr.ht/~redstrate/physis/tree/main/item/src/patch.rs)
|
||||
* [libxiv (C++)](https://git.sr.ht/~redstrate/libxiv/tree/main/item/src/patch.cpp)
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
---
|
||||
title: "SHPK"
|
||||
title: "Shader Package (.shpk)"
|
||||
---
|
||||
|
||||
**Note**: Resource and scalar parameters are not documented yet.
|
||||
{{< note "This documentation is incomplete, resource and scalar parameters are not documented yet." >}}
|
||||
|
||||
These are "shader packages" or a collection of vertex and pixel shaders. A good example is _"character.shpk"_ which contains - you guessed it - character shaders.
|
||||
A collection of vertex and pixel shaders. A good example is _"character.shpk"_ which contains - you guessed it - character shaders.
|
||||
|
||||
# Header Structure
|
||||
|
||||
|
@ -34,4 +34,4 @@ The format of this shader bytecode is nothing special, it's DXBC (the bytecode f
|
|||
# Alternative Implementations
|
||||
|
||||
* [SaintCoinach (C#)](https://github.com/xivapi/SaintCoinach/blob/master/SaintCoinach/Graphics/ShPk/ShPkFile.cs)
|
||||
* [physis (Rust)](https://git.sr.ht/~redstrate/physis/tree/main/item/src/shpk.rs)
|
||||
* [Physis (Rust)](https://git.sr.ht/~redstrate/physis/tree/main/item/src/shpk.rs)
|
||||
|
|
11
content/format/sklb.md
Normal file
11
content/format/sklb.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Skeleton (.sklb)"
|
||||
---
|
||||
|
||||
{{< note "This documentation is incomplete." >}}
|
||||
|
||||
A Havok skeleton.
|
||||
|
||||
# Alternative Implementations
|
||||
|
||||
None yet.
|
|
@ -1,13 +1,16 @@
|
|||
---
|
||||
title: "dat"
|
||||
title: "Game Data (.dat)"
|
||||
---
|
||||
|
||||
**Note:** This documentation is incomplete.
|
||||
{{< note "This documentation is incomplete." >}}
|
||||
|
||||
Compressed game data.
|
||||
|
||||
I recommend reading the ["SqPack" page](https://xiv.dev/data-files/sqpack) on xiv.dev.
|
||||
|
||||
## Alternative Implementations
|
||||
# Alternative Implementations
|
||||
|
||||
* [Physis (Rust)](https://git.sr.ht/~redstrate/physis/tree/main/item/src/gamedata.rs)
|
||||
* [xivModdingFramework (C#)](https://github.com/TexTools/xivModdingFramework/blob/master/xivModdingFramework/SqPack/FileTypes/Dat.cs)
|
||||
* [Lumina (C#)](https://github.com/NotAdam/Lumina/blob/master/src/Lumina/Data/SqPackStream.cs)
|
||||
* [libxiv (C++)](https://git.sr.ht/~redstrate/libxiv/tree/main/item/src/gamedata.cpp)
|
||||
|
|
|
@ -1,13 +1,16 @@
|
|||
---
|
||||
title: "index/index2"
|
||||
title: "Game Data Index (.index/.index2)"
|
||||
---
|
||||
|
||||
**Note:** This documentation is incomplete.
|
||||
{{< note "This documentation is incomplete." >}}
|
||||
|
||||
Index files for [compressed game data](/format/sqpack-dat).
|
||||
|
||||
I recommend reading the ["Reading Index Data" section](https://xiv.dev/data-files/sqpack#reading-index-data) on xiv.dev's SqPack docs.
|
||||
|
||||
## Alternative Implementations
|
||||
# Alternative Implementations
|
||||
|
||||
* [Physis (Rust)](https://git.sr.ht/~redstrate/physis/tree/main/item/src/index.rs)
|
||||
* [xivModdingFramework (C#)](https://github.com/TexTools/xivModdingFramework/blob/master/xivModdingFramework/SqPack/FileTypes/Index.cs)
|
||||
* [Lumina (C#)](https://github.com/NotAdam/Lumina/blob/master/src/Lumina/Data/SqPackIndex.cs)
|
||||
* [libxiv (C++)](https://git.sr.ht/~redstrate/libxiv/tree/main/item/src/indexparser.cpp)
|
||||
|
|
11
content/format/tex.md
Normal file
11
content/format/tex.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
title: "Texture (.tex)"
|
||||
---
|
||||
|
||||
{{< note "This documentation is incomplete." >}}
|
||||
|
||||
Visual texture.
|
||||
|
||||
# Alternative Implementations
|
||||
|
||||
* [Physis (Rust)](https://git.sr.ht/~redstrate/physis/tree/main/item/src/tex.rs)
|
13
content/server/frontier.md
Normal file
13
content/server/frontier.md
Normal file
|
@ -0,0 +1,13 @@
|
|||
---
|
||||
title: "Frontier"
|
||||
---
|
||||
|
||||
{{< note "This documentation is incomplete." >}}
|
||||
|
||||
This is a multi-purpose server, and seems to handle many miscellaneous aspects.
|
||||
|
||||
It serves the [launcher](/executable/ffxivlauncher) page and gives out the gate status, for example.
|
||||
|
||||
# Alternative Implementations
|
||||
|
||||
* [Kawari (Rust)](https://git.sr.ht/~redstrate/kawari)
|
9
content/server/lobby.md
Normal file
9
content/server/lobby.md
Normal file
|
@ -0,0 +1,9 @@
|
|||
---
|
||||
title: "Lobby"
|
||||
---
|
||||
|
||||
{{< note "This documentation is incomplete." >}}
|
||||
|
||||
# Alternative Implementations
|
||||
|
||||
* [Sapphire (C++)](https://github.com/SapphireServer/Sapphire/)
|
9
content/server/login.md
Normal file
9
content/server/login.md
Normal file
|
@ -0,0 +1,9 @@
|
|||
---
|
||||
title: "Login"
|
||||
---
|
||||
|
||||
{{< note "This documentation is incomplete." >}}
|
||||
|
||||
# Alternative Implementations
|
||||
|
||||
* [Kawari (Rust)](https://git.sr.ht/~redstrate/kawari)
|
9
content/server/patch.md
Normal file
9
content/server/patch.md
Normal file
|
@ -0,0 +1,9 @@
|
|||
---
|
||||
title: "Patch"
|
||||
---
|
||||
|
||||
{{< note "This documentation is incomplete." >}}
|
||||
|
||||
# Alternative Implementations
|
||||
|
||||
* [Kawari (Rust)](https://git.sr.ht/~redstrate/kawari)
|
9
content/server/world.md
Normal file
9
content/server/world.md
Normal file
|
@ -0,0 +1,9 @@
|
|||
---
|
||||
title: "World"
|
||||
---
|
||||
|
||||
{{< note "This documentation is incomplete." >}}
|
||||
|
||||
# Alternative Implementations
|
||||
|
||||
* [Sapphire (C++)](https://github.com/SapphireServer/Sapphire/)
|
BIN
static/ffxivlauncher-new.png
Normal file
BIN
static/ffxivlauncher-new.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 405 KiB |
BIN
static/ffxivlauncher-old.png
Normal file
BIN
static/ffxivlauncher-old.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 483 KiB |
|
@ -46,6 +46,14 @@ a:visited {
|
|||
color: var(--link-color-visited)
|
||||
}
|
||||
|
||||
header h1 {
|
||||
margin-left: 1em;
|
||||
}
|
||||
|
||||
footer {
|
||||
margin-left: 1em;
|
||||
}
|
||||
|
||||
img {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
|
@ -69,8 +77,9 @@ main {
|
|||
margin: 2px;
|
||||
}
|
||||
|
||||
main > h2 {
|
||||
margin: 0px;
|
||||
aside {
|
||||
margin: 5px;
|
||||
flex: 25em 0 0;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 900px) {
|
||||
|
@ -93,6 +102,10 @@ main > h2 {
|
|||
}
|
||||
}
|
||||
|
||||
#content {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
footer {
|
||||
font-size: .9rem;
|
||||
}
|
||||
|
@ -124,3 +137,29 @@ footer {
|
|||
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
|
||||
.note {
|
||||
padding: 1em;
|
||||
border-radius: 7px;
|
||||
margin: 0.5em;
|
||||
text-decoration: none;
|
||||
background-color: #ecd89c;
|
||||
}
|
||||
|
||||
.note p {
|
||||
margin: 0em;
|
||||
}
|
||||
|
||||
|
||||
.info {
|
||||
padding: 1em;
|
||||
border-radius: 7px;
|
||||
margin: 0.5em;
|
||||
text-decoration: none;
|
||||
background-color: #caebff;
|
||||
}
|
||||
|
||||
.info p {
|
||||
margin: 0em;
|
||||
}
|
||||
|
|
|
@ -1,12 +0,0 @@
|
|||
{{- $url := .Destination | safeURL -}}
|
||||
{{- $img := .Page.Resources.GetMatch .Destination -}}
|
||||
{{- if and (not $img) .Page.File -}}
|
||||
{{ $path := path.Join .Page.File.Dir .Destination }}
|
||||
{{- $img = resources.Get $path -}}
|
||||
{{- end -}}
|
||||
{{- with $img -}}
|
||||
{{- $large := $img.Resize "800x webp" -}}
|
||||
<a class="gallery-img spotlight" href="{{ $img.RelPermalink }}" data-download="true"><img class="fancy-img" alt="{{ $.Text }}" width="{{ $large.Width }}" height="{{ $large.Height }}" src="{{ $large.RelPermalink }}" src="{{ $large.RelPermalink }}" /></a>
|
||||
{{- else -}}
|
||||
|
||||
<a class="gallery-img spotlight" href="{{ .Destination | safeURL }}" data-download="true"><img class="fancy-img" src="{{ .Destination | safeURL }}" alt="{{ $.Text }}" />{{- end -}}</a>
|
|
@ -1,19 +0,0 @@
|
|||
{{ partial "head.html" . }}
|
||||
|
||||
<div id="center-wrapper">
|
||||
|
||||
{{ partial "header.html" . }}
|
||||
|
||||
<div id="wrapper">
|
||||
|
||||
<main>
|
||||
<h2>{{ .Title }}</h2>
|
||||
|
||||
{{ .Content }}
|
||||
</main>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</html>
|
|
@ -1,19 +1,15 @@
|
|||
{{ partial "head.html" . }}
|
||||
|
||||
<div id="center-wrapper">
|
||||
|
||||
{{ partial "header.html" . }}
|
||||
|
||||
<div id="wrapper">
|
||||
|
||||
<main>
|
||||
{{- block "main" . }}{{- end }}
|
||||
</main>
|
||||
|
||||
</div>
|
||||
|
||||
{{ partial "footer.html" . }}
|
||||
|
||||
</div>
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="{{ .Site.LanguageCode }}" prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb#">
|
||||
{{- partial "head.html" . -}}
|
||||
<body>
|
||||
<header>{{- partial "header.html" . -}}</header>
|
||||
<div id="content">
|
||||
<aside>{{- partial "sidebar.html" . -}}</aside>
|
||||
<article>
|
||||
{{- block "main" . }}{{- end }}
|
||||
</article>
|
||||
</div>
|
||||
<footer>{{- partial "footer.html" . -}}</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
{{ define "main" }}
|
||||
|
||||
<h2>{{ .Title }}</h2>
|
||||
|
||||
{{ .Content }}
|
||||
|
||||
{{ range .Data.Pages.ByDate.Reverse }}
|
||||
<h2>{{ .Title }}</h2>
|
||||
{{ .Content }}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
{{ define "main" }}
|
||||
|
||||
<h2>{{ .Title }}</h2>
|
||||
|
||||
{{ .Content }}
|
||||
|
||||
|
||||
{{ end }}
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
<footer>
|
||||
|
||||
<a href="https://xiv.zone">xiv.zone</a>
|
||||
<a href="https://xiv.zone/copyright">Copyright Notice</a>
|
||||
</footer>
|
||||
|
|
|
@ -1,53 +1,83 @@
|
|||
{{ $image := resources.Get "img/profile.jpg" }}
|
||||
{{ with $image }}
|
||||
{{ $resized := .Resize "webp 256x" }}
|
||||
<img class="fancy-img" alt="Profile Picture" width="{{ $resized.Width }}" height="{{ $resized.Height }}" src="{{ $resized.Permalink }}"/>
|
||||
{{ $current := . }}
|
||||
{{ template "tree-nav" dict "sect" .Site.Home.Sections "current" $current }}
|
||||
|
||||
{{ define "tree-nav" }}
|
||||
{{ $current := .current }}
|
||||
|
||||
|
||||
<ul class="gdoc-nav__list">
|
||||
{{ $sortBy := (default "title" | lower) }}
|
||||
{{ range .sect.GroupBy "Weight" }}
|
||||
{{ $rangeBy := .ByTitle }}
|
||||
|
||||
{{ if eq $sortBy "title" }}
|
||||
{{ $rangeBy = .ByTitle }}
|
||||
{{ else if eq $sortBy "linktitle" }}
|
||||
{{ $rangeBy = .ByLinkTitle }}
|
||||
{{ else if eq $sortBy "date" }}
|
||||
{{ $rangeBy = .ByDate }}
|
||||
{{ else if eq $sortBy "publishdate" }}
|
||||
{{ $rangeBy = .ByPublishDate }}
|
||||
{{ else if eq $sortBy "expirydate" }}
|
||||
{{ $rangeBy = .ByExpiryDate }}
|
||||
{{ else if eq $sortBy "lastmod" }}
|
||||
{{ $rangeBy = .ByLastmod }}
|
||||
{{ else if eq $sortBy "title_reverse" }}
|
||||
{{ $rangeBy = .ByTitle.Reverse }}
|
||||
{{ else if eq $sortBy "linktitle_reverse" }}
|
||||
{{ $rangeBy = .ByLinkTitle.Reverse }}
|
||||
{{ else if eq $sortBy "date_reverse" }}
|
||||
{{ $rangeBy = .ByDate.Reverse }}
|
||||
{{ else if eq $sortBy "publishdate_reverse" }}
|
||||
{{ $rangeBy = .ByPublishDate.Reverse }}
|
||||
{{ else if eq $sortBy "expirydate_reverse" }}
|
||||
{{ $rangeBy = .ByExpiryDate.Reverse }}
|
||||
{{ else if eq $sortBy "lastmod_reverse" }}
|
||||
{{ $rangeBy = .ByLastmod.Reverse }}
|
||||
{{ end }}
|
||||
|
||||
{{ range $rangeBy }}
|
||||
{{ if not .Params.geekdocHidden }}
|
||||
{{ $numberOfPages := (add (len .Pages) (len .Sections)) }}
|
||||
{{ $isParent := and (ne $numberOfPages 0) (not .Params.geekdocFlatSection) }}
|
||||
{{ $isCurrent := eq $current . }}
|
||||
{{ $isAncestor := .IsAncestor $current }}
|
||||
{{ $id := substr (sha1 .Permalink) 0 8 }}
|
||||
{{ $doCollapse := and $isParent (or .Params.geekdocCollapseSection (default false .Site.Params.geekdocCollapseAllSections)) }}
|
||||
|
||||
|
||||
<li>
|
||||
<label>
|
||||
{{ if or .Content .Params.geekdocFlatSection }}
|
||||
<span class="flex">
|
||||
<a
|
||||
href="{{ .RelPermalink }}"
|
||||
class="gdoc-nav__entry{{- if eq $current . }}
|
||||
{{- printf " is-active" }}
|
||||
{{- end }}"
|
||||
>
|
||||
{{ .Title }}
|
||||
</a>
|
||||
</span>
|
||||
{{ else }}
|
||||
{{ .Title }}
|
||||
{{ end }}
|
||||
{{ if $doCollapse }}
|
||||
<svg class="gdoc-icon toggle gdoc_keyboard_arrow_left">
|
||||
<use xlink:href="#gdoc_keyboard_arrow_left"></use>
|
||||
</svg>
|
||||
<svg class="gdoc-icon toggle gdoc_keyboard_arrow_down">
|
||||
<use xlink:href="#gdoc_keyboard_arrow_down"></use>
|
||||
</svg>
|
||||
{{ end }}
|
||||
</label>
|
||||
|
||||
{{ if $isParent }}
|
||||
{{ template "tree-nav" dict "sect" .Pages "current" $current }}
|
||||
{{ end }}
|
||||
</li>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
</ul>
|
||||
{{ end }}
|
||||
|
||||
<div style="text-align: center; margin-top: 10px">
|
||||
{{ $currentPage := . }}
|
||||
{{ range $index, $element := .Site.Menus.formats }}
|
||||
{{ $len := (len $.Site.Menus.formats) }}
|
||||
|
||||
<a class="header-link" title="{{ .Name }}" rel="me" href="{{ .URL }}">{{ .Name }}</A>
|
||||
|
||||
{{ if not (eq (add $index 1) $len) }}·{{ end }}
|
||||
{{ end }}
|
||||
</div>
|
||||
|
||||
<p>
|
||||
Hey I do graphics dev, write tools, cross-platform stuff and contribute
|
||||
where I can! I draw sometimes.
|
||||
</p>
|
||||
|
||||
<hr>
|
||||
|
||||
<p>Accounts:</p>
|
||||
|
||||
<div id="social-links">
|
||||
{{ $currentPage := . }}
|
||||
{{ range .Site.Menus.links }}
|
||||
{{ $icon := .Params.icon}}
|
||||
<div><a class="header-link" title="{{ .Name }}" rel="me" href="{{ .URL }}">{{ partial "svg" $icon }} {{ .Name }}</a></div>
|
||||
{{ end }}
|
||||
</div>
|
||||
|
||||
<p>Contact:</p>
|
||||
|
||||
<div id="social-links">
|
||||
{{ $currentPage := . }}
|
||||
{{ range .Site.Menus.contact }}
|
||||
{{ $icon := .Params.icon}}
|
||||
<div><a class="header-link" title="{{ .Name }}" rel="me" href="{{ .URL }}">{{ partial "svg" $icon }} {{ .Name }}</a></div>
|
||||
{{ end }}
|
||||
</div>
|
||||
|
||||
<p>Donate:</p>
|
||||
|
||||
<div id="social-links">
|
||||
{{ $currentPage := . }}
|
||||
{{ range .Site.Menus.donate }}
|
||||
{{ $icon := .Params.icon}}
|
||||
<div><a class="header-link" title="{{ .Name }}" rel="me" href="{{ .URL }}">{{ partial "svg" $icon }} {{ .Name }}</a></div>
|
||||
{{ end }}
|
||||
</div>
|
||||
|
|
6
themes/mytheme/layouts/shortcodes/info.html
Normal file
6
themes/mytheme/layouts/shortcodes/info.html
Normal file
|
@ -0,0 +1,6 @@
|
|||
{{ $note := .Get 0 }}
|
||||
|
||||
<div class="info">
|
||||
<b>Note</b>
|
||||
<p>{{ $note | markdownify }}</p>
|
||||
</div>
|
6
themes/mytheme/layouts/shortcodes/note.html
Normal file
6
themes/mytheme/layouts/shortcodes/note.html
Normal file
|
@ -0,0 +1,6 @@
|
|||
{{ $note := .Get 0 }}
|
||||
|
||||
<div class="note">
|
||||
<b>Note</b>
|
||||
<p>{{ $note | markdownify }}</p>
|
||||
</div>
|
Loading…
Add table
Reference in a new issue