diff --git a/.github/workflows/README.md b/.github/workflows/README.md
index b8ec90e1b5..bb01386854 100644
--- a/.github/workflows/README.md
+++ b/.github/workflows/README.md
@@ -1,14 +1,5 @@
-# Workflows
+# Permanently Moved to OverlayPlugin/cactbot
-Replacing [Travis CI](https://travis-ci.org/) as this project's primary CI/CD tool,
-[GitHub Actions](https://help.github.com/en/actions) uses workflows to perform operations
-when specific events within the repository occur.
-Workflows are specified in YAML and can utilize shared components
-from other GitHub Actions to form expansive pipelines.
+See: [.github/workflows/README.md](https://github.com/OverlayPlugin/cactbot/blob/main/.github/workflows/README.md)
-These workflows should appear within pull requests as status indicators
-that denote "pending”, “success”, “failure”, or “error",
-and should contain detail links to view the workflows and their individual steps therein.
-Additionally, these workflow runs should be visible by clicking
-the [Actions](https://github.com/quisquous/cactbot/actions) tab
-in the repository's menu at the top of the repository's main page.
+
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
index 62acda1ff5..c9c2ab06d7 100644
--- a/CODE_OF_CONDUCT.md
+++ b/CODE_OF_CONDUCT.md
@@ -1,76 +1,5 @@
-# Contributor Covenant Code of Conduct
+# Permanently Moved to OverlayPlugin/cactbot
-## Our Pledge
+See: [CODE_OF_CONDUCT.md](https://github.com/OverlayPlugin/cactbot/blob/main/CODE_OF_CONDUCT.md)
-In the interest of fostering an open and welcoming environment, we as
-contributors and maintainers pledge to making participation in our project and
-our community a harassment-free experience for everyone, regardless of age, body
-size, disability, ethnicity, sex characteristics, gender identity and expression,
-level of experience, education, socio-economic status, nationality, personal
-appearance, race, religion, or sexual identity and orientation.
-
-## Our Standards
-
-Examples of behavior that contributes to creating a positive environment
-include:
-
-* Using welcoming and inclusive language
-* Being respectful of differing viewpoints and experiences
-* Gracefully accepting constructive criticism
-* Focusing on what is best for the community
-* Showing empathy towards other community members
-
-Examples of unacceptable behavior by participants include:
-
-* The use of sexualized language or imagery and unwelcome sexual attention or
- advances
-* Trolling, insulting/derogatory comments, and personal or political attacks
-* Public or private harassment
-* Publishing others' private information, such as a physical or electronic
- address, without explicit permission
-* Other conduct which could reasonably be considered inappropriate in a
- professional setting
-
-## Our Responsibilities
-
-Project maintainers are responsible for clarifying the standards of acceptable
-behavior and are expected to take appropriate and fair corrective action in
-response to any instances of unacceptable behavior.
-
-Project maintainers have the right and responsibility to remove, edit, or
-reject comments, commits, code, wiki edits, issues, and other contributions
-that are not aligned to this Code of Conduct, or to ban temporarily or
-permanently any contributor for other behaviors that they deem inappropriate,
-threatening, offensive, or harmful.
-
-## Scope
-
-This Code of Conduct applies both within project spaces and in public spaces
-when an individual is representing the project or its community. Examples of
-representing a project or community include using an official project e-mail
-address, posting via an official social media account, or acting as an appointed
-representative at an online or offline event. Representation of a project may be
-further defined and clarified by project maintainers.
-
-## Enforcement
-
-Instances of abusive, harassing, or otherwise unacceptable behavior may be
-reported by contacting the project team at cactbot@quisquo.us. All
-complaints will be reviewed and investigated and will result in a response that
-is deemed necessary and appropriate to the circumstances. The project team is
-obligated to maintain confidentiality with regard to the reporter of an incident.
-Further details of specific enforcement policies may be posted separately.
-
-Project maintainers who do not follow or enforce the Code of Conduct in good
-faith may face temporary or permanent repercussions as determined by other
-members of the project's leadership.
-
-## Attribution
-
-This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
-available at
-
-[homepage]: https://www.contributor-covenant.org
-
-For answers to common questions about this code of conduct, see
-
+
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index dfc3c47f61..ec7964c563 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,3 +1,5 @@
# Permanently Moved to OverlayPlugin/cactbot
+See: [CONTRIBUTING.md](https://github.com/OverlayPlugin/cactbot/blob/main/CONTRIBUTING.md)
+
diff --git a/docs/CactbotCustomization.md b/docs/CactbotCustomization.md
index 657fc0b666..eea74e3ea0 100644
--- a/docs/CactbotCustomization.md
+++ b/docs/CactbotCustomization.md
@@ -1,514 +1,5 @@
-# Cactbot Customization
+# Permanently Moved to OverlayPlugin/cactbot
-🌎 [**English**] [[简体中文](./zh-CN/CactbotCustomization.md)] [[繁體中文](./zh-TW/CactbotCustomization.md)] [[한국어](./ko-KR/CactbotCustomization.md)]
+See: [docs/CactbotCustomization.md](https://github.com/OverlayPlugin/cactbot/blob/main/docs/CactbotCustomization.md)
-- [Using the cactbot UI](#using-the-cactbot-ui)
-- [Changing Trigger Text with the cactbot UI](#changing-trigger-text-with-the-cactbot-ui)
-- [User Directory Overview](#user-directory-overview)
-- [Setting Your User Directory](#setting-your-user-directory)
-- [Customizing Appearance](#customizing-appearance)
-- [Overriding Raidboss Triggers](#overriding-raidboss-triggers)
- - [Example 1: changing the output text](#example-1-changing-the-output-text)
- - [Example 2: making provoke work for all jobs](#example-2-making-provoke-work-for-all-jobs)
- - [Example 3: adding custom triggers](#example-3-adding-custom-triggers)
-- [Overriding Raidboss Timelines](#overriding-raidboss-timelines)
-- [Customizing Behavior](#customizing-behavior)
-- [Debugging User Files](#debugging-user-files)
- - [Check the OverlayPlugin log for errors](#check-the-overlayplugin-log-for-errors)
- - [Check if your file is loaded](#check-if-your-file-is-loaded)
- - [Check if your user file has errors](#check-if-your-user-file-has-errors)
-
-## Using the cactbot UI
-
-The best way to customize cactbot is to use the cactbot configuration UI.
-This is under
-ACT -> Plugins -> OverlayPlugin.dll -> Cactbot.
-
-This has options for things like:
-
-- setting triggers to tts
-- disabling triggers
-- changing the output text of triggers
-- changing triggers to say a player's job instead of name
-- changing your cactbot language
-- volume settings
-- getting rid of that cheese icon
-
-It is not possible to configure everything you might want
-through the cactbot configuration UI.
-However, it is the easiest place to start with.
-Over time, more options will be added there.
-
-These options are stored in your
-`%APPDATA%\Advanced Combat Tracker\Config\RainbowMage.OverlayPlugin.config.json`
-file.
-You should not need to edit that file directly.
-
-## Changing Trigger Text with the cactbot UI
-
-In the cactbot configuration UI, under
-ACT -> Plugins -> OverlayPlugin.dll -> Cactbot -> Raidboss,
-there are individual trigger listings.
-You can use these listings to change various exposed configuration settings per trigger.
-
-Settings with a bell (🔔) next to their name are trigger outputs that you can override.
-For example, maybe there's an 🔔onTarget field whose text is `Tank Buster on ${player}`.
-This is the string that will get played on screen (or via tts) when there is a tank buster on some person.
-`${player}` here is a parameter that will be set dynamically by the trigger.
-Anything that looks like `${param}` is such a dynamic parameter.
-
-You could change this to say `${player} is going to die!` instead.
-Or, maybe you don't care who it's on, and you can edit the text to `Buster` to be brief.
-If you want to undo your overriding, just clear the text.
-
-There are some limitations to this overriding.
-You cannot change the logic.
-You cannot make `tts` to say something different than the `alarmText` in most cases.
-You cannot add additional parameters.
-If you want to do any of these more complicated overrides,
-then you will want to look at the [Overriding Raidboss Triggers](#overriding-raidboss-triggers) section.
-
-Any parameter that refers to a player (usually called `${player}` but not always)
-can also be further modified in each individual output string:
-
-- `${player.job}`: job abbreviation, e.g. WHM
-- `${player.jobFull}`: job full name, e.g. White Mage
-- `${player.role}`: role, e.g. support
-- `${player.name}`: player's full name, e.g. Tini Poutini
-- `${player.nick}`: player's nickname / first name, e.g. Tini
-- `${player.id}`: a player's id (for testing purposes), e.g. 1000485F
-
-If there are bugs or a player is not in your party or you use an invalid suffix,
-it may fall back to a default nickname just so something can be printed.
-
-By default, `${player}` implies `${player.nick}`,
-however you can set this default with the "Default Player Label" option
-in the cactbot config UI under the raidboss section.
-
-## User Directory Overview
-
-If the cactbot UI doesn't have the option you are looking for,
-then you may need to consider user file overrides.
-At this point, you are writing JavaScript and CSS,
-and so you might need a little bit of programming savvy.
-
-The general philosophy of cactbot is that
-any user configuration should only go in files in the user directory.
-This will prevent your changes from being overwritten during future cactbot updates.
-Additionally, modifying cactbot files directly from a cactbot release
-will not work properly without running extra build steps.
-
-All cactbot UI modules can load user settings from the [user/](../user/) directory.
-The `raidboss` module loads `user/raidboss.js` and `user/raidboss.css`,
-as well as any `.js` and `.css` files inside the `user/raidboss/` directory
-with any filenames in any number of subfolders.
-(Timeline `.txt` files must be directly in the same folder as the `.js` that refers to them.)
-These user-defined files are included after cactbot's files and can override its settings.
-
-Similarly, the `oopsyraidsy` module loads `user/oopsyraidsy.js` and `user/oopsyraidsy.css`,
-as well as all `.js` and `.css` files inside the `user/oopsyraidsy/` directory.
-And so on, for each module by name.
-
-cactbot loads files in subdirectories (alphabetically) before loading files in outer directories.
-This is so that `user/raidboss.js` will always be loaded last
-and can override anything that is set inside a file inside of `user/raidboss/`.
-For example, `user/alphascape/some_file.js` will load before `user/mystatic/some_file.js`,
-which will both load before `user/raidboss.js`.
-The same ordering applies to `.css` files.
-
-In this documentation, any reference to "user-defined js file" applies to both of these.
-There is no difference between `user/raidboss.js` and `user/raidboss/some_file.js`,
-other than the order in which they load.
-Similarly, "user-defined css file" means both `user/radar.css` and `user/radar/some_file.css`.
-Subdirectories in the user folder are intended to
-make it easier to share triggers and customizations with others.
-
-You can get more information about the loading order
-by looking at the [debug messages](#check-if-your-file-is-loaded)
-when developer mode is turned on.
-
-The `user/` directory already includes some example configuration files,
-which you can rename and use.
-For example the [user/raidboss-example.js](../user/raidboss-example.js) file
-can be renamed to `user/raidboss.js`
-and edited to change the behavior of the `raidboss` module.
-
-After making any changes to these files,
-pressing the "Reload overlay" button
-for the appropriate overlay in ACT's OverlayPlugin settings will apply the changes.
-
-## Setting Your User Directory
-
-The cactbot user directory can be set via the cactbot configuration UI:
-ACT -> Plugins -> OverlayPlugin.dll -> Cactbot -> Cactbot user directory.
-Click the `Choose Directory` button and select a folder on disk.
-
-If you haven't selected one,
-it will try to select one based on where you have installed cactbot on disk.
-
-Ideally, you should select the `cactbot/user` folder from your cactbot installation.
-This is often in `%APPDATA%\Advanced Combat Tracker\Plugins\cactbot-version\cactbot\user`.
-[This folder](../user) has example customization files.
-
-## Customizing Appearance
-
-A user-defined css file can change positions, sizes, colors, etc. for components of
-the UI module. See the `ui//.css` to find the selectors you can modify.
-
-For example in [ui/raidboss/raidboss.css](../ui/raidboss/raidboss.css),
-you see the `#popup-text-container` and `#timeline-container`
-which can be changed via `user/raidboss.css` to different positions as desired.
-You can use `user/raidboss.css` or a `.css` file in `user/raidboss/` to add additional styling.
-
-The size and color of info text alerts can also be changed
-by making a CSS rule for the `.info-text` class such as below:
-
-```css
-.info-text {
- font-size: 200%;
- color: rgb(50, 100, 50);
-}
-```
-
-You can think about the CSS in the user file as being appended to the end
-of any built-in cactbot CSS file.
-Therefore, you need to keep in mind [CSS specificity rules](https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity),
-possibly adding `!important` to force your rule to override.
-Additionally, you may need to unset properties by setting them to `auto`.
-
-The best way to debug CSS issues is to use [Chrome DevTools](https://developers.google.com/web/tools/chrome-devtools).
-You can open DevTools for an overlay by going to
-ACT -> Plugins -> OverlayPlugin.dll -> your overlay -> Open DevTools.
-
-**Note**: some things are hard or impossible to customize, such as the timeline bars.
-This is because they use custom elements,
-and they don't expose a lot of knobs to tune.
-If you have particular things you want to change about the timeline bars that you can't,
-please feel free to submit a [github issue](https://github.com/quisquous/cactbot/issues/new/choose).
-
-**Warning**: cactbot makes no guarantees about preserving CSS backwards compatability.
-Future changes to cactbot may rearrange elements,
-change element names and classes,
-or change styling entirely.
-In general, you are on your own if you want to style cactbot with CSS.
-
-## Overriding Raidboss Triggers
-
-You can use a user-defined js file
-(e.g. `user/raidboss.js` or any `.js` file under `user/raidboss/`)
-to override how triggers behave.
-You can change the text that they output,
-what jobs they run for,
-and how long they stay on screen,
-and anything else.
-
-You can see readable JavaScript versions of all of the cactbot triggers
-in this branch:
-This is the preferred reference to use for viewing, copying, and pasting.
-Triggers in the main branch
-or shipped in a cactbot release are often in unreadable bundles
-or are TypeScript which is not supported in user folders.
-
-In your user-defined js file for raidboss,
-there is an `Options.Triggers` list that contains a list of trigger sets.
-You can use this to append new triggers and
-modify existing triggers.
-If a user file contains a trigger with the same id as any previous trigger
-(including triggers in cactbot), then that trigger will override it.
-
-If you are going to modify triggers,
-it is worth reading the [trigger guide](RaidbossGuide.md)
-to understand what the various fields of each trigger means.
-
-In general, the pattern to follow is to add a block of code
-to your user-defined js file (e.g. `user/raidboss.js`) that looks like this:
-
-```javascript
-Options.Triggers.push({
- // Find the ZoneId from the top of the file,
- // e.g. ZoneId.MatchAll (for all zones) or ZoneId.TheBozjanSouthernFront.
- zoneId: ZoneId.PutTheZoneFromTheTopOfTheFileHere,
- triggers: [
- {
- // This is where you put the trigger object.
- // e.g. id or netRegex or infoText
- },
- ],
-});
-```
-
-The easiest approach to modify triggers is to copy and paste the block of code
-above for each trigger.
-Modify the `zoneId` line to have the zone id for the zone you care about,
-usually from the top of the cactbot trigger file.
-[This file](../resources/zone_id.ts) has a list of all the zone ids.
-If you specify one incorrectly, you will get a warning in the OverlayPlugin log window.
-Then, [copy the trigger text](https://github.com/quisquous/cactbot/tree/triggers) into this block.
-Edit as needed.
-Repeat for all the triggers you want to modify.
-Reload your raidboss overlay to apply your changes.
-
-**Note**: This method completely removes the original trigger,
-and so do not delete any logic when making edits.
-Also, this is JavaScript, and so it still needs to be valid JavaScript.
-If you are not a programmer, be extra careful with what and how you edit.
-
-### Example 1: changing the output text
-
-Let's say hypothetically that you are doing UCOB
-and your group decides that they are going to do "fire out" first
-instead of "fire in" first like cactbot calls it by default.
-Additionally, you *also* want to have the tts say something different for this trigger.
-You keep forgetting to get out, so you want it to repeat a few times.
-
-If you only wanted to change the `infoText`,
-you could do this via [Changing Trigger Text with the cactbot UI](#changing-trigger-text-with-the-cactbot-ui).
-
-One way to adjust this is to edit the trigger output for this trigger.
-You can find the original fireball #1 trigger in
-[ui/raidboss/data/04-sb/ultimate/unending_coil_ultimate.js](https://github.com/quisquous/cactbot/blob/triggers/04-sb/ultimate/unending_coil_ultimate.js#:~:text=UCU%20Nael%20Fireball%201).
-
-This chunk of code is what you would paste into the bottom of your user-defined js file.
-
-```javascript
-Options.Triggers.push({
- zoneId: ZoneId.TheUnendingCoilOfBahamutUltimate,
- triggers: [
- {
- id: 'UCU Nael Fireball 1',
- netRegex: NetRegexes.ability({ source: 'Ragnarok', id: '26B8', capture: false }),
- delaySeconds: 35,
- suppressSeconds: 99999,
- // The infoText is what appears on screen in green.
- infoText: {
- en: 'Fire OUT',
- },
- tts: {
- en: 'out out out out out',
- },
- run: function(data) {
- data.naelFireballCount = 1;
- },
- },
- ],
-});
-```
-
-This edit also removed languages other than English.
-
-### Example 2: making provoke work for all jobs
-
-Currently, provoke only works for players in your alliance and not for all jobs.
-This example shows how to make it work for all players.
-The provoke trigger can be found in
-[ui/raidboss/data/00-misc/general.js](https://github.com/quisquous/cactbot/blob/triggers/00-misc/general.js#:~:text=General%20Provoke).
-
-Here is a modified version with a different `condition` function.
-Because this shares the same `General Provoke` id with the built-in cactbot trigger,
-it will override the built-in version.
-
-This chunk of code is what you would paste into the bottom of your user-defined js file.
-
-```javascript
-Options.Triggers.push({
- zoneId: ZoneId.MatchAll,
- triggers: [
- {
- id: 'General Provoke',
- netRegex: NetRegexes.ability({ id: '1D6D' }),
- condition: function(data, matches) {
- // I want to see all provokes, even they are not in the party,
- // or I am not a tank.
- return true;
- },
- infoText: (data, matches, output) => {
- return output.text!({ player: data.party.member(matches.source) });
- },
- outputStrings: {
- text: {
- en: 'Provoke: ${player}',
- de: 'Herausforderung: ${player}',
- fr: 'Provocation: ${player}',
- ja: '挑発: ${player}',
- cn: '挑衅: ${player}',
- ko: '도발: ${player}',
- },
- },
- },
- ],
-});
-```
-
-You could also just delete the `condition` function entirely here,
-as triggers without conditions will always run when their regex matches.
-
-### Example 3: adding custom triggers
-
-You can also use this same pattern to add your own custom triggers.
-
-Here's an example of a custom trigger that prints "Get out!!!",
-one second after you receive an effect called "Forked Lightning".
-
-```javascript
-Options.Triggers.push({
- zoneId: ZoneId.MatchAll,
- triggers: [
- {
- // This id is made up, and is not overriding a cactbot trigger.
- id: 'Personal Forked Lightning',
- regex: Regexes.gainsEffect({ effect: 'Forked Lightning' }),
- condition: (data, matches) => { return matches.target === data.me; },
- delaySeconds: 1,
- alertText: 'Get out!!!',
- },
-
- // ... other triggers here, if you want
- ],
-});
-```
-
-Your best resources for learning how to write cactbot triggers
-is the [trigger guide](RaidbossGuide.md)
-and also reading through existing triggers in [ui/raidboss/data](../ui/raidboss/data).
-
-## Overriding Raidboss Timelines
-
-Some customization of timelines can be done via the [cactbot config UI](#using-the-cactbot-ui).
-This UI allows you to hide/rename existing timeline entries
-or add custom entries at particular times.
-
-This section is for when you need to do more than that, and want to replace a timeline entirely.
-Completely overriding a raidboss timeline is similar to [overriding a trigger](#overriding-raidboss-triggers).
-
-The steps to override a timeline are:
-
-1) Copy the timeline text file out of cactbot and into your user folder
-
- For example, you could copy
- [ui/raidboss/data/05-shb/ultimate/the_epic_of_alexander.txt](../ui/raidboss/data/05-shb/ultimate/the_epic_of_alexander.txt)
- to `user/the_epic_of_alexander.txt`.
-
-1) Add a section to your user/raidboss.js file to override this.
-
- Like adding a trigger, you add a section with the `zoneId`,
- along with `overrideTimelineFile: true`,
- and a `timelineFile` with the name of the text file.
-
- ```javascript
- Options.Triggers.push({
- zoneId: ZoneId.TheEpicOfAlexanderUltimate,
- overrideTimelineFile: true,
- timelineFile: 'the_epic_of_alexander.txt',
- });
- ```
-
- In this case, this assumes that you have followed step 1
- and there is a `user/the_epic_of_alexander.txt` file.
-
- By setting `overrideTimelineFile: true`,
- it tells cactbot to replace the built-in timeline entirely
- with any new timeline that you add.
-
-1) Edit your new timeline file in your user folder as needed
-
- Refer to the [timeline guide](TimelineGuide.md) for more documentation on the timeline format.
-
-**Note**: Editing timelines is a bit risky,
-as there may be timeline triggers that refer to specific timeline text.
-For instance, in TEA, there are timeline triggers for `Fluid Swing` and `Propeller Wind`, etc.
-If these names are changed or removed, then the timeline triggers will also be broken.
-
-## Customizing Behavior
-
-This section discusses other kinds of customizations you can make to cactbot modules.
-There are some variables that are not in the config UI and are also not triggers.
-
-Each cactbot module has an `Options` variable that controls various options.
-The options that can be changed are documented in the `Options` section
-at the top of each `ui//.js` file.
-
-For example in [ui/raidboss/raidboss.js](../ui/raidboss/raidboss.js),
-you see the `PlayerNicks` option which allows you to give people nicknames
-when their names are called out
-
-```javascript
-Options.PlayerNicks = {
- // 'Firstname Lastname': 'Nickname',
- 'Banana Nana': 'Nana',
- 'The Great\'one': 'Joe', // The Great'one => Joe, needs a backslash for the apostrophe
- 'Viewing Cutscene': 'Cut',
- // etc, with more nicknames
-};
-```
-
-You can override text-to-speech callouts globally via
-
-```javascript
-Options.TransformTts = (text) => {
- return text.replace('a', 'b');
-};
-```
-
-**Warning**: files inside of your user directory will silently overwrite settings
-that were set from the cactbot configuration UI.
-This can be confusing,
-so it's generally preferable to let the config tool set everything you can,
-and only use user files in order to set things that the config tool does not
-provide access to.
-
-## Global Trigger File Imports
-
-User files are `eval`'d in JavaScript,
-and thus cannot `import` in the same way that built-in trigger files do.
-User javascript files have access to the following globals:
-
-- [Conditions](../resources/conditions.ts)
-- [ContentType](../resources/content_type.ts)
-- [NetRegexes](../resources/netregexes.ts)
-- [Regexes](../resources/regexes.ts)
-- [Responses](../resources/responses.ts)
-- [Outputs](../resources/outputs.ts)
-- [Util](../resources/util.ts)
-- [ZoneId](../resources/zone_id.ts)
-- [ZoneInfo](../resources/zone_info.ts)
-
-## Debugging User Files
-
-### Check the OverlayPlugin log for errors
-
-The OverlayPlugin log is scrolling window of text that can be found by going to
-ACT -> Plugins -> OverlayPlugin.dll,
-and looking at the bottom of the window.
-
-If there are errors, they will appear here.
-
-### Check if your file is loaded
-
-First, turn on debug mode for raidboss.
-Go to the cactbot configuration UI,
-enable `Show developer options` and reload the page.
-Then, enable `Enable debug mode` under Raidboss, and reload again.
-
-When raidboss debug mode is on,
-it will print more information to the OverlayPlugin log.
-It will list lines for each local user file it loads:
-`[10/19/2020 6:18:27 PM] Info: raidbossy: BrowserConsole: local user file: C:\Users\tinipoutini\cactbot\user\raidboss.js`
-
-Verify that your user file is loaded at all.
-
-The order that the filenames are printed is the order in which they are loaded.
-
-### Check if your user file has errors
-
-User files are JavaScript, and so if you write incorrect JavaScript, there will be errors
-and your user file will be skipped and it will not load.
-Check the OverlayPlugin log for errors when loading.
-
-Here's an example:
-
-```log
-[10/19/2020 6:18:27 PM] Info: raidbossy: BrowserConsole: local user file: C:\Users\tinipoutini\cactbot\user\raidboss.js (Source: file:///C:/Users/tinipoutini/cactbot/resources/user_config.ts, Line: 83)
-[10/19/2020 6:18:27 PM] Info: raidbossy: BrowserConsole: *** ERROR IN USER FILE *** (Source: file:///C:/Users/tinipoutini/cactbot/resources/user_config.ts, Line: 95)
-[10/19/2020 6:18:27 PM] Info: raidbossy: BrowserConsole: SyntaxError: Unexpected token :
- at loadUser (file:///C:/Users/tinipoutini/cactbot/resources/user_config.ts:92:28) (Source: file:///C:/Users/tinipoutini/cactbot/resources/user_config.ts, Line: 96)
-```
+
diff --git a/docs/FAQ-Troubleshooting.md b/docs/FAQ-Troubleshooting.md
index c942593818..e7aea9718f 100644
--- a/docs/FAQ-Troubleshooting.md
+++ b/docs/FAQ-Troubleshooting.md
@@ -1,318 +1,5 @@
-# Troubleshooting FAQ
+# Permanently Moved to OverlayPlugin/cactbot
-- [General FFXIV ACT Troubleshooting](#general-ffxiv-act-troubleshooting)
-- [Installation Testing](#installation-testing)
- - [Verify That Your Plugins Are in the Right Order](#verify-that-your-plugins-are-in-the-correct-order)
- - [Verify Your Language Settings Match](#verify-your-language-settings-match)
- - [Verify That You Have Added the Overlays You Want](#verify-that-you-have-added-the-overlays-you-want)
- - [Summerford Farms Raidboss Test](#summerford-farms-raidboss-test)
- - [Summerford Farms Provoke Test](#summerford-farms-provoke-test)
-- [New Content Isn't Working](#new-content-isnt-working)
- - [Do Your Cactbot Plugin and Overlay Paths Match](#do-your-cactbot-plugin-and-overlay-paths-match)
- - [Has This Content Been Added to Cactbot](#has-this-content-been-added-to-cactbot)
-- [Fixing Chat Log Problems](#fixing-chat-log-problems)
- - [Check Game Chat Log Filters](#check-game-chat-log-filters)
- - [Check FFXIV Plugin Filters](#check-ffxiv-plugin-filters)
- - [Check Dalamud Plugins](#check-dalamud-plugins)
- - [Check Your Network Log](#check-your-network-log)
-- [Fixing Network Data Problems](#fixing-network-data-problems)
- - [Has the Game Just Updated?](#has-the-game-just-updated)
- - [Test Game Connection](#test-game-connection)
- - [Cactbot Stops Working Randomly](#cactbot-stops-working-randomly)
-- [Problems During Cactbot Installation](#problems-during-cactbot-installation)
-- [My TTS Isn't Working](#my-tts-isnt-working)
-- [Places to Get Help](#places-to-get-help)
-- [How to Find a Network Log](#how-to-find-a-network-log)
+See: [docs/FAQ-Troubleshooting.md](https://github.com/OverlayPlugin/cactbot/blob/main/docs/FAQ-Troubleshooting.md)
-## General FFXIV ACT Troubleshooting
-
-[This guide](https://github.com/OverlayPlugin/docs/blob/main/faq/README.md)
-is an excellent FAQ for common FFXIV ACT Plugin and OverlayPlugin issues.
-
-If you get an error that it can't find **FFXIV_ACT_Plugin.dll**, make sure the **FFXIV_ACT_Plugin.dll** is in the `%APPDATA%\Advanced Combat Tracker\Plugins` folder.
-You can install **FFXIV_ACT_Plugin.dll** from the ACT Startup Wizard.
-
-You should also verify that your OverlayPlugin is at least version 0.18.2.
-Look at ACT -> Plugins -> Plugin Listing -> OverlayPlugin.dll.
-Is the version 0.18.2 or earlier?
-If so, follow
-
-## Installation Testing
-
-First, follow the [installation guide](../README.md#installing) for cactbot from the main readme.
-Once done, check the following steps.
-
-### Verify That Your Plugins Are in the Right Order
-
-Open ACT -> Plugins -> Plugin Listing.
-You should have `FFXIV_ACT_Plugin.dll`, `OverlayPlugin.dll`, and `CactbotOverlay.dll` in that order.
-
-See: [this section](../README.md#plugin-load-order) for more information about load order.
-
-### Verify Your Language Settings Match
-
-Verify that the game language matches the FFXIV ACT Plugin language.
-You can check the plugin language via ACT -> Plugins -> FFXIV ACT Plugin -> Language.
-(Note: this may not be true for Chinese users.)
-
-Raidboss should pick up the plugin language automatically.
-It does not matter which cactbot display, alerts, or timeline language you have set
-as these are all for display purposes.
-
-### Verify That You Have Added the Overlays You Want
-
-It is not enough to just add the cactbot plugin,
-you also need to add an overlay for the parts of cactbot you want.
-Commonly, most people add raidboss for alerts and timelines.
-
-If you are not sure which overlays you have,
-go to ACT -> Plugins -> OverlayPlugin.dll -> General and click "Copy Tech Support Info to Clipboard".
-Paste this somewhere (like notepad) to look at.
-It should list the overlays you think exist (e.g. raidboss for alerts and timelines).
-
-One important note is that raidboss has three versions:
-
-- combined (alerts and timelines)
-- timeline only (just timeline, no alerts)
-- alerts only (just alerts, no timeline)
-
-A common use case is to add one overlay for timeline only and one overlay for alerts only.
-If you are seeing timelines but not alerts or vice versa,
-make sure you have the overlays you need.
-
-See: [this section](../README.md#adding-overlays) for how to add cactbot overlays.
-
-### Summerford Farms Raidboss Test
-
-This test verifies that basic timelines and triggers are working
-and your overlay has been added correctly.
-
-To do a basic test of raidboss,
-teleport to Summerford Farms.
-Do a `/countdown 5`.
-
-When the countdown ends,
-a timeline should appear on your screen
-and several alert messages should appear.
-You can teleport to stop the timeline.
-
-If this does not work,
-see the [Fixing Chat Log Problems](#fixing-chat-log-problems) section.
-
-### Summerford Farms Provoke Test
-
-A second test to do for network data is to switch to a tank job.
-Teleport to Summerford Farms again.
-Use Provoke on a Striking Dummy.
-You should see an alert trigger when you do this.
-
-If this does not work,
-see the [Fixing Network Data Problems](#fixing-network-data-problems) section.
-
-## New Content Isn't Working
-
-A common complaint that people have is that older content works in cactbot but not newer.
-There are a number of reasons this could be the case:
-
-### Do Your Cactbot Plugin and Overlay Paths Match
-
-Check the cactbot plugin path in ACT -> Plugins -> Plugin Listing -> CactbotOverlay.dll -> Plugin Info -> FileName.
-Then check the overlay URL via ACT -> Plugins -> OverlayPlugin.dll -> (name of a cactbot overlay, e.g. raidboss) -> URL.
-Make sure the paths are the same.
-
-If the plugin has a path including `cactbot/cactbot/` and the overlay has a path like `cactbot/cactbot-0.19.2/`
-then you should remove and re-add your cactbot overlay.
-You can do this via ACT -> Plugins -> OverlayPlugin.dll -> (name of the overlay to remove) -> Remove (button at the bottom).
-Then hit New at the bottom to re-add it and select the same overlay type that it was.
-
-Note: This will not remove your settings. Also, this should be a "one time" fix and in the future this won't happen again.
-
-### Has This Content Been Added to Cactbot
-
-It takes time and effort to add support for new content to cactbot.
-If it just came out in the last week or few,
-it's possible that there is not support for it yet.
-
-Check for the latest list of supported content.
-It is possible that support for content has been added to cactbot but not released.
-You can check the release notes for more details.
-
-Additionally, if you are not playing in English,
-make sure you check that ACT -> Plugins -> FFXIV ACT Plugin -> Parser Options is set to the language of your client.
-Content that has just been added to cactbot may not have been translated yet
-and so may not work immediately in non-English languages.
-This is usually fixed by the next release.
-
-## Fixing Chat Log Problems
-
-The chat log is currently used by cactbot for a number of things.
-
-The most common things are broken when the chat log has an issue is:
-
-- zones sealing/unsealing to start dungeon timelines
-- UCOB Nael dialog
-- countdown messages (for the jobs countdown timer and Summerford Farms test)
-
-### Check Game Chat Log Filters
-
-FFXIV doesn't send chat messages to you that you have turned off due to a filter.
-In game, go to System -> Character Configuration -> Log Window Settings -> Log Filters.
-Pick a log number. It does not have to be the General log,
-and could be some log that you don't ever look at.
-
-Verify that these categories are enabled for at least one log:
-
-- Announcements
- - System Messages
- - Echo
- - NPC Dialogue (Announcements)
-
-### Check FFXIV Plugin Filters
-
-The FFXIV plugin has a filter as well that is sometimes enabled.
-Go to ACT -> Plugins -> FFXIV ACT Plugin.
-Verify that `Hide Chat Log (for privacy)` is not clicked.
-
-### Check Dalamud Plugins
-
-There are a number of quicklauncher/Dalamud plugins that can mess with chat output.
-If you are still having issues, try launching the game without quicklauncher.
-If this fixes the issue, then one of your Dalamud plugins is at fault.
-Figure out which one, and disable it or configure it differently.
-
-### Check Your Network Log
-
-One final check here is to look at the network log file from ACT.
-You can find your network log [with these steps](#how-to-find-a-network-log).
-
-In the network log,
-you can see if the lines that cactbot is looking for appears in the file
-or have been modified by Dalamud plugins.
-Chat log lines start with `00`.
-
-If you need an example to try,
-queue into Susano normal (The Pool of Tribute trial, level 63) unsynced.
-Open ACT. Do a `/countdown 5`, pull the boss, and then wipe.
-
-In your network log, you should be able to find something like each of the following lines (not exact):
-
-```text
-00|2023-11-29T11:55:14.0000000-08:00|00B9||Battle commencing in 5 seconds! (Your Name)|0cb8cd44ec6d6723
-00|2023-11-29T11:46:08.0000000-08:00|0044|Susano|Let the revels begin!|8cfb1aec4563d935
-```
-
-## Fixing Network Data Problems
-
-### Has the Game Just Updated?
-
-If the game has patched recently,
-you need to wait for the ACT FFXIV Plugin to update before anything will work.
-Even if cactbot has done a release, this is not enough.
-
-### Test Game Connection
-
-Verify your firewall rules by going to ACT -> Plugins -> FFXIV ACT Plugin -> Test Game Connection.
-You should get a notification that says something like
-`Success: All FFXIV memory signatures detected successfully, and Network data is available.`.
-
-If you do not get this message, ask in the [FFXIV ACT discord](#places-to-get-help) for help.
-
-### Verify DPS Parsing
-
-Even if the game connection works, that doesn't mean everything is correct.
-If dps parsing isn't working, then cactbot triggers will likely not work either.
-
-Verify dps parsing works.
-Open ACT.
-Go hit a striking dummy for 10 seconds.
-If you have a dps overlay, numbers should appear.
-Regardless of a dps overlay, if you go to ACT -> Main and click on the encounter,
-then you should see a dps chart.
-
-If you don't see dps charts,
-make sure you have enabled Deucalion via
-ACT -> Plugins -> FFXIV ACT Plugin -> Inject and use Deucalion for network data.
-
-### Cactbot Stops Working Randomly
-
-If cactbot and dps parsing works properly and then stops,
-then you should enable Deucalion via
-ACT -> Plugins -> FFXIV ACT Plugin -> Inject and use Deucalion for network data.
-
-Clicking this option will also allow you to start ACT after the game has started.
-
-## Problems During Cactbot Installation
-
-If you get an error in the OverlayPlugin console similar to `System.MissingMethodException: Method not found: '!!0[] System.Array.Empty()` then you have installed the wrong .NET framework version. Please install the [.NET Framework](https://www.microsoft.com/net/download/framework) version 4.6.1 or above.
-
-If you get an error that says `Plugin Load Failure` and `The downloaded file did not contain a plugin that could be loaded`,
-there could be several potential issues.
-
-- Make sure you have [installed OverlayPlugin](https://github.com/quisquous/cactbot#install-overlayplugin).
-- Check your OverlayPlugin version in **Plugins** -> **Plugin Listing** -> **OverlayPlugin.dll**.
-If this is not the same version as [this release](https://github.com/OverlayPlugin/OverlayPlugin/releases/latest),
-then remove it and re-follow the [installation instructions](https://github.com/quisquous/cactbot#install-overlayplugin).
-- Make sure you are running x64 ACT (`Advanced Combat Tracker.exe`) and not x86 ACT (`ACTx86.exe`).
-- Finally, make sure you have reloaded ACT once you have installed OverlayPlugin.
-
-If you get an error similar to
-`Invalid Plugin: This assembly does not have a class that implements ACT's plugin interface, or scanning the assembly threw an error.`
-or
-`Load Error: Method 'LoadConfig' in type 'CactbotEventSource' etc etc does not have an implementation`
-then you should make sure that `CactbotOverlay.dll` is listed after `OverlayPlugin.dll` in
-**Plugins** -> **Plugin Listing**.
-
-## My TTS Isn't Working
-
-Cactbot uses ACT for Text to Speech (TTS).
-If your TTS isn't working, then ACT is likely not set up properly.
-If you are not using some custom plugin like yukkuri etc,
-the default ACT TTS settings are in ACT -> Options -> Sound Settings -> Text to Speech.
-
-If you want to test TTS with cactbot, you can use the [test overlay](#test-module).
-If you add this overlay and then in game type `/echo tts:thing to say` it will use TTS to play it.
-
-If this does not work, verify that you see the echo line in game.
-See: [Fixing Chat Log Problems](#fixing-chat-log-problems).
-
-## Places to Get Help
-
-- ask in the [FFXIV ACT discord](https://discord.gg/ahFKcmx) #troubleshooting channel
-- open a [github issue](https://github.com/quisquous/cactbot/issues)
-
-It is highly recommended that you ask in the FFXIV ACT discord first for most troubleshooting issues.
-You should also read the #troubleshooting channel pins first.
-Pasting OverlayPlugin's tech support info is also a lot of help in tracking down issues.
-Go to ACT -> Plugins -> OverlayPlugin.dll -> General and click "Copy Tech Support Info to Clipboard" to find it.
-
-## How to Find a Network Log
-
-If you are having issues with triggers or timelines,
-it can be useful to attach a network log from ACT
-so that the [network logs](LogGuide.md#network-log-lines)
-can be replayed and investigated for errors.
-
-To find your network logs, go to the **Plugins** tab in ACT,
-click the **FFXIV Settings** button,
-and then click **Open FFXIV Log Folder**.
-
-![image](images/troubleshooting_openlogfolder.png)
-
-This will open up a folder window with files in it.
-Select a file named something like **Network_etc.log**.
-The files are named with your FFXIV ACT Plugin version and the date.
-
-![image](images/troubleshooting_networklog.png)
-
-These files are often large, so zip them up first.
-
-You can attach these to github issues directly.
-Alternatively, find some file hosting site,
-upload the files there,
-and then attach the link.
-
-If you want to split a log to only include a particular fight,
-you can use the [log splitter](https://quisquous.github.io/cactbot/util/logtools/splitter.html)
-by dragging a network log file to the page and selecting the fights you want.
-
-If you are trying to debug something, it is usually better to not split the log.
+
diff --git a/docs/Headmarkers.md b/docs/Headmarkers.md
index 3d3ad96215..ba58d0b501 100644
--- a/docs/Headmarkers.md
+++ b/docs/Headmarkers.md
@@ -1,206 +1,5 @@
-# Headmarker Guide
+# Permanently Moved to OverlayPlugin/cactbot
-This is a guide to finding the real ids for "headmarkers",
-i.e. the visual that appears above your player's head when you need to spread, stack, etc.
+See: [docs/Headmarkers.md](https://github.com/OverlayPlugin/cactbot/blob/main/docs/Headmarkers.md)
-cactbot calls them "headmarkers",
-e.g. `NetRegexes.headMarker()`.
-The FFXIV parsing plugin calls them "TargetIcon",
-e.g. `[21:40:13.596] TargetIcon 1B:4002ADD7:Arcane Cylinder:0000:0000:00B5:0000:0000:0000`.
-FFXIV itself calls them "Lockon",
-e.g. .
-
-This guide will call them "headmarkers" from here on out.
-
-## History and Motivation
-
-During TEA,
-Square Enix changed headmarkers to have a per-instance offset in certain content.
-This now happens in all ultimates, extremes, and savage raids.
-Once the content is no longer current,
-sometimes the offsets are then removed.
-
-This same thing happened with ability ids as well during o4s.
-However, the FFXIV parsing plugin and fflogs cannot function without real ability ids,
-and so the parsing plugin takes care of this itself.
-Headmarkers are not parsing related,
-and so headmarker offsets are left to downstream developers to fix themselves.
-
-The offset is sent to the client when zoning into the instance,
-and so is the same for every pull while in the same instance.
-
-## Handling this in cactbot
-
-cactbot chooses to handle this by trying to figure out the true headmarker ids.
-This is so that it's easy to find different content using the same id,
-e.g. limit cut starting at `004F` (usually, but not always).
-It's also easier to double check that the values are correct.
-Ideally, when finding headmarkers, please leave a comment with the full avfx path.
-
-cactbot handles offsets by looking for headmarkers,
-recording the first id it finds,
-and then comparing to the expected first headmarker to calculate the offset.
-
-### No Offsets
-
-If the encounter does not have headmarker offsets,
-please use headmarker ids directly in triggers,
-e.g. [p9n](https://github.com/quisquous/cactbot/blob/7b904e35c7d678013d229080c858f19d35510ac1/ui/raidboss/data/06-ew/raid/p9n.ts#L33-L38).
-
-### Same first headmarker
-
-Most of the time,
-if the encounter does have headmarker offsets,
-the first headmarker id will always be the same.
-
-Most trigger sets do something like [p11s](https://github.com/quisquous/cactbot/blob/3ca3589/ui/raidboss/data/06-ew/raid/p11s.ts).
-
-There's a helper function to set the headmarker offset if it's not found,
-and return the true headmarker id.
-
-```typescript
-// Helper functions.
-const firstHeadmarker = parseInt(headmarkers.dike, 16);
-
-const getHeadmarkerId = (data: Data, matches: NetMatches['HeadMarker']) => {
- if (data.decOffset === undefined)
- data.decOffset = parseInt(matches.id, 16) - firstHeadmarker;
- return (parseInt(matches.id, 16) - data.decOffset).toString(16).toUpperCase().padStart(4, '0');
-};
-```
-
-There's usually also a trigger at the top of the file to always try to set the offset.
-In the past there's been bugs where `getHeadmarkerId` has been used in `condition` functions.
-(See the P9S defamation example below for how the `getHeadmarkerId` call might be skipped.)
-
-```typescript
- {
- id: 'P11S Headmarker Tracker',
- type: 'HeadMarker',
- netRegex: {},
- condition: (data) => data.decOffset === undefined,
- // Unconditionally set the first headmarker here so that future triggers are conditional.
- run: (data, matches) => getHeadmarkerId(data, matches),
- },
-```
-
-Then, any later headmarker trigger has to match all headmarker lines,
-and use `getHeadmarkerId` to figure out the correct id.
-It's definitely a little bit cumbersome and inefficient, but that's what we got.
-
-```typescript
- {
- id: 'P9S Defamation',
- type: 'HeadMarker',
- netRegex: {},
- condition: (data, matches) => {
- return data.me === matches.target &&
- getHeadmarkerId(data, matches) === headmarkers.defamation;
- },
- alarmText: (_data, _matches, output) => output.defamation!(),
- // etc
-```
-
-### Different first headmarker
-
-In rare cases, the first headmarker is not consistent.
-
-As cactbot resets all trigger info (including recorded headmarker offset) on wipe,
-any trigger file must handle the first headmarker from any door boss and final boss simultaneously.
-
-For example, [P12S](https://github.com/quisquous/cactbot/blob/4700770/ui/raidboss/data/06-ew/raid/p12s.ts#L159-L179)
-has a door boss with two different first headmarkers (bottom left / bottom right wing)
-and a final boss with one first headmarker.
-
-See that file for how that can be solved.
-
-## Lockon table
-
-All visual effects are avfx game data files and are referenced by the `Lockon` table.
-
-You can `exd Lockon` from a local copy of [SaintCoinach](https://github.com/xivapi/SaintCoinach),
-or alternatively you can browse the Lockon table online here:
-
-Headmarkers are 2 byte hex values,
-and the `key` field in the `Lockon` is the decimal representation of that hex value.
-
-Here is some code from:
-
-```typescript
-const headmarkers = {
- // vfx/lockon/eff/tank_lockonae_0m_5s_01t.avfx
- dualityOfDeath: '01D4',
- // vfx/lockon/eff/m0361trg_a1t.avfx (through m0361trg_a8t)
- limitCut1: '004F',
- limitCut2: '0050',
- limitCut3: '0051',
- limitCut4: '0052',
- limitCut5: '0053',
- limitCut6: '0054',
- limitCut7: '0055',
- limitCut8: '0056',
- // vfx/lockon/eff/r1fz_skywl_s9x.avfx
- defamation: '014A',
- // vfx/lockon/eff/n5r9_lockon_bht_c0g.avfx
- cometMarker: '01B3',
-} as const;
-```
-
-The comet marker (that appears on one of the two unbroken meteors during Charybdis in P9S) is `01B3`.
-`0x01B3` = 435 in decimal.
-In the [LockOn table](https://github.com/xivapi/ffxiv-datamining/blob/master/csv/Lockon.csv#L439),
-you can find that key 435 has the string `n5r9_lockon_bht_c0g`.
-
-This corresponds to the game asset `vfx/lockon/eff/n5r9_lockon_bht_c0g.avfx`.
-My understanding is that all headmarker effects have this `avfx` extension
-and are in the `vfx/lockon/eff/` game directory.
-
-## How to test headmarkers in game
-
-In order to verify that you have the correct headmarker id,
-you can use VFXEditor.
-
-Install [FFXIVQuickLauncher](https://github.com/goatcorp/FFXIVQuickLauncher).
-
-Install the [VFXEditor plugin](https://github.com/0ceal0t/Dalamud-VFXEditor).
-
-Type `/vfxedit` to start.
-
-![VFXEditor Initial](images/vfxeditor_initial.png)
-
-Pick a skill to replace that's easy to do in game, like Cure 1.
-
-![VFXEditor Replace](images/vfxeditor_replace.png)
-
-Now, type a vfx to replace it with.
-
-![VFXEditor Loaded](images/vfxeditor_loaded.png)
-
-Finally, cast cure and observe the different animation.
-
-![VFXEditor Result](images/vfxeditor_result.png)
-
-Headmarkers on mobs (see: p12s wings, this meteor marker) may have odd positions and rotations.
-
-## How to Find True Ids
-
-Mostly this is about sleuthing it out.
-
-Here's some suggestions on things to consider:
-
-- look for new Lockon entries that weren't there in previous patches
-- check if normal mode ids still apply (e.g. p12s wings)
-- check if the same ids from previous encounters apply (e.g. limit cut ids)
-- read names in the Lockon table and try to make connections, e.g. `m0515_turning_right01c` is the orange clockwise laser rotation
-
-## Future Work
-
-If somebody tracked down the network data and game code to find the actual offset and math,
-then OverlayPlugin could emit a custom log line for the offset
-or custom log lines with adjusted headmarker ids.
-
-Barring that, it's also possible that OverlayPlugin could handle all of the
-"first headmarker" tracking itself per zone in C# code and emit custom log lines.
-
-Finally, it'd be nice if somebody could figure out how to automatically extract avfx into gifs
-and then we could have an online library of headmarker ids mapped to visuals.
+
diff --git a/docs/LogGuide.md b/docs/LogGuide.md
index 61b7d4e656..8956f5c627 100644
--- a/docs/LogGuide.md
+++ b/docs/LogGuide.md
@@ -1,2769 +1,5 @@
-
-
-
-# Log Lines and Triggers
+# Permanently Moved to OverlayPlugin/cactbot
-This is intended to be a comprehensive guide to log lines
-for folks who want to write ACT triggers for ff14.
+See: [docs/LogGuide.md](https://github.com/OverlayPlugin/cactbot/blob/main/docs/LogGuide.md)
-This guide was last updated for:
-
-- [FF14](https://na.finalfantasyxiv.com/lodestone/special/patchnote_log/) Patch 6.4
-- [FFXIV Plugin](https://github.com/ravahn/FFXIV_ACT_Plugin/releases) Patch 2.6.8.9
-- [OverlayPlugin](https://github.com/OverlayPlugin/OverlayPlugin/releases) Patch 0.19.20
-
-## TOC
-
-
-- [Data Flow](#data-flow)
- - [Viewing logs after a fight](#viewing-logs-after-a-fight)
- - [Importing an old fight](#importing-an-old-fight)
- - [Importing into ffxivmon](#importing-into-ffxivmon)
-- [Glossary of Terms](#glossary-of-terms)
- - [Network Data](#network-data)
- - [Network Log Lines](#network-log-lines)
- - [Parsed Log Lines](#parsed-log-lines)
- - [Game Log Lines](#game-log-lines)
- - [Object/Actor/Entity/Mob/Combatant](#objectactorentitymobcombatant)
- - [Object ID](#object-id)
- - [Ability ID](#ability-id)
- - [Instance Content ID](#instance-content-id)
-- [FFXIV Plugin Log Lines](#ffxiv-plugin-log-lines)
- - [Line 00 (0x00): LogLine](#line-00-0x00-logline)
- - [Structure](#structure)
- - [Regexes](#regexes)
- - [Examples](#examples)
- - [Don't Write Triggers Against Game Log Lines](#dont-write-triggers-against-game-log-lines)
- - [Line 01 (0x01): ChangeZone](#line-01-0x01-changezone)
- - [Structure](#structure-1)
- - [Regexes](#regexes-1)
- - [Examples](#examples-1)
- - [Line 02 (0x02): ChangePrimaryPlayer](#line-02-0x02-changeprimaryplayer)
- - [Structure](#structure-2)
- - [Regexes](#regexes-2)
- - [Examples](#examples-2)
- - [Line 03 (0x03): AddCombatant](#line-03-0x03-addcombatant)
- - [Structure](#structure-3)
- - [Regexes](#regexes-3)
- - [Examples](#examples-3)
- - [Line 04 (0x04): RemoveCombatant](#line-04-0x04-removecombatant)
- - [Structure](#structure-4)
- - [Regexes](#regexes-4)
- - [Examples](#examples-4)
- - [Line 11 (0x0B): PartyList](#line-11-0x0b-partylist)
- - [Structure](#structure-5)
- - [Regexes](#regexes-5)
- - [Examples](#examples-5)
- - [Line 12 (0x0C): PlayerStats](#line-12-0x0c-playerstats)
- - [Structure](#structure-6)
- - [Regexes](#regexes-6)
- - [Examples](#examples-6)
- - [Line 20 (0x14): NetworkStartsCasting](#line-20-0x14-networkstartscasting)
- - [Structure](#structure-7)
- - [Regexes](#regexes-7)
- - [Examples](#examples-7)
- - [Line 21 (0x15): NetworkAbility](#line-21-0x15-networkability)
- - [Structure](#structure-8)
- - [Regexes](#regexes-8)
- - [Examples](#examples-8)
- - [Ability Flags](#ability-flags)
- - [Ability Damage](#ability-damage)
- - [Special Case Shifts](#special-case-shifts)
- - [Ability Examples](#ability-examples)
- - [Line 22 (0x16): NetworkAOEAbility](#line-22-0x16-networkaoeability)
- - [Line 23 (0x17): NetworkCancelAbility](#line-23-0x17-networkcancelability)
- - [Structure](#structure-9)
- - [Regexes](#regexes-9)
- - [Examples](#examples-9)
- - [Line 24 (0x18): NetworkDoT](#line-24-0x18-networkdot)
- - [Structure](#structure-10)
- - [Regexes](#regexes-10)
- - [Examples](#examples-10)
- - [Line 25 (0x19): NetworkDeath](#line-25-0x19-networkdeath)
- - [Structure](#structure-11)
- - [Regexes](#regexes-11)
- - [Examples](#examples-11)
- - [Line 26 (0x1A): NetworkBuff](#line-26-0x1a-networkbuff)
- - [Structure](#structure-12)
- - [Regexes](#regexes-12)
- - [Examples](#examples-12)
- - [Line 27 (0x1B): NetworkTargetIcon (Head Marker)](#line-27-0x1b-networktargeticon-head-marker)
- - [Structure](#structure-13)
- - [Regexes](#regexes-13)
- - [Examples](#examples-13)
- - [Head Marker IDs](#head-marker-ids)
- - [Line 28 (0x1C): NetworkRaidMarker (Floor Marker)](#line-28-0x1c-networkraidmarker-floor-marker)
- - [Structure](#structure-14)
- - [Regexes](#regexes-14)
- - [Examples](#examples-14)
- - [Combatant Marker Codes](#combatant-marker-codes)
- - [Line 29 (0x1D): NetworkTargetMarker (Player Marker)](#line-29-0x1d-networktargetmarker-player-marker)
- - [Structure](#structure-15)
- - [Regexes](#regexes-15)
- - [Examples](#examples-15)
- - [Floor Marker Codes](#floor-marker-codes)
- - [Line 30 (0x1E): NetworkBuffRemove](#line-30-0x1e-networkbuffremove)
- - [Structure](#structure-16)
- - [Regexes](#regexes-16)
- - [Examples](#examples-16)
- - [Line 31 (0x1F): NetworkGauge](#line-31-0x1f-networkgauge)
- - [Structure](#structure-17)
- - [Regexes](#regexes-17)
- - [Examples](#examples-17)
- - [Line 32 (0x20): NetworkWorld](#line-32-0x20-networkworld)
- - [Line 33 (0x21): Network6D (Actor Control)](#line-33-0x21-network6d-actor-control)
- - [Structure](#structure-18)
- - [Regexes](#regexes-18)
- - [Examples](#examples-18)
- - [Line 34 (0x22): NetworkNameToggle](#line-34-0x22-networknametoggle)
- - [Structure](#structure-19)
- - [Regexes](#regexes-19)
- - [Examples](#examples-19)
- - [Line 35 (0x23): NetworkTether](#line-35-0x23-networktether)
- - [Structure](#structure-20)
- - [Regexes](#regexes-20)
- - [Examples](#examples-20)
- - [Line 36 (0x24): LimitBreak](#line-36-0x24-limitbreak)
- - [Structure](#structure-21)
- - [Regexes](#regexes-21)
- - [Examples](#examples-21)
- - [Line 37 (0x25): NetworkActionSync](#line-37-0x25-networkactionsync)
- - [Structure](#structure-22)
- - [Regexes](#regexes-22)
- - [Examples](#examples-22)
- - [Line 38 (0x26): NetworkStatusEffects](#line-38-0x26-networkstatuseffects)
- - [Structure](#structure-23)
- - [Regexes](#regexes-23)
- - [Examples](#examples-23)
- - [Line 39 (0x27): NetworkUpdateHP](#line-39-0x27-networkupdatehp)
- - [Structure](#structure-24)
- - [Regexes](#regexes-24)
- - [Examples](#examples-24)
- - [Line 40 (0x28): Map](#line-40-0x28-map)
- - [Structure](#structure-25)
- - [Regexes](#regexes-25)
- - [Examples](#examples-25)
- - [Line 41 (0x29): SystemLogMessage](#line-41-0x29-systemlogmessage)
- - [Structure](#structure-26)
- - [Regexes](#regexes-26)
- - [Examples](#examples-26)
- - [Line 42 (0x2A): StatusList3](#line-42-0x2a-statuslist3)
- - [Structure](#structure-27)
- - [Regexes](#regexes-27)
- - [Examples](#examples-27)
- - [Line 251 (0xFB): Debug](#line-251-0xfb-debug)
- - [Line 252 (0xFC): PacketDump](#line-252-0xfc-packetdump)
- - [Line 253 (0xFD): Version](#line-253-0xfd-version)
- - [Line 254 (0xFE): Error](#line-254-0xfe-error)
-- [OverlayPlugin Log Lines](#overlayplugin-log-lines)
- - [Line 256 (0x100): LineRegistration](#line-256-0x100-lineregistration)
- - [Structure](#structure-28)
- - [Regexes](#regexes-28)
- - [Examples](#examples-28)
- - [Line 257 (0x101): MapEffect](#line-257-0x101-mapeffect)
- - [Structure](#structure-29)
- - [Regexes](#regexes-29)
- - [Examples](#examples-29)
- - [Line 258 (0x102): FateDirector](#line-258-0x102-fatedirector)
- - [Structure](#structure-30)
- - [Regexes](#regexes-30)
- - [Examples](#examples-30)
- - [Line 259 (0x103): CEDirector](#line-259-0x103-cedirector)
- - [Structure](#structure-31)
- - [Regexes](#regexes-31)
- - [Examples](#examples-31)
- - [Line 260 (0x104): InCombat](#line-260-0x104-incombat)
- - [Structure](#structure-32)
- - [Regexes](#regexes-32)
- - [Examples](#examples-32)
- - [Line 261 (0x105): CombatantMemory](#line-261-0x105-combatantmemory)
- - [Structure](#structure-33)
- - [Regexes](#regexes-33)
- - [Examples](#examples-33)
- - [Line 262 (0x106): RSVData](#line-262-0x106-rsvdata)
- - [Structure](#structure-34)
- - [Regexes](#regexes-34)
- - [Examples](#examples-34)
- - [Line 263 (0x107): StartsUsingExtra](#line-263-0x107-startsusingextra)
- - [Structure](#structure-35)
- - [Regexes](#regexes-35)
- - [Examples](#examples-35)
- - [Line 264 (0x108): AbilityExtra](#line-264-0x108-abilityextra)
- - [Structure](#structure-36)
- - [Regexes](#regexes-36)
- - [Examples](#examples-36)
-
-
-## Data Flow
-
-![Alt text](https://g.gravizo.com/source/data_flow?https%3A%2F%2Fraw.githubusercontent.com%2Fquisquous%2Fcactbot%2Fmain%2Fdocs%2FLogGuide.md)
-
-
-
-data_flow
- digraph G {
- size ="4,4";
- ff14 [label="ff14 servers"]
- ff14 -> ACT [label="network data"]
- network [label="network log files"]
- ACT [label="ACT + ffxiv plugin",shape=box,penwidth=3]
- ACT -> network [label="write to disk"]
- fflogs
- network -> fflogs [label="upload"]
- network -> ffxivmon [label="import"]
- network -> ACT [label="import"]
- network -> util [label="process"]
- util [label="cactbot util scripts"]
- plugins [label="triggers, ACT plugins"]
- ACT -> plugins [label="parsed log lines"]
- ACT -> plugins [label="network log lines"]
- }
-data_flow
-
-
-### Viewing logs after a fight
-
-If you have ACT open during a fight, then it will generate logs.
-These logs will be trimmed to the start and end of combat.
-
-To see the parsed version of these logs, click on the **Main** tab,
-expand the zone you care about,
-right click on the encounter you want,
-then select **View Logs**.
-
-![view logs screenshot](images/logguide_viewlogs.png)
-
-The **All** entry includes all the encounters in a zone and cannot be viewed.
-You must view individual encounters.
-
-The window that pops up has the parsed log lines that triggers can be made against.
-This is one way to search through and find the text that you want to make a trigger for.
-
-### Importing an old fight
-
-Sometimes you have to close ACT, but you want to look at old fights.
-Or, somebody else sends you a log, and you want to make triggers from it.
-
-To do this, click the **Import/Export** tab,
-click on **Import a Log File**,
-click on **Select File...**
-select the **Network_plugin_date.log** log file,
-(where `plugin` and `date` are the FFXIV plugin version and day)
-and finally click the **YOU** button.
-
-![import screenshot](images/logguide_import.png)
-
-This will create encounters whose [logs you can view](#viewing-logs-after-a-fight).
-
-### Importing into ffxivmon
-
-If you want to dig into the network data itself, ffxivmon is a great tool.
-
-To create a log file suitable for ffxivmon,
-first turn on the **(DEBUG) Dump all Network Data to logfile** setting in ACT.
-
-![dump network data screenshot](images/logguide_dumpnetworkdata.png)
-
-Then, run an encounter in game with ACT running.
-Once you're done, import that network log file into ffxivmon.
-
-![ffxivmon import screenshot](images/logguide_ffxivmon_import.png)
-
-Now, you can walk through and investigate the network data directly.
-
-![ffxivmon screenshot](images/logguide_ffxivmon.png)
-
-## Glossary of Terms
-
-### Network Data
-
-This is the raw packet dump sent from ff14 servers to your computer.
-This data is processed both by the game itself as well as by the ffxiv plugin to
-produce network log lines.
-
-![network data screenshot](images/logguide_networkdata.png)
-
-Folks writing triggers generally do not have to worry about raw packet data and
-so this document does not focus very much on this type of data.
-
-### Network Log Lines
-
-These represent the lines that the ffxiv plugin writes to disk in
-**Network_22009_20210801.log** files in your log directory.
-These lines are still processed and filtered by the ffxiv plugin,
-and are (mostly) not raw network data.
-
-Here are some example network log lines:
-
-```log
-21|2019-05-31T21:14:56.8980000-07:00|10532971|Tini Poutini|DF9|Fire IV|40002F21|Zombie Brobinyak|150003|3B9D4002|1C|DF98000|0|0|0|0|0|0|0|0|0|0|0|0|104815|348652|12000|12000|1000|1000|-767.7882|156.939|-672.0446|26285|28784|13920|15480|1000|1000|-771.8156|157.1111|-671.3281||8eaa0245ad01981b69fc1af04ea8f9a1
-30|2019-05-31T20:02:41.4560000-07:00|6b4|Boost|0.00|1069C23F|Potato Chippy|1069C23F|Potato Chippy|00|3394|3394||4f7b1fa11ec7a2746a8c46379481267c
-20|2019-05-31T20:02:41.4660000-07:00|105E3321|Tater Tot|2C9D|Peculiar Light|105E3321|Tater Tot||c375d8a2d1cf48efceccb136584ed250
-```
-
-Data on network log lines is separated by vertical braces, i.e. `|`.
-Network log lines also contain the hash of that line at the end.
-The log line type itself is in decimal, e.g. aoe abilities are on lines that begin with `22|`.
-The equivalent [parsed log line](#parsed-log-lines) would be written as the hex type `0x16`, i.e. `NetworkAOEAbility`.
-
-The ffxiv plugin does not write the parsed log lines that plugins interact with
-to disk.
-
-The network log lines are used by some tools, such as:
-
-- fflogs uploader
-- ffxivmon
-- cactbot make_timeline utility
-
-In the past,
-cactbot used to use [parsed log lines](#parsed-log-lines) for all triggers
-but has switched to using network log lines instead
-as they have more information.
-Timelines still use parsed log lines for syncing (for now).
-
-If you [import a network log file into ACT](#importing-an-old-fight),
-then you can view the parsed log lines for in the fight.
-
-### Parsed Log Lines
-
-These are the log lines that come out of the ffxiv plugin at runtime and are
-also exposed to plugins for triggers.
-These are what the [View Logs](#viewing-logs-after-a-fight) option in ACT shows.
-Most cactbot triggers used network log lines,
-but ACT custom triggers use parsed log lines.
-
-Data in parsed log lines is separated by colons, i.e. `:`.
-The log line type is in hex.
-
-Here is an example:
-
-```log
-[21:16:44.288] 15:10532971:Potato Chippy:9C:Scathe:40001299:Striking Dummy:750003:90D0000:1C:9C8000:0:0:0:0:0:0:0:0:0:0:0:0:2778:2778:0:0:1000:1000:-653.9767:-807.7275:31.99997:26945:28784:6720:15480:1000:1000:-631.5208:-818.5244:31.95173:
-```
-
-Parsed log lines lines always start with the time in square brackets.
-This time is formatted to be in your local time zone.
-The time is followed with a hex value (in this case 0x15) that indicates the type of the line it is.
-
-The rest of the data in the line needs to be interpreted based on what type it is.
-See the following sections that describe each line.
-
-### Game Log Lines
-
-A game log line is a specific type of log line with type `00`.
-These log lines also appear directly in your chat windows in game,
-possibly in the Battle Log tab.
-Try to [avoid writing triggers](#dont-write-triggers-against-game-log-lines) using these lines.
-
-See: [Line 00](#line00) for examples.
-
-### Object/Actor/Entity/Mob/Combatant
-
-These are all words used synonymously in this document to refer to an object
-in the game that can use abilities and has stats.
-This could be the player, Bahamut, Eos, a Striking Dummy.
-
-### Object ID
-
-Object ids are 4 byte identifiers used for all types of objects.
-
-Player ids always start with the byte `10`,
-e.g. `1069C23F` or `10532971`.
-
-Enemy and pet ids always start with the byte `40`,
-e.g. `4000A848` or `4000A962`.
-
-For `NetworkAOEAbility` lines that don't affect anybody, e.g. a Titan landslide that somehow nobody stands in,
-this is represented as hitting the id `E0000000` (and a blank name).
-
-One thing to note is that in most raids,
-there are many mobs in the scene with the same name.
-For example, in t13, there are about twenty Bahamut Prime mobs in the zone,
-most of which are invisible.
-You can often differentiate these by HP values (see [AddCombatant](#line03) log lines).
-Often these invisible mobs are used as the damaging actors,
-which is why in UWU Titan Phase, both Garuda and Titan use Rock Throw to put people in jails.
-
-### Ability ID
-
-Although ff14 differentiates between abilities and spells,
-this document uses these words interchangeably.
-All actions taken by a player or an enemy are "abilities" and have a unique 4 byte id.
-
-You can use xivapi.com to look up a particular action, as sometimes these are
-listed as "Unknown" from the ffxiv plugin if it hasn't updated yet.
-For example, Fire IV has the ability id 0xDF9 = 3577,
-so this link will give you more information about it:
-
-
-This works for both players and enemies, abilities and spells.
-
-### Instance Content ID
-
-Some lines like the [actor control line](#line33) and [SystemLogMessage](#line41)
-have a field called `instance`.
-This field is a four byte field with two parts,
-The first two bytes are the update type (e.g. `8003` is the update type for instanced content,
-and `8004` is the same content but with trusts).
-The second two bytes are the `InstanceContentType`,
-from the [InstanceContent table](https://github.com/xivapi/ffxiv-datamining/blob/master/csv/InstanceContent.csv).
-
-For example, if `instance` is `80034E6C` then `0x4E6C` is the `InstanceContentType`.
-`0x4E6C` is 20076 in decimal, and corresponds to Diamond Weapon (Savage): .
-
-## FFXIV Plugin Log Lines
-
-
-
-### Line 00 (0x00): LogLine
-
-These are what this document calls "game log lines".
-Because these are not often used for triggers
-(other than `0839` and `0044` messages),
-the full set of LogTypes is not well-documented.
-
-(Pull requests welcome!)
-
-
-
-#### Structure
-
-```log
-Network Log Line Structure:
-00|[timestamp]|[code]|[name]|[line]
-
-Parsed Log Line Structure:
-[timestamp] ChatLog 00:[code]:[name]:[line]
-```
-
-#### Regexes
-
-```log
-Network Log Line Regex:
-^(?00)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|
-
-Parsed Log Line Regex:
-(?^.{14}) ChatLog (?00):(?[^:]*):(?[^:]*):(?[^:]*)(?:$|:)
-```
-
-#### Examples
-
-```log
-Network Log Line Examples:
-00|2021-04-26T14:12:30.0000000-04:00|0839||You change to warrior.|d8c450105ea12854e26eb687579564df
-00|2021-04-26T16:57:41.0000000-04:00|0840||You can now summon the antelope stag mount.|caa3526e9f127887766e9211e87e0e8f
-00|2021-04-26T14:17:11.0000000-04:00|0B3A||You defeat the embodiment.|ef3b7b7f1e980f2c08e903edd51c70c7
-00|2021-04-26T14:12:30.0000000-04:00|302B||The gravity node uses Forked Lightning.|45d50c5f5322adf787db2bd00d85493d
-00|2021-04-26T14:12:30.0000000-04:00|322A||The attack misses.|f9f57724eb396a6a94232e9159175e8c
-00|2021-07-05T18:01:21.0000000-04:00|0044|Tsukuyomi|Oh...it's going to be a long night.|1a81d186fd4d19255f2e01a1694c7607
-
-Parsed Log Line Examples:
-[14:12:30.000] ChatLog 00:0839::You change to warrior.
-[16:57:41.000] ChatLog 00:0840::You can now summon the antelope stag mount.
-[14:17:11.000] ChatLog 00:0B3A::You defeat the embodiment.
-[14:12:30.000] ChatLog 00:302B::The gravity node uses Forked Lightning.
-[14:12:30.000] ChatLog 00:322A::The attack misses.
-[18:01:21.000] ChatLog 00:0044:Tsukuyomi:Oh...it's going to be a long night.
-```
-
-
-
-#### Don't Write Triggers Against Game Log Lines
-
-There are a number of reasons to avoid basing triggers on game log lines:
-
-- can show up later than parsed log lines (often up to half a second)
-- inconsistent text (gains effect vs suffers effect, begins casting vs readies, you vs player name)
-- often vague (the attack misses)
-- can change spelling at the whim of SquareEnix
-
-Instead, the recommendation is to base your triggers on log lines that are not type `0x00`.
-Prefer using [NetworkBuff](#line26) line instead of "suffers the effect" game log lines.
-Prefer using the [NetworkStartsCasting](#line20) "starts using" line instead of the "readies" or "begins casting" game log lines.
-
-At the moment, there are some cases where you must use game log lines,
-such as sealing and unsealing of zones, or boss rp text for phase transitions.
-
-Note:
-There are examples where [NetworkStartsCasting](#line20) lines show up
-after the corresponding `00` "readies" line,
-but it is on the order of tens of milliseconds
-and does not consistently show up first.
-[NetworkAbility](#line21) lines always seem to show up before the `00` "uses" lines.
-
-
-
-### Line 01 (0x01): ChangeZone
-
-This message is sent when first logging in and whenever the zone is changed.
-
-
-
-#### Structure
-
-```log
-Network Log Line Structure:
-01|[timestamp]|[id]|[name]
-
-Parsed Log Line Structure:
-[timestamp] Territory 01:[id]:[name]
-```
-
-#### Regexes
-
-```log
-Network Log Line Regex:
-^(?01)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|
-
-Parsed Log Line Regex:
-(?^.{14}) Territory (?01):(?[^:]*):(?[^:]*)(?:$|:)
-```
-
-#### Examples
-
-```log
-Network Log Line Examples:
-01|2021-04-26T14:13:17.9930000-04:00|326|Kugane Ohashi|b9f401c0aa0b8bc454b239b201abc1b8
-01|2021-04-26T14:22:04.5490000-04:00|31F|Alphascape (V2.0)|8299b97fa36500118fc3a174ed208fe4
-
-Parsed Log Line Examples:
-[14:13:17.993] Territory 01:326:Kugane Ohashi
-[14:22:04.549] Territory 01:31F:Alphascape (V2.0)
-```
-
-
-
-
-
-### Line 02 (0x02): ChangePrimaryPlayer
-
-This redundant message follows every [ChangeZone](#line01) message to indicate the name of the player.
-
-
-
-#### Structure
-
-```log
-Network Log Line Structure:
-02|[timestamp]|[id]|[name]
-
-Parsed Log Line Structure:
-[timestamp] ChangePrimaryPlayer 02:[id]:[name]
-```
-
-#### Regexes
-
-```log
-Network Log Line Regex:
-^(?02)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|
-
-Parsed Log Line Regex:
-(?^.{14}) ChangePrimaryPlayer (?02):(?[^:]*):(?[^:]*)(?:$|:)
-```
-
-#### Examples
-
-```log
-Network Log Line Examples:
-02|2021-04-26T14:11:31.0200000-04:00|10FF0001|Tini Poutini|5b0a5800460045f29db38676e0c3f79a
-02|2021-04-26T14:13:17.9930000-04:00|10FF0002|Potato Chippy|34b657d75218545f5a49970cce218ce6
-
-Parsed Log Line Examples:
-[14:11:31.020] ChangePrimaryPlayer 02:10FF0001:Tini Poutini
-[14:13:17.993] ChangePrimaryPlayer 02:10FF0002:Potato Chippy
-```
-
-
-
-
-
-### Line 03 (0x03): AddCombatant
-
-This message is sent when a new object is added to the scene or
-becomes close enough to the player that they can view its actions.
-
-
-
-#### Structure
-
-```log
-Network Log Line Structure:
-03|[timestamp]|[id]|[name]|[job]|[level]|[ownerId]|[worldId]|[world]|[npcNameId]|[npcBaseId]|[currentHp]|[hp]|[currentMp]|[mp]|[?]|[?]|[x]|[y]|[z]|[heading]
-
-Parsed Log Line Structure:
-[timestamp] AddCombatant 03:[id]:[name]:[job]:[level]:[ownerId]:[worldId]:[world]:[npcNameId]:[npcBaseId]:[currentHp]:[hp]:[currentMp]:[mp]:[?]:[?]:[x]:[y]:[z]:[heading]
-```
-
-#### Regexes
-
-```log
-Network Log Line Regex:
-^(?03)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?:[^|]*\|){2}(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|
-
-Parsed Log Line Regex:
-(?^.{14}) AddCombatant (?03):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*)(?::[^:]*){2}:(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*)(?:$|:)
-```
-
-#### Examples
-
-```log
-Network Log Line Examples:
-03|2021-06-16T20:46:38.5450000-07:00|10FF0001|Tini Poutini|24|46|0000|28|Jenova|0|0|30460|30460|10000|10000|0|0|-0.76|15.896|0|-3.141593|c0e6f1c201e7285884fb6bf107c533ee
-03|2021-06-16T21:35:11.3060000-07:00|4000B364|Catastrophe|00|46|0000|00||5631|6358|57250|57250|0|10000|0|0|0|0|0|-4.792213E-05|9c22c852e1995ed63ff4b71c09b7d1a7
-03|2021-06-16T21:35:11.3060000-07:00|4000B363|Catastrophe|00|46|0000|00||5631|6358|57250|57250|0|10000|0|0|0|0|0|-4.792213E-05|9438b02195d9b785e07383bc84b2bf37
-03|2021-06-16T21:35:11.3060000-07:00|4000B362|Catastrophe|00|46|0000|00||5631|7305|13165210|13165210|10000|10000|0|0|0|-15|0|-4.792213E-05|1c4bc8f27640fab6897dc90c02bba79d
-03|2021-06-16T21:35:11.4020000-07:00|4000B365|Catastrophe|00|46|0000|00||5631|6358|57250|57250|0|10000|0|0|0|0|0|-4.792213E-05|8b3f6cf1939428dd9ab0a319aba44910
-03|2021-06-16T21:35:11.4020000-07:00|4000B36a|Catastrophe|00|46|0000|00||5631|6358|57250|57250|0|10000|0|0|0|0|0|-4.792213E-05|b3b3b4f926bcadd8b6ef008232d58922
-
-Parsed Log Line Examples:
-[20:46:38.545] AddCombatant 03:10FF0001:Tini Poutini:24:46:0000:28:Jenova:0:0:30460:30460:10000:10000:0:0:-0.76:15.896:0:-3.141593
-[21:35:11.306] AddCombatant 03:4000B364:Catastrophe:00:46:0000:00::5631:6358:57250:57250:0:10000:0:0:0:0:0:-4.792213E-05
-[21:35:11.306] AddCombatant 03:4000B363:Catastrophe:00:46:0000:00::5631:6358:57250:57250:0:10000:0:0:0:0:0:-4.792213E-05
-[21:35:11.306] AddCombatant 03:4000B362:Catastrophe:00:46:0000:00::5631:7305:13165210:13165210:10000:10000:0:0:0:-15:0:-4.792213E-05
-[21:35:11.402] AddCombatant 03:4000B365:Catastrophe:00:46:0000:00::5631:6358:57250:57250:0:10000:0:0:0:0:0:-4.792213E-05
-[21:35:11.402] AddCombatant 03:4000B36a:Catastrophe:00:46:0000:00::5631:6358:57250:57250:0:10000:0:0:0:0:0:-4.792213E-05
-```
-
-
-
-This combatant may be invisible and fake. The real ones have more HP.
-For example, at the start of Deltascape V2.0 you will see messages like the
-latter 5 examples above.
-
-In heavy zones (e.g. Eureka), combatants may be culled if there are too many
-things nearby.
-Usually other players are culled first, but mobs can be as well.
-Eureka NMs (and S ranks) solve this by having a flag on them
-that allows them to be seen via AddCombatant message from anywhere in the zone,
-which is why it is possible to write triggers for when these pop.
-
-
-
-### Line 04 (0x04): RemoveCombatant
-
-This message is sent when an object is removed from the scene, either because
-the player has moved too far away from it, it has died, or the player has
-changed zones.
-
-
-
-#### Structure
-
-```log
-Network Log Line Structure:
-04|[timestamp]|[id]|[name]|[job]|[level]|[owner]|[?]|[world]|[npcNameId]|[npcBaseId]|[?]|[hp]|[?]|[?]|[?]|[?]|[x]|[y]|[z]|[heading]
-
-Parsed Log Line Structure:
-[timestamp] RemoveCombatant 04:[id]:[name]:[job]:[level]:[owner]:[?]:[world]:[npcNameId]:[npcBaseId]:[?]:[hp]:[?]:[?]:[?]:[?]:[x]:[y]:[z]:[heading]
-```
-
-#### Regexes
-
-```log
-Network Log Line Regex:
-^(?04)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?:[^|]*\|)(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?:[^|]*\|)(?[^|]*)\|(?:[^|]*\|){4}(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|
-
-Parsed Log Line Regex:
-(?^.{14}) RemoveCombatant (?04):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):[^:]*:(?[^:]*):(?[^:]*):(?[^:]*):[^:]*:(?[^:]*)(?::[^:]*){4}:(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*)(?:$|:)
-```
-
-#### Examples
-
-```log
-Network Log Line Examples:
-04|2021-07-23T23:01:27.5480000-07:00|10FF0001|Tini Poutini|05|1E|0000|35|Jenova|0|0|816|816|10000|10000|0|0|-66.24337|-292.0904|20.06466|1.789943|4fbfc851937873eacf94f1f69e0e2ba9
-04|2021-06-16T21:37:36.0740000-07:00|4000B39C|Petrosphere|00|46|0000|00||6712|7308|0|57250|0|10000|0|0|-16.00671|-0.01531982|0|1.53875|980552ad636f06249f1b5c7a6e675aad
-
-Parsed Log Line Examples:
-[23:01:27.548] RemoveCombatant 04:10FF0001:Tini Poutini:05:1E:0000:35:Jenova:0:0:816:816:10000:10000:0:0:-66.24337:-292.0904:20.06466:1.789943
-[21:37:36.074] RemoveCombatant 04:4000B39C:Petrosphere:00:46:0000:00::6712:7308:0:57250:0:10000:0:0:-16.00671:-0.01531982:0:1.53875
-```
-
-
-
-
-
-### Line 11 (0x0B): PartyList
-
-This line represents the players currently in the party, and is sent whenever the party makeup changes.
-
-
-
-#### Structure
-
-```log
-Network Log Line Structure:
-11|[timestamp]|[partyCount]|[id0]|[id1]|[id2]|[id3]|[id4]|[id5]|[id6]|[id7]|[id8]|[id9]|[id10]|[id11]|[id12]|[id13]|[id14]|[id15]|[id16]|[id17]|[id18]|[id19]|[id20]|[id21]|[id22]|[id23]
-
-Parsed Log Line Structure:
-[timestamp] PartyList 0B:[partyCount]:[id0]:[id1]:[id2]:[id3]:[id4]:[id5]:[id6]:[id7]:[id8]:[id9]:[id10]:[id11]:[id12]:[id13]:[id14]:[id15]:[id16]:[id17]:[id18]:[id19]:[id20]:[id21]:[id22]:[id23]
-```
-
-#### Regexes
-
-```log
-Network Log Line Regex:
-^(?11)\|(?[^|]*)\|(?[^|]*)\|
-
-Parsed Log Line Regex:
-(?^.{14}) PartyList (?0B):(?[^:]*)(?:$|:)
-```
-
-#### Examples
-
-```log
-Network Log Line Examples:
-11|2021-06-16T20:46:38.5450000-07:00|8|10FF0002|10FF0003|10FF0004|10FF0001|10FF0005|10FF0006|10FF0007|10FF0008|
-11|2021-06-16T21:47:56.7170000-07:00|4|10FF0002|10FF0001|10FF0003|10FF0004|
-
-Parsed Log Line Examples:
-[20:46:38.545] PartyList 0B:8:10FF0002:10FF0003:10FF0004:10FF0001:10FF0005:10FF0006:10FF0007:10FF0008
-[21:47:56.717] PartyList 0B:4:10FF0002:10FF0001:10FF0003:10FF0004
-```
-
-
-
-
-
-### Line 12 (0x0C): PlayerStats
-
-This message is sent whenever your player's stats change and upon entering a new zone/instance.
-
-
-
-#### Structure
-
-```log
-Network Log Line Structure:
-12|[timestamp]|[job]|[strength]|[dexterity]|[vitality]|[intelligence]|[mind]|[piety]|[attackPower]|[directHit]|[criticalHit]|[attackMagicPotency]|[healMagicPotency]|[determination]|[skillSpeed]|[spellSpeed]|[?]|[tenacity]|[localContentId]
-
-Parsed Log Line Structure:
-[timestamp] PlayerStats 0C:[job]:[strength]:[dexterity]:[vitality]:[intelligence]:[mind]:[piety]:[attackPower]:[directHit]:[criticalHit]:[attackMagicPotency]:[healMagicPotency]:[determination]:[skillSpeed]:[spellSpeed]:[?]:[tenacity]:[localContentId]
-```
-
-#### Regexes
-
-```log
-Network Log Line Regex:
-^(?12)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?:[^|]*\|)(?[^|]*)\|(?[^|]*)\|
-
-Parsed Log Line Regex:
-(?^.{14}) PlayerStats (?0C):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):[^:]*:(?[^:]*):(?[^:]*)(?:$|:)
-```
-
-#### Examples
-
-```log
-Network Log Line Examples:
-12|2021-04-26T14:30:07.4910000-04:00|21|5456|326|6259|135|186|340|5456|380|3863|135|186|2628|1530|380|0|1260|4000174AE14AB6|3c03ce9ee4afccfaae74695376047054
-12|2021-04-26T14:31:25.5080000-04:00|24|189|360|5610|356|5549|1431|189|1340|3651|5549|5549|1661|380|1547|0|380|4000174AE14AB6|53b98d383806c5a29dfe33720f514288
-12|2021-08-06T10:29:35.3400000-04:00|38|308|4272|4443|288|271|340|4272|1210|2655|288|271|2002|1192|380|0|380|4000174AE14AB6|4ce3eac3dbd0eb1d6e0044425d9e091d
-
-Parsed Log Line Examples:
-[14:30:07.491] PlayerStats 0C:21:5456:326:6259:135:186:340:5456:380:3863:135:186:2628:1530:380:0:1260:4000174AE14AB6
-[14:31:25.508] PlayerStats 0C:24:189:360:5610:356:5549:1431:189:1340:3651:5549:5549:1661:380:1547:0:380:4000174AE14AB6
-[10:29:35.340] PlayerStats 0C:38:308:4272:4443:288:271:340:4272:1210:2655:288:271:2002:1192:380:0:380:4000174AE14AB6
-```
-
-
-
-
-
-### Line 20 (0x14): NetworkStartsCasting
-
-For abilities with cast bars,
-this is the log line that specifies that a player or a monster has started casting an ability.
-This precedes a [NetworkAbility](#line21),
-[NetworkAOEAbility](#line22),
-or [NetworkCancelAbility](#line23)
-where it uses the ability or is interrupted.
-
-
-
-#### Structure
-
-```log
-Network Log Line Structure:
-20|[timestamp]|[sourceId]|[source]|[id]|[ability]|[targetId]|[target]|[castTime]|[x]|[y]|[z]|[heading]
-
-Parsed Log Line Structure:
-[timestamp] StartsCasting 14:[sourceId]:[source]:[id]:[ability]:[targetId]:[target]:[castTime]:[x]:[y]:[z]:[heading]
-```
-
-#### Regexes
-
-```log
-Network Log Line Regex:
-^(?20)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|
-
-Parsed Log Line Regex:
-(?^.{14}) StartsCasting (?14):(?[^:]*):(?[^:]*):(?[^:]*):(?(?:[^:]|: )*?):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*)(?:$|:)
-```
-
-#### Examples
-
-```log
-Network Log Line Examples:
-20|2021-07-27T12:47:23.1740000-04:00|40024FC4|The Manipulator|F63|Carnage|40024FC4|The Manipulator|4.70|-0.01531982|-13.86256|10.59466|-4.792213E-05|488abf3044202807c62fa32c2e36ee81
-20|2021-07-27T12:48:33.5420000-04:00|10FF0001|Tini Poutini|DF0|Stone III|40024FC4|The Manipulator|2.35|-0.06491255|-9.72675|10.54466|-3.141591|2a24845eab5ed48d4f043f7b6269ef70
-20|2021-07-27T12:48:36.0460000-04:00|10FF0002|Potato Chippy|BA|Succor|10FF0002|Potato Chippy|1.93|-0.7477417|-5.416992|10.54466|2.604979|99a70e6f12f3fcb012e59b3f098fd69b
-20|2021-07-27T12:48:29.7830000-04:00|40024FD0|The Manipulator|13BE|Judgment Nisi|10FF0001|Tini Poutini|3.20|8.055649|-17.03842|10.58736|-4.792213E-05|bc1c3d72782de2199bfa90637dbfa9b8
-20|2021-07-27T12:48:36.1310000-04:00|40024FCE|The Manipulator|13D0|Seed Of The Sky|E0000000||2.70|8.055649|-17.03842|10.58736|-4.792213E-05|5377da9551e7ca470709dc08e996bb75
-
-Parsed Log Line Examples:
-[12:47:23.174] StartsCasting 14:40024FC4:The Manipulator:F63:Carnage:40024FC4:The Manipulator:4.70:-0.01531982:-13.86256:10.59466:-4.792213E-05
-[12:48:33.542] StartsCasting 14:10FF0001:Tini Poutini:DF0:Stone III:40024FC4:The Manipulator:2.35:-0.06491255:-9.72675:10.54466:-3.141591
-[12:48:36.046] StartsCasting 14:10FF0002:Potato Chippy:BA:Succor:10FF0002:Potato Chippy:1.93:-0.7477417:-5.416992:10.54466:2.604979
-[12:48:29.783] StartsCasting 14:40024FD0:The Manipulator:13BE:Judgment Nisi:10FF0001:Tini Poutini:3.20:8.055649:-17.03842:10.58736:-4.792213E-05
-[12:48:36.131] StartsCasting 14:40024FCE:The Manipulator:13D0:Seed Of The Sky:E0000000::2.70:8.055649:-17.03842:10.58736:-4.792213E-05
-```
-
-
-
-These lines are usually (but not always) associated with game log lines that either look like
-`00:282B:Shinryu readies Earthen Fury.`
-or `00:302b:The proto-chimera begins casting The Ram's Voice.`
-
-
-
-### Line 21 (0x15): NetworkAbility
-
-This is an ability that ends up hitting a single target (possibly the caster's self).
-The reason this is worded as "ends up hitting" is that some AOE abilities may only hit a single target,
-in which case they still result in this type
-
-For example, in ucob, if Firehorn's fireball in nael phase hits the whole group, it will be a `22/0x16` type.
-If one person runs the fireball out and it only hits them, then it is type `21/0x15` because there's only one target.
-If your trigger includes the message type,
-it is usually best to write your parsed log line regex `1[56]`
-and your network log line regex as `2[12]`
-to include both possibilities.
-
-Ground AOEs that don't hit anybody are considered [NetworkAOEAbility](#line22) lines.
-
-
-
-#### Structure
-
-```log
-Network Log Line Structure:
-21|[timestamp]|[sourceId]|[source]|[id]|[ability]|[targetId]|[target]|[flags]|[damage]|[?]|[?]|[?]|[?]|[?]|[?]|[?]|[?]|[?]|[?]|[?]|[?]|[?]|[?]|[targetCurrentHp]|[targetMaxHp]|[targetCurrentMp]|[targetMaxMp]|[?]|[?]|[targetX]|[targetY]|[targetZ]|[targetHeading]|[currentHp]|[maxHp]|[currentMp]|[maxMp]|[?]|[?]|[x]|[y]|[z]|[heading]|[sequence]|[targetIndex]|[targetCount]
-
-Parsed Log Line Structure:
-[timestamp] ActionEffect 15:[sourceId]:[source]:[id]:[ability]:[targetId]:[target]:[flags]:[damage]:[?]:[?]:[?]:[?]:[?]:[?]:[?]:[?]:[?]:[?]:[?]:[?]:[?]:[?]:[targetCurrentHp]:[targetMaxHp]:[targetCurrentMp]:[targetMaxMp]:[?]:[?]:[targetX]:[targetY]:[targetZ]:[targetHeading]:[currentHp]:[maxHp]:[currentMp]:[maxMp]:[?]:[?]:[x]:[y]:[z]:[heading]:[sequence]:[targetIndex]:[targetCount]
-```
-
-#### Regexes
-
-```log
-Network Log Line Regex:
-^(?2[12])\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?:[^|]*\|){14}(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?:[^|]*\|){2}(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?:[^|]*\|){2}(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|
-
-Parsed Log Line Regex:
-(?^.{14}) (?:ActionEffect|AOEActionEffect) (?(?:15|16)):(?[^:]*):(?[^:]*):(?[^:]*):(?(?:[^:]|: )*?):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*)(?::[^:]*){14}:(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*)(?::[^:]*){2}:(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*)(?::[^:]*){2}:(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*)(?:$|:)
-```
-
-#### Examples
-
-```log
-Network Log Line Examples:
-21|2021-07-27T12:48:22.4630000-04:00|40024FD1|Steam Bit|F67|Aetherochemical Laser|10FF0001|Tini Poutini|750003|4620000|1B|F678000|0|0|0|0|0|0|0|0|0|0|0|0|36022|36022|5200|10000|0|1000|1.846313|-12.31409|10.60608|-2.264526|16000|16000|8840|10000|0|1000|-9.079163|-14.02307|18.7095|1.416605|0000DE1F|0|5d60825d70bb46d7fcc8fc0339849e8e
-21|2021-07-27T12:46:22.9530000-04:00|10FF0002|Potato Chippy|07|Attack|40024FC5|Right Foreleg|710003|3910000|0|0|0|0|0|0|0|0|0|0|0|0|0|0|378341|380640|8840|10000|0|1000|-6.37015|-7.477235|10.54466|0.02791069|26396|26396|10000|10000|0|1000|-5.443688|-1.163282|10.54466|-2.9113|0000DB6E|0|58206bdd1d0bd8d70f27f3fb2523912b
-21|2021-07-27T12:46:21.5820000-04:00|10FF0001|Tini Poutini|03|Sprint|10FF0001|Tini Poutini|1E00000E|320000|0|0|0|0|0|0|0|0|0|0|0|0|0|0|19053|26706|10000|10000|0|1000|-1.210526|17.15058|10.69944|-2.88047|19053|26706|10000|10000|0|1000|-1.210526|17.15058|10.69944|-2.88047|0000DB68|0|29301d52854712315e0951abff146adc
-21|2021-07-27T12:47:28.4670000-04:00|40025026|Steam Bit|F6F|Laser Absorption|40024FC4|The Manipulator|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|685814|872320|8840|10000|0|1000|-0.01531982|-13.86256|10.59466|-4.792213E-05|16000|16000|8840|10000|0|1000|0|22.5|10.64999|-3.141593|0000DCEC|0|0f3be60aec05333aae73a042edb7edb4
-21|2021-07-27T12:48:39.1260000-04:00|40024FCE|The Manipulator|13D0|Seed Of The Sky|E0000000||0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|||||||||||16000|16000|8840|10000|0|1000|8.055649|-17.03842|10.58736|-4.792213E-05|0000DE92|0|ca5594611cf4ca4e276f64f2cfba5ffa
-
-Parsed Log Line Examples:
-[12:48:22.463] ActionEffect 15:40024FD1:Steam Bit:F67:Aetherochemical Laser:10FF0001:Tini Poutini:750003:4620000:1B:F678000:0:0:0:0:0:0:0:0:0:0:0:0:36022:36022:5200:10000:0:1000:1.846313:-12.31409:10.60608:-2.264526:16000:16000:8840:10000:0:1000:-9.079163:-14.02307:18.7095:1.416605:0000DE1F:0
-[12:46:22.953] ActionEffect 15:10FF0002:Potato Chippy:07:Attack:40024FC5:Right Foreleg:710003:3910000:0:0:0:0:0:0:0:0:0:0:0:0:0:0:378341:380640:8840:10000:0:1000:-6.37015:-7.477235:10.54466:0.02791069:26396:26396:10000:10000:0:1000:-5.443688:-1.163282:10.54466:-2.9113:0000DB6E:0
-[12:46:21.582] ActionEffect 15:10FF0001:Tini Poutini:03:Sprint:10FF0001:Tini Poutini:1E00000E:320000:0:0:0:0:0:0:0:0:0:0:0:0:0:0:19053:26706:10000:10000:0:1000:-1.210526:17.15058:10.69944:-2.88047:19053:26706:10000:10000:0:1000:-1.210526:17.15058:10.69944:-2.88047:0000DB68:0
-[12:47:28.467] ActionEffect 15:40025026:Steam Bit:F6F:Laser Absorption:40024FC4:The Manipulator:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:685814:872320:8840:10000:0:1000:-0.01531982:-13.86256:10.59466:-4.792213E-05:16000:16000:8840:10000:0:1000:0:22.5:10.64999:-3.141593:0000DCEC:0
-[12:48:39.126] ActionEffect 15:40024FCE:The Manipulator:13D0:Seed Of The Sky:E0000000::0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:::::::::::16000:16000:8840:10000:0:1000:8.055649:-17.03842:10.58736:-4.792213E-05:0000DE92:0
-```
-
-
-
-Index | Example | Explanation
---- | --- | ---
-0 | 15 | type id (in hex)
-1 | 10532971 | caster object id
-2 | Tini Poutini | caster name
-3 | 07 | ability id
-4 | Attack | ability name
-5 | 40001299 | target object id
-6 | Striking Dummy | target name
-7 | 710003 | [flags](#ability-flags)
-8 | 9420000 | [damage](#ability-damage)
-9-22 | 0 | ??? (see: [special case shifts](#special-case-shifts))
-23 | 2778 | target current hp
-24 | 2778 | target max hp
-25 | 0 | target current mp
-26 | 0 | target max mp
-27 | 1000 | target current tp
-28 | 1000 | target max tp
-29 | -653.9767 | target x position
-30 | -807.7275 | target y position
-31 | 31.99997 | target z position
-32 | 66480 | caster current hp
-33 | 74095 | caster max hp
-34 | 4560 | caster current mp
-35 | 4560 | caster max mp
-36 | 1000 | caster current tp
-37 | 1000 | caster max tp
-38 | -653.0394 | caster x position
-39 | -807.9677 | caster y position
-40 | 31.99997 | caster z position
-
-Network ability lines are a combination of raw network data
-(e.g. the `710003` flags and the `9420000` damage)
-and frequently sampled data from memory
-(e.g. the `66480` current hp value and `-653.0394` x position).
-
-This means that there's a number of caveats going on to handling all the data in these lines. The raw network data is subject to change over time from ff14 servers. Also, the data from memory may be slightly stale and out of date
-
-#### Ability Flags
-
-Damage bitmasks:
-
-- 0x01 = dodge
-- 0x03 = damage done
-- 0x05 = blocked damage
-- 0x06 = parried damage
-- 0x33 = instant death
-- 0x2000 = crit damage
-- 0x4000 = direct hit damage
-- 0x6000 = crit direct hit damage
-
-Heal bitmasks:
-
-- 0x000004 = heal
-- 0x200004 = crit heal
-
-Other bitmasks appear on particular abilities, and can indicate whether bane
-missed or hit recipients. However, these all appear ability-specific.
-
-Some of these flags also indicate whether the ability is part of a combo or not
-and whether the positional was hit.
-However, these values do not seem to be consistent between jobs.
-
-For example, the flags for successful rear trick attack are `1971.003`.
-The `.` here represents 2, 4, or 6 as the trick may crit, dh, both, or neither.
-The flags for a missed trick attack positional are `714.003`.
-
-If you care about specific ability flags, you likely have to do this research yourself.
-Please send pull requests to this document so it can be shared!
-
-#### Ability Damage
-
-Damage bitmasks:
- 0x10000 = hallowed or bolide, no damage (this can be blocked too)
- 0x4000 = "a lot" of damage
-
-The damage value in an ability usage is not the literal damage, because that would be too easy.
-
-The formula to get from the damage value in the ability log line to the actual damage value is the following.
-
-First, left-extend zeroes to 4 bytes (8 chars), e.g. 2934001 => 02934001, or 1000 => 00001000.
-
-The first two bytes (4 chars) are the damage.
-
-Unless, if there is an 0x00004000 mask, then this implies "a lot" of damage.
-In this case, consider the bytes as ABCD, where C is 0x40.
-The total damage is calculated as D A (B-D) as three bytes together interpreted
-as an integer.
-
-For example, `424E400F` becomes `0F 42 (4E - OF = 3F)` => `0F 42 3F` => 999999
-
-#### Special Case Shifts
-
-It is not clear what this represents, but sometimes the flags is replaced by
-one (or more) pairs of values.
-
-The most likely case is that if flags is `3F`,
-then the flags and damage are in index 9 and 10 instead of 7 and 8, respectively.
-In other words, when you see flags being a particular value,
-you need to shift everything over two to find the real flags.
-See the example below.
-It is also to be noted that this value has slowly increased over time and was
-`3C` back in 2017.
-
-The other shift is that plenary indulgence lists the number of stacks in the flags as `113`, `213`, or `313` respectively.
-These are always followed by `4C3`.
-Therefore, these should also be shifted over two to find the real flags.
-
-#### Ability Examples
-
-1) 18216 damage from Grand Cross Alpha (basic damage)
-`16:40001333:Neo Exdeath:242B:Grand Cross Alpha:1048638C:Tater Tot:750003:47280000:1C:80242B:0:0:0:0:0:0:0:0:0:0:0:0:36906:41241:5160:5160:880:1000:0.009226365:-7.81128:-1.192093E-07:16043015:17702272:12000:12000:1000:1000:-0.01531982:-19.02808:0:`
-
-2) 82538 damage from Hyperdrive (0x4000 extra damage mask)
-`15:40024FBA:Kefka:28E8:Hyperdrive:106C1DBA:Okonomi Yaki:750003:426B4001:1C:28E88000:0:0:0:0:0:0:0:0:0:0:0:0:35811:62464:4560:4560:940:1000:-0.1586061:-5.753153:0:30098906:31559062:12000:12000:1000:1000:0.3508911:0.4425049:2.384186E-07:`
-
-3) 22109 damage from Grand Cross Omega (:3F:0: shift)
-`16:40001333:Neo Exdeath:242D:Grand Cross Omega:1048638C:Tater Tot:3F:0:750003:565D0000:1C:80242D:0:0:0:0:0:0:0:0:0:0:41241:41241:5160:5160:670:1000:-0.3251641:6.526299:1.192093E-07:7560944:17702272:12000:12000:1000:1000:0:19:2.384186E-07:`
-
-4) 15732 crit heal from 3 confession stack Plenary Indulgence (:?13:4C3: shift)
-`16:10647D2F:Tako Yaki:1D09:Plenary Indulgence:106DD019:Okonomi Yaki:313:4C3:10004:3D74:0:0:0:0:0:0:0:0:0:0:0:0:7124:40265:14400:9192:1000:1000:-10.78815:11.94781:0:11343:40029:19652:16451:1000:1000:6.336648:7.710004:0:`
-
-5) instant death twister
-`16:40004D5D:Twintania:26AB:Twister:10573FDC:Tini Poutini:33:0:1C:26AB8000:0:0:0:0:0:0:0:0:0:0:0:0:43985:43985:5760:5760:910:1000:-8.42179:9.49251:-1.192093E-07:57250:57250:0:0:1000:1000:-8.565645:10.20959:0:`
-
-6) zero damage targetless aoe (E0000000 target)
-`16:103AAEE4:Potato Chippy:B1:Miasma II:E0000000::0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0::::::::::19400:40287:17649:17633:1000:1000:-0.656189:-3.799561:-5.960464E-08:`
-
-
-
-### Line 22 (0x16): NetworkAOEAbility
-
-This is an ability usage in game that ends up hitting multiple actors or no actors at all.
-
-See: [NetworkAbility](#line21) for a discussion of the difference between `NetworkAbility` and `NetworkAOEAbility`.
-
-
-
-### Line 23 (0x17): NetworkCancelAbility
-
-For abilities with cast bars, this is the log line that specifies that the cast was cancelled either due to movement or an interrupt and it won't go off.
-
-
-
-#### Structure
-
-```log
-Network Log Line Structure:
-23|[timestamp]|[sourceId]|[source]|[id]|[name]|[reason]
-
-Parsed Log Line Structure:
-[timestamp] CancelAction 17:[sourceId]:[source]:[id]:[name]:[reason]
-```
-
-#### Regexes
-
-```log
-Network Log Line Regex:
-^(?23)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|
-
-Parsed Log Line Regex:
-(?^.{14}) CancelAction (?17):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*):(?[^:]*)(?:$|:)
-```
-
-#### Examples
-
-```log
-Network Log Line Examples:
-23|2021-07-27T13:04:38.7790000-04:00|10FF0002|Potato Chippy|408D|Veraero II|Cancelled|dbce3801c08020cb8ae7da9102034131
-23|2021-07-27T13:04:39.0930000-04:00|40000132|Garm|D10|The Dragon's Voice|Interrupted|bd936fde66bab0e8cf2874ebd75df77c
-23|2021-07-27T13:04:39.1370000-04:00|4000012F||D52|Unknown_D52|Cancelled|8a15bad31745426d65cc13b8e0d50005
-
-Parsed Log Line Examples:
-[13:04:38.779] CancelAction 17:10FF0002:Potato Chippy:408D:Veraero II:Cancelled
-[13:04:39.093] CancelAction 17:40000132:Garm:D10:The Dragon's Voice:Interrupted
-[13:04:39.137] CancelAction 17:4000012F::D52:Unknown_D52:Cancelled
-```
-
-
-
-
-
-### Line 24 (0x18): NetworkDoT
-
-HoT (heal over time) and DoT (damage over time) amounts.
-These are the aggregated quantities of damage for every hot or dot on that target
-from a given source.
-
-The reason why there is such a discrepancy between ACT and fflogs about dots
-is that ff14 does not return the exact tick amounts for every active dot.
-Instead, if a boss has 20 dots applied to it,
-then it returns the total tick amount for all of these dots.
-Parsers are left to estimate what the individual dot amounts are.
-
-The `damageType` field is a number id that corresponds to the `AttackType` table.
-
-
-
-#### Structure
-
-```log
-Network Log Line Structure:
-24|[timestamp]|[id]|[name]|[which]|[effectId]|[damage]|[currentHp]|[maxHp]|[currentMp]|[maxMp]|[?]|[?]|[x]|[y]|[z]|[heading]|[sourceId]|[source]|[damageType]|[sourceCurrentHp]|[sourceMaxHp]|[sourceCurrentMp]|[sourceMaxMp]|[?]|[?]|[sourceX]|[sourceY]|[sourceZ]|[sourceHeading]
-
-Parsed Log Line Structure:
-[timestamp] DoTHoT 18:[id]:[name]:[which]:[effectId]:[damage]:[currentHp]:[maxHp]:[currentMp]:[maxMp]:[?]:[?]:[x]:[y]:[z]:[heading]:[sourceId]:[source]:[damageType]:[sourceCurrentHp]:[sourceMaxHp]:[sourceCurrentMp]:[sourceMaxMp]:[?]:[?]:[sourceX]:[sourceY]:[sourceZ]:[sourceHeading]
-```
-
-#### Regexes
-
-```log
-Network Log Line Regex:
-^(?24)\|(?[^|]*)\|(?[^|]*)\|(?[^|]*)\|(?