Attainment (2.23) is a replacement for Expwatch.
It includes all of the classic expwatch features, plus:
It works for FoV, EXP Scrolls, etc.
It works for exp from Abyssean fiends.
It tracks Cruor, Cruor/time, lights accumulated and visitant time remaining in Abyssea zones.
It tracks time remaining and time extension KIs obtained in Neo-Dynamis zones.ed in Neo-Dynamis zones.
To use, simply place Attainment.dll and the attainment folder inside your plugins directory, comment out “load expwatch” in your init.txt and replace with “load attainment”
Attainment is highly customizable.
The default statusbar templates are as follows:
statusbar: {current_exp}/{exp_next_lvl}({tnl}) XP:{total_exp}({last_exp}) {exp_k_per_hour}k/hr
statusbar75: {current_exp}/{exp_next_lvl}({tnl}) {current_limits}/{max_limits}({tnm})[{merits}] XP:{total_exp}({last_exp}) {exp_k_per_hour}k/hr
statusbarAbyssea: Cruor:{total_cruor}({last_cruor}) {cruor_k_per_hour}k/hr Prl:{pearl} Gld:{gold} Slv:{silver} Ebn:{ebon} Azr:{azure} Rby:{ruby} Amb:{amber} V.Time: {visitant}
statusbarDynamis: Alb:{alabastor_granules} Amb:{amber_granules} Azr:{azure_granules} Crm:{crimson_granules} Obn:{obsidian_granules} Time Remaining: {hourglass}
The templates can be changed by executing //Attainment <statusbar> ”<new template>“
This may be done in your init.txt as a more permanent change, or on the fly through the console, or through // or /console syntax.
The text tokens which can be replaced by meaningful values (such as current_exp) are defined in plugins/attainment/tokens.xml.
You may edit this file to add new tokens at your leisure, but new releases may come with new predefined tokens, so be sure to backup any customizations before downloading an update.
The templates for statusbars use values in the <aliases> element. A token may have unlimited aliases, but ALL ALIASES (SPANNING ALL TOKENS) MUST BE UNIQUE.
For example:
<token>
<type>double</type>
<format decimalPlaces="1" />
<aliases>
<alias>exp_k_per_hour</alias>
</aliases>
<value>(<exp_per_second /> * 3600) / 1000</value>
</token>
In this example, {exp_k_per_hour} is now declared as a valid token and will work in any statusbarXYZ as well as in normal chat/macros, to be replaced with the calculation performed in the <value> element.
The XML elements allowed in the <value> element are as follows:
| Variable | Description |
| current_exp | Your current exp total |
| current_limits | Your current limit point total |
| current_merits | Your current merit point total |
| max_limits | The maximum amount of limits points you can currently attain (10,000) |
| max_merits | The maximum amount of merit points you can currently attain (20) |
| next_level_exp | The experience required to level up from 0 exp into your current level |
| last_exp_gained | The amount of experience you last received from any source |
| last_cruor_gained | The amount of cruor you last received from any source |
| total_exp_gained | The total amount of experience/limit points gained this session |
| exp_per_second | Your exp/sec calculation within the given time frame |
| cruor_per_second | Your cruor/sec calculation within the given time frame |
| pearl_lights | The number of pearl light messages received since last /heal |
| gold_lights | The number of gold light messages received since last /heal |
| silver_lights | The number of silver light messages received since last /heal |
| ebon_lights | The number of ebon light messages received since last /heal |
| azure_lights | The number of azure light messages received since last /heal |
| ruby_lights | The number of ruby light messages received since last /heal |
| amber_lights | The number of amber light messages received since last heal |
| pearl_light_intensity | The Intensity reading of pearl light obtained from /heal |
| gold_light_intensity | The Intensity reading of gold light obtained from /heal |
| silver_light_intensity | The Intensity reading of silver light obtained from /heal |
| ebon_light_intensity | The Intensity reading of ebon light obtained from /heal |
| azure_light_intensity | The Intensity reading of azure light obtained from /heal |
| ruby_light_intensity | The Intensity reading of ruby light obtained from /heal |
| amber_light_intensity | The Intensity reading of amber light obtained from /heal |
| visitant_time_remaining | The amount of visitant time you have left, in minutes |
| last_visitant_received | The amount of visitant time specified in the last warning message received |
| last_visitant_update_time | The UNIX timestamp of when the last visitant time warning message was received |
| dynamis_time_remaining | The amount of time remaining in dynamis, in minutes |
| last_dynamis_received | The amount of time remaining specified in the last warning message received |
| last_dynamis_update_time | The UNIX timestamp of when the last time warning message was received |
| has_alabastor_granules | O if you have alabastor granules of time, X if you do not |
| has_amber_granules | O if you have amber granules of time, X if you do not |
| has_azure_granules | O if you have azure granules of time, X if you do not |
| has_crimson_granules | O if you have crimson granules of time, X if you do not |
| has_obsidian_granules | O if you have obsidian granules of time, X if you do not |
The default window for exp and cruor over time calculations is 30 minutes.
This may be changed with the expAverageTime and cruorAverageTime commands, but note that these commands accept values in seconds, not minutes.
Use ”//Attainment help” in game for a brief overview of supported commands.