Achievements

The Achievement plugin tracks what players do (kills, levels, resets, upgrades, chaos mixes, events, quests, play time and more) and turns it into a card grid of achievements. Every achievement has one or more tiers; reaching a tier's target completes it, and the player clicks Claim on the card to receive that tier's rewards and achievement points.

Opening the Window#

Press U (Window Menu) and pick Achievements - it is the last entry. The entry is only listed when the server shipped an achievement catalog, so an unlicensed server never shows it. There is no dedicated letter hotkey (every letter is already taken). When a tier completes, a toast appears under the top bar and a gold chat line is printed.

File Location#

Data/Plugins/Achievements/
  Settings.xml                                  optional global settings
  01 - Combat.xml                               one file per category
  02 - Progression.xml
  ...
  _TEMPLATE - Achievement Format Reference.xml  reference, never loaded

Dependencies#

Depends OnPurpose
Monster.xmlMonsterClass filters
Item.xmlItem filters and Item rewards (ItemType / ItemIndex)
EventItemBagItemBag rewards
Effect.xmlBuff rewards (BuffIndex)
Custom QuestsQuestComplete trigger counts custom quest turn-ins
Lucky SpinLuckySpin trigger
Reset SystemReset trigger (reset / grand / master counts)
DataServerTable dbo.AchievementProgress (Name varchar(10), Blob varbinary(1254)). Run the shipped SQL script once

How Files Are Loaded#

  • Every *.xml in the folder is loaded in alphabetical order. Settings.xml and files starting with _ are skipped.
  • One file = one <Category>; its <Achievement> children belong to it.
  • Category Id must be 1 to 16 and unique. Achievement Id must be 0 to 249 and globally unique across all files.
  • Progress is stored by achievement Id. Never renumber a live achievement; removing one leaves harmless orphan progress in the database.
  • A bad entry (duplicate id, missing trigger, no tiers) is logged and skipped; the rest of the file still loads.
  • Reload with $achreload (GM) or the plugin reload. Players already online keep the old catalog until they relog.

Category#

<Category Id="1" Name="Combat" Order="1" Icon="ach/cat_combat">
  <Achievement .../>
</Category>
AttributeTypeDefaultEffect
Id1-16-Stable category id
Namestring (31 chars)CategoryTab label in the window
OrderintIdTab order, ascending
Iconstring-Client sprite name (see Icons). Optional

Achievement#

<Achievement Id="2" Name="Dragon Slayer" Icon="ach/dragon" Text="Slay Budge Dragons in Lorencia." Enabled="1">
  <Trigger Type="KillMonster" MonsterClass="2" Map="0"/>
  <Tier Target="10"   Points="5">  <Reward Type="Zen" Amount="50000"/> </Tier>
  <Tier Target="100"  Points="10"> <Reward Type="Item" ItemType="14" ItemIndex="13" Count="1"/> </Tier>
  <Tier Target="1000" Points="15"> <Reward Type="Item" ItemType="14" ItemIndex="14" Count="2"/> </Tier>
</Achievement>
AttributeTypeDefaultEffect
Id0-249-Global unique id
Namestring (31 chars)""Card title
Iconstring""Client sprite name; missing = ach/default, then an empty plate
Textstring (127 chars)""One-line description on the card
Enabled0/110 = not loaded

Trigger#

Exactly one <Trigger> per achievement. Every achievement owns one counter. The counter mode is fixed by the trigger type:

  • Count types add 1 per matching event.
  • Max types keep the highest value seen (level, reset count, item level).

Filters default to -1 = any. Generic A and B attributes override the friendly names below.

TypeFiltersModeCounts
KillMonsterMonsterClass, MapCountMonster kills
KillBossMonsterClass, MapCountBoss kills. Only classes listed in Data\Plugins\BossClasses.xml count (shared with the Bridge exporter)
KillPlayer-CountPvP kills (killer side)
ReachLevel-MaxHighest character level reached
ResetKind (0 reset, 1 grand, 2 master)MaxHighest reset count of that kind
TalkNpcNpcClassCountNPC talks. Only NPCs that open a dialog count (shops, warehouse, quest givers). Guards (247, 249) are monsters with no dialog and never fire
VisitMapMapCountMap entries (use Target="1" for "visit once")
WinEventEventIndex (0 Blood Castle, 2 Chaos Castle), EventLevelCountEvent wins
ChaosMixMixType, Success (1 success, 0 fail, -1 any)CountChaos Machine results. MixType is the mix id: 3/4/22/23/49/50 = +10..+15, 7 Wings 1, 11 Wings 2, 24 Wings 3, 5 Dinorant, 6 Fruit, 8 Blood Castle ticket, 13/14 pets, 27 Fenrir
ItemUpgradeMethod (0 Bless, 1 Soul, 2 Chaos Machine), ItemType+ItemIndexMaxHighest item level reached by an upgrade the player performed
ItemPickupItemType+ItemIndex, Level, or Group="Jewel"CountGround pickups that landed in the inventory. Group="Jewel" = Bless, Soul, Life, Creation, Guardian, Gemstone, Harmony, Chaos, Lower/Higher Refining Stone
LuckySpinWheelId, Won (1 won, -1 any)CountPaid spins
QuestCompleteQuestIdCountCustom quest turn-ins
PlayTime-CountFull minutes online
Trade-CountCompleted trades (both sides)
PShopSell-CountPersonal store sales (seller)
RareDropItemType+ItemIndexCountRare drops the player owns

Tier#

1 to 8 tiers per achievement. Target values must strictly ascend.

AttributeTypeDefaultEffect
Targetint1Counter value that completes the tier
Points0-655350Achievement points added when the tier is claimed

Reward#

0 to 4 per tier. Same grammar as Custom Quests.

TypeAttributesEffect
ZenAmountZen added
ExpAmountExperience, capped by MaxLevelUpQuest
ItemItemType, ItemIndex, Level, Skill, Luck, Option, Excellent, CountItem into the inventory. One free slot per item reward is required to claim
PointsPointType (Normal / Master), AmountStat points or master points
CurrencyCurrencyType (WCoin / Goblin), AmountCash-shop currency
BuffBuffIndex, Value1, Value2, DurationMinServer effect for DurationMin minutes
ItemBagBagIndexDrops the bag at the player's feet (not inventory-checked)

Settings.xml#

<Achievements AutosaveSec="180" RewardToInventory="0"/>
AttributeTypeRangeDefaultEffect
AutosaveSecint30+180Seconds between background saves of changed counters. Tier completions and claims always save immediately
RewardToInventoryint0-101 = Item and ItemBag rewards go straight into the inventory. If the inventory is full at that moment, the item drops at the player's feet (only they can pick it up). In this mode an ItemBag gives items only: its zen roll, random set-item roll and firework are skipped. 0 = drop at the player's feet

Icons#

Icons are client sprites from the atlas Data/Interface/UI/atlas/achievements.png + achievements.xml, referenced as ach/<name>. The same atlas serves both UI skins. To add icons (48x48 PNG), use Tools\AtlasPacker (see Tools): AtlasPacker.exe -unpack <client>\Data\Interface\UI\atlas\achievements.xml MyIcons, add your PNGs to MyIcons (keep default.png), then AtlasPacker.exe MyIcons achievements ach -out <client>\Data\Interface\UI\atlas. The file name is the sprite name: slayer.png becomes ach/slayer. Any Icon that is missing from the atlas falls back to ach/default; if that is missing too, the card shows an empty plate. Text and progress are unaffected.

Important Behavior#

  • Tier completion is derived from the counter (Counter >= Target), not stored. Raising a Target after players progressed can un-complete a tier they have not claimed yet; lowering one completes it on their next progress tick or relog.
  • Claimed tiers are stored as a bitmask and never revert.
  • Progress before the DataServer answered the load request is dropped (never saved over the database). Players see this only on a slow DataServer.
  • Achievement points are display-only (window header, per tier in the tooltip). They are the sum of claimed tiers' Points.
  • The Bridge plugin can export the same events; achievements do not depend on it.

GM Commands#

GM authority (Authority & 32) required.

CommandEffect
$achstate [id]List non-zero counters (or one achievement) with claimed bits and tiers reached
$achset <id> <counter>Set a counter directly; newly reached tiers unlock like live progress
$achresetWipe the character's achievement progress
$achreloadReload the folder and refresh the catalog cache

Examples#

<?xml version="1.0" encoding="UTF-8"?>
<Category Id="2" Name="Progression" Order="2">
  <Achievement Id="14" Name="Devoted" Icon="ach/playtime" Text="Spend time in the world (minutes online).">
    <Trigger Type="PlayTime"/>
    <Tier Target="60"   Points="5">  <Reward Type="Zen" Amount="100000"/> </Tier>
    <Tier Target="600"  Points="10"> <Reward Type="Item" ItemType="14" ItemIndex="13" Count="2"/> </Tier>
    <Tier Target="6000" Points="25"> <Reward Type="Currency" CurrencyType="Goblin" Amount="300"/> </Tier>
  </Achievement>
</Category>

Common Issues#

Last updated October 28, 2026