Technical documentation
AION2 Network Protocol
Last change 2026-11-01 · source: docs/PROTOCOL.md · corrections welcome as issues or pull requests
A reference for the AION2 game traffic as of the post-June-2026 client: how packets are framed and compressed, and the layout of every packet type that has been decoded. It covers what a passive reader can see: the server → client direction, read from the network without touching the game.
Each packet section starts with a status line:
- Verified: checked field by field against live traffic and the game's own UI.
- Partly verified: the fields that matter were checked; others are inferred.
- Unconfirmed: taken from earlier public research or a single observation.
Working notes, measurements and the history behind each result are kept in PROTOCOL-NOTES.md.
Conventions
| Notation | Meaning |
|---|---|
u8 u16 u32 u64 |
unsigned integers, little-endian |
i64 |
signed 64-bit integer, little-endian |
f32 |
IEEE 754 single, little-endian |
varint |
unsigned LEB128, at most 5 bytes (32 bits) |
str8 |
u8 length, then that many bytes of UTF-8 |
pos |
three f32 (x, y, z): a world position, see Positions |
time |
u64 milliseconds since the Unix epoch |
Opcodes are two bytes, written in wire order (04 38) as they appear in a hex dump. Field tables start right
after the opcode and list the fields in order; a When column marks fields that are only present sometimes.
Transport
- The game uses TCP. Server → client data is plaintext; client → server data is encrypted, so the client's own actions (movement, chat, skill input) are only visible through the server's answers.
- The same server port may also carry a TLS connection. A connection whose first segment is a TLS record header
(type
14…17, version03 00…03 04, length 1…16640) is not game traffic. - Instances (dungeons, strongholds, arenas) are served by separate servers: entering one moves the game stream to a new TCP connection and leaving moves it back. A reader has to follow the stream across connections.
- So does crossing through a Spacetime Rift into the other faction's land: Verteron and the rift's Altgard were on two different servers, and each crossing (there and back, twice) opened a new connection.
- Before a switch the old connection sends
16 36with the next server's address as text (str8, e.g.193.202.112.54) and its port (u16, 13328), followed by bytes not decoded here; then both sides close the old connection (FIN). The new connection's first record is11 36(278 bytes, not decoded). It shows the0E 00 36signature about a dozen times only some 2.7 s and 30 KB in, so a reader has to keep what arrives before it decides (identity, bag and map load are in there).
Finding the game connection
Verified
The server sends a small periodic record whose frame ends in 0E 00 36 (06 00 36 before June 2026) about 19 times a
second, even when nothing happens. A connection that shows this signature a dozen times within three seconds is the
game stream; the server is the side sending it. Addresses and ports differ between regions, so this is more reliable
than a fixed list.
Capturing reliably
- Cut each payload at the IP total length, not the frame length: some network cards pad short frames with non-zero bytes. When the total length is 0 (segmentation offload), use the end of the frame.
- Reassemble TCP by sequence number: handle wrap-around, retransmissions and partial overlaps, and give up on a gap after a bound instead of waiting forever.
- Latency tools that relay the game through
localhostmake the stream visible only on the loopback device.
Framing
00 zero padding: skip one byte
17 03 03 <u16 BE length> … a stray TLS record: skip 5 + length bytes
<varint L> <opcode: 2 bytes> body a packet
<varint L> FF FF <u32 size> data a compressed bundle
| Rule | Detail |
|---|---|
| Frame size | L − 4 + (bytes used by the varint): a 1-byte varint gives L − 3, a 2-byte one L − 2 |
| Legacy flag | older clients put a byte in F0…FE right after the length; skip it |
| Bad length | ≤ 0, or a frame over 65,535 bytes: advance one byte |
| Incomplete frame | wait for more data only up to 16,384 bytes (65,535 when it looks like a bundle), else advance one byte |
| Bodyless packets | some packets are the opcode only; never assume a body |
Bundles
Verified
| Field | Type | Meaning |
|---|---|---|
| marker | FF FF |
|
| size | u32 |
decompressed size, 1…1,000,000 |
| data | bytes | a raw LZ4 block (not the LZ4 frame format) |
The decompressed bytes are more frames in the same format, zero padding included; bundles nest up to four deep. Inside a bundle, stop at the first impossible length rather than resynchronising.
Bundles also appear embedded in the middle of another packet, preceded by a 1–3 byte varint; identity and roster records often arrive this way. Damage, spawn, HP and identity records are therefore best found by scanning packets, not only at frame starts.
Lobby
Partly verified · plaintext server → client, like the world connection
Before the world connection, the client talks to a lobby server on a separate connection for a few seconds:
account, server list, character list and the chosen server, ending with a redirect to the world server. The lobby
closes as the world connection opens. Its packets are the xx 39 family; the framing is the same as below.
| Opcode | Record | Content |
|---|---|---|
01 39 |
handshake | an encrypted key block |
06 39 |
account | account identifiers (GUID strings) |
09 39 |
server list | see below |
0B 39 |
characters | the account's characters on the servers: name, level, legion, … |
0D 39 |
server chosen | 00 00 00, server u16 |
0F 39 |
redirect | 00 00, server u16, host str8, port u16 of the world server |
09 39 server list: 00 00, count u8, then per server:
| Field | Type | Meaning |
|---|---|---|
| id | u16 |
the server id used in player records (e.g. 1321) |
| faction | u8 |
1 Light, 2 Dark |
| id | u16 |
again |
| — | 00 00 |
|
| name | str8 |
the internal name, e.g. LIVE_Light_021 |
| status | 6 bytes | load or status (not decoded) |
Observed: ids 1301–1323 are LIVE_Light_001…023, ids 2301–2323 LIVE_Dark_001…023.
Entering the world
Partly verified
The world connection starts with a key exchange: the client sends its public key (10 36), the server answers with
11 36 (the client → server direction is encrypted from here). 15 36 (~4 KB) then describes the chosen character
(name, class, level, legion, position, appearance, character id) and 20 36 enters the world with it.
Combat
04 38 — Direct damage
Verified · one packet can hold several records back to back, without separators
| Field | Type | When | Meaning |
|---|---|---|---|
| target | varint |
entity hit | |
| switch | varint |
layout = switch & 0x0F (0 = no value: an aura or effect tick); flag bits below |
|
| flag | varint |
0 in all observations | |
| actor | varint |
entity hitting | |
| skill | u32 |
8-digit player skill or 7-digit NPC skill | |
| uid | u8 |
||
| hitType | varint |
2 normal, 3 critical (1 miss, 6 resist per earlier research) | |
| plotter | u8 |
switch & 0x02 |
hit modifiers, see below |
| restoreHP | varint |
switch & 0x02 |
|
| angle | u8 |
switch & 0x02 |
0x01 back, 0x02 front |
| extra | u32 |
switch & 0x01 |
unknown |
| effect | u32 |
skill effect code = skill × 100 + n | |
| seq | u32 |
hit index within the cast: 1, 2, 3 … | |
| scalar | varint |
after a 00 |
the attacker's damage multiplier in 1/100 % (10000 = 100 %) |
| value | varint |
layout ≠ 0 | total damage, additional hits included |
| hits | varint + n × varint |
switch & 0x20 |
additional hits, already counted in value |
| linked | u8, u32 |
switch & 0x40 |
a linked effect code (e.g. damage absorbed by a shield) |
| end | u8, 00 |
the low byte of seq, then 00 |
| Plotter bit | Meaning | Plotter bit | Meaning |
|---|---|---|---|
0x01 |
shield block | 0x10 |
iron wall |
0x02 |
parry (about half damage) | 0x20 |
regeneration |
0x04 |
perfect | 0x40 |
perfect block |
0x08 |
double |
Skill ids 3,000,000…3,099,999 map to id × 10 + 1 (Theostones). Skill ids 16990000…16999999 and 16770000…16779999
are links between a spirit and its owner, not damage.
05 38 — Damage and healing over time
Unconfirmed
| Field | Type | Meaning |
|---|---|---|
| target | varint |
|
| effectType | u8 |
02/0A damage, 01/09 heal, 0B heal over time, 00 status, 08 buff |
| actor | varint |
|
| — | varint |
unknown |
| skillRaw | u32 |
the skill is skillRaw / 100 |
| amount | varint |
02 38 — Skill cast
Verified · sent for every entity in range, including buffs and heals and the player's own casts
| Field | Type | When | Meaning |
|---|---|---|---|
| actor | varint |
||
| — | 00 |
||
| skill | u32 |
||
| sequence | u8 |
||
| kind | u8 |
2 = aimed at the ground | |
| target | varint |
||
| facing | f32 |
degrees; 0 along +X, turning toward +Y (atan2(dy, dx)) |
|
| target position | pos |
kind 2 |
06 38 follows every 02 38 for the same actor and skill, almost always in the same bundle (rarely up to 2.5 s
later): actor varint, skill u32, counter u16 rising by one with each of that actor's casts.
Own skills and target
Verified on one session (Chanter at a training dummy, 13 skills)
Sent only for the player. Skill ids here are u32 as on the skill bar (18010000).
| Opcode | Fields | Meaning |
|---|---|---|
01 38 |
00 00 00, skill u32 |
a skill was used and its cooldown starts. Every skill the player uses, including Dodge and Dash; not for auras and passive procs. The cooldown length is not sent: the client has it, and no record marks the cooldown ending |
18 38 |
skill u32, 01, next u32 |
next can be used now: a chain step after skill (Onslaught → Resonance Crush → Bolt Crush) |
19 38 |
01, next u32 |
the chain step next is gone: used, or expired after 3 s |
3B 38 3D 38 |
00 00 |
around each targeted skill: 3B 38 with its 02 38, 3D 38 about 50 ms later |
34 38 |
00 00 00, target varint |
the player selected a target; 00 = none |
35 38 |
entity varint, 00, target varint |
the selected target's own target ("target of target"); 00 = none. Sent on selecting and when it changes, e.g. a monster turning to the player once hit |
31 38 |
00 00, target varint, 00 00 |
the target the player attacks; 00 when combat ends |
Buffs and debuffs
Verified
2A 38 added (2B 38 changed has the same fields from abnormal on, without the leading 01):
| Field | Type | When | Meaning |
|---|---|---|---|
| entity | varint |
who has it | |
| — | 01 |
||
| flags | u8 |
||
| instance | varint |
identifies this application, used by 2C 38 |
|
| abnormal | u32 |
the buff or debuff | |
| length | i64 |
ms, −1 = permanent | |
| end | i64 |
server-epoch ms, 4102412400000 = never | |
| caster | varint |
||
| level | u8 |
||
| skill | u32 |
flags & 2 |
|
| reapplied | u8 |
2 = reapplied | |
| position | pos |
where the caster was; for a self-cast buff, the entity's own position |
2C 38 removed: entity varint, n u8, then n times:
| Field | Type | When | Meaning |
|---|---|---|---|
| kind | u8 |
||
| instance | varint |
as in 2A 38 |
|
| reason | u8 |
1 = expired | |
| remover | varint |
kind & 7 = 7 |
|
| skill | u32 |
kind & 7 = 7 |
|
| effect | u32 |
kind & 7 = 7 |
00 8D — Resources
Verified
| Field | Type | Meaning |
|---|---|---|
| entity | varint |
|
| kind | u8 |
|
| — | u8 |
|
| resource | u8 |
0 HP, 1 MP, 6 flight time (below), 3 / 4 other gauges |
| value | u32 |
current value; the maximum is not sent (learn it from the highest value seen or from spawns) |
Flight time (resource 6) counts in 1/10 000 s; full is 570 000 (57 s). Sent every 100 ms while flying, every second while it refills.
| While | Change |
|---|---|
| taking off | −2 500 once |
| flying | −1 000, −1 500 or −2 500 per 100 ms; each 44 37 (our id, 00 00) switches between −1 500 and −2 500 (probably a speed boost) |
| gliding | −750 per 100 ms, −1 000 for 2 s at a time between two 43 37 (our id, 00 00), and −10 000 at once every ~4 s |
| on the ground | +4 000 per second until full |
At 0 the character lands.
1B 92 — HP
Unconfirmed
| Field | Type |
|---|---|
| actor | varint |
| hp | varint |
| hpMax | varint |
21 8D — Combat state
Verified
| Field | Type | Meaning |
|---|---|---|
| entity | varint |
|
| — | 00 |
|
| state | u8 |
1 entered combat, 0 left combat |
For the player these bracket the game's own Combat Analysis clock: on just before the first hit, off a few seconds after the last.
Entities
Entity and character ids
| Id | Scope | Used in |
|---|---|---|
| entity id | per zone: reissued on every zone change | almost every record (varint) |
| character id | stable per character | party roster, loot, own identity (u32, followed by 00 00 and the server u16) |
Entity ids above 1,000,000 in spawn records map to (id & 0x3FFF) | 0x4000.
33 36 — Own character
Verified · sent on every map load and periodically, often inside embedded bundles
| Field | Type | When | Meaning |
|---|---|---|---|
| id | varint |
the player's entity id | |
| mask1 | u32 |
||
| mask2 | u8 |
bit 0 = name present | |
| name | str8 |
||
| server | u16 |
1000…2999 | |
| class | u32 |
roster class code | |
| — | u8 |
||
| level | u32 |
||
| … | further in the record, located by pattern: | ||
| character id | u32, 00 00, u16 server |
right after the character's position | |
| combat power | u32, 0 u32, u32, 0 u32, 05 01 91 00 |
found by the trailing bytes |
45 36 — Player spawn
Verified (class) · Unconfirmed (combat power) · 44 36 before June 2026
| Field | Type | When | Meaning |
|---|---|---|---|
| id | varint |
||
| mask1 | u32 |
||
| mask2 | u8 |
||
| name | str8 |
mask2 & 1 |
|
| class | u32 |
roster class code | |
| position | pos |
after the class code |
Earlier research places the combat power after the last F4 CB 1F marker: from 11 bytes on, the first u32 in
1…10,000,000 that is followed by a zero u32.
41 36 — NPC, monster and summon spawn
Verified · 40 36 before June 2026
| Field | Type | Meaning |
|---|---|---|
| id | varint |
|
| kind | u8 |
see below |
| — | 20 00 |
|
| npcCode | u24 |
the u24 right before 00 40 02 or 00 00 02 (within the first 60 bytes) |
| — | 00 00 02 or 00 40 02 |
|
| position | pos |
|
| … | ||
| HP | 01, varint hp, varint hpMax |
within 64 bytes of the code |
| Kind | Entity | Kind | Entity |
|---|---|---|---|
04, 05 |
monsters | 1C |
effect entities |
0C, 0D |
NPCs | 1D, 1F, 5D |
spirits, ground spells |
14 |
boss helpers (deal damage, no owner) | 5F |
summons and pets |
42 36 — Death and despawn
Verified
| Field | Type | Meaning |
|---|---|---|
| entity | varint |
|
| — | varint |
0 |
| how | varint |
1 already dead when loaded, 3 died in combat, 7 left the area |
04 8D — Ownership
Verified · links summons, spirits and effects to the player who made them (monsters are claimed this way too)
| Field | Type | Meaning |
|---|---|---|
| spawned | varint |
the summon, spirit or effect |
| skill | u32 |
the skill that created it |
| owner | varint |
|
| server | u16 |
|
| owner name | str8 |
|
| legion | str8 |
A 23-byte short form carries no owner.
Legions
Verified
| Opcode | Record | Fields |
|---|---|---|
33 8A |
legion tag of a player in range | entity varint, 5–6 bytes, server u16, legion str8, … |
03 8A |
legion details | 00 00, legion str8, leader str8, counters, texts (u8 or u16 length: introduction, notice …) |
05 8A |
legion roster | per member: server u16, u32, name str8, level u8, …, last login time |
Positions
Verified
World units are about 1 cm; z points up. Headings in u16 are × 360 / 65536 degrees.
| Opcode | Record | Fields | Rate |
|---|---|---|---|
1C 37 |
move | entity varint, mode u8 (5 = one more byte follows), pos, heading u16 × 2, 01 |
~1 / s per moving entity |
1D 37 |
steer | entity varint, flags u8, i8 deltas …, heading u16 × 2 |
~10 / s, no absolute position |
1A 37 |
position | entity varint, 2 bytes, pos |
|
1B 37 |
position | entity varint, [05] 03, pos |
|
2F 37 |
dash, leap | entity varint, u8, pos |
|
3C 37 |
relocation | entity varint, u8, pos |
also sent for the player |
The server does not echo the player's own movement: it travels in the encrypted direction. The player's position
can only be followed through records about it: self-cast buffs (2A/2B 38, well under a metre off), relocations
(3C 37), spawn and identity records, and cast records.
World
21 36 — Map load
Verified
| Field | Type | Meaning |
|---|---|---|
| count | u32 |
|
| map | u32 |
see Map ids |
| — | u64 |
|
| position | pos |
where the player appears |
| facing | f32 |
|
| … | ||
| content | u8 |
at offset 43, see below |
| Content code | Place |
|---|---|
| 0 | open world |
| 12 | reload inside the current instance |
| 30 | sealed dungeon; also the other faction's land reached through a Spacetime Rift (map 1110 Altgard) |
| 37, 38, 40, 65 | stronghold |
| 72, 80 | other instances (e.g. ascension instances) |
| 79 | expedition |
The content code also arrives just before the map load in 47 36 (self varint, 02, content u8).
23 36 — Zone change
Verified
A body starting with 00 (entity 0) is the player's own teleport or zone change. Entity ids are reissued from here on.
Time
Verified
| Opcode | Record | Fields |
|---|---|---|
00 36 |
server clock, ~20 / s | u64 ms |
03 36 |
every 10 s | 00 00, u64 server uptime ms, time |
01 91 — Field bosses of the current map
Verified · repeats about once a second on maps with field bosses
00 00, map u32, count u8, then count times:
| Field | Type | When | Meaning |
|---|---|---|---|
| state | u8 |
1 alive, 0 dead | |
| spawn code | varint |
map × 100 + n |
|
| position | pos |
state 1 | |
| — | 0–1 byte | ||
| time | time |
alive: when it spawned · dead: the announced respawn |
World objects
Verified · gathering nodes, portals, chests, hidden cubes
| Opcode | Record | Fields |
|---|---|---|
34 36 |
object in range | entity varint, kind u8, u8, code u32, pos, … |
38 36, 37 36 |
the player starts using an object | object varint, actor varint, … |
3A 36 |
use finished | object varint, actor varint, u8, …, item u32 used up (last 4 bytes, 0 = none) |
35 36 |
object state changed | object varint, state bytes (e.g. after opening) |
A Spacetime Rift portal is code 1100007 (kind 4). After the position its record carries f32 facing, 01 01 01,
the time the rift opened (time; 13:00:00 UTC on a Europe server, 1 November 2026) and a u64 that went from 0 to 31
while the rift stayed open (players who went through, probably). Using it is 38 36 / 3A 36 like any object; the
server switch follows (see Transport).
Hidden cubes are objects with code 1200039; opening one uses up item 630900003 (Key: Hidden Cube) and the loot
drops at the cube's position.
Gathering
Verified · 28 gatherings on ore, plant and gem nodes
The server decides a gathering's outcome when it starts; the success and fail bars on screen only play it out.
31 8D started:
| Field | Type | Meaning |
|---|---|---|
| — | 00 00 |
|
| node | varint |
the gathering node (object) |
| attempt | u32 |
gatherings on this node so far, this one included (1, 2, 3) |
| outcome | u8 |
bit 0 = success; bits 1–2 = the better grade: 0 fail, 1 success, 6 fail (fine node), 7 fine success |
| — | 00 00 |
|
| grade | u8 |
1 normal, 2 fine (the item the panel shows) |
| — | 00 00 00 |
|
| steps | u8 |
how many steps the bar race on screen has; the steps follow (27 bytes each: kind u8, 01, timing values) |
33 8D ended:
| Field | Type | Meaning |
|---|---|---|
| result | u8 |
0 success, 1 success with the better grade, 2 failed |
| — | u8 |
|
| node | varint |
|
| item | u32 |
the item gathered (or that would have been) |
| count | u32 |
0 when it failed |
3A 36 (use finished) follows on the node, and 1B 56 updates the bag.
Aborted: no end record comes. Instead 39 36 (use interrupted: object varint, u8, u8 (06 19),
actor varint, attempt u32) arrives, with 3E 36 (00 00, object varint) and 6D 8D (object varint).
Blocked for aborting too often: the fourth abort within 5 minutes gets gathering blocked; this held for all nine aborts in one session (three blocks, none on a third abort). Aborting a gathering that would succeed counts too, and a block does not reset the count: one more abort 104 s after a block blocked again. The window lies between 4 min 34 s (an abort that long ago still counted) and 5 min 5 s (one that long ago did not).
The server puts abnormal 10020 on the player with 2A 38, caster the player: 60 000 ms the first two times,
120 000 ms when blocked again 104 s after the last block. The game then says "Essence Extraction has been restricted
due to repetitive behavior." While it lasts, every try to gather gets a refused 31 8D of 19 bytes: 1C 38 instead
of 00 00, then the node and zeros, and no bar race. 2C 38 removes the abnormal (reason 1, expired) when it runs
out.
Crafting
Verified · 27 crafts at cooking and alchemy stations, 4 of them combos
Like gathering, the server decides a craft's outcome when it starts, including whether a combo follows: after the first race succeeds, a second race for the better recipe (two items) runs. A failed combo yields nothing.
6F 8D started:
| Field | Type | Meaning |
|---|---|---|
| — | 00, u8 |
|
| station | varint |
the crafting station (object) |
| recipe | u32 |
|
| outcome | u8 |
bit 0 = the first race succeeds; bit 2 = a combo follows; bit 3 = the combo succeeds (01 success, 05 combo that fails, 0D combo that succeeds) |
| — | 00 |
|
| races | per race: steps u8, the steps (10 bytes each: kind u8, 00, two equal u32), 00; a second race when a combo follows |
71 8D ended:
| Field | Type | Meaning |
|---|---|---|
| result | u8 |
0 success, 1 combo success (two items), 2 failed |
| — | u8 |
|
| station | varint |
|
| — | u8 |
The materials leave the bag (1B 56) when the craft starts, the crafted item arrives with the end record. 7C 8D and
7D 8D follow with the craft's proficiency (craft type u8: 3 handicraft, 4 alchemy, 5 cooking, then points).
Everyone's crafts at the stations around are broadcast, ours included (without the outcome in advance):
| Opcode | Fields | Meaning |
|---|---|---|
72 8D |
actor varint, station varint, u8, craft type u8 |
a player started a craft |
74 8D |
actor varint, result u8 (as in 71 8D), u8, station varint, u8, craft type u8 |
a player's craft ended |
Opening a station's window sends 41 E2 (00 00, station u32, …) and closing it 43 E2 (00 00, station u32).
Shops
Verified · two purchases from NPC shops
| Opcode | Fields | Meaning |
|---|---|---|
01 8C |
00 00, npc varint, 00, time |
a shop opened (also 41 E2 with the NPC) |
03 8C |
00 06, npc u32, lines u8, then per line: goods u32 (the shop's own id, not the item's), count u32 |
we bought |
The bag update (1B 56) with the items and the Kina paid arrives in the same instant.
The marketplace (other players' listings) does not use the game connection: opening it starts a few short HTTPS connections, so its listings and prices are encrypted web traffic.
Instances
00 61 — Instance stage
Verified
| Field | Type | Meaning |
|---|---|---|
| map | u32 |
|
| stage | u8 |
see below |
| from | time |
|
| to | time |
0 = open-ended |
| Stage | Meaning |
|---|---|
| 2 | running; from = when it was entered |
| 3 | cleared; to = from + 10 s, the automatic exit |
| 4 | leaving; to = from + 10 min (likely the time until it can be entered again) |
Map events and objectives
Verified · instances with objectives (strongholds) run a map event
| Opcode | Record | Fields |
|---|---|---|
2E 92 |
event started | event id u32, name str8 (e.g. World_L1_GarrisonTerritory_R3_MapEvent), …, time |
2D 92 |
progress | event id u32, state u8 (2 running, 3 done), 01, step u8 (1, 2 …), n u8, n counters, 08, … |
2F 92 |
event ended | event id u32 |
A step begins when the one before it is done, so step changes mark each objective's completion; state 3 closes the last one. Open-world events use the same records with a single step whose counter rises.
Entering and leaving
| Step | Records |
|---|---|
| use the entry portal | 38 36 / 3A 36 on the portal object |
| announce the place | 47 36 with the content code |
| load it | 21 36, then 00 61 stage 2 and 2E 92 |
| clear | 2D 92 state 3, 00 61 stage 3 |
| leave | 00 61 stage 4, bodyless 05 40, 47 36, 21 36 back to the open world, 2F 92 |
Matchmaking for group content arrives just before entering: 00 92 / 0D 92 member records (an id string, server,
name, legion), 26 92, 27 92 and 1F 93.
Items
Inventory records describe the player's own character only.
Item record
Verified
| Field | Type | Meaning |
|---|---|---|
| item | u32 |
|
| count | u64 |
|
| container | u8 |
see below |
| slot | u8 |
|
| — | 11 × 00 |
|
| enchant | u8 |
gear only, in one of the next two bytes |
| Container | Holds |
|---|---|
01 |
the cube (bag), currencies included |
04 |
quest items |
0B |
equipped gear |
0F |
warehouse |
10 |
cooking ingredients and other crafting stacks |
Inventory
Verified
| Opcode | Record | Fields |
|---|---|---|
11 56 |
the whole inventory, on entering the world | item records of different lengths (gear carries more); scan for them |
1B 56 |
slots changed | n u8, then n changes: two flag bytes, u32 (top byte 0), 00, u16, 00, the item record (count = new total, 0 = emptied). Records differ in length (gear carries stats, some items an expiry time), so after the first (at offset 11) the next is found by that shape. Rewards change up to 11 slots at once |
Ground loot
Verified · both come in batches: a u8 count, the records, one trailing byte
1E 56 dropped, 63 bytes each:
| Field | Type | Meaning |
|---|---|---|
| drop id | u32 |
identifies the drop until it is taken |
| position | pos |
where it lies |
| — | pos |
a second spot nearby |
| source | u32 |
likely the corpse it dropped from |
| serial | u32 |
global, rising |
| item | u32 |
|
| count | u32 |
|
| — | 02 |
|
| owner | u32 |
character id with the right to take it |
| — | 00 00 |
|
| owner server | u16 |
|
| time | time |
|
| — | 2 bytes |
1F 56 taken, 20 bytes each:
| Field | Type | Meaning |
|---|---|---|
| drop id | u32 |
as in 1E 56 |
| source | u32 |
|
| serial | u32 |
|
| taker | u32 |
character id, 0 = it vanished |
| — | 00 00 |
|
| server | u16 |
Items that go to a separate collection (souls, 5346600xx) are picked up like any drop but never appear in the cube;
the take record is the only trace of them.
Other item records
Partly verified
| Opcode | Record |
|---|---|
15 57 |
rewards of a cleared instance as (item, count) pairs |
83 56 |
~40 KB at login with item ids (not decoded) |
84 56 |
01, u64, u64 time, u8 per item: a cooldown or acquisition time (not decoded) |
Quests
Seen once · two kill-ten quests done and turned in
| Opcode | Fields | Meaning |
|---|---|---|
10 8D |
quest u32, state u8, 01, count u32, 00 00 |
progress, one record per step (1 … 10); at the last step a second record follows with state 3 instead of 2: the objective is done |
0F 8D |
00 00, quest u32, 00 |
the quest was turned in |
Quest ids seen: 167 and 168. A turn-in comes with the reward in the bag (1B 56), several 84 56 records and pass
progress (24 E3 id 10044: +150 per quest). A 10 8D of another shape follows each turn-in
(09 00 00 00 02 01, then varints, one of them +10 per quest), probably a counter of quests done.
Daeva Pass
Seen once · two rewards claimed
Pass progress is 24 E3 (see Not decoded yet); ids 10044 and 10047 are two passes or tracks.
23 E3 reward claimed: 00 00, pass u32 (10044, 10047), u32 (810433000, 810439000; 810433000 also names the
pass points in 84 56), level u16 (44, 13). The reward arrives in the bag (1B 56) in the same instant: Kina from
the first, a Nightmare Dungeon Challenge Ticket and 20 Small Odyle Energy from the second.
Party
02 97 — Party roster
Partly verified · sent after every change (join, leave, zone); it can outlive a party
A header (party id, recruiting text), then per member:
| Field | Type | Meaning |
|---|---|---|
| flag | u8 |
0C/1C nearby, 0E/1E elsewhere or offline |
| slot | u8 |
|
| character | u32 |
character id |
| — | 00 00, 2 bytes |
|
| name | str8 |
|
| class | u32 |
roster class code |
| level | u32 |
01 97 is the group finder board (listings with names and recruitment texts; not decoded). 0B 97 and 0D 97
announce a player joining (not decoded).
Not decoded yet
Seen in normal play and described by shape only.
| Opcode | Size | Shape | Probably |
|---|---|---|---|
03 38 |
~37 B | caster varint, 00, target varint, u32, counter, …, pos |
an effect placed at a position |
09 38 |
~33 B | caster, u32, 01 02, target, pos |
like 03 38 |
0E 38 |
~47 B | caster, 02, target, u32, counter, two positions |
something moving between two points |
35 36 37 36 6D 8D 46 37 |
small | entity varint with the player's id |
targeting and object interaction |
05 E0 |
16 B | entity, 03 01, max u32, current u32 falling by 2 |
a gauge (not flight time: absent while flying) |
07 95 08 95 |
14 B | entity varint, u32 (fixed per entity, e.g. 1252, 1264; or 10000 / 20000), 01 / 02; 08 95 then 07 95 150 ms later, every few seconds, for NPCs standing around |
an idle animation, or a timer in ms |
0C 91 |
~30 B | map u32, 01 01, pos, time |
something placed on the map with a time |
15 8D |
~55 B | dialogue keys (Talk_L1_Garrison_…), entity at the end |
NPC dialogue |
24 E3 |
64 B | 01, id u32 (10044, 10047), two points u32, time, … ; both points +30 after each successful craft, none after a failed one, +150 per quest turned in |
progress of a pass or event |
09 90 08 90 |
25 / 6 B | 09 90: the player's entity varint, u32 (1137, 1202), 01 00 00 00, 02, 03 00 00 00, u32 (1000, 1500), …; 08 90: entity varint, 00 00. Twice while fighting for two kill quests, not on a kill step |
unknown |
13 56 |
16 B | 04 03, id varint, 00 00, varint, 00, 02, varint |
a legion member's status: one each time the chat says a legion member logged in, and one for the player entering the Legion Hall |
17 56 19 56 |
16 B | entity varint (the player), then the same fields as 13 56 |
the player's own legion membership, when the legion window opens and its Hall tab is used |
45 8A 09 61 08 61 |
3–16 B | 45 8A a fixed 16-byte record; 09 61 00 00 00 00; 08 61 00 |
always together, at each teleport into or out of the Legion Hall |
0C 61 |
10 B | 00 04, counter u32 (10, then 12), 0E 02 |
progress in the Legion Training Grounds |
01 43 |
50–130 B | ids around 10044–10047 with start and end times | event or season schedule |
Identifiers
Skills
Player skills have 8 digits, CC SS NNNN. The base skill is raw − raw % 10000; the low digits encode
specialisation choices. NPC skills have 7 digits.
| Prefix | Class | Prefix | Class |
|---|---|---|---|
| 11 | Gladiator | 16 | Elementalist |
| 12 | Templar | 17 | Cleric |
| 13 | Assassin | 18 | Chanter |
| 14 | Ranger | 19 | Fighter |
| 15 | Sorcerer |
Roster class codes
Used in identity, spawn and roster records; four codes per class.
| Codes | Class | Codes | Class |
|---|---|---|---|
| 5–8 | Gladiator | 25–28 | Sorcerer |
| 9–12 | Templar | 29–32 | Cleric |
| 13–16 | Ranger | 33–36 | Chanter |
| 17–20 | Assassin | 45–48 | Fighter |
| 21–24 | Elementalist |
Items
| Item | Id |
|---|---|
| Kina (Bound) | 930100001 |
| Kina | 930100031 |
| Enhance Stone | 930100023 |
| Abyss Points | 930100003 |
| Key: Hidden Cube | 630900003 |
The game's currency bar shows the sum of both Kina items in the cube.
Map ids
| Range | Content |
|---|---|
| below 100000 | open world (e.g. 1010 Verteron, 1110 Altgard, 20 / 22 / 23 Reshanta) |
| 152xxx, 153xxx, 154xxx | strongholds; map events GarrisonTerritory_R1…R5, H1…H5, D1…D5 |
| 200xxx, 210xxx | an ascension instance chain |
| 3100xx, 400001 | sealed dungeons |
| 6000xx | expeditions |
| 800xxx, 900xxx | other instances |
Prior work
This reference builds on public research by other passive meters (facts only, no code taken): A2Tools-DPS-Meter (GPL-3.0), Aion2-Dps-Meter (MIT; before the June 2026 changes) and NOIA2 (GPL-3.0). Also worth reading: nuriland/a2kit (a Go decoder) and lunixxx37/aion2-protocol-research.
Nothing matches the filter.