
Introduction
Welcome to the Conquer Online server development and client modifications wiki. This wiki is hosted publicly using Git, published using mdBook, and maintained by the open source community. Pages on this wiki cover topics such as server-client message types, cryptography, client file formats, constants, system overviews, and more.
To participate in this collaborative effort to document Conquer Online development, the following rules must be followed:
- Articles must be written from a neutral point of view.
- Authors must respect each other, and not engage in personal attacks.
- Authors must not publish pirated programs.
Please read up on the code of conduct found in the root of the repository.
Verification
Statuses are used to indicate how reliable a page is / what the source of information is. Specifically, if information has been gathered from a community source, such as a private server project, then the status should be unverified until the server is run and the behavior can be at least observed.
- 🚩 Incomplete: The source is unknown and the information is incomplete.
- ❓ Unverified: The source is unknown or cannot be verified.
- ☑️ Assumed (Observed): Assumed by observing the behavior in the client.
- ☑️ Assumed (Soul): Assumed by reading the leaked client source code from TQ.
- ✅ Verified (Client): Confirmed by reverse engineering the client binary.
- ✅ Verified (Server): Confirmed by reverse engineering the leaked server binaries.
Sections
This wiki is broken up into multiple sections:
- Algorithms: Calculations made for attacks, rates, skill distances, and more.
- Constants: Hard-coded constants found in and across messages and the client.
- Features: In-game systems & mechanics and how they work on the server and client.
- Files: File formats and definitions for various content types.
- Network: Message structures and client-server networking.
- Renderers: System descriptions for rendering content in the client.
- Security: Cryptography and security around networking and content.
- Strings: Details on strings and restrictions on inputs.
Algorithms
This section documents algorithms and calculations for attacks, movement, and more.
Conquer Online's client and server both utilize Microsoft's rand function for random number generation. This can be seen when generating a seed for RC5 in later patches of the client. Algorithms documented by this section that reference rand are assumed to use the Microsoft C implementation.
Subsections
- Calculations: Algorithms used in calculating distance, damage, etc.
- Rates: Descriptions of random rates for various systems.
Calculations
Attributes
Damage
Direction
Enlightenment
Item Durability
Role View
Rates
Item Composition
Item Sockets
Constants
Action
Actions are emotes a role can perform. Not all roles can perform all types of actions. For monsters and players, this is determined by the 3dmotion.ini file. For NPCs, this is determined by npc.ini, which links with 3dmotion.ini for ACTION_STANDBY, ACTION_REST1, and ACTION_SAYHELLO.
Table of Contents
Patch 4267
☑️ Assumed (Observed) - Soul
enum ActionType {
ACTION_DANCE1 = 1;
ACTION_DANCE2 = 2;
ACTION_DANCE3 = 3;
ACTION_DANCE4 = 4;
ACTION_DANCE5 = 5;
ACTION_DANCE6 = 6;
ACTION_DANCE7 = 7;
ACTION_DANCE8 = 8;
ACTION_STANDBY = 100;
ACTION_REST1 = 101;
ACTION_REST2 = 102;
ACTION_REST3 = 103;
ACTION_STANDBY_I = 105;
ACTION_WALKL = 110;
ACTION_WALKR = 111;
ACTION_WALKL_I = 115;
ACTION_WALKR_I = 116;
ACTION_RUNL = 120;
ACTION_RUNR = 121;
ACTION_TRANSFORM = 122;
ACTION_RUNL_I = 125;
ACTION_RUNR_I = 126;
ACTION_JUMP = 130;
ACTION_JUMP_BACK = 131;
ACTION_JUMP_RUN = 132;
ACTION_JUMP_ATK = 140;
ACTION_JUMP_ATKEND = 141;
ACTION_LAUGH = 140;
ACTION_GUFFAW = 151;
ACTION_FURY = 160;
ACTION_SAD = 150;
ACTION_SALUTE = 160;
ACTION_GENUFLECT = 170;
ACTION_EXCITEMENT = 180;
ACTION_SAYHELLO = 190;
ACTION_FAINT = 190;
ACTION_LIE = 200;
ACTION_KNEEL = 220;
ACTION_COOL = 230;
ACTION_COOLPOSE = 231;
ACTION_SWIM = 240;
ACTION_SITDOWN = 250;
ACTION_SITDOWN_STATIC = 251;
ACTION_ZAZEN = 260;
ACTION_ZAZENCOOL = 261;
ACTION_PICKUP = 262;
ACTION_ALERT_I = 305;
ACTION_DODGE0 = 311;
ACTION_BRUISE0 = 321;
ACTION_BRUISE1 = 321;
ACTION_POPOFF = 321;
ACTION_DIE0 = 330;
ACTION_BODY0 = 331;
ACTION_DIE1 = 332;
ACTION_BODY1 = 333;
ACTION_DIE2 = 334;
ACTION_BODY2 = 335;
ACTION_DIE3 = 336;
ACTION_BODY3 = 337;
ACTION_ALERT = 340;
ACTION_DIEFLY = 340;
ACTION_DIEFLYEND = 341;
ACTION_WALKBACK = 342;
ACTION_ATTACK0 = 350;
ACTION_ATTACK1 = 351;
ACTION_ATTACK2 = 352;
ACTION_MINE = 360;
ACTION_INTONE = 390;
ACTION_INTONE_DURATION = 391;
ACTION_INTONE_LAUNCH = 392;
ACTION_RELIVE = 400;
ACTION_PUNCTURE = 451;
ACTION_AIRSTRIKE = 452;
ACTION_TORNADO = 453;
ACTION_BODYSHIELD = 460;
ACTION_GODBELIEVE = 465;
ACTION_BUMP = 470;
ACTION_FLY_STANDBY = 501;
ACTION_FLY_ALERT = 502;
ACTION_FLY_MOVE = 510;
ACTION_FLY_ATTACK = 520;
ACTION_FLY_DOWN = 530;
ACTION_FLY_UP = 540;
ACTION_FLY_DIE = 550;
ACTION_FLY_WOUND = 560;
ACTION_JUMPBACK_SHOOT = 610;
ACTION_FAST_SHOOT = 620;
ACTION_CHARGEUP_BEGIN = 630;
ACTION_CHARGEUP_END = 631;
ACTION_TM_FAST_SHOOT = 800;
ACTION_TM_DISPERSION_SHOOT = 801;
}
Gem
Gems can be socketed into equipment to grant bonuses. Equipment can have up to two socket slots, each holding one gem.
Gems come in three quality grades: Normal, Refined, and Super.
Table of Contents
Patch 5517
Gem Item IDs
Gem item IDs fall in the range 700000–709999, identified by the client via CItem::IsGem. The last digit of the ID encodes the Gems Quality.
| Digit | Quality |
|---|---|
| 1 | Normal |
| 2 | Refined |
| 3 | Super |
Gem Types
| Gem Type | Normal ItemID | Refined ItemID | Super ItemID | Effect |
|---|---|---|---|---|
| Phoenix | 700001 | 700002 | 700003 | +5% / +10% / +15% magic attack |
| Dragon | 700011 | 700012 | 700013 | +5% / +10% / +15% physical attack |
| Fury | 700021 | 700022 | 700023 | +5% / +10% / +15% hitting accuracy |
| Rainbow | 700031 | 700032 | 700033 | +10% / +15% / +25% killing experience |
| Kylin | 700041 | 700042 | 700043 | +50% / +100% / +200% durability |
| Violet | 700051 | 700052 | 700053 | +30% / +50% / +100% weapon experience |
| Moon | 700061 | 700062 | 700063 | +15% / +30% / +50% magic experience |
| Tortoise | 700071 | 700072 | 700073 | -2% / -4% / -6% damage taken |
| Thunder | 700101 | 700102 | 700103 | Heaven Fan only: +100 / +300 / +500 Attack & Magic Attack |
| Glory | 700121 | 700122 | 700123 | Star Tower only: +100 / +300 / +500 Defense & Magic Defense |
The gem type and quality can be determined by floor(item_id % 10000 / 10). For example, 700011 = type 1 (Dragon), quality 1 (Normal).
Socket Encoding
The socket byte value is stored in MsgItemInfo (Socket 1 / Socket 2 fields) and is derived from the gem's item ID:
socket_byte = item_id % 1000
For example, Super Dragon Gem (700013): 700013 % 1000 = 13.
Socket Values
enum SocketedGem {
NO_SOCKET = 0;
PHOENIX_NORMAL = 1;
PHOENIX_REFINED = 2;
PHOENIX_SUPER = 3;
DRAGON_NORMAL = 11;
DRAGON_REFINED = 12;
DRAGON_SUPER = 13;
FURY_NORMAL = 21;
FURY_REFINED = 22;
FURY_SUPER = 23;
RAINBOW_NORMAL = 31;
RAINBOW_REFINED = 32;
RAINBOW_SUPER = 33;
KYLIN_NORMAL = 41;
KYLIN_REFINED = 42;
KYLIN_SUPER = 43;
VIOLET_NORMAL = 51;
VIOLET_REFINED = 52;
VIOLET_SUPER = 53;
MOON_NORMAL = 61;
MOON_REFINED = 62;
MOON_SUPER = 63;
TORTOISE_NORMAL = 71;
TORTOISE_REFINED = 72;
TORTOISE_SUPER = 73;
THUNDER_NORMAL = 101;
THUNDER_REFINED = 102;
THUNDER_SUPER = 103;
GLORY_NORMAL = 121;
GLORY_REFINED = 122;
GLORY_SUPER = 123;
EMPTY_SOCKET = 255;
}
NO_SOCKET = 0 means the equipment has no socket in that slot. EMPTY_SOCKET = 255 means the socket exists in the equipment but has no gem socketed.
Hairstyles
The HairStyle value encodes both hair color and style in a single numeric type.
HairStyle = (HairColor × 100) + Style
HairColor = HairStyle ÷ 100 // integer division
Style = HairStyle % 100 // modulo
Examples:
537= Color 3 (Black), Style 30 (New)515= Color 5 (Red), Style 15 (Nostalgic)625= Color 6 (Brown), Style 25 (Special)
Note: VIP styles (70-90) have a static appearance and the color formula does not affect their visual look.
Client File References
ini/NpcX.ini: Contains 145+Hair=entries with values ranging from 0 to 678, used to define NPC hairstyles
Hair Colors
enum HairColor {
HAIR_COLOR_BLACK = 3;
HAIR_COLOR_WHITE = 4;
HAIR_COLOR_RED = 5;
HAIR_COLOR_BROWN = 6;
HAIR_COLOR_GREEN = 7;
HAIR_COLOR_BLUE = 8;
HAIR_COLOR_VIOLET = 9;
}
Hair Styles
enum HairStyle {
// Bald
BALD_NO_HAIR = 0;
// Nostalgic - 10-16
HAIR_STYLE_NOSTALGIC_1 = 10;
HAIR_STYLE_NOSTALGIC_2 = 11;
HAIR_STYLE_NOSTALGIC_3 = 12;
HAIR_STYLE_NOSTALGIC_4 = 13;
HAIR_STYLE_NOSTALGIC_5 = 14;
HAIR_STYLE_NOSTALGIC_6 = 15;
HAIR_STYLE_NOSTALGIC_7 = 16;
// Special - 21-25
HAIR_STYLE_SPECIAL_1 = 21;
HAIR_STYLE_SPECIAL_2 = 22;
HAIR_STYLE_SPECIAL_3 = 23;
HAIR_STYLE_SPECIAL_4 = 24;
HAIR_STYLE_SPECIAL_5 = 25;
// New - 30-41
HAIR_STYLE_NEW_1 = 30;
HAIR_STYLE_NEW_2 = 31;
HAIR_STYLE_NEW_3 = 32;
HAIR_STYLE_NEW_4 = 33;
HAIR_STYLE_NEW_5 = 34;
HAIR_STYLE_NEW_6 = 35;
HAIR_STYLE_NEW_7 = 36;
HAIR_STYLE_NEW_8 = 37;
HAIR_STYLE_NEW_9 = 38;
HAIR_STYLE_NEW_10 = 39;
HAIR_STYLE_NEW_11 = 40;
HAIR_STYLE_NEW_12 = 41;
// VIP Level 4 - 70-74
HAIR_STYLE_VIP4_1 = 70;
HAIR_STYLE_VIP4_2 = 71;
HAIR_STYLE_VIP4_3 = 72;
HAIR_STYLE_VIP4_4 = 73;
HAIR_STYLE_VIP4_5 = 74;
// VIP Level 5 - 75-90
HAIR_STYLE_VIP5_1 = 75;
HAIR_STYLE_VIP5_2 = 76;
HAIR_STYLE_VIP5_3 = 77;
HAIR_STYLE_VIP5_4 = 78;
HAIR_STYLE_VIP5_5 = 79;
HAIR_STYLE_VIP5_6 = 80;
HAIR_STYLE_VIP5_7 = 81;
HAIR_STYLE_VIP5_8 = 82;
HAIR_STYLE_VIP5_9 = 83;
HAIR_STYLE_VIP5_10 = 84;
HAIR_STYLE_VIP5_11 = 85;
HAIR_STYLE_VIP5_12 = 86;
HAIR_STYLE_VIP5_13 = 87;
HAIR_STYLE_VIP5_14 = 88;
HAIR_STYLE_VIP5_15 = 89;
HAIR_STYLE_VIP5_16 = 90;
}
Hero Look
Hero Profession
Item ID
Item IDs are structured integers that encode information such as the item's category, type, level and quality directly in the number.
ItemType.dat is the file the client uses to find the details about an item id.
Table of Contents
Patch 5517
Fields
Three fields can always be extracted from any Item ID:
| Field | Formula | Description |
|---|---|---|
| Item Quality | id % 10 | Quality grade (0-9) |
| Item Level | floor(id / 10) % 100 | Level of the item (name / stats) |
| Category | floor(id / 10000) % 100 | Two-digit item category (equipment & weapons only) |
Item Quality Grade
For equipment and gems, the last digit of the item ID is the quality, where a higher quality digit means increased stats. The exception is quality digit 0 (Fixed) which applies to low-level equipment (level < 52) & stats can exceed Super quality but the item cannot be upgraded.
For all other item types, the last digit sometimes acts as a variant identifier or isn't used.
Equipment Quality
| Digit | Name |
|---|---|
| 0 | Fixed |
| 1 | Starting Gear for New Players (Normal) |
| 2 | Unused 🔵 |
| 3 | Normal (Base Stats) |
| 4 | Normal (Typically Base + Slight Stat Increase) |
| 5 | Normal (Typically Base + Further Stat Increase) |
| 6 | Refined |
| 7 | Unique |
| 8 | Elite |
| 9 | Super |
🔵 There is only one item with quality digit 2: 131052 (Lv57 Warrior ChainedArmor). There is no explanation for this, it is suspected to be a developer mistake.
Gems Quality
| Digit | Name |
|---|---|
| 1 | Normal |
| 2 | Refined |
| 3 | Super |
Overall Item ID Ranges
| ID Range | Description |
|---|---|
100000-199999 | Equipment (Head, Necklace, Ring, Bracelets, Armor, Garments) |
200000-209999 | Mount Armor, Fan & Tower |
300000-309999 | Mounts (Only Single Entry: Steed) |
400000-499999 | Single-hand weapons (excluding Katanas & Beads) |
500000-599999 | Two-hand weapons |
600000-699999 | Single-hand Weapons: Katanas (Ninja) & Beads (Monk) |
700000-799999 | Gems, Item Packs, Quest Items, Furniture, Refinery Items |
800000-899999 | Dragon & Martial Souls |
900000-999999 | Shields |
1000000-1099999 | Consumables, arrows, ores, Dragonball/Meteor & Silver/Gold |
2000000-2999999 | Gourd & Talismans |
There is a single item that falls outside these ranges: ID: 50000 Name: Speed Arrow, but this item has an invalid icon & the real Speed Arrow ID is: 1050002. This is an invalid (perhaps legacy) record.
Equipment Ranges
| ID Range | Equipment type |
|---|---|
| 110000-119999 | Head gear |
| 120000-129999 | Necklaces |
| 130000-139999 | Body armor |
| 140000-149999 | Head gear |
| 150000-159999 | Rings, bracelets |
| 160000-169999 | Boots |
| 180000-189999 | Garments |
| 190000-199999 | Garments |
Weapon Ranges
Single-hand (4xxxxx & 6xxxxx):
| ID Range | Weapon type |
|---|---|
| 410000-419999 | Blade |
| 420000-429999 | Sword |
| 430000-439999 | Hook |
| 440000-449999 | Whip |
| 450000-459999 | Axe |
| 460000-469999 | Hammer |
| 480000-489999 | Club |
| 490000-499999 | Dagger |
| 600000-609999 | Katana |
| 610000-619999 | Prayer Beads |
Two-hand (5xxxxx):
| ID Range | Weapon type |
|---|---|
| 500000-509999 | Bow |
| 510000-519999 | Glaive |
| 530000-539999 | Poleaxe |
| 540000-549999 | Long Hammer |
| 560000-560999 | Spear |
| 561000-561999 | Wand |
| 562000-562001 | Pickaxe & Hoe |
| 580000-589999 | Halberd |
Look Face
The look face of a player or monster is the mesh calculation for the 3D role. While the monster look face is rather simple (just the monster type), the look face of a player is more complicated and follows this equation:
Look = Body + (Avatar x 10000) + (Transformation x 10000000)
PK Mode
Role Type
Roles in Conquer Online are entities such as NPCs, Monsters, and Heroes (the players). Depending on the role, the game client interprets left click actions differently. The server may use these constants to determine how MsgInteract is processed, or how an NPC is spawned using MsgNpcInfo.
Table of Contents
Patch 4267
☑️ Assumed (Soul)
enum RoleType {
ROLE_NPC_NONE = 0;
ROLE_SHOPKEEPER_NPC = 1;
ROLE_TASK_NPC = 2;
ROLE_STORAGE_NPC = 3;
ROLE_TRUNK_NPC = 4;
ROLE_FACE_NPC = 5;
ROLE_FORGE_NPC = 6;
ROLE_EMBED_NPC = 7;
ROLE_STATUARY_NPC = 9;
ROLE_SYNFLAG_NPC = 10;
ROLE_PLAYER = 11,
ROLE_HERO = 12,
ROLE_MONSTER = 13,
ROLE_BOOTH_NPC = 14,
SYN_TRANSPORT_NPC = 15,
ROLE_BOOTH_FLAG_NPC = 16,
ROLE_MOUSE_NPC = 17,
ROLE_MAGICITEM = 18,
ROLE_DICE_NPC = 19,
ROLE_WEAPONGOAL_NPC = 21,
ROLE_MAGICGOAL_NPC = 22,
ROLE_BOWGOAL_NPC = 23,
ROLE_TARGET_NPC = 24,
ROLE_FURNITURE_NPC = 25,
ROLE_CITY_GATE_NPC = 26,
ROLE_NEIGHBOR_DOOR = 27,
ROLE_CALL_PET = 28,
TRAINPLACE_NPC = 29,
AUCTION_NPC = 30,
ROLE_STONE_MINE = 31,
ROLE_PKGAME_NPC = 32,
ROLE_3DFURNITURE_NPC = 101,
ROLE_CITY_WALL_NPC = 102,
ROLE_CITY_MOAT_NPC = 103,
}
Files
This section documents file formats and provides definitions for various content types.
Files in the Conquer Online game client follow some consistency in format, but are largely different between files. Some files are encrypted by various ciphers, and some files are packed in compressed archives.
Subsections
- Compression: File types meant for compressing content into a single file.
- Content: File types specific to content needed for the client renderers.
- Formats: Formats for how to read various file types.
Compression
Content
3DEffect.ini
3DMotion.ini
Action.dat
This file was used in Conquer 1.0 (patches 4267 & below). Although this file is distributed with Conquer 2.0, the code that consumes it is dead code in the client binary, so it is not used in Conquer 2.0.
It maps some ActionType to specify the length of each animation frame in milliseconds.
Table of Contents
Patch 4267
☑️ Assumed (Soul)
File Header
| Offset | Type | Description |
|---|---|---|
| 0 | UInt32 | Number of records in the file |
Record Structure
| Offset | Type | Description |
|---|---|---|
| 0 | UInt32 | Checksum 1 |
| 4 | UInt32 | Action Index |
| 8 | UInt32 | Checksum 2 |
| 12 | UInt32 | Frame Interval (ms) |
| 16 | UInt32 | Checksum 3 |
Each record is 20 bytes. There are three checksum fields computed using the value of the Action Index and its position i, starting from zero.
Checksum1 = (ActionIndex * 2) + (FrameInterval + i)
Checksum2 = (i * Checksum1) + (ActionIndex * FrameInterval) - i
Checksum3 = (Checksum1 * ActionIndex) + (Checksum2 * 7) + (FrameInterval * i)
The client errors on checksum mismatch. The checksums are likely anti-tamper protection against manipulating animation speeds.
Action Index Structure
ActionIndex is made up of three components as a single integer:
ActionIndex = (LookFace * 1000000) + (WeaponType * 1000) + ActionType
When any component is set to 999, the code has specific logic as match-any, effectively a wildcard.
As an example: 999999110
- Digits 7-9 =
999= Match any LookType (Male / Female / Transform) - Digits 4-6 =
999= Match any WeaponType (Bow / Club / Dual-Wield / Shield etc.) - Digits 1-3 =
110= Matches ActionTypeACTION_WALKL(Walk Left)
For 999999110, the frame interval is 25, so each frame in the animation has a 25ms delay.
Example Entries
| Action Index | Frame Interval (ms) |
|---|---|
| 999999100 | 66 |
| 999999101 | 66 |
| 999999110 | 25 |
| 999999120 | 25 |
| 999999130 | 33 |
| ... | ... |
Parsing Script
The following is a simple python script which reads and parses Action.dat.
Pass the filepath as the first arg & it will print each action index alongside its time interval. Checksums won't be printed. Example: python3 action_decode.py Action.dat
import struct, sys
with open(sys.argv[1], "rb") as f:
count, = struct.unpack("<I", f.read(4)) # Little-Endian uint32 - Header (Record Count)
for i in range(count):
# checksum1, action_index, checksum2, frame_interval, checksum3
_, action_index, _, frame_interval, _ = struct.unpack("<IIIII", f.read(20))
print(f"{action_index}: {frame_interval}ms")
AutoAllot.dat
Although this file was distributed with the client, it is never referenced or used in any known version (at least 4217 to 6090). It was most likely moved to the server side database (table: cq_point_allot) and the file was never removed from the client. It maps the distribution of Strength (Force), Agility (Speed), Vitality (Health), and Spirit (Soul) attribute points for each level before first Rebirth and up to level 120.
Table of Contents
Patch 4267
☑️ Assumed (Soul)
File Header
| Offset | Type | Description |
|---|---|---|
| 0 | UInt32 | ProfessionCount |
| 4 | UInt32 | LevelCount |
Profession Index
After the header is an array of ProfessionType. i is the array index, starting from zero:
| Offset | Type | Description |
|---|---|---|
8 + (i * 4) | UInt32 | ProfessionType |
Data Records
Then an array of ProfessionCount * LevelCount records, ordered by ProfessionType then level:
| Offset (per record) | Type | Description |
|---|---|---|
| 0 | UInt32 | Strength |
| 4 | UInt32 | Agility |
| 8 | UInt32 | Vitality |
| 12 | UInt32 | Spirit |
Level is not stored, it is implicit from the position in the array.
Example Entries
| ProfessionType | Level | Strength | Agility | Vitality | Spirit |
|---|---|---|---|---|---|
| 1 | 1 | 5 | 2 | 3 | 0 |
| 1 | 2 | 7 | 2 | 4 | 0 |
| 1 | 3 | 8 | 3 | 5 | 0 |
| 1 | 4 | 10 | 4 | 5 | 0 |
| 1 | 5 | 11 | 5 | 6 | 0 |
| ... | ... | ... | ... | ... | ... |
Parsing Script
The following Python script decodes AutoAllot.dat and prints the allocation table for every profession and level.
Pass the filepath as the first argument. Example: python3 autoallot_decode.py AutoAllot.dat
import struct, sys
with open(sys.argv[1], "rb") as f:
prof_count, level_count = struct.unpack("<II", f.read(8))
index = struct.unpack(f"<{prof_count}I", f.read(prof_count * 4))
for i in range(prof_count):
prof_type = index[i]
for level in range(1, level_count + 1):
strength, agility, vitality, spirit = struct.unpack("<IIII", f.read(16))
print(f"ProfessionType={prof_type}, Level {level}: "
f"Strength={strength} Agility={agility} Vitality={vitality} Spirit={spirit}")
AutoPatch.dat
chatContribute.Ani
Cn_Res.ini
CodePage.ini
Sets the Windows code page (character set) used by graphic.dll to decode multibyte character strings for font rendering. Read by client immediately after font.ini.
This file does not exist by default with the English distribution, but can be created.
Table of Contents
Patch 5517
✅ Verified (Client)
Located at ini/CodePage.ini.
Example Entries
936
The first line is read as an integer and used by C3_CORE_DLL font functions to convert multibyte sequences to Unicode before FreeType rendering.
Common code page values
| Value | Encoding | Region |
|---|---|---|
936 | GBK | Simplified Chinese |
950 | Big5 | Traditional Chinese |
932 | Shift-JIS | Japanese |
949 | EUC-KR | Korean |
1256 | Windows-1256 | Arabic |
If this file is absent, multibyte characters will not decode correctly, preventing non-ASCII text from rendering.
Control.Ani
font.ini
Tells graphic.dll which font file to load via FreeType and at what size. Read by the client at startup.
Used as a fallback if FontSetting.ini is not present or its values are not set or invalid.
Table of Contents
Patch 5517
✅ Verified (Client)
Located at ini/font.ini.
The file contains a single line in the format:
<fontname> <size>
| Part | Description |
|---|---|
fontname | Font filename in the client root, or an installed Windows font name. |
size | Default font size (int). Falls back to 12 if 0 or missing. |
Examples
Load simsun.ttf from the client root folder at size 14:
simsun.ttf 14
FontSetting.ini
Configures the fonts used for in-game text rendering. Read once at startup by the client. If the file or font does not exist, it falls back to the value in font.ini.
This file does not exist by default with the English distribution, but can be created.
Table of Contents
Patch 5517
✅ Verified (Client)
Located at ini/FontSetting.ini.
[FontSetting]
ChatFontSize=12
ChatFont=simsun.ttf
GUIFont=simsun.ttf
| Field | Type | Description |
|---|---|---|
ChatFontSize | int | Size used for chat and floating text. |
ChatFont | string | Font filename in the client root, or an installed Windows font name, used for chat text. |
GUIFont | string | Font filename in the client root, or an installed Windows font name, used for GUI labels. |
fuse.ini
GameMap.dat
This file is loaded when the client starts. It maps the Map IDs to either the DMap or, in later clients, its compressed archive equivalent (.7z files).
Table of Contents
Patch 5517
File Header
| Offset | Size | Type | Description |
|---|---|---|---|
| 0 | 4 | UInt32 | Number of records in the file |
Record Structure
| Offset | Size | Type | Description | Example |
|---|---|---|---|---|
| 0 | 4 | UInt32 | Map ID | 1000 |
| 4 | 4 | UInt32 | Length of the filepath | 17 |
| 8 | [Length] | String | Map path (Ascii Unterminated) | map/map/desert.7z |
| 8 + Length | 4 | UInt32 | Puzzle Size | 256 |
Example Entries
| Map ID | Map Path | Puzzle Size |
|---|---|---|
| 1000 | map/map/desert.7z | 256 |
| 1001 | map/map/d_antre01.7z | 256 |
| 1002 | map/map/newplain.7z | 256 |
| 1003 | map/map/mine01.7z | 256 |
| ... | ... | ... |
Parsing Script
The following is a simple python script which reads and parses the GameMap.dat. Pass the filepath as the first arg & it will output each map ID alongside its path. Example: python3 gamemap_decode.py GameMap.dat
import struct, sys
with open(sys.argv[1], "rb") as f:
count, = struct.unpack("<I", f.read(4)) # Little-Endian uint32 - Header (Record Count)
for idx in range(count):
map_id, name_len = struct.unpack("<II", f.read(8)) # Read ID & Length of Map Name
name = f.read(name_len).decode("ascii") # Read the map name
f.read(4) # Puzzle Size (value always 256), don't need to print it
print(f"{map_id}: {name}")
gui.ini
ItemType.dat
This file is loaded when the client starts. It defines every item in the game such as equipment, weapons, consumables, mounts, soul/purification, garments, crafting materials, and more.
Records in itemtype.dat are the default values for the item, MsgItemInfo can be used to supply some of the dynamic values (such as the socketed gems, expiration time, durability and more)
See Item ID for the full breakdown of how Item IDs encodes information such category, weapon type, item level & quality for equipment.
Table of Contents
Patch 5517
In Patch 5517, this file is encrypted with TQ File Cipher with seed: 9527 (0x2537).
File Format
After decryption, the file is plain-text with an item record-per-line. Each field is separated by @@ and ends with a trailing @@\r\n.
~ is used as space characters and backticks (`) used as apostrophe in fields such as item name and description.
Record Structure
| Field | Name | Type | Description |
|---|---|---|---|
| 1 | id | uint32 | Item ID |
| 2 | name | string | Item Name |
| 3 | req_profession | uint8 | Required Hero Profession |
| 4 | req_weaponskill | uint8 | Required Weapon Proficiency level |
| 5 | req_level | uint8 | Minimum character level required to equip or use |
| 6 | req_sex | uint8 | Hero gender restriction (0=any, 1=Male , 2=Female) |
| 7 | req_force | uint16 | Required Strength attribute amount |
| 8 | req_speed | uint16 | Required Agility attribute amount |
| 9 | req_health | uint16 | Required Vitality attribute amount |
| 10 | req_soul | uint16 | Required Spirit attribute amount |
| 11 | monopoly | uint8 | Bitmask trade, warehouse, bound, lock & drop restrictions |
| 12 | weight | uint16 | Used on a few event item tooltips |
| 13 | price | int32 | NPC buy price in silver |
| 14 | id_action | int32 | Script or action ID to trigger on use or equip (0 = none) |
| 15 | attack_max | uint16 | Maximum physical attack |
| 16 | attack_min | uint16 | Minimum physical attack |
| 17 | defense | uint16 | Physical defense bonus |
| 18 | agility | uint16 | Agility bonus |
| 19 | dodge | uint16 | Dodge bonus |
| 20 | life | uint16 | HP bonus |
| 21 | mana | uint16 | MP bonus |
| 22 | durability | uint16 | Default durability. In the item tooltip this is displayed as floor(value / 100) |
| 23 | durability_limit | uint16 | Maximum durability. In the item tooltip this is displayed as floor(value / 100) |
| 24 | identified | uint8 | Unused |
| 25 | gem1 | uint8 | Socket 1 Gem Item ID (0 = empty socket) |
| 26 | gem2 | uint8 | Socket 2 Gem Item ID (0 = empty socket) |
| 27 | magic1 | int32 | Unused, set via MsgItemInfo |
| 28 | magic2 | uint8 | Unused, set via MsgItemInfo |
| 29 | n_amount | uint8 | +N item value & +N item stones |
| 30 | data | int32 | Unused, set via MsgItemInfo for additional attributes (socket progress, container amount) |
| 31 | magic_atk | uint16 | Magic attack bonus |
| 32 | magic_def | uint16 | Magic defense bonus |
| 33 | atk_range | uint16 | Attack range |
| 34 | atk_speed | uint16 | Attack speed |
| 35 | fray_mode | uint8 | Unknown 0 on all normal equipment. 2 on garments & mount armor. (Suspected: Different durability algorithm for garments) |
| 36 | repair_mode | uint8 | Unknown 0 on normal equipment. 2 on garments & mount armor. 3 on gourds. (Suspected: Different repair mechanic for garments / gourds) |
| 37 | type_mask | uint8 | Is set to 1 on Cosmetic Equipment (Garments / Mounts) appears client uses it in Character Pose Actions (Unknown purpose) |
| 38 | emoney_price | int32 | Conquer Points (CP) shop price. 0 = not sold for CP |
| 39 | emoney_bound_price | int32 | Bound Conquer Points (CP) Shop Price. 0 = not sold for Bound CP |
| 40 | expiry_time | int32 | Item duration in minutes. Used on some mounts, cosmetics & quest items |
| 41 | soul_atk_1 | int32 | Soul - Critical Strike percentage bonus (value / 100)% |
| 42 | soul_atk_2 | int32 | Soul - Skill Critical Strike percentage bonus (value / 100)% |
| 43 | soul_def_1 | int32 | Soul - Immunity percentage bonus (value / 100)% |
| 44 | soul_atk_3 | int32 | Soul - Penetration percentage bonus (value / 100)% |
| 45 | soul_def_2 | int32 | Soul - Block percentage bonus (value / 100)% |
| 46 | soul_atk_4 | int32 | Soul - Breakthrough percentage bonus (value / 10)% |
| 47 | soul_def_3 | int32 | Soul - Counteraction percentage bonus (value / 10)% |
| 48 | max_stack_size | int32 | Maximum amount the same item can be stacked in same item slot |
| 49 | elem_res_metal | int32 | Metal element resistance bonus (unused) |
| 50 | elem_res_wood | int32 | Wood element resistance bonus |
| 51 | elem_res_water | int32 | Water element resistance bonus |
| 52 | elem_res_fire | int32 | Fire element resistance bonus |
| 53 | elem_res_earth | int32 | Earth element resistance bonus |
| 54 | item_type | string | Tooltip description of the item type |
| 55 | description | string | Tooltip long description about the item |
| 56 | quality_color | int32 | For non-equipment, the item name color. Quality value same as Equipment Quality |
| 57 | dragonsoul_phase | uint16 | Dragonsoul phase number (1-6) |
| 58 | dragonsoul_req | int32 | Dragonsoul requirement to reach next phase |
| 59 | crop_quality | int32 | Only used by item Riding Crop quality (1=Unique, 2=Elite, 3=Super) |
Parsing Script (To CSV)
You must first decrypt itemtype.dat using TQ File Cipher with seed: 9527 (0x2537). Then you can use this python script to parse the file and output it as a CSV file.
Pass the decrypted itemtype.dat path as the first arg & it will output a csv called itemtype.csv. This script has no error handling, checks or dependencies as it is intentionally kept minimal for readability.
Example: python3 itemtype_decode.py itemtype_decrypted.dat
import csv, sys
# NOTE: This script has only been tested on client 5517 itemtype.dat. Other patches may have a different amount of fields so this script will not work
FIELDS_PATCH_5517 = [
"id", "name", "req_profession", "req_weaponskill", "req_level", "req_sex",
"req_force", "req_speed", "req_health", "req_soul", "monopoly", "weight",
"price", "id_action", "attack_max", "attack_min", "defense", "agility",
"dodge", "life", "mana", "durability", "durability_limit", "identified",
"gem1", "gem2", "magic1", "magic2", "n_amount", "data", "magic_atk",
"magic_def", "atk_range", "atk_speed", "fray_mode", "repair_mode", "type_mask",
"emoney_price", "emoney_bound_price", "expiry_time", "soul_atk_1", "soul_atk_2",
"soul_def_1", "soul_atk_3", "soul_def_2", "soul_atk_4", "soul_def_3",
"max_stack_size", "elem_res_metal", "elem_res_wood", "elem_res_water",
"elem_res_fire", "elem_res_earth", "item_type", "description",
"quality_color", "dragonsoul_phase", "dragonsoul_req", "crop_quality",
]
input_path = sys.argv[1]
output_path = sys.argv[2] if len(sys.argv) > 2 else "itemtype.csv"
# Some items have chinese characters (gbk encoding) & mark unknown characters with '?'
with open(input_path, "r", encoding="gbk", errors="replace") as f_in, \
open(output_path, "w", newline="", encoding="utf-8") as f_out:
writer = csv.writer(f_out)
writer.writerow(FIELDS_PATCH_5517)
skipped = 0
rows_extracted = 0
for line in f_in:
line = line.strip()
if not line:
continue
parts = line.split("@@")
if parts[-1] == "":
parts = parts[:-1]
if len(parts) != len(FIELDS_PATCH_5517):
skipped += 1
continue
writer.writerow(parts)
rows_extracted += 1
if skipped > 0:
print(f"Warning: {skipped} rows were skipped as they had an incorrect amount of fields.")
print(f"Completed {rows_extracted} extracted from {input_path} to {output_path}")
LevelExp.dat
This file was used in Conquer 1.0 and some early Conquer 2.0 patches (superseded by LevExp.dat)
It maps each level to the experience points required to reach the next level.
Table of Contents
Patch 4267
☑️ Assumed (Soul)
File Structure
The file is a flat array of UInt32 values, one per level. Levels start at 1, where i is the zero-based array index:
| Offset | Type | Description |
|---|---|---|
i * 4 | UInt32 | EXP to reach level i+1 |
Encryption
Each UInt32 in the file is XOR-encrypted using a hardcoded 27-byte Chinese string: ★就这样被你蒸熟★.
In bytes, this UTF-8 string is: E2 98 85 E5 B0 B1 E8 BF 99 E6 A0 B7 E8 A2 AB E4 BD A0 E8 92 B8 E7 86 9F E2 98 85 which is used as the XOR key (each byte treated as a signed char).
Example Entries
| Level | EXP Required |
|---|---|
| 1 | 59 |
| 2 | 195 |
| 3 | 203 |
| 4 | 320 |
| 5 | 573 |
| ... | ... |
Parsing Script
The following Python script decodes LevelExp.dat and prints each level alongside its EXP requirement.
Pass the filepath as the first argument. Example: python3 levelexp_decode.py LevelExp.dat
import struct, sys, math
KEY = bytes.fromhex("E29885E5B0B1E8BF99E6A0B7E8A2ABE4BDA0E892B8E7869FE29885")
with open(sys.argv[1], "rb") as f:
data = f.read()
count = math.floor(len(data) / 4) # Find number of levels based on file size
values = struct.unpack(f"<{count}I", data)
for level in range(1, count + 1):
key_byte = KEY[(level - 1) % len(KEY)]
mask = (key_byte | 0xFFFFFF00) if key_byte > 0x7F else key_byte # Signed Byte
exp = (values[level - 1] ^ mask) & 0xFFFFFFFF
print(f"Level {level}: {exp} EXP")
levexp.dat
Magic Type
magictypeop.dat
MapDestination.dat
MapMagicItem.ini
This file is loaded on client role data initialization, and utilized by MsgMapItem to show magical effects on the map floor. These effects play as "moments" that the client iterates through: starting with "start" and ending with "end". If any of the moment TMEs are "0" in the file, then that moment will be skipped.
The "look" described in MsgMapItem is the type key in the INI file.
Table of Contents
Patch 4267
☑️ Assumed (Soul)
| Field | Type | Description | Example |
|---|---|---|---|
| Start | String | Starting TME to play at start of processing | rain01.TME |
| Last | String | Lasting TME playing until effect is removed | windblade7-1.TME |
| End | String | Ending TME to play at the end of processing | line05.TME |
Below is an example entry using the definition above:
[Type10]
Start=rain01.TME
Last=windblade7-1.TME
End=line05.TME
Monster.dat
Monster Type
mounttype.dat
MyAnimate.dat
Npc.ini
This file defines the 3D model, animations, and rendering properties for each NPC type. The server references NPCs by their type ID in MsgNpcInfo the client uses this file to know how to render them.
Table of Contents
Patch 5517
✅ Verified (Client)
Each section header follows the format:
[NpcTypeX]
Where X is the NPC type ID. The client parses it by stripping the NpcType prefix and reading the int.
Below is an example entry using the definition above:
[NpcType1]
Name=Storekeeper
SimpleObjID=0211
StandByMotion=9990010100
BlazeMotion=9990010190
RestMotion=9990010101
Effect=none
ASB=5
ADB=6
FixDir=0
| Field | Type | Description |
|---|---|---|
Name | string | Display name shown above the NPC in-game. Can be overridden by MsgNpcInfo |
SimpleObjID | uint | ID of the object in C3 Simple Objects |
StandByMotion | int64 | Motion ID in C3 for Standing-Still NPC (Not Interacted With) |
BlazeMotion | int64 | Motion ID in C3 when Hovering-Over or Interacting with NPC |
RestMotion | int64 | Motion ID in C3 that plays periodically when on-screen & not interacting |
Effect | string | Name of a 3DEffect in C3 to add to the NPC. Default is none. |
ASB | int | Alpha Source Blend. See: 3DEffect.ini |
ADB | int | Alpha Destination Blend 3DEffect.ini |
FixDir | uint | Fixed facing direction. 0 = NPC rotates to where player is on interaction. 1 = NPC stays fixed direction |
ZoomPercent | int | (Optional) Model scale as a percentage. Defaults to 100 |
NpcX.ini
This file defines the appearance for NPC types that are rendered as full character models with equipment, rather than the simple 3D objects.
These are NPCs which are the class promotion NPCs and dressed with weapons and armor.
Table of Contents
Patch 5517
✅ Verified (Client)
Each section header follows the format:
[X]
Where X is the NPC type ID. Unlike npc.ini, there is no NpcType prefix.
Below is an example entry using the definition above:
[5000]
Name=WarriorGod
AddSize=1
Scale=120
FixDir=0
Look=500
Head=0
Hair=0
Armet=111300
Armor=0
RWeapon=560439
LWeapon=900309
Misc=0
Mount=0
Effect=foot03
| Field | Type | Description |
|---|---|---|
Name | string | Display name shown above the NPC in-game. Can be overridden by MsgNpcInfo |
AddSize | int | Unknown, always 1. |
Scale | uint | Model scale as a percentage. Defaults to 100 |
FixDir | uint | Fixed facing direction. 0 = NPC rotates to where player is on interaction. 1 = NPC stays fixed direction |
Look | uint | This is the overall look of the NPC (body & armor) from C3 under mix_body |
Head | uint | Seems to always be zero, as Armet takes precedence (and no Head items in C3) |
Hair | uint | Seems to always be zero, as Armet takes precedence. But can be Hairstyle |
Armet | uint | Helmet item ID. 0 = none. |
ArmetColor | int | Color/quality value prepended (as 00X) to the Armet ID to form the C3 mesh path. e.g. ArmetColor=3 + Armet=111300 == c3/mesh/003111300. Defaults to 3 if not specified. |
Armor | uint | Seems to always be zero, as look takes precedence. |
ArmorColor | int | The armor quality, by default this is 3. Unused as Armor is zero. |
RWeapon | uint | Right-hand weapon item ID. 0 = none. |
LWeapon | uint | Left-hand weapon item ID. 0 = none. |
Misc | uint | Always 0, there's only one Misc in C3 and unrelated to this. |
Mount | uint | Always 0, but can be set to a mount from C3 (8010001) - but breaks the model |
Effect | string | Name of a 3DEffect in C3 to add to the NPC. Default is none. |
Peerage.ini
This file defines the icons & 3DEffects for the Nobility system.
Table of Contents
Patch 5517
✅ Verified (Client)
The ini-heading is a number that follows the formula:
(Rank Number * 10) + Gender
Gender (calculated by the client from the hero's mesh) is 1 for Male or 2 for Female.
The Peerage ranks are:
| Rank Number | Title |
|---|---|
| 12 | King / Queen |
| 9 | Prince / Princess |
| 7 | Duke / Duchess |
| 5 | Earl / Countess |
| 3 | Baron / Baroness |
| 1 | Knight / Lady |
| 0 | Commoner |
For example, ini-heading [72] is the female (2) version of the 7th Rank (70) = Duchess.
Below is an example entry using the definition above:
[71]
Name=Duke
Icon16=nob_Marquis16
Icon32=nob_Marquis32
Icon64=nob_Marquis64
Font16=nob_MarquisFont16
Font32=nob_MarquisFont32
Font64=nob_MarquisFont64
StatusIconID=40
StatusIconEffect=InsigniaNoble05s
Effect1=letter5
Effect2=coronet2
Button=checont_shiremarquis
ChatIcon=nob_MarquisJPG
ChatFont=nob_MarquisFontJPG
| Field | Type | Description |
|---|---|---|
Name | string | Display name of the rank used in various places during string formatting |
Icon16 | string | Small DDS icon for the rank in the leaderboard (data/interface/Style01/nobility) |
Icon32 | string | Medium DDS icon for the rank in the leaderboard (data/interface/Style01/nobility) |
Icon64 | string | Large DDS icon for the rank in the leaderboard (data/interface/Style01/nobility) |
Font16 | string | Small DDS glowing text for the rank in the leaderboard (data/interface/Style01/nobility) |
Font32 | string | Medium DDS glowing text for the rank in the leaderboard (data/interface/Style01/nobility) |
Font64 | string | Large DDS glowing text for the rank in the leaderboard (data/interface/Style01/nobility) |
StatusIconID | uint | Status button icon ID for the rank. Defined in StatusTips.ini (data/pic/Contribute) |
StatusIconEffect | string | Glowing status icon in C3 (c3/effect/other/rank) |
Effect1 | string | Text 3D effect that appears on the hero in C3 (c3/effect/other/rank/letter) |
Effect2 | string | Crown effect that appears on the hero in C3 (c3/effect/other/rank/coronet) |
Button | string | Button for the rank in the Contribute Dialog. Defined in Control.ani (data/interface/Style01/checontribute) |
ChatIcon | string | Rank icon in the whisper chat window. Defined in chatContribute.ani (data/interface/Style01/chatsystem/nobility_JPG) |
ChatFont | string | Rank name in the whisper chat window. Defined in chatContribute.Ani (data/interface/Style01/chatsystem/nobility_JPG) |
ProfessionalName.ini
This file maps each ProfessionType identifier to its display name.
Table of Contents
Patch 4267
☑️ Assumed (Soul)
ProfessionType Structure
The leading digits identify the class and the trailing digit is the promotion rank within that class:
| Range | Class |
|---|---|
| 10 - 15 | Trojan |
| 20 - 25 | Warrior |
| 40 - 45 | Archer |
| 100+ | Taoist |
File Format
This is a plain-text file with one entry per line, comma-separated:
<ProfessionType>,<Name>
Example Entries
| ProfessionType | Name |
|---|---|
| 10 | InternTrojan |
| 11 | Trojan |
| 12 | VeteranTrojan |
| 13 | TigerTrojan |
| 14 | DragonTrojan |
| 15 | TrojanMaster |
| 20 | InternWarrior |
| 21 | Warrior |
| 22 | BrassWarrior |
| 23 | SilverWarrior |
| 24 | GoldWarrior |
| 25 | WarriorMaster |
| ... | ... |
Play.dat
RaceTrackProp.dat
Res.dat
role.dat
Server.dat
Shop.dat
showhandlayout.dat
ShowHandTable.dat
slient.dat
start.dat
start-facebook.dat
StatusEffect.ini
This file is used to map effects to player statuses for MsgUserInfo. The index mapping can be found on that page, but the file structure for mapping those effects can be found below. Though labeled as an INI file, it doesn't follow the syntax. Each entry is space delimitated and line separated.
Table of Contents
Patch 4267
✅ Verified (Client)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | Int64 | Index | Status index | 1 |
| 1 | Char[64] | 3DEffect | 3D effect name | poisonstate |
| 2 | Char[64] | 2DEffect | 2D effect name | NULL |
StrRes.ini
A key-value string resource file used by the client to look up UI text, system messages, and error strings by integer ID. Read at client startup.
Table of Contents
Patch 5517
✅ Verified (Client)
Located at ini/StrRes.ini.
Each line is in the format:
<StringID>=<String>
String values may contain printf-style format specifiers (%d, %s, %f, %I64u) and escape sequences (\n for newline). Both English and GBK-encoded Chinese strings are supported in the same file.
ID Ranges
A comment at the top of the file (written in Chinese) documents the intended ID ranges.
| Range | Subsystem |
|---|---|
| 10000 - 50000 | Interface |
| 100000 - 200000 | 3DRole |
| 300000 - 400000 | 3DGameMap |
| 500000 - 600000 | 3DBaseCode |
suittype.dat
Tips.dat
Title.ini
tqist.dat
UserHelpInfo.dat
UserHelpInfo.ini.dat
version.dat
VipTrans.ini
This file defines the teleport destinations available to VIP players. It is read by the client to populate the City Teleport (VIP Level 2+) & Portal Teleport (VIP Level 3+) dialog buttons.
City Teleport is the major cities such as TwinCity, PhoenixCastle, ApeCity, DesertCity & BirdIsland
Portal Teleport is a section of the map, for example: WindPlain-Turtledove - for the Turtledove section of Windplain.
Table of Contents
Patch 5517
✅ Verified (Client)
Each line contains three space-separated fields:
<Index> <Group> <LocationName>
| Field | Type | Description |
|---|---|---|
Index | int | The order within the group |
Group | int | 1 = City Teleport, 0 = Portal Teleport |
LocationName | string | Name of the location |
WeaponSkillLevelExp.ini
This file maps weapon skill levels to experience required to obtain the level. Similarly to WeaponSkillName.ini, this file is not an INI file. It's a CSV file where each new line in the list is a weapon skill level, and each entry has comma delimited fields.
Table of Contents
Patch 4267
✅ Verified (Client)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt32 | Level | Weapon skill level | 1 |
| 1 | UInt32 | Exp | Weapon skill experience | 0 |
WeaponSkillName.ini
This file maps weapon skill types to their names. Though labeled as an INI file, it's actually a CSV file where each new line in the list is a weapon skill entry, and each entry has comma delimited fields.
Table of Contents
Patch 4267
✅ Verified (Client)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt32 | Index | Weapon skill type index | 490 |
| 1 | Char[16] | Name | Weapon skill name | Dagger |
Formats
DAT
A DAT file is generic data. DAT files are either plain-text, binary-encoded, or encrypted. This page lists the DAT files in the client patch version and an overview of how to read them. For an explanation of what each file does, see its individual linked page.
DAT File Formats Summary
-
TQ File Cipher: Files which are marked as encrypted by TQ File Cipher. These files can be decrypted & re-encrypted. The seed for each file is listed in brackets.
-
RSA: Files which are marked RSA have been encrypted by a TQ 2048-bit RSA private key. The public key is baked and obfuscated in the client binary. While it's possible to extract the public key from the binary to decrypt the file, it is not possible to re-encrypt without the private key.
-
SWF: Files which are marked SWF are actually a SWF file (Shockwave Flash). Rename the extension to SWF. jpexs-decompiler is a good & free decompiler for this file type.
-
Binary Encoded: The file is unencrypted, but has a binary structure. A hex editor can be used to inspect the raw binary contents but a dedicated parser is required to read it correctly. See the individual linked dat file for more information.
-
Unencrypted - Plain Text: The file is unencrypted, you should be able to open the file in notepad without issues.
Patch 5517
| File (relative to client root) | DAT Format |
|---|---|
| ./AutoPatch.dat | Unencrypted - Plain Text |
| ./ini/UserHelpInfo.dat | TQ File Cipher (Seed: 9527 / 0x2537) |
| ./ini/Action.dat | Unencrypted - Binary Encoded. Unused File (Remnant) |
| ./ini/Monster.dat | TQ File Cipher (Seed: 9527 / 0x2537) |
| ./ini/GameMap.dat | Unencrypted - Binary Encoded |
| ./ini/AutoAllot.dat | Unencrypted - Binary Encoded. Unused File (Remnant) |
| ./ini/MyAnimate.dat | RSA Encrypted |
| ./ini/LevelExp.dat | Custom Encrypted: XOR with Hardcoded 27-Byte Key. Unused File (Remnant) |
| ./ini/Shop.dat | Unencrypted - Plain Text |
| ./ini/Play.dat | Custom Encrypted: Subtract 6 from each byte (Used in play.exe launcher) |
| ./ini/ShowHandTable.dat | RSA Encrypted |
| ./ini/suittype.dat | RSA Encrypted |
| ./ini/RaceTrackProp.dat | RSA Encrypted |
| ./ini/magictypeop.dat | TQ File Cipher (Seed: 9527 / 0x2537) |
| ./ini/slient.dat | TQ File Cipher (Seed: 9527 / 0x2537) |
| ./ini/mounttype.dat | TQ File Cipher (Seed: 9527 / 0x2537) |
| ./ini/levexp.dat | TQ File Cipher (Seed: 1234 / 0x04D2) |
| ./ini/tqist.dat | Unknown (Referenced in ndist.dll) |
| ./ini/UserHelpInfo.ini.dat | TQ File Cipher (Seed: 9527 / 0x2537) |
| ./ini/MagicType.dat | TQ File Cipher (Seed: 9527 / 0x2537) |
| ./ini/showhandlayout.dat | RSA Encrypted |
| ./ini/itemtype.dat | TQ File Cipher (Seed: 9527 / 0x2537) |
| ./ini/MapDestination.dat | TQ File Cipher (Seed: 9527 / 0x2537) |
| ./ini/Tips.dat | Unencrypted - Binary Encoded |
| ./version.dat | Unencrypted - Plain Text |
| ./res.dat | Unencrypted - Plain Text |
| ./Server.dat | RSA Encrypted |
| ./data/main/start.dat | SWF - Shockwave Flash File |
| ./data/main/role.dat | SWF - Shockwave Flash File |
| ./data/main/start-facebook.dat | SWF - Shockwave Flash File |
DMAP
TME
Network
This section documents network procedures and message types for client-server communication.
Conquer Online uses TCP/IPv4 for network communication between the game servers and client. Messages are received as a stream, and ordering must be preserved for the correct processing of requests. Message encryption relies on the previous message, either as a counter or using cipher feedback; therefore, if the messages are encrypted and decrypted out of order, the client and server will desynchronize.
Protocol
Conquer Online uses Little-endian for the byte ordering of words and multi-byte sequences.
Games developed by TQ Digital Entertainment employ a custom binary protocol in this endianness, and contain a message header and sometimes a message footer. Messages are written to the binary protocol using custom encoding rules that change between versions of the client. These changes are documented in the Messages section.
Subsections
- Messages: Definitions for how the client and server communicate.
Identifiers
Unique identifiers in Conquer Online are 32-bit unsigned integers split into incremental ranges. Due to the small size of identifiers, some must be recycled and reused, such as monster identifiers. The easiest method of recycling these identifiers is to create reservations per spawn area.
⚠️ WARNING
Incremental IDs, such as account IDs and item IDs, can be too predictable and lead to exposing account information of your PM / first created accounts on the server, or items in the database. Consider using a linear-feedback shift register for a pseudo-random identifier that is deterministic for counting, but obfuscated for general security use.
Table of Contents
Account Server
Account IDs can be any number in the range of a 32-bit unsigned integer.
Game Server
The game server has the following ranges statically defined.
| Min | Max | Name | Description |
|---|---|---|---|
| 0000001 | 0000299999 | Scene | Scenery NPC |
| 0000001 | 0000099999 | System NPC | Statically spawned NPC |
| 0100001 | 0000199999 | Dynamic NPC | Dynamically spawned NPC |
| 0400001 | 0000499999 | Monster | World monster spawn |
| 0500001 | 0000599999 | Pet | Syndicate monster spawn |
| 0700001 | 0000799999 | Call Pet | Player monster spawn |
| 0900001 | 0000989999 | Magic Trap | Player spell trap from MsgMapItem |
| 0990001 | 0000999999 | System Trap | System trap from MsgMapItem |
| 1000000 | 3999999999 | Hero | Player character |
Some identifiers, such as items, are incremental across a 32-bit unsigned integer range.
Messages
This subsection organizes messages by the name found in the assembly of the macOS game client. See the table below for a mapping from message type to message definition.
Message Header
The table below defines TQ's message header. The header is written to all messages first and contains the size of the message (aka. the message length minus the size of the footer) and the message type (a constant identifier for handling the message on the client and server).
| Pos | Type | Description | Example |
|---|---|---|---|
| 0 | UInt16 | Message Size | 60 |
| 2 | UInt16 | Message Type | 1001 |
Message Footer
The message footer in Conquer Online was added in patch 5018. The footer contains an 8-byte string identifying the sender of the message. If the client sent the message, the footer would be "TQClient"; else, it would be "TQServer".
Message Types
The table below is an abstract and directory of message types used in various patches of Conquer Online.
For some message types, in later client versions the message type changed to a 5-digit value. These are noted in the table in brackets, see the individual message documentation for which patch version applies.
Msg2ndPsw
MsgAccount
This client message is sent to the account server to request authentication. There have been multiple message types over the years for handling authentication requests from the client. MsgAccount is the first, but was later replaced by MsgAccountSRP6 and MsgAccountSRP6Ex in versions 5532+.
In this message, the player's password is encrypted using RC5.
⚠️ WARNING
The password in this message is encrypted using a static key in earlier versions of the client. Although later versions start to use a generated key, that key is exchanged using MsgEncryptCode and does not protect against proxies employing a man-in-the-middle attack. This was patched in version 5532 with the use of SRP6, which also added additional complexity for clientless bot creation.
Table of Contents
Patch 4267
Message Definition
☑️ Assumed (Observed) - CoFuture + Soul
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 52 |
| 2 | UInt16 | MsgType | Type of message | 1051 |
| 4 | Char[16] | Account | Fixed string of the username | Player |
| 20 | Char[16] | Password | Encrypted buffer containing the password | RC5(Password) |
| 36 | Char[16] | Server | Fixed string of the game server | Meteor |
Patch 5165
Message Definition
✅ Verified (Client)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 276 |
| 2 | UInt16 | MsgType | Type of message | 1086 |
| 4 | Char[128] | Account | Fixed string of the username | Player |
| 132 | Char[128] | Password | Encrypted buffer containing the password | RC5(Password) |
| 260 | Char[16] | Server | Fixed string of the game server | Meteor |
MsgAccountKalydo
MsgAccountSoftKb
MsgAccountSRP6
This client message is sent to the account server to request authentication using SRP6 as an augmented password-authenticated key exchange, replacing the previous MsgAccount message that used an RC5 encrypted password in patch 5532. The messages are similar, but the password field has been removed.
Before handling this message, an account needs to be created using a password verifier and salt rather than a password. The account server is expected look up the account's password verifier in the database to send MsgLoginChallengeS in response to this message.
Table of Contents
Patch 5635
Message Definition
☑️ Assumed (Observed)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 240 |
| 2 | UInt16 | MsgType | Type of message | 1124 |
| 8 | Char[128] | Account | Fixed string of the username | Player |
| 136 | Char[16] | Server | Fixed string of the game server | Meteor |
MsgAccountSRP6Ex
This client message is sent to the account server to request authentication using SRP6 as an augmented password-authenticated key exchange, replacing the previous MsgAccountSRP6 message. It combines MsgAccountSRP6, MsgConnect, MsgEncryptCode, and MsgPCNum into a single message, and implements a random buffer used as a key derivation function (KDF) in SRP6.
Before handling this message, an account needs to be created using a password verifier and salt rather than a password. The account server is expected look up the account's password verifier in the database to send MsgLoginChallengeS in response to this message.
Table of Contents
Patch 5635
Message Definition
❓ Unverified
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 312 |
| 2 | UInt16 | MsgType | Type of message | 1636 |
| 8 | Char[128] | Account | Fixed string of the username | Player |
| 136 | Char[16] | Server | Fixed string of the game server | Meteor |
| 152 | Char[16] | Mac Address | Mac address of connecting interface | 0A0B0C0D0E0F |
| 193 | Char[4] | Data | Contents of the Res.dat file | 0010 |
| 244 | Byte[64] | Random | Random buffer used as a KDF in SRP6 | |
| 308 | UInt32 | EncryptCode | Exchange seed for SRP6 | 10000 |
MsgAchievement
MsgAction
This message is received by the game server or game client as a general action request. The server responds to MsgAction with either a specific action message (such as a spawn that was missing or with item details) or with the MsgAction message itself (such as for the login messages). The client may or may not respond with the MsgAction in response to a server MsgAction message.
MsgAction is used for a variety of actions, such as configuring the client during login, changing maps, requesting inventory and friends lists, setting the hero's location on login, jumping, and more.
Table of Contents
Patch 4267
Message Definition
☑️ Assumed (Soul)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 28 |
| 2 | UInt16 | MsgType | Type of message | 1010 |
| 4 | UInt32 | System Time | Milliseconds of system uptime | 1579535985 |
| 8 | UInt32 | Hero ID | Unique identifier for the character | 1000000 |
| 12 | UInt16 | X | X coordinate of the action or hero | 320 |
| 14 | UInt16 | Y | Y coordinate of the action or hero | 460 |
| 16 | UInt32 | Direction | Action direction | 0 |
| 20 | UInt32 | Data | Payload or target identifier | 0 |
| 24 | UInt32 | Action | How to process the message | 0 |
Action Type
☑️ Assumed (Soul)
🔶 Response data
| Val | Name | Description | Recipient | ID | Data |
|---|---|---|---|---|---|
| 124 | CHANGE_DIR | Change facing direction | Server | Hero ID | |
| 126 | CHANGE_EMOTION | Change emoting action | Server | Hero ID | Action |
| 130 | CHANGE_MAP | Change map (portal) | Server | Hero ID | |
| 137 | ENTER_MAP | Request hero location | Server | Hero ID | Map ID 🔶 |
| 138 | GET_ITEMS | Load items on login | Server | Hero ID | |
| 139 | GET_FRIENDS | Load friends on login | Server | Hero ID | |
| 141 | LEAVE_MAP | Remove role entity from map | Client | Role ID | |
| 142 | JUMP | Role entity jump | Server | Role ID | LOW: X HIGH: Y |
| 146 | UP_LEVEL | Notify new level | Server | Hero ID | |
| 147 | XP_CLEAR | Notify clear XP | Server | Hero ID | |
| 148 | REVIVE | Request revive | Server | Hero ID | |
| 149 | DEL_ROLE | Delete hero | Server | Hero ID | |
| 150 | GET_WEAPON_SKILLS | Load skills on login | Server | Hero ID | |
| 151 | GET_MAGIC | Load spells on login | Server | Hero ID | |
| 152 | SET_PK_MODE | Set PK mode | Server | Hero ID | Mode |
| 153 | GET_SYN_ATTR | Get guild info | Server | Hero ID | |
| 154 | GHOST | Notify death | Server | Hero ID | |
| 155 | SYNCHRO | Synchronize screen | Server | Hero ID | |
| 156 | QUERY_FRIEND_INFO | Get friend info | Server | Hero ID | Target ID |
| 157 | QUERY_LEAVE_WORD | Get offline messages | Server | Hero ID | |
| 158 | CHANGE_FACE | Change teammate or own avatar | Both | Hero ID | Face |
| 159 | MINE | Mine with pickaxe | Server | Hero ID | |
| 160 | TEAM_MEMBER_POS | Teammate position | Client | Hero ID | LOW: X HIGH: Y |
| 161 | QUERY_PLAYER | Get player spawn | Server | Hero ID | |
| 162 | ABORT_MAGIC | Cancel magic or chargeup | Server | Hero ID | |
| 164 | MAP_ARGB | Set game map ARGB | Client | ARGB | |
| 166 | QUERY_MEMBER | Get team member info | Server | Hero ID | Target ID |
| 167 | CREATE_BOOTH | Create market booth | Both | Hero ID | LOW: X HIGH: Y |
| 168 | SUSPEND_BOOTH | Pause market booth (unused) | Server | Hero ID | |
| 169 | RESUME_BOOTH | Resume market booth | Both | Hero ID | LOW: X HIGH: Y |
| 170 | DESTROY_BOOTH | Remove market booth | Server | Hero ID | |
| 172 | POST_CMD | Run client command | Client | Hero ID | Command |
| 173 | QUERY_EQUIPMENT | Get player's equipment | Server | Hero ID | |
| 174 | ABORT_TRANSFORM | Cancel transformation | Server | Hero ID | |
| 176 | LANDING | Cancel flight | Server | Hero ID | |
| 177 | GET_MONEY | Pick up money | Client | Hero ID | Amount |
| 179 | ENEMY_INFO | Get enemy info | Server | Hero ID | |
| 181 | KICKBACK | Rubberband to coord | Client | Hero ID | LOW: X HIGH: Y |
| 182 | DROP_MAGIC | Remove magic type | Client | Hero ID | Magic Type |
| 183 | DROP_SKILL | Remove weapon skill | Client | Hero ID | Weapon Skill Type |
| 184 | SOUND_EFFECT | Monster sound at coord | Client | Hero ID | Monster Type |
| 186 | POST_DIALOG | Open a dialog window | Client | Hero ID | Dialog ID |
Patch 5017
Message Definition
☑️ Assumed (Observed) - Redux
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 24 |
| 2 | UInt16 | MsgType | Type of message | 1010 |
| 4 | UInt32 | System Time | Milliseconds of system uptime | 1579535985 |
| 8 | UInt32 | Hero ID | Unique identifier for the character | 1000000 |
| 12 | UInt32 | Data | Payload or target identifier | 0 |
| 16 | UInt16 | X | X coordinate of the action or hero | 320 |
| 18 | UInt16 | Y | Y coordinate of the action or hero | 460 |
| 20 | UInt16 | Direction | Action direction | 0 |
| 22 | UInt16 | Action | How to process the message | 0 |
Action Type
☑️ Assumed (Observed) - COPSv6
🔶 Response data
| Val | Name | Description | Recipient | ID | Data |
|---|---|---|---|---|---|
| 74 | GET_POSITION | Request hero location | Server | Hero ID | Map ID 🔶 |
| 75 | GET_ITEMS | Load items on login | Server | Hero ID | |
| 76 | GET_FRIENDS | Load friends on login | Server | Hero ID | |
| 77 | GET_WEAPON_SKILLS | Load skills on login | Server | Hero ID | |
| 78 | GET_MAGIC | Load spells on login | Server | Hero ID | |
| 79 | CHANGE_DIR | Change facing direction | Server | Hero ID | |
| 81 | CHANGE_EMOTION | Change emoting action | Server | Hero ID | Emotion |
| 85 | CHANGE_MAP | Change map (portal) | Server | Hero ID | |
| 86 | ENTER_MAP | Add entity to map | Server | Role ID | Map ID |
| 92 | UP_LEVEL | Notify new level | Server | Hero ID | |
| 93 | XP_CLEAR | Notify clear XP | Server | Hero ID | |
| 94 | REVIVE | Request revive | Server | Hero ID | |
| 95 | DEL_ROLE | Delete hero | Server | Hero ID | |
| 96 | SET_PK_MODE | Set PK mode | Server | Hero ID | Mode |
| 97 | GET_SYN_ATTR | Get guild info | Server | Hero ID | |
| 99 | MINE | Mine with pickaxe | Server | Hero ID | |
| 101 | TEAM_LEAD_POS | Get team leader position | Client | Hero ID | Game Map Type |
| 102 | QUERY_PLAYER | Get player spawn | Server | Hero ID | |
| 104 | MAP_ARGB | Set game map ARGB | Client | ARGB | |
| 105 | QUERY_MEMBER | Get team member info | Server | Hero ID | Target ID |
| 106 | TEAM_MEMBER_POS | Teammate position | Client | Hero ID | LOW: X HIGH: Y |
| 108 | KICKBACK | Rubberband to coord | Client | Hero ID | LOW: X HIGH: Y |
| 109 | DROP_MAGIC | Remove magic type | Client | Hero ID | Magic Type |
| 110 | DROP_SKILL | Remove weapon skill | Client | Hero ID | Weapon Skill Type |
| 111 | CREATE_BOOTH | Create market booth | Both | Hero ID | LOW: X HIGH: Y |
| 112 | SUSPEND_BOOTH | Pause market booth (unused) | Server | Hero ID | |
| 113 | RESUME_BOOTH | Resume market booth | Both | Hero ID | LOW: X HIGH: Y |
| 114 | DESTROY_BOOTH | Remove market booth | Server | Hero ID | |
| 116 | POST_CMD | Run client command | Client | Hero ID | Command |
| 117 | QUERY_EQUIPMENT | Get player's equipment | Server | Hero ID | |
| 118 | ABORT_TRANSFORM | Cancel transformation | Server | Hero ID | |
| 120 | LANDING | Cancel flight | Server | Hero ID | |
| 121 | GET_MONEY | Pick up money | Client | Hero ID | Amount |
| 123 | ENEMY_INFO | Get enemy info | Server | Hero ID | |
| 126 | POST_DIALOG | Open a dialog window | Client | Hero ID | Dialog ID |
| 130 | QUERY_LEAVE_WORD | Get offline messages | Server | Hero ID | |
| 132 | LEAVE_MAP | Remove role entity from map | Client | Role ID | |
| 133 | JUMP | Role entity jump | Server | Role ID | LOW: X HIGH: Y |
| 137 | GHOST | Notify death | Server | Hero ID | |
| 138 | SYNCHRO | Synchronize screen | Server | Hero ID | |
| 140 | QUERY_FRIEND_INFO | Get friend info | Server | Hero ID | Target ID |
| 142 | CHANGE_FACE | Change teammate or own avatar | Both | Hero ID | Face |
| 162 | PATHFINDING | Trigger pathfinding to X, Y | Client | Hero ID | |
| 163 | ABORT_MAGIC | Cancel magic or chargeup | Server | Hero ID |
MsgAllot
This message is sent by the client to allot attribute points.
⚠️ WARNING
Although the client checks the number of attribute points that can be allotted, a modified client can easily spoof this message with values beyond what is available. Ensure that your game server checks the number of attribute points that can be allotted before saving.
Table of Contents
Patch 4267
Message Definition
☑️ Assumed (Soul)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 8 |
| 2 | UInt16 | MsgType | Type of message | 1024 |
| 4 | Byte | Force | Points towards strength | 1 |
| 5 | Byte | Speed | Points towards dexterity | 2 |
| 6 | Byte | Health | Points towards vitality | 5 |
| 7 | Byte | Soul | Points towards spirit | 0 |
MsgAnnounceInfo
MsgAnnounceList
MsgArenicScore
MsgArenicWitness
MsgAuction
MsgAuctionItem
MsgAuctionQuery
MsgAura
MsgAuraGroup
MsgBattleEffectiveness
Undocumented
MsgCampFight
MsgCampFightInfo
MsgChangeName
MsgCheatingProgram
MsgCompleteRank
MsgConfirmKeyLogin
MsgConfirmKeyLoginMobile
MsgConnect
This client message is first sent to the account server after receiving MsgConnectEx, and then sent to the game server after the client disconnects from the account server and connects to the game server specified in MsgConnectEx. The game server is expected to respond to this connection attempt with MsgTalk (see this message type for details on that interaction).
The account ID in the account server MsgConnect message is copied from MsgConnectEx, and the account ID and data fields in the game server MsgConnect message are also copied from MsgConnectEx.
⚠️ WARNING
A serious exploit is possible using this message on some servers. If a deterministic key is used, such as the account ID, an encrypted account ID, or incrementor, then it may be possible for any bad actor to log into any character in the game (bypassing the account server).
The following are some example fixes employed in various server projects for replacing the two 32-bit fields:
- Short-lived access token sent from the account server to the game server over RPC, paired with the connector's IP address and account ID.
- Short-lived connection request record stored in a shared database containing the connector's IP address and account ID.
Table of Contents
Patch 4267
Account Server Message Definition
☑️ Assumed (Observed) - Comet
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 28 |
| 2 | UInt16 | MsgType | Type of message | 1052 |
| 4 | UInt32 | Account ID | Account id from the account server | 1 |
| 8 | UInt32 | Data | Contents of the Res.dat file | 10 |
| 12 | Char[16] | Info | Name of the file | Res.dat |
Game Server Message Definition
☑️ Assumed (Observed) - Comet
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 28 |
| 2 | UInt16 | MsgType | Type of message | 1052 |
| 4 | UInt32 | Account ID | Account id from the account server | 1 |
| 8 | UInt32 | Data | Encryption key generator parameter | 6351601 |
| 12 | Char[16] | Info | Build version and language | 117 English |
Patch 4343
Account Server Message Definition
☑️ Assumed (Observed) - Comet
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 28 |
| 2 | UInt16 | MsgType | Type of message | 1052 |
| 4 | UInt32 | Account ID | Account id from the account server | 1 |
| 8 | UInt32 | Data | Contents of the Res.dat file | 10 |
| 12 | Char[16] | Info | Name of the file | Res.dat |
Game Server Message Definition
☑️ Assumed (Observed) - Comet
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 28 |
| 2 | UInt16 | MsgType | Type of message | 1052 |
| 4 | UInt32 | Account ID | Account id from the account server | 1 |
| 8 | UInt32 | Data | Encryption key generator parameter | 6351601 |
| 12 | UInt16 | Build | Build version of the client | 123 |
| 14 | Char[10] | Language | ISO 639-1 language code | En |
| 24 | UInt32 | Info | Contents of the Res.dat file | 10 |
Patch 5065
Account Server Message Definition
☑️ Assumed (Observed) - Comet
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 28 |
| 2 | UInt16 | MsgType | Type of message | 1052 |
| 4 | UInt32 | Account ID | Account id from the account server | 1 |
| 8 | UInt32 | Data | Contents of the Res.dat file | 10 |
| 12 | Char[16] | Info | Name of the file | Res.dat |
Game Server Message Definition
☑️ Assumed (Observed) - Comet
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 28 |
| 2 | UInt16 | MsgType | Type of message | 1052 |
| 4 | UInt32 | Account ID | Account id from the account server | 1 |
| 8 | UInt32 | Data | Encryption key generator parameter | 6351601 |
| 12 | UInt16 | Build | Build version of the client | 123 |
| 14 | Char[2] | Language | ISO 639-1 language code | En |
| 16 | Char[8] | Mac Address | Mac address of connecting interface | 0A0B0C0D0E0F |
| 24 | UInt32 | Info | Contents of the Res.dat file | 10 |
MsgConnectEx
This account server message is sent to the client to provide connection details for the selected game server. If authentication failed on the account server, then this message will contain a rejection code and message. In older versions of the client, the rejection message is in Chinese but not actually used by the client besides for validation. It was later removed.
The client also validates the IP address and will reject localhost (127.x.x.x). The game server IP address can be a local (10.x.x.x or 192.x.x.x) or public IP address.
Table of Contents
Patch 4267
Accept Message Definition
☑️ Assumed (Observed) - Comet
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 32 |
| 2 | UInt16 | MsgType | Type of message | 1055 |
| 4 | UInt32 | Account ID | Account id from the account server | 1 |
| 8 | UInt32 | Data | Encryption key generator parameter | 6351601 |
| 12 | Char[16] | Info | Game server's IP address | 192.168.1.2 |
| 28 | UInt32 | Port | Game server's port | 5816 |
Reject Message Definition
☑️ Assumed (Observed) - Comet
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 28 |
| 2 | UInt16 | MsgType | Type of message | 1055 |
| 8 | UInt32 | Data | Rejection type | 10 |
| 12 | Char[16] | Info | Rejection message in GB2312 encoding | 帐号名或口令错 |
Rejection Type
☑️ Assumed (Observed) - Comet
| Type | Chinese | English |
|---|---|---|
| 1 | 帐号名或口令错 | Invalid account name or password. |
| 10 | 服务器未启动 | The server is down! |
| 11 | 请稍后重新登录 | Please re-login later. |
| 12 | 该帐号被封号 | This account is banned. |
| 999 | 数据库错误 | Unknown Error |
Patch 5017
Accept Message Definition
☑️ Assumed (Observed) - Comet
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 32 |
| 2 | UInt16 | MsgType | Type of message | 1055 |
| 4 | UInt32 | Account ID | Account id from the account server | 1 |
| 8 | UInt32 | Data | Encryption key generator parameter | 6351601 |
| 12 | Char[16] | Info | Game server's IP address | 192.168.1.2 |
| 28 | UInt32 | Port | Game server's port | 5816 |
Reject Message Definition
☑️ Assumed (Observed) - Comet
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 12 |
| 2 | UInt16 | MsgType | Type of message | 1055 |
| 8 | UInt32 | Data | Rejection type | 10 |
Rejection Type
☑️ Assumed (Observed) - Comet
| Type | Description |
|---|---|
| 1 | Invalid account name or password |
| 10 | Server down |
| 11 | Try again later |
| 12 | Account banned |
| 20 | Server busy |
| 22 | Account locked |
| 30 | Account not activated |
| 31 | Account activation failed |
| 42 | Server timed out |
| 51 | Max login attempts |
| 70 | Server locked |
| 73 | Old protocol |
| 999 | Unknown error |
Patch 5517
Accept Message Definition
❓ Unverified
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 52 |
| 2 | UInt16 | MsgType | Type of message | 1055 |
| 4 | UInt32 | Account ID | Account id from the account server | 1 |
| 8 | UInt32 | Data | Encryption key generator parameter | 6351601 |
| 12 | UInt32 | Port | Game server's port | 5816 |
| 20 | Char[32] | Info | Game server's IP address | 192.168.1.2 |
Reject Message Definition
❓ Unverified
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 12 |
| 2 | UInt16 | MsgType | Type of message | 1055 |
| 8 | UInt32 | Data | Rejection type | 10 |
Rejection Type
✅ Verified (Client)
The following mapping is copied from Cn_Res.ini.
000=Changing Map
001=Invalid Account ID or Password
006=Point Card Expired
007=Monthly Card Expired
010=Server maintenance. Please try again later!
011=Please try again later.
012=This account has been banned.
013=Net cafe mode. Invalid Account ID or Password.
014=Net cafe mode. No more accounts can be logged, at this time.
020=Server is busy.
021=Server is busy. Please try again, later.
022=Your account has been locked. Please contact GM for more help.
024=This account has been banned.
025=This account has been banned.
026=This account has been banned.
027=This account has been banned.
028=This account has been banned.
030=This account has not been activated.
031=Failed to activate the account.
040=Invalid Input
041=Invalid Info
042=Timed Out
043=Please recheck the serial number or retrieve a new one.
044=Invalid Sub-password
045=Please input Sub-password.
046=Unbound
050=Non-cooperator Account
051=Sorry, but you have used up your login attempts. Please wait 30 minutes and try again.
052=Failed to login
053=The same server
054=Database Error
055=Failed to connect to the database.
056=Failed to connect
057=Invalid Account ID
058=Validation timed out.
059=Servers are not configured correctly.
060=Passpod Server Disconnected
061=Failed to process Passpod return
062=Passpod Password Expired
063=Passpod Verification Failed
064=Passpod Certification Expired
065=Passpod Certification Disabled
066=Failed to find the user.
067=Passpod Server Error
068=Passpod has not been input.
070=Server Locked
071=Login has been restricted. Please check the login limit, and try again.
072=Account Locked by Phone
073=Authentication Protocol is invalid or expired.
501=The account has not been bound to any phone
502=The key is wrong. Please rebind it.
504=The sub-key is wrong.
506=Please input the sub-key.
507=Failed to call.
508=Failed to login QQ account
999=Database Error
MsgConnectFaceBook
MsgConnectLegalitySpec
MsgConnectWithBgp
MsgContribute
MsgCrossFlagWar
MsgCrossFlagWarAltar
MsgCrossFlagWarFlag
MsgCrossFlagWarMerit
MsgCrossFlagWarRank
MsgCrossSwitch
MsgData
This message is sent by the game server to update the client interface with a series of integer values. The main usage of this message is to sync the client with the date and time of the server, and was introduced with the watercolor client. In later versions of the client, it was used again for displaying mount vigor.
Table of Contents
Patch 5031
Message Definition
☑️ Assumed (Observed) - Chimera
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 36 |
| 2 | UInt16 | MsgType | Type of message | 1033 |
| 4 | UInt32 | Data Type | How to process the message | 0 |
| 8 | UInt32[] | Data Values | Array of data values |
Data Type
☑️ Assumed (Observed) - Chimera
| Val | Name | Description | Data |
|---|---|---|---|
| 0 | DATETIME | Set server datetime | Year, month, weekday, day, hour, minute, second |
Patch 5165
Message Definition
☑️ Assumed (Observed) - Chimera
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 36 |
| 2 | UInt16 | MsgType | Type of message | 1033 |
| 4 | UInt32 | Data Type | How to process the message | 0 |
| 8 | UInt32[] | Data Values | Array of data values |
Data Type
☑️ Assumed (Observed) - Chimera
| Val | Name | Description | Data |
|---|---|---|---|
| 0 | DATETIME | Set server datetime | Year, month, weekday, day, hour, minute, second |
| 2 | VIGOR | Set mount vigor (move points) | Vigor |
MsgDataArray
MsgDeadMark
MsgDetainItemInfo
This message is sent to the client to show an item in the detained items window. Along with a summary of the item's details (similar to MsgItemInfo), it also contains the cost of reclaiming the item, days remaining until the hunter is rewarded, and the name and identifier of the original owner and hunter.
Table of Contents
Patch 5103
Message Definition
❓ Unverified
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 112 |
| 2 | UInt16 | MsgType | Type of message | 1034 |
| 4 | UInt32 | Reward ID | Unique identifier of the reward record | 103 |
| 8 | UInt32 | Item ID | Unique identifier for the item (unless someone else's item) | 1 |
| 12 | UInt32 | Item Type | Identifies the type of item | 730001 |
| 16 | UInt16 | Amount | Current durability or amount of the item | 10000 |
| 18 | UInt16 | Max Amount | Total durability or amount the item can have | 10000 |
| 20 | Byte | Action | How item info should be processed | 1 |
| 21 | Byte | Status | Condition bit flags on the item | 0 |
| 22 | Byte | Position | Position where the item appears | 0 |
| 24 | UInt32 | Socket Progress | Progress on creating a socket | 0 |
| 28 | Byte | Socket 1 | The gem in the first socket position | 0 |
| 29 | Byte | Socket 2 | The gem in the second socket position | 0 |
| 30 | Byte | Magic 1 | Reserved for rebirth magic effect | 0 |
| 31 | Byte | Magic 2 | Reserved for an unknown purpose | 0 |
| 32 | Byte | Magic 3 | Reserved for magical plus rating | 0 |
| 33 | Byte | Bless | Reduced damage percentage taken by the character | 0 |
| 34 | Bool | Bound | True if the item can't be traded | 0 |
| 35 | Byte | Enchant | Added max life for the character | 0 |
| 36 | UInt32 | Data | Additional attributes for the item | 0 |
| 40 | Bool | Suspicious | Marked as suspicious for trading | 0 |
| 42 | Bool | Locked | Locked from being dropped or traded | 0 |
| 44 | Byte | Color | Color modifier for the item | 3 |
| 48 | UInt32 | Owner ID | Role ID of the item owner | 1000000 |
| 52 | Char[16] | Owner Name | Owner's character name | Player |
| 68 | UInt32 | Hunter ID | Role ID of the hunter | 1000001 |
| 72 | Char[16] | Hunter Name | Hunter's character name | Hunter |
| 88 | UInt32 | Capture Date | Date string in the format YYYYMMDD | 20161001 |
| 96 | UInt32 | CPs | Cost for claiming | 1950 |
| 100 | Bool | Expired | True if the detain window has expired | 1 |
| 108 | UInt32 | Days | Days remaining to detain | 6 |
MsgDice
One of the first street gambling games introduced in Conquer Online was the dice game hosted by DiceKing in the Market. The game revolves around the NPC rolling four dice and the player making bets on the outcome. The outcome can be high or low, three of a kind, or specific values.
Interestingly, results of the game are broadcast to all participants using the MsgName message rather than a server message via MsgTalk. MsgName is also used to add players to the game.
The game is split into three phases: a 30 second phase where players can bet (Amount is set to 30 for BEGINCHIP), followed by a 5 second phase where all bets are in (ENDCHIP), followed by the result (DICE).
Table of Contents
Patch 4267
Message Definition
☑️ Assumed (Soul)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 20 |
| 2 | UInt16 | MsgType | Type of message | 1113 |
| 4 | Byte | Action | How to process the message | 0 |
| 5 | Byte | Amount | Amount of data or time | 1 |
| 6 | UInt32 | NPC ID | Role ID of the NPC | 169 |
| 10 | Struct | DiceData | Payload for dices |
Action Type
☑️ Assumed (Soul)
| Val | Name | Description | Recipient |
|---|---|---|---|
| 0 | CHIPIN | Shows a new bet | Both |
| 1 | CHIPIN_CONFIRM | Confirms a bet | Client |
| 2 | CANCELCHIP | Removes a bet | Both |
| 3 | CANCELCHIP_CONFIRM | Confirms removal | Client |
| 4 | BEGINCHIP | Start a betting window | Client |
| 5 | ENDCHIP | Stops betting window | Client |
| 6 | DICE | Results of the role | Client |
Dice Data
☑️ Assumed (Soul)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | Byte | Type | Dice Value for betting | 1 |
| 1 | UInt32 | Data | Amount of money or array of dice | 1000 |
Dice Values
☑️ Assumed (Soul)
enum DiceValues {
DICE_VALUE_SMALL = 0;
DICE_VALUE_BIG = 1;
DICE_VALUE_111 = 2;
DICE_VALUE_222 = 3;
DICE_VALUE_333 = 4;
DICE_VALUE_444 = 5;
DICE_VALUE_555 = 6;
DICE_VALUE_666 = 7;
DICE_VALUE_4 = 8;
DICE_VALUE_5 = 9;
DICE_VALUE_6 = 10;
DICE_VALUE_7 = 11;
DICE_VALUE_8 = 12;
DICE_VALUE_9 = 13;
DICE_VALUE_10 = 14;
DICE_VALUE_11 = 15;
DICE_VALUE_12 = 16;
DICE_VALUE_13 = 17;
DICE_VALUE_14 = 18;
DICE_VALUE_15 = 19;
DICE_VALUE_16 = 20;
DICE_VALUE_17 = 21;
DICE_VALUE_ALL = 22;
}
MsgDisconnect
MsgDominateTeamName
MsgDominateTeamPopPkName
MsgDutyMinContri
MsgElitePKArenic
MsgElitePKGameRankInfo
MsgElitePKScore
MsgEncryptCode
This message is sent from the account server to the client when it first connects to initialize the RC5 cipher used for encrypting the player's password. The client then responds to this message with MsgAccount. In later versions of the client, this message is sent but never utilized. This is to keep the account server compatible with older versions of the client / different games.
Table of Contents
Patch 5187
Message Definition
✅ Verified (Client)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 8 |
| 2 | UInt16 | MsgType | Type of message | 1059 |
| 4 | UInt32 | Seed | Generated seed for RC5 | 10000 |
MsgEnemyList
Undocumented
MsgEquipLock
MsgFacebookAccount
MsgFactionChiefBase
MsgFactionMatch
MsgFactionMatchWitness
MsgFactionRankInfo
MsgFamily
This message is received by the game server or game client as an action for managing a clan. It allows a clan leader to manage allies and enemies, and for family members to query for clan information.
Table of Contents
Patch 5187
Message Definition
❗ Incomplete
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 88 |
| 2 | UInt16 | MsgType | Type of message | 1312 |
| 4 | UInt32 | Action | How the message will be processed | 29 |
| 8 | UInt32 | Target ID | Unique identifier for the character or clan | 1000000 |
| 16 | UInt32 | NetStringPacker | Strings | 5 10 FamilyName 8 UserName 18 FamilyOccupyString 18 FamilyDominatedMap 19 FamilyChallengedMap |
Alternative:
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 88 |
| 2 | UInt16 | MsgType | Type of message | 1312 |
| 4 | UInt32 | Action | How the message will be processed | 29 |
| 8 | UInt32 | Target ID | Unique identifier for the character or clan | 1000000 |
| 16 | UInt32 |
Clan Action Type
❗ Incomplete
🔶 Response data
| Val | Name | Description | Recipient | NetStringPacker |
|---|---|---|---|---|
| 1 | QUERY | |||
| 4 | QUERY_MEMBERS | |||
| 9 | RECRUIT | |||
| 10 | ACCEPT_RECRUIT | |||
| 11 | JOIN | |||
| 12 | ACCEPT_JOIN | |||
| 13 | SHOW_ENEMY | |||
| 14 | ADD_ENEMY | |||
| 15 | DEL_ENEMY | |||
| 16 | SHOW_ALLY | |||
| 17 | ADD_ALLY | |||
| 18 | ACCEPT_ALLY | |||
| 20 | DEL_ALLY | |||
| 21 | ABDICATE | |||
| 22 | KICK_MEMBER | |||
| 23 | QUIT | |||
| 24 | SHOW_ANNOUNCE | |||
| 25 | SET_ANNOUNCE | |||
| 26 | DEDICATE | |||
| 29 | QUERY_OCCUPY |
MsgFamilyOccupy
MsgFlower
MsgFlushExp
This game server message is sent to the client to update the interface with new weapon skill, magic, XP skill, or other types of experience.
Table of Contents
Patch 4267
Message Definition
☑️ Assumed (Soul)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 12 |
| 2 | UInt16 | MsgType | Type of message | 1104 |
| 4 | UInt32 | Exp | Updated experience towards leveling the spell | 0 |
| 8 | UInt16 | Type | Magic or skill type identifier | 1001 |
| 10 | UInt16 | Action | The type of experience being updated | 0 |
Action Type
☑️ Assumed (Soul)
| Val | Name | Description | File |
|---|---|---|---|
| 0 | WEAPON_SKILL | Weapon skill proficiency | WeaponSkillLevelExp.ini |
| 1 | MAGIC | Magic spell experience | MagicType.dat |
MsgFMMatch
MsgFMRoundRobin
MsgFriend
This message is sent by clients to manage friend requests and their friend and enemy lists. It's also sent by the game server to populate those lists on sign-on, update online statuses, after accepting a friend request, and after a player kill.
The level parameter that once appeared at offset 10 was removed during the alpha for Conquer Online in favor of the MsgFriendInfo message.
Table of Contents
Patch 4267
Message Definition
☑️ Assumed (Observed) - Soul + CoFuture
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 28 |
| 2 | UInt16 | MsgType | Type of message | 1019 |
| 4 | UInt32 | Hero ID | Unique identifier for the friend | 1000000 |
| 8 | Byte | Action | How to process the message | 11 |
| 9 | Byte | IsOnline | True if the friend is online | 1 |
| 12 | Char[16] | Name | Character name as a fixed string | Player |
Action Type
☑️ Assumed (Soul)
enum FriendActionTypes {
FRIEND_APPLY = 10;
FRIEND_ACCEPT = 11;
FRIEND_ONLINE = 12;
FRIEND_OFFLINE = 13;
FRIEND_BREAK = 14;
FRIEND_GETINFO = 15;
ENEMY_ONLINE = 16;
ENEMY_OFFLINE = 17;
ENEMY_DELETE = 18;
ENEMY_ADD = 19;
}
Patch 5017
Message Definition
❓ Unverified
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 36 |
| 2 | UInt16 | MsgType | Type of message | 1019 |
| 4 | UInt32 | Hero ID | Unique identifier for the friend | 1000000 |
| 8 | Byte | Action | How to process the message | 11 |
| 9 | Byte | Is Online | True if the friend is online | 1 |
| 12 | UInt32 | Nobility Rank | Nobility ranking | 3 |
| 16 | UInt32 | Flower Rank | Flower ranking | 0 |
| 20 | Char[16] | Name | Character name as a fixed string | Player |
Action Type
☑️ Assumed (Soul)
enum FriendActionTypes {
FRIEND_APPLY = 10;
FRIEND_ACCEPT = 11;
FRIEND_ONLINE = 12;
FRIEND_OFFLINE = 13;
FRIEND_BREAK = 14;
FRIEND_GETINFO = 15;
ENEMY_ONLINE = 16;
ENEMY_OFFLINE = 17;
ENEMY_DELETE = 18;
ENEMY_ADD = 19;
}
Patch 5615
Message Definition
❓ Unverified
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 68 |
| 2 | UInt16 | MsgType | Type of message | 1019 |
| 4 | UInt32 | Hero ID | Unique identifier for the friend | 1000000 |
| 8 | Byte | Action | How to process the message | 11 |
| 9 | Byte | Is Online | True if the friend is online | 1 |
| 12 | UInt32 | Nobility Rank | Nobility ranking | 3 |
| 16 | UInt32 | Flower Rank | Flower ranking | 0 |
| 20 | Char[16] | Name | Character name as a fixed string | Player |
| 36 | Char[32] | Facebook ID | Identifier for Facebook Profile |
Action Type
☑️ Assumed (Soul)
enum FriendActionTypes {
FRIEND_APPLY = 10;
FRIEND_ACCEPT = 11;
FRIEND_ONLINE = 12;
FRIEND_OFFLINE = 13;
FRIEND_BREAK = 14;
FRIEND_GETINFO = 15;
ENEMY_ONLINE = 16;
ENEMY_OFFLINE = 17;
ENEMY_DELETE = 18;
ENEMY_ADD = 19;
}
MsgFriendInfo
MsgFuse
This message is sent by the client to request fusing materials to an item. Though the system isn't officially used by non-Chinese Conquer Online or translated in the interface, it is implemented in the client and can be utilized by private servers. Fuse rates come from fuse.ini, and successfully fused items result in a +1 stone (according to unverified sources).
Some private servers have repurposed this interface to quickly attempt a socket on an included item using meteor scrolls and other loose meteors.
Table of Contents
Patch 4267
Message Definition
❓ Unverified
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 22 |
| 2 | UInt16 | MsgType | Type of message | 1028 |
| 4 | UInt32 | User | Hero ID of the player | 1000001 |
| 8 | UInt16 | Action | The type of fuse being performed | 0 |
| 10 | UInt32 | Count | The number of items included | 2 |
| 14 | UInt32[] | Items | Array of item IDs |
MsgGameServerShutDown
This message is sent by the game server to the client to request a polite disconnect. Sending this message to the client causes an error state and spawns a message.
Table of Contents
Patch 5635
Message Definition
❓ Unverified
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 12 |
| 2 | UInt16 | MsgType | Type of message | 1350 |
| 4 | UInt32 | Action | How the message will be processed | 0 |
| 8 | UInt32 | Message ID | The message to display | 10 |
Shutdown Action
❓ Unverified
enum ShutdownAction {
DEFAULT = 0;
}
MsgGemEmbed
This message is sent by the client to request embedding or removing a gem in an item.
⚠️ WARNING
Ensure that the identifier of the gem is a valid gem. It's possible that a modified game client can send a message containing a gem ID that's the same as the item identifier. In that case, a poorly validated server could add a gem based on the item type (could be deterministic).
Table of Contents
Patch 4267
Message Definition
☑️ Assumed (Soul)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 20 |
| 2 | UInt16 | MsgType | Type of message | 1027 |
| 4 | UInt32 | User | Hero ID of the player | 1000001 |
| 8 | UInt32 | Item | Identifier for the item | 1 |
| 12 | UInt32 | Gem | Identifier for the gem | 2 |
| 16 | UInt16 | Pos | Gem socket to embed into or remove from | 1 |
| 18 | UInt16 | Action | Embed or remove the gem | 0 |
Action Type
☑️ Assumed (Soul)
enum GemEmbedActionType {
GEM_EMBED_ACTION_EMBED = 0;
GEM_EMBED_ACTION_REMOVE = 1;
}
MsgGLChampionList
MsgGLHeroDetail
MsgGLInteractive
MsgGLLastSeasonTopScore
MsgGLRankingList
MsgGodExp
Undocumented
MsgGuide
MsgGuideInfo
MsgHangUp
MsgInstance
MsgInteract
This message is used to request an interaction with another player or broadcast an interaction to surrounding players. Some example interactions include physical and magical attacks, proposing, and killing a player.
Magic attacks in Conquer Online are obfuscated using bit rotations and XORs. See the example below from Soul.
#define ENCODE_MAGICATTACK(idUser, usType, idTarget, usPosX, usPosY) \
{ \
usType = (::ExchangeShortBits((usType - 0x14BE), 3) ^ (idUser) ^ 0x915D); \
idTarget = ::ExchangeLongBits(((idTarget - 0x8B90B51A) ^ (idUser) ^ 0x5F2D2463), 32 - 13); \
usPosX = (::ExchangeShortBits((usPosX - 0xDD12), 1) ^ (idUser) ^ 0x2ED6); \
usPosY = (::ExchangeShortBits((usPosY - 0x76DE), 5) ^ (idUser) ^ 0xB99B); \
}
#define DECODE_MAGICATTACK(idUser, usType, idTarget, usPosX, usPosY) \
{ \
usType = 0xFFFF & (::ExchangeShortBits(((usType) ^ (idUser) ^ 0x915D), 16 - 3) + 0x14BE); \
idTarget = (::ExchangeLongBits((idTarget), 13) ^ (idUser) ^ 0x5F2D2463) + 0x8B90B51A; \
usPosX = 0xFFFF & (::ExchangeShortBits(((usPosX) ^ (idUser) ^ 0x2ED6), 16 - 1) + 0xDD12); \
usPosY = 0xFFFF & (::ExchangeShortBits(((usPosY) ^ (idUser) ^ 0xB99B), 16 - 5) + 0x76DE); \
}
inline unsigned int ExchangeShortBits(unsigned long nData, int nBits)
{
MYASSERT(nBits >= 0 && nBits < 16);
nData &= 0xFFFF;
return ((nData >> nBits) | (nData << (16 - nBits))) & 0xFFFF;
}
inline unsigned int ExchangeLongBits(unsigned long nData, int nBits)
{
MYASSERT(nBits >= 0 && nBits < 32);
return (nData >> nBits) | (nData << (32 - nBits));
}
Similar to other messages, MsgInteract also contains types that overlap with other types in other messages. For example, aborting magic was handled in MsgInteract, but is instead duplicated and utilized in MsgAction.
Table of Contents
Patch 4267
Message Definition
☑️ Assumed (Observed) - CoFuture + Soul
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 28 |
| 2 | UInt16 | MsgType | Type of message | 1022 |
| 4 | UInt32 | System Time | Milliseconds of system uptime | 10000 |
| 8 | UInt32 | Sender | Role ID of the initiator | 1000000 |
| 12 | UInt32 | Target | Role ID of the target | 1000001 |
| 16 | UInt16 | X | X coordinate of the interaction | 320 |
| 18 | UInt16 | Y | Y coordinate of the interaction | 460 |
| 20 | UInt32 | Type | How to process the message | 14 |
| 24 | UInt32 | Data | Value associated with the interaction | 1 |
Interaction Type
☑️ Assumed (Observed) - CoFuture + Soul
🔶 Response data
| Val | Name | Description | Recipient | Data |
|---|---|---|---|---|
| 2 | ATTACK | Physical attack | Server | Damage 🔶 |
| 8 | COURT | Propose to a player | Server | |
| 9 | MARRY | Accept a proposal | Server | |
| 14 | KILL | Confirms kill of an entity | Client | Count |
| 21 | MAGIC_ATTACK | Magical attack | Server | HIGH: MagicType |
| 23 | REFLECT_WEAPON | Reflect a physical attack | Client | Damage |
| 24 | BUMP | Bumped from dash | Client | Direction |
| 25 | SHOOT | Shoot projectile | Server | Damage 🔶 |
| 26 | REFLECT_MAGIC | Reflect a magical attack | Client | Damage |
Patch 5017
Message Definition
☑️ Assumed (Observed) - COPSv6
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 28 |
| 2 | UInt16 | MsgType | Type of message | 1022 |
| 4 | UInt32 | System Time | Milliseconds of system uptime | 10000 |
| 8 | UInt32 | Sender | Role ID of the initiator | 1000000 |
| 12 | UInt32 | Target | Role ID of the target | 1000001 |
| 16 | UInt16 | X | X coordinate of the interaction | 320 |
| 18 | UInt16 | Y | Y coordinate of the interaction | 460 |
| 20 | UInt32 | Type | How to process the message | 14 |
| 24 | UInt32 | Data | Value associated with the interaction | 1 |
| 28 | UInt32 | Progress | Progress on an interaction | 0 |
Interaction Type
☑️ Assumed (Observed) - COPSv6
🔶 Response data
| Val | Name | Description | Recipient | Data | Progress |
|---|---|---|---|---|---|
| 2 | ATTACK | Physical attack | Server | Damage 🔶 | |
| 8 | COURT | Propose to a player | Server | ||
| 9 | MARRY | Accept a proposal | Server | ||
| 14 | KILL | Confirms kill of an entity | Client | Count | |
| 21 | MAGIC_ATTACK | Magical attack | Server | HIGH: MagicType | |
| 23 | REFLECT_WEAPON | Reflect a physical attack | Client | Damage | |
| 24 | BUMP | Bumped from dash | Client | Direction | |
| 25 | SHOOT | Shoot projectile | Server | Damage 🔶 | |
| 26 | REFLECT_MAGIC | Reflect a magical attack | Client | Damage | |
| 30 | JAR_PROGRESS | Cloud Saint Jar count | Server | 0 | Count 🔶 |
MsgInviteTrans
MsgItem
This message is received by the game server as a client request to use or act on an item. Item actions can be buying, selling, equipping, repairing, dropping, upgrading, and more. A miscellaneous function of this message is as a ping response. The client sends this message once every 10 seconds to show the latency to the server in the client.
The message can also be sent to the client for specific actions such as force unequipping, force dropping, updating the durability of an item, or updating the amount of an item.
⚠️ WARNING
Ensure that the item type for item improvements matches the consumption item type when improving items. If composing two items together, ensure that the fuel item is also different than the improved item. In all cases, location should also be validated (you cannot upgrade an item from any distance or from any map, same with vending items at player booths). If showing an item, generate a new sharing identifier rather than exposing the item's unique identifier.
Requests
Requests can be of multiple sizes, not necessarily always containing an amount or additional fields past the system time. When processing these request messages, this should be taken into account so not to use fields that have been unspecified.
Responses
Most item actions are initiated by the player. Each request expects a response of either MsgItem (this message) with a filled data field, or a MsgItemInfo of the resulting item (like from a shop purchase).
Table of Contents
Patch 4267
Message Definition
☑️ Assumed (Observed) - CoFuture + Soul
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 20 |
| 2 | UInt16 | MsgType | Type of message | 1009 |
| 4 | UInt32 | ID | Unique identifier for the item or role | 1000000 |
| 8 | UInt32 | Data | Payload usually of the item type or position | 730001 |
| 12 | UInt32 | Action | How to process the message | 2 |
| 16 | UInt32 | System Time | Milliseconds of system uptime | 1579535985 |
Item Action
☑️ Assumed (Observed) - CoFuture + Soul
🔶 Response data
| Val | Name | Description | Recipient | ID | Data |
|---|---|---|---|---|---|
| 1 | BUY | Purchase from shop | Server | NPC | Item Type |
| 2 | SELL | Sell to shop | Server | NPC | Item ID |
| 3 | DROP | Drops an item or removes it | Server | Item | LOW: X HIGH: Y 🔶 |
| 4 | EQUIP | Equip to position on body | Server | Item | Position |
| 5 | UPDATE | Updates an item | Client | Item | Position |
| 6 | UNEQUIP | Force unequip | Client | Item | Position |
| 8 | COMBINE | Combine two of same type | Server | Item | Item ID |
| 9 | QUERY_MONEY | Request warehouse money | Server | NPC | Money 🔶 |
| 10 | SAVE_MONEY | Deposit warehouse money | Server | NPC | Money |
| 11 | DRAW_MONEY | Withdraw warehouse money | Server | NPC | Money |
| 12 | DROP_MONEY | Drop money on the floor | Server | Money | LOW: X HIGH: Y |
| 14 | REPAIR | Repair durability | Server | Item | |
| 17 | DURABILITY | Update durability | Client | Position | Durability |
| 18 | DROP_EQUIPMENT | Force delete equipment | Client | Item | Position |
| 19 | IMPROVE | Quality upgrade | Server | Item | Dragonball Item ID |
| 20 | UPLEV | Level upgrade | Server | Item | Meteor Item ID |
| 21 | BOOTH_QUERY | Show booth item | Server | Item | |
| 22 | BOOTH_ADD | Add to booth | Server | Item | Money |
| 23 | BOOTH_DEL | Remove from booth | Server | Item | Shop |
| 24 | BOOTH_BUY | Buy from a booth | Server | Item | Shop |
| 27 | PING | Latency check | Server | Player |
Patch 5017
Message Definition
☑️ Assumed (Observed) - ApexConquer
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 24 |
| 2 | UInt16 | MsgType | Type of message | 1009 |
| 4 | UInt32 | ID | Unique identifier for the item or role | 1000000 |
| 8 | UInt32 | Data | Payload usually of the item type or position | 730001 |
| 12 | UInt32 | Action | How the server processes the message | 2 |
| 16 | UInt32 | System Time | Milliseconds of system uptime | 1579535985 |
| 20 | UInt32 | Amount | Amount of items being purchased or used | 0 |
Item Action
☑️ Assumed (Observed) - ApexConquer
🔶 Response data
| Val | Name | Description | Recipient | ID | Data |
|---|---|---|---|---|---|
| 1 | BUY | Purchase from shop | Server | NPC | Item Type |
| 2 | SELL | Sell to shop | Server | NPC | Item ID |
| 3 | DROP | Drops an item or removes it | Server | Item | LOW: X HIGH: Y 🔶 |
| 4 | EQUIP | Equip to position on body | Server | Item | Position |
| 5 | UPDATE | Updates an item | Client | Item | Position |
| 6 | UNEQUIP | Force unequip | Client | Item | Position |
| 8 | COMBINE | Combine two of same type | Server | Item | Item ID |
| 9 | QUERY_MONEY | Request warehouse money | Server | NPC | Money 🔶 |
| 10 | SAVE_MONEY | Deposit warehouse money | Server | NPC | Money |
| 11 | DRAW_MONEY | Withdraw warehouse money | Server | NPC | Money |
| 12 | DROP_MONEY | Drop money on the floor | Server | Money | LOW: X HIGH: Y |
| 14 | REPAIR | Repair durability | Server | Item | |
| 17 | DURABILITY | Update durability | Client | Position | Durability |
| 18 | DROP_EQUIPMENT | Force delete equipment | Client | Item | Position |
| 19 | IMPROVE | Quality upgrade | Server | Item | Dragonball Item ID |
| 20 | UPLEV | Level upgrade | Server | Item | Meteor Item ID |
| 21 | BOOTH_QUERY | Show booth item | Server | Item | |
| 22 | BOOTH_ADD | Add to booth | Server | Item | Money |
| 23 | BOOTH_DEL | Remove from booth | Server | Item | Shop |
| 24 | BOOTH_BUY | Buy from a booth | Server | Item | Shop |
| 27 | PING | Latency check | Server | Player | |
| 28 | ENCHANT | Enchant item | Server | Item | Gem Item ID |
| 29 | BOOTH_ADD_EMONEY | Add EMoney to booth | Server | Item | EMoney |
Patch 5517
Message Definition
☑️ Assumed (Observed) - ApexConquer
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 60 |
| 2 | UInt16 | MsgType | Type of message | 1009 |
| 4 | UInt32 | ID | Unique identifier for the item or role | 1000000 |
| 8 | UInt32 | Data | Payload usually of the item type or position | 730001 |
| 12 | UInt32 | Action | How the server processes the message | 2 |
| 16 | UInt32 | System Time | Milliseconds of system uptime | 1579535985 |
| 20 | UInt32 | Amount | Amount of items being purchased or used | 0 |
| 24 | UInt32[9] | Equipment | Equipment in order of slot position | 0 |
Item Action
☑️ Assumed (Observed) - ConquerServerV3
🔶 Response data
| Val | Name | Description | Recipient | ID | Data |
|---|---|---|---|---|---|
| 1 | BUY | Purchase from shop | Server | NPC | Item Type |
| 2 | SELL | Sell to shop | Server | NPC | Item ID |
| 4 | EQUIP | Equip to position on body | Server | Item | Position |
| 5 | UPDATE | Updates an item | Client | Item | Position |
| 6 | UNEQUIP | Force unequip | Client | Item | Position |
| 9 | QUERY_MONEY | Request warehouse money | Server | NPC | Money 🔶 |
| 10 | SAVE_MONEY | Deposit warehouse money | Server | NPC | Money |
| 11 | DRAW_MONEY | Withdraw warehouse money | Server | NPC | Money |
| 14 | REPAIR | Repair durability | Server | Item | |
| 17 | DURABILITY | Update durability | Client | Position | Durability |
| 18 | DROP_EQUIPMENT | Force delete equipment | Client | Item | Position |
| 19 | IMPROVE | Quality upgrade | Server | Item | Dragonball Item ID |
| 20 | UPLEV | Level upgrade | Server | Item | Meteor Item ID |
| 21 | BOOTH_QUERY | Show booth item | Server | Item | |
| 22 | BOOTH_ADD | Add to booth | Server | Item | Money |
| 23 | BOOTH_DEL | Remove from booth | Server | Item | Shop |
| 24 | BOOTH_BUY | Buy from a booth | Server | Item | Shop |
| 27 | PING | Latency check | Server | Hero | |
| 28 | ENCHANT | Enchant item | Server | Item | Gem Item ID |
| 29 | BOOTH_ADD_EMONEY | Add EMoney to booth | Server | Item | EMoney |
| 33 | DETAIN_REDEEM | Redeem a detained item | Server | Item | |
| 35 | SOCKET | Socket a talisman | Server | Item | Item ID |
| 36 | SOCKET_EMONEY | Socket talisman with EMoney | Server | Item | EMoney |
| 37 | DROP | Drops an item or removes it | Server | Item | |
| 38 | DROP_MONEY | Drop money on the floor | Server | Money | |
| 40 | UPBLESS | Upgrade bless | Server | Item | |
| 41 | SHOW_ACCESSORY | Show an accessory | Server | Item | |
| 46 | SHOW_EQUIPMENT | Response for MsgAction | Client | Hero | |
| 48 | COMBINE | Combine two of same type | Server | Item | Item ID |
| 49 | SPLIT | Split into two | Server | Item | |
| 52 | SHOW_ITEM | Item card | Client | Item |
MsgItemInfo
This message is sent to the game client from the game server to initialize an item, which can appear in the player's inventory, as equipment, or in another position within the client's UI. Some exceptions to this include detained items (MsgDetainItemInfo) and shop / present items (MsgItemInfoEx).
In later versions of the client (around patch 5200), MsgPlayerAttribInfo was added to update the role view separately from equipment being placed in a player's equipment slot. The purpose of splitting off attributes from items was to enable temporary boons and weaknesses.
Table of Contents
Patch 4267
Message Definition
☑️ Assumed (Soul)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 24 |
| 2 | UInt16 | MsgType | Type of message | 1008 |
| 4 | UInt32 | Item ID | Unique identifier for the item (unless someone else's item) | 1 |
| 8 | UInt32 | Item Type | Identifies the type of item | 730001 |
| 12 | UInt16 | Amount | Current durability or amount of the item | 10000 |
| 14 | UInt16 | Max Amount | Total durability or amount the item can have | 10000 |
| 16 | Byte | Action | How item info should be processed | 1 |
| 17 | Byte | Status | Condition bit flags on the item | 0 |
| 18 | Byte | Position | Position where the item appears | 0 |
| 19 | Byte | Socket 1 | The gem in the first socket position | 0 |
| 20 | Byte | Socket 2 | The gem in the second socket position | 0 |
| 21 | Byte | Magic 1 | Reserved for rebirth magic effect | 0 |
| 22 | Byte | Magic 2 | Reserved for an unknown purpose | 0 |
| 23 | Byte | Magic 3 | Reserved for magical plus rating | 0 |
Action Type
☑️ Assumed (Soul)
enum ItemInfoActionType {
ITEMINFO_NONE = 0;
ITEMINFO_ADDITEM = 1;
ITEMINFO_TRADE = 2;
ITEMINFO_UPDATE = 3;
ITEMINFO_OTHERPLAYER_EQUIPMENT = 4;
ITEMINFO_AUCTION = 5;
}
Item Status
☑️ Assumed (Soul)
enum ItemStatus {
ITEM_STATUS_NONE = 0;
ITEM_STATUS_UNIDENTIFIED = 0x01;
ITEM_STATUS_CANNOT_REPAIR = 0x02;
ITEM_STATUS_FIXED_DURABILITY = 0x04;
ITEM_STATUS_MAGIC_ADD = 0x08;
}
Item Position
☑️ Assumed (Soul)
enum ItemPosition {
ITEMPOSITION_INVENTORY = 0;
ITEMPOSITION_HELMET = 1;
ITEMPOSITION_NECKLACE = 2;
ITEMPOSITION_ARMOR = 3;
ITEMPOSITION_WEAPON_RIGHT = 4;
ITEMPOSITION_WEAPON_LEFT = 5;
ITEMPOSITION_RING = 6;
ITEMPOSITION_TREASURE = 7;
ITEMPOSITION_BOOTS = 8;
ITEMPOSITION_STORAGE = 201;
ITEMPOSITION_TRUNK = 202;
ITEMPOSITION_TREASURE_BAG = 203;
ITEMPOSITION_AUCTION_STORAGE = 207;
ITEMPOSITION_GROUND = 254;
ITEMPOSITION_NONE = 255;
}
Patch 4330
Message Definition
☑️ Assumed (Observed) - COPSv6 Enhanced
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 30 |
| 2 | UInt16 | MsgType | Type of message | 1008 |
| 4 | UInt32 | Item ID | Unique identifier for the item (unless someone else's item) | 1 |
| 8 | UInt32 | Item Type | Identifies the type of item | 730001 |
| 12 | UInt16 | Amount | Current durability or amount of the item | 10000 |
| 14 | UInt16 | Max Amount | Total durability or amount the item can have | 10000 |
| 16 | Byte | Action | How item info should be processed | 1 |
| 17 | Byte | Status | Condition bit flags on the item | 0 |
| 18 | Byte | Position | Position where the item appears | 0 |
| 19 | Byte | Socket 1 | The gem in the first socket position | 0 |
| 20 | Byte | Socket 2 | The gem in the second socket position | 0 |
| 21 | Byte | Magic 1 | Reserved for rebirth magic effect | 0 |
| 22 | Byte | Magic 2 | Reserved for an unknown purpose | 0 |
| 23 | Byte | Magic 3 | Reserved for magical plus rating | 0 |
| 24 | Byte | Bless | Reduced damage percentage taken by the character | 0 |
| 25 | Byte | Enchant | Added max life for the character | 0 |
| 26 | UInt32 | Data | Additional attributes for the item | 0 |
Action Type
☑️ Assumed (Soul)
enum ItemInfoActionType {
ITEMINFO_NONE = 0;
ITEMINFO_ADDITEM = 1;
ITEMINFO_TRADE = 2;
ITEMINFO_UPDATE = 3;
ITEMINFO_OTHERPLAYER_EQUIPMENT = 4;
ITEMINFO_AUCTION = 5;
}
Item Status
☑️ Assumed (Soul)
enum ItemStatus {
ITEM_STATUS_NONE = 0;
ITEM_STATUS_UNIDENTIFIED = 0x01;
ITEM_STATUS_CANNOT_REPAIR = 0x02;
ITEM_STATUS_FIXED_DURABILITY = 0x04;
ITEM_STATUS_MAGIC_ADD = 0x08;
}
Item Position
☑️ Assumed (Soul)
enum ItemPosition {
ITEMPOSITION_INVENTORY = 0;
ITEMPOSITION_HELMET = 1;
ITEMPOSITION_NECKLACE = 2;
ITEMPOSITION_ARMOR = 3;
ITEMPOSITION_WEAPON_RIGHT = 4;
ITEMPOSITION_WEAPON_LEFT = 5;
ITEMPOSITION_RING = 6;
ITEMPOSITION_TREASURE = 7;
ITEMPOSITION_BOOTS = 8;
ITEMPOSITION_STORAGE = 201;
ITEMPOSITION_TRUNK = 202;
ITEMPOSITION_TREASURE_BAG = 203;
ITEMPOSITION_AUCTION_STORAGE = 207;
ITEMPOSITION_GROUND = 254;
ITEMPOSITION_NONE = 255;
}
Patch 5017
Message Definition
❓ Unverified
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 36 |
| 2 | UInt16 | MsgType | Type of message | 1008 |
| 4 | UInt32 | Item ID | Unique identifier for the item (unless someone else's item) | 1 |
| 8 | UInt32 | Item Type | Identifies the type of item | 730001 |
| 12 | UInt16 | Amount | Current durability or amount of the item | 10000 |
| 14 | UInt16 | Max Amount | Total durability or amount the item can have | 10000 |
| 16 | Byte | Action | How item info should be processed | 1 |
| 17 | Byte | Status | Condition bit flags on the item | 0 |
| 18 | Byte | Position | Position where the item appears | 0 |
| 20 | UInt32 | Socket Progress | Progress on creating a socket | 0 |
| 24 | Byte | Socket 1 | The gem in the first socket position | 0 |
| 25 | Byte | Socket 2 | The gem in the second socket position | 0 |
| 26 | Byte | Magic 1 | Reserved for rebirth magic effect | 0 |
| 27 | Byte | Magic 2 | Reserved for an unknown purpose | 0 |
| 28 | Byte | Magic 3 | Reserved for magical plus rating | 0 |
| 29 | Byte | Bless | Reduced damage percentage taken by the character | 0 |
| 30 | Byte | Enchant | Added max life for the character | 0 |
| 32 | UInt32 | Data | Additional attributes for the item | 0 |
Action Type
☑️ Assumed (Soul)
enum ItemInfoActionType {
ITEMINFO_NONE = 0;
ITEMINFO_ADDITEM = 1;
ITEMINFO_TRADE = 2;
ITEMINFO_UPDATE = 3;
ITEMINFO_OTHERPLAYER_EQUIPMENT = 4;
ITEMINFO_AUCTION = 5;
}
Item Status
☑️ Assumed (Soul)
enum ItemStatus {
ITEM_STATUS_NONE = 0;
ITEM_STATUS_UNIDENTIFIED = 0x01;
ITEM_STATUS_CANNOT_REPAIR = 0x02;
ITEM_STATUS_FIXED_DURABILITY = 0x04;
ITEM_STATUS_MAGIC_ADD = 0x08;
}
Item Position
☑️ Assumed (Soul)
enum ItemPosition {
ITEMPOSITION_INVENTORY = 0;
ITEMPOSITION_HELMET = 1;
ITEMPOSITION_NECKLACE = 2;
ITEMPOSITION_ARMOR = 3;
ITEMPOSITION_WEAPON_RIGHT = 4;
ITEMPOSITION_WEAPON_LEFT = 5;
ITEMPOSITION_RING = 6;
ITEMPOSITION_TREASURE = 7;
ITEMPOSITION_BOOTS = 8;
ITEMPOSITION_STORAGE = 201;
ITEMPOSITION_TRUNK = 202;
ITEMPOSITION_TREASURE_BAG = 203;
ITEMPOSITION_AUCTION_STORAGE = 207;
ITEMPOSITION_GROUND = 254;
ITEMPOSITION_NONE = 255;
}
Patch 5095
Message Definition
❓ Unverified
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 48 |
| 2 | UInt16 | MsgType | Type of message | 1008 |
| 4 | UInt32 | Item ID | Unique identifier for the item (unless someone else's item) | 1 |
| 8 | UInt32 | Item Type | Identifies the type of item | 730001 |
| 12 | UInt16 | Amount | Current durability or amount of the item | 10000 |
| 14 | UInt16 | Max Amount | Total durability or amount the item can have | 10000 |
| 16 | Byte | Action | How item info should be processed | 1 |
| 17 | Byte | Status | Condition bit flags on the item | 0 |
| 18 | Byte | Position | Position where the item appears | 0 |
| 19 | UInt32 | Socket Progress | Progress on creating a socket | 0 |
| 23 | Byte | Socket 1 | The gem in the first socket position | 0 |
| 24 | Byte | Socket 2 | The gem in the second socket position | 0 |
| 25 | Byte | Magic 1 | Reserved for rebirth magic effect | 0 |
| 26 | Byte | Magic 2 | Reserved for an unknown purpose | 0 |
| 27 | Byte | Magic 3 | Reserved for magical plus rating | 0 |
| 28 | Byte | Bless | Reduced damage percentage taken by the character | 0 |
| 29 | Bool | Bound | True if the item can't be traded | 0 |
| 30 | Byte | Enchant | Added max life for the character | 0 |
| 32 | UInt32 | Data | Additional attributes for the item | 0 |
| 36 | Bool | Suspicious | Marked as suspicious for trading | 0 |
| 38 | Bool | Locked | Locked from being dropped or traded | 0 |
| 40 | Byte | Color | Color modifier for the item | 3 |
| 44 | UInt32 | Magic 3 Progress | Progress towards magical plus rating | 0 |
Action Type
☑️ Assumed (Soul)
enum ItemInfoActionType {
ITEMINFO_NONE = 0;
ITEMINFO_ADDITEM = 1;
ITEMINFO_TRADE = 2;
ITEMINFO_UPDATE = 3;
ITEMINFO_OTHERPLAYER_EQUIPMENT = 4;
ITEMINFO_AUCTION = 5;
}
Item Status
☑️ Assumed (Soul)
enum ItemStatus {
ITEM_STATUS_NONE = 0;
ITEM_STATUS_UNIDENTIFIED = 0x01;
ITEM_STATUS_CANNOT_REPAIR = 0x02;
ITEM_STATUS_FIXED_DURABILITY = 0x04;
ITEM_STATUS_MAGIC_ADD = 0x08;
}
Item Position
☑️ Assumed (Soul)
enum ItemPosition {
ITEMPOSITION_INVENTORY = 0;
ITEMPOSITION_HELMET = 1;
ITEMPOSITION_NECKLACE = 2;
ITEMPOSITION_ARMOR = 3;
ITEMPOSITION_WEAPON_RIGHT = 4;
ITEMPOSITION_WEAPON_LEFT = 5;
ITEMPOSITION_RING = 6;
ITEMPOSITION_TREASURE = 7;
ITEMPOSITION_BOOTS = 8;
ITEMPOSITION_STORAGE = 201;
ITEMPOSITION_TRUNK = 202;
ITEMPOSITION_TREASURE_BAG = 203;
ITEMPOSITION_AUCTION_STORAGE = 207;
ITEMPOSITION_GROUND = 254;
ITEMPOSITION_NONE = 255;
}
Item Color
☑️ Assumed (Observed) - Chimera
enum ItemColor {
ITEMCOLOR_NONE = 0;
ITEMCOLOR_BLACK = 2;
ITEMCOLOR_ORANGE = 3;
ITEMCOLOR_TEAL = 4;
ITEMCOLOR_RED = 5;
ITEMCOLOR_BLUE = 6;
ITEMCOLOR_YELLOW = 7;
ITEMCOLOR_PURPLE = 8;
ITEMCOLOR_WHITE = 9;
}
MsgItemInfoEx
This message is sent by the game server to the client to display an item with additional details for a game feature (like marketplace booths). For the most part, this message resembles MsgItemInfo with the addition of price, extended action type, and optional string (seems unused in Conquer Online).
Table of Contents
Patch 4267
Message Definition
☑️ Assumed (Soul)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 37 |
| 2 | UInt16 | MsgType | Type of message | 1108 |
| 4 | UInt32 | ID | Unique identifier for the item | 10 |
| 8 | UInt32 | Owner ID | Unique identifier for the target player | 1000000 |
| 12 | UInt32 | Price | Cost of the item if vending | 100 |
| 16 | UInt32 | Item Type | Identifies the type of item | 730001 |
| 20 | UInt16 | Amount | Current durability or amount of the item | 10000 |
| 22 | UInt16 | Max Amount | Total durability or amount the item can have | 10000 |
| 24 | Byte | Action | How item info is extended | 1 |
| 25 | Byte | Status | Condition bit flags on the item | 0 |
| 26 | Byte | Position | Position where the item appears | 0 |
| 27 | Byte | Socket 1 | The gem in the first socket position | 0 |
| 28 | Byte | Socket 2 | The gem in the second socket position | 0 |
| 29 | Byte | Magic 1 | Reserved for rebirth magic effect | 0 |
| 30 | Byte | Magic 2 | Reserved for an unknown purpose | 0 |
| 31 | Byte | Magic 3 | Reserved for magical plus rating | 0 |
| 32 | UInt32 | Data | Additional attributes for the item | 0 |
| 36 | NetStringPacker | Strings | Group of length prefixed strings |
Action Type
☑️ Assumed (Soul)
| Val | Name | Description | Strings |
|---|---|---|---|
| 1 | BOOTH | Vending at a player booth | |
| 2 | EQUIPMENT | Updates equipment info window |
MsgItemStatus
MsgKickOut
MsgLeaveWord
MsgLoadMap
Undocumented
MsgLoginAccountEx
MsgLoginChallengeS
The account server sends this message to client to start the SRP6 challenge. The challenge consists of the calculated public ephemeral value (B = kv + g^b mod |N|) and the player's salt (S). The client expects this message in response to MsgAccountSRP6 / MsgAccountSRP6Ex, and responds with MsgLoginProofC.
Table of Contents
Patch 5635
Message Definition
☑️ Assumed (Observed)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 653 |
| 2 | UInt16 | MsgType | Type of message | 1213 |
| 4 | Byte | B Length | Server's public ephemeral length | |
| 5 | Byte[] | B | Server's public ephemeral value | |
| 391 | Byte | S Length | Salt length | |
| 392 | Byte[] | S | The player's salt |
MsgLoginNotice
MsgLoginProofC
The client sends this message back to the account server in response to MsgLoginChallengeS for completing the SRP6 challenge. The response contains the client's proof of K (the client key C). The account server is expected to complete its own proof of K (server key M), which it then compares against C. It then sends MsgConnectEx to either accept or reject the client.
⚠️ WARNING
The server should always verify that the client's proof of K and public ephemeral value are non-zero.
Table of Contents
Patch 5635
Message Definition
☑️ Assumed (Observed)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 262 |
| 2 | UInt16 | MsgType | Type of message | 1214 |
| 4 | Byte | A Length | Client's public ephemeral length | |
| 5 | Byte[] | A | Client's public ephemeral value | |
| 133 | Byte | C Length | Client's proof of K length | |
| 134 | Byte[] | C | Client's proof of K |
MsgLottery
MsgMagicCoat
MsgMagicEffect
This game server message is sent to the client to display a damaging magical effect from a target or cell coordinate on one or many targets. MagicType.dat contains all spell types that can be sent with this message.
In later versions of the client, the target coordinates are lightly encrypted. See MsgInteract for details.
Table of Contents
Patch 4267
Message Definition
☑️ Assumed (Observed) - CoFuture + Soul
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 36 |
| 2 | UInt16 | MsgType | Type of message | 1105 |
| 4 | UInt32 | User | Unique identifier of the role | 1000000 |
| 8 | UInt32 | Target | Unique identifier of the target or a coordinate | LOW: 320 HIGH: 460 |
| 12 | UInt16 | Type | Type of magic being cast | 1001 |
| 14 | UInt16 | Level | Level of the magic being cast | 1 |
| 16 | UInt32 | Effect Num | Number of effects to display | 1 |
| 20 | RoleInfo[] | Effects | Effects to display on roles |
Magic Effect Role Info
🚩 Incomplete
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt32 | Role | Role ID of the target in the area effect | 1000001 |
| 1 | UInt32 | Data | Damage associated with the area effect | 1 |
| 2 | UInt32 | Reserved | Unknown | 0 |
MsgMagicInfo
This game server message is sent to the client to describe spells the player has learned. MagicType.dat contains all spells accompanied with available levels and experience required for the next level, used to fill this message.
Table of Contents
Patch 4267
Message Definition
☑️ Assumed (Observed) - CoFuture + Soul
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 12 |
| 2 | UInt16 | MsgType | Type of message | 1103 |
| 4 | UInt32 | Exp | Current experience towards leveling the spell | 0 |
| 8 | UInt16 | Type | Magic type identifier | 1001 |
| 10 | UInt16 | Level | Level of the spell | 1 |
MsgMailContent
Undocumented
MsgMailList
Undocumented
MsgMailNotify
Undocumented
MsgMailOperation
Undocumented
MsgMapInfo
This small game server message is sent to instruct the client on which data map document to load from and what map type flags apply to it. This allows the game server to create unique duplicates of a map that reference one single data map.
Rather than referencing the file path to the DMap in the message, an identifier is used as a key for looking up the path in GameMap.dat.
Table of Contents
Patch 4267
Message Definition
✅ Verified (Client)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 16 |
| 2 | UInt16 | MsgType | Type of message | 1110 |
| 4 | UInt32 | Map ID | Map identifier | 1002 |
| 8 | UInt32 | Doc ID | DMap identifier | 1002 |
| 12 | UInt32 | Type | Map type flags | 0 |
Map Type Flags
☑️ Assumed (Soul)
enum MapTypeFlags {
MAPTYPE_NORMAL = 0x0000,
MAPTYPE_PKFIELD = 0x0001,
MAPTYPE_CHGMAP_DISABLE = 0x0002,
MAPTYPE_RECORD_DISABLE = 0x0004,
MAPTYPE_PK_DISABLE = 0x0008,
MAPTYPE_BOOTH_ENABLE = 0x0010,
MAPTYPE_TEAM_DISABLE = 0x0020,
MAPTYPE_TELEPORT_DISABLE = 0x0040,
MAPTYPE_SYN_MAP = 0x0080,
MAPTYPE_PRISON_MAP = 0x0100,
MAPTYPE_FLY_DISABLE = 0x00200,
MAPTYPE_FAMILY = 0x00400,
MAPTYPE_MINEFIELD = 0x0800,
MAPTYPE_PKGAME = 0x1000,
}
MsgMapItem
This game server message is sent to the client to display an action with an item on the map floor. It also allows the server to set "traps", which act as magic effects on a map tile and are used for squama rewards.
Table of Contents
Patch 4267
Message Definition
☑️ Assumed (Observed) - CoFuture + Soul
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 18 |
| 2 | UInt16 | MsgType | Type of message | 1101 |
| 4 | UInt32 | ID | Map item identifier | 1 |
| 8 | UInt32 | Type | Map item type or trap look | 0 |
| 12 | UInt16 | Pos X | X coordinate of the item or trap | 320 |
| 14 | UInt16 | Pos Y | Y coordinate of the item or trap | 460 |
| 16 | UInt16 | Action | How to process the message | 1 |
Action Type
☑️ Assumed (Observed) - CoFuture + Soul
| Val | Name | Description | Recipient | ID | Type |
|---|---|---|---|---|---|
| 1 | CREATE | Create map item | Client | Map Item ID | Item Type |
| 2 | DELETE | Delete map item | Client | Map Item ID | |
| 3 | PICK | Request to pick up map item | Server | Map Item ID | |
| 10 | CAST_TRAP | Place a floor trap | Client | Trap ID | Look |
| 11 | SYNCHRO_TRAP | Update a floor trap | Client | Trap ID | Look |
| 12 | DROP_TRAP | Stop a floor trap | Client | Trap ID |
Patch 5095
Message Definition
☑️ Assumed (Observed) - Elite-CoEmu
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 24 |
| 2 | UInt16 | MsgType | Type of message | 1101 |
| 4 | UInt32 | ID | Map item identifier | 1 |
| 8 | UInt32 | Type | Map item type or trap look | 0 |
| 12 | UInt16 | Pos X | X coordinate of the item or trap | 320 |
| 14 | UInt16 | Pos Y | Y coordinate of the item or trap | 460 |
| 16 | UInt16 | Color | Color modifier for the item | 3 |
| 18 | UInt16 | Action | How to process the message | 1 |
| 20 | UInt32 | Unused | Confirmed unused by the client | 0 |
Action Type
☑️ Assumed (Observed) - Elite-CoEmu
| Val | Name | Description | Recipient | ID | Type |
|---|---|---|---|---|---|
| 1 | CREATE | Create map item | Client | Map Item ID | Item Type |
| 2 | DELETE | Delete map item | Client | Map Item ID | |
| 3 | PICK | Request to pick up map item | Server | Map Item ID | |
| 4 | PICK_EFFECT | Pick up item with an effect | Client | Map Item ID | |
| 10 | CAST_TRAP | Place a floor trap | Client | Trap ID | Look |
| 11 | SYNCHRO_TRAP | Update a floor trap | Client | Trap ID | Look |
| 12 | DROP_TRAP | Stop a floor trap | Client | Trap ID |
MsgMentorPlayer
MsgMessageBoard
Message boards are categorized into channels, referenced in MsgTalk as Text Attributes. The game server and client pass this message to organize text messages from MsgTalk into listable postings.
The NetStringPacker returned when listing posts (10 maximum) is flattened groupings of three strings each:
- Name: The name of the hero who authored the message.
- Message: Text shortened to 36 characters.
- Date: In the format yyyyMMddHHmmss.
Table of Contents
Patch 5017
Message Definition
☑️ Assumed (Observed) - Soul + COPSv6
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 9 |
| 2 | UInt16 | MsgType | Type of message | 1111 |
| 4 | UInt16 | Index | Message index for continuation | 0 |
| 6 | UInt16 | Channel | Text Attributes | 2201 |
| 8 | Byte | Action | Message action type | 2 |
| 9 | NetStringPacker | Strings |
Message Board Action
☑️ Assumed (Observed) - Soul + COPSv6
| Val | Name | Description | Recipient | Strings |
|---|---|---|---|---|
| 1 | DEL | Deletes a message on the board | Server | 1 4 Hero |
| 2 | GET_LIST | Fetches list of messages by index | Server | |
| 3 | LIST | List of messages for a requested index | Client | (See format) |
| 4 | GET_WORDS | Request MsgTalk message for a post | Server |
MsgMeteSpecial
MsgMonsterTransform
Undocumented
MsgName
This message allows the client to query for a string update, and allows the game server to trigger a string command on the client. In later versions of the client, the purpose of this message is mostly superseded by MsgAction, which adds an optional string parameter. Even in lower patches, a few types are unimplemented since they overlap with functionality in other messages, such as deleting the role.
Fireworks are an interesting type in this packet, as the way the client processes a fireworks request is to make the string an even number of letters, iterate through every two characters, and spawn a firework at a random coordinate near the center of the screen for those two characters.
Table of Contents
Patch 4267
Message Definition
☑️ Assumed (Observed) - CoFuture
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 10 |
| 2 | UInt16 | MsgType | Type of message | 1015 |
| 4 | UInt32 | Data | A parameter, target role ID, or coordinates | 1000001 |
| 8 | Byte | Action Type | The type of contents in the message | 6 |
| 9 | NetStringPacker | Strings | Group of length prefixed strings |
Action Type
☑️ Assumed (Observed) - CoFuture + Soul
🔶 Response data
| Val | Name | Description | Recipient | Data | NetStringPacker |
|---|---|---|---|---|---|
| 1 | FIREWORKS | Spawn fireworks | Client | Hero ID | 1 4 Test |
| 3 | CHANGE_SYN | Update guild name | Client | Guild ID | 1 4 Name |
| 6 | MATE | Update mate | Client | Hero ID | 1 4 Mate |
| 9 | MAP_EFFECT | Spawn effect at coordinates | Client | LOW: X HIGH: Y | 1 7 rainbow |
| 10 | ROLE_EFFECT | Spawn effect on role | Client | Role ID | 1 9 warrior-s |
| 11 | MEMBER_LIST | Get guild member list | Server | Index | 1 6 Member 🔶 |
| 16 | QUERY_MATE | Get mate's name | Server | Hero ID | 1 4 Mate 🔶 |
| 17 | ADD_DICE_PLAYER | Add player / open game | Server | Dice Game ID 🔶 | 1 6 Player |
| 18 | DEL_DICE_PLAYER | Delete player / close game | Server | Dice Game ID | 1 6 Player |
| 19 | DICE_BONUS | Update money bonus | Client | Money | 1 6 Player |
| 20 | PLAYER_WAVE | Play DX Sound | Client | LOW: X HIGH: Y | 1 11 sound/1.wav |
Patch 5017
Message Definition
☑️ Assumed (Observed) - CoFuture
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 10 |
| 2 | UInt16 | MsgType | Type of message | 1015 |
| 4 | UInt32 | Data | A parameter, target role ID, or coordinates | 1000001 |
| 8 | Byte | Action Type | The type of contents in the message | 6 |
| 9 | NetStringPacker | Strings | Group of length prefixed strings |
Action Type
☑️ Assumed (Observed) - CoFuture + Soul
🔶 Response data
| Val | Name | Description | Recipient | Data | NetStringPacker |
|---|---|---|---|---|---|
| 1 | FIREWORKS | Spawn fireworks | Client | Hero ID | 1 4 Test |
| 3 | CHANGE_SYN | Update guild name | Client | Guild ID | 1 4 Name |
| 6 | MATE | Update mate | Client | Hero ID | 1 4 Mate |
| 9 | MAP_EFFECT | Spawn effect at coordinates | Client | LOW: X HIGH: Y | 1 7 rainbow |
| 10 | ROLE_EFFECT | Spawn effect on role | Client | Role ID | 1 9 warrior-s |
| 11 | MEMBER_LIST | Get guild member list | Server | Index | 1 6 Member 🔶 |
| 16 | QUERY_MATE | Get mate's name | Server | Hero ID | 1 4 Mate 🔶 |
| 17 | ADD_DICE_PLAYER | Add player / open game | Server | Dice Game ID 🔶 | 1 6 Player |
| 18 | DEL_DICE_PLAYER | Delete player / close game | Server | Dice Game ID | 1 6 Player |
| 19 | DICE_BONUS | Update money bonus | Client | Money | 1 6 Player |
| 20 | PLAYER_WAVE | Play DX Sound | Client | LOW: X HIGH: Y | 1 11 sound/1.wav |
| 26 | WHISPER_DIALOG | Dialog window details | Server | See below 🔶 |
Whisper NetStringPacker Fields
| Name | Description | Example |
|---|---|---|
| Name | Target player | Player |
| Details | HeroID Level Potency GuildName | 1000001 1 1 Guild |
MsgNationality
MsgNpc
This message is sent to the game server to interact with an NPC. This is mostly used to activate an NPC for a shop or dialog, but can also be used to place and delete player furniture. This same feature can be used from PM menus to add and delete any NPC using the client as an editor.
Table of Contents
Patch 4267
Message Definition
☑️ Assumed (Observed) - CoFuture + Soul
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 16 |
| 2 | UInt16 | MsgType | Type of message | 2031 |
| 4 | UInt32 | ID | Unique identifier | 1 |
| 8 | UInt32 | Data | Option or coordinate of the action | 10 |
| 12 | UInt16 | Event | How to process the message | 0 |
| 14 | UInt16 | Role | The RoleType of the NPC | 0 |
NPC Event Type
☑️ Assumed (Soul)
🔶 Response data
| Val | Name | Description | Recipient | ID | Data |
|---|---|---|---|---|---|
| 0 | ACTIVATE | Activates an NPC for dialog | Server | NPC ID | |
| 1 | ADD_NPC | Adds an NPC to the map | Server | NPC ID | |
| 2 | LEAVE_MAP | Deletes an NPC from the map | Client | NPC ID | |
| 3 | DEL_NPC | Requests an NPC be deleted | Server | NPC ID | |
| 4 | CHANGE_POS | Change the position of the NPC | Both | NPC ID | LOW: X HIGH: Y 🔶 |
| 5 | LAY_NPC | Notifies the client to start placing | Client | Lookface |
MsgNpcInfo
This message is sent by the game server to the client to spawn an NPC into the world.
The lookface of an NPC is as calculated:
Lookface = Type * 10 + Direction
The type portion of the lookface can be found in npc.ini. This file is also what determines the name of the NPC.
Table of Contents
Patch 4267
Message Definition
☑️ Assumed (Observed) - CoFuture + Soul
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 18 |
| 2 | UInt16 | MsgType | Type of message | 2030 |
| 4 | UInt32 | ID | Unique identifier | 1 |
| 8 | UInt16 | X | X coordinate of the NPC | 320 |
| 10 | UInt16 | Y | Y coordinate of the NPC | 460 |
| 12 | UInt16 | Role | The role the NPC plays | 1 |
| 14 | UInt16 | Lookface | The type and direction of the NPC | 10 |
| 16 | UInt16 | Sort | Sort flags or action type the NPC performs | 1 |
| 18 | NetStringPacker | Strings | Optional name of the NPC |
NPC Sort Flags
☑️ Assumed (Observed) - CoFuture + Soul
| Val | Name | Description | Strings |
|---|---|---|---|
| 0 | NONE | NPC that responds as dialog | |
| 1 | TASK | NPC that opens a window in the client | |
| 2 | RECYCLE | NPC that is dynamically relocated |
Patch 5065
Message Definition
❓ Unverified
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 20 |
| 2 | UInt16 | MsgType | Type of message | 2030 |
| 4 | UInt32 | ID | Unique identifier | 1 |
| 8 | UInt16 | X | X coordinate of the NPC | 320 |
| 10 | UInt16 | Y | Y coordinate of the NPC | 460 |
| 12 | UInt16 | Lookface | The type and direction of the NPC | 10 |
| 14 | UInt16 | Role | The role the NPC plays | 1 |
| 16 | UInt16 | Sort | Sort flags or action type the NPC performs | 1 |
| 18 | NetStringPacker | Strings | Optional name of the NPC |
NPC Sort Flags
❓ Unverified
| Val | Name | Description | Strings |
|---|---|---|---|
| 0 | NONE | NPC that responds as dialog | |
| 1 | TASK | NPC that opens a window in the client | |
| 2 | RECYCLE | NPC that is dynamically relocated |
Patch 5517
Message Definition
❓ Unverified
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 32 |
| 2 | UInt16 | MsgType | Type of message | 2030 |
| 4 | UInt32 | ID | Unique identifier | 1 |
| 8 | UInt32 | ID | Static identifier | 1 |
| 12 | UInt16 | X | X coordinate of the NPC | 320 |
| 14 | UInt16 | Y | Y coordinate of the NPC | 460 |
| 16 | UInt16 | Lookface | The type and direction of the NPC | 10 |
| 18 | UInt16 | Role | The role the NPC plays | 1 |
| 20 | UInt16 | Sort | Sort flags or action type the NPC performs | 1 |
| 22 | NetStringPacker | Strings | Optional name of the NPC |
NPC Sort Flags
❓ Unverified
| Val | Name | Description | Strings |
|---|---|---|---|
| 0 | NONE | NPC that responds as dialog | |
| 1 | TASK | NPC that opens a window in the client | |
| 2 | RECYCLE | NPC that is dynamically relocated |
MsgNpcInfoEx
This message is sent by the game server to the client to spawn an NPC with health, an extension of MsgNpcInfo. This is normally used for spawning terrain NPCs, such as the guild gate or pole during guild wars.
Table of Contents
Patch 4267
Message Definition
☑️ Assumed (Soul)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 36 |
| 2 | UInt16 | MsgType | Type of message | 1109 |
| 4 | UInt32 | ID | Unique identifier | 6701 |
| 8 | UInt32 | Max Life | Maximum health of the NPC | 10000000 |
| 12 | UInt32 | Life | Current health of the NPC | 10000000 |
| 16 | UInt16 | X | X coordinate of the NPC | 163 |
| 18 | UInt16 | Y | Y coordinate of the NPC | 211 |
| 20 | UInt16 | Role | The role the NPC plays | 26 |
| 22 | UInt16 | Lookface | The type and direction of the NPC | 241 |
| 24 | UInt16 | Sort | Sort flags or action type the NPC performs | 1 |
| 26 | NetStringPacker | Strings | Optional name of the NPC | 1 8 LeftGate |
MsgNpcPath
Undocumented
MsgOperatingAct
MsgOperatingActInfo
MsgOwnKongfuBase
MsgOwnKongfuImproveFeedback
MsgOwnKongfuImproveSummaryInfo
MsgOwnKongfuPKSetting
MsgOwnKongRank
MsgPackage
This message is sent between the client and game server to handle item storage, such as warehouses, chests in houses, and sashes in later versions of Conquer Online.
Table of Contents
Patch 4267
Message Definition
☑️ Assumed (Observed) - CoFuture + Soul
The message definition below is used for basic requests on checking in and out items.
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 14 |
| 2 | UInt16 | MsgType | Type of message | 1102 |
| 4 | UInt32 | ID | Identifier for a hero, NPC, or trunk | 8 |
| 8 | Byte | Action | How to process the message | 0 |
| 9 | Byte | Type | The type of package being processed | 10 |
| 10 | UInt32 | Item ID | Unique identifier of the item | 1 |
The message definition below is used for returning a list of items back to the player.
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 28 |
| 2 | UInt16 | MsgType | Type of message | 1102 |
| 4 | UInt32 | ID | Identifier for a hero, NPC, or trunk | 8 |
| 8 | Byte | Action | How to process the message | 0 |
| 9 | Byte | Type | The type of package being processed | 10 |
| 10 | UInt16 | Amount | Amount of items to send | 1 |
| 12 | PackageItem[] | Items | Abbreviated item infos |
Package Item Definition
❓ Unverified
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt32 | Item ID | Unique identifier of the item | 1 |
| 4 | UInt32 | Item Type | Identifies the type of item | 730001 |
| 8 | Byte | Status | Condition bit flags on the item | 0 |
| 9 | Byte | Socket 1 | The gem in the first socket position | 0 |
| 10 | Byte | Socket 2 | The gem in the second socket position | 0 |
| 11 | Byte | Magic 1 | Reserved for rebirth magic effect | 0 |
| 12 | Byte | Magic 2 | Reserved for an unknown purpose | 0 |
| 13 | Byte | Magic 3 | Reserved for magical plus rating | 0 |
| 14 | Byte | Bless | Reduced damage percentage taken by the character | 0 |
| 15 | Byte | Enchant | Added max life for the character | 0 |
Action Type
☑️ Assumed (Observed) - CoFuture + Soul
| Val | Name | Description | Recipient | ID | Data |
|---|---|---|---|---|---|
| 0 | QUERY_LIST | Query for a list of items | Server | NPC ID | PackageItem[] |
| 1 | CHECK_IN | Deposit an item | Server | NPC ID | ItemID |
| 2 | CHECK_OUT | Withdraw an item | Server | NPC ID | ItemID |
Package Type
☑️ Assumed (Observed) - CoFuture + Soul
enum PackageType {
PACKAGE_TYPE_NONE = 0;
PACKAGE_TYPE_STORAGE = 10;
PACKAGE_TYPE_TRUNK = 20;
}
Patch 5187
Message Definition
❓ Unverified
The message definition below is used for basic requests on checking in and out items.
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 14 |
| 2 | UInt16 | MsgType | Type of message | 1102 |
| 4 | UInt32 | ID | Identifier for a hero, NPC, or trunk | 8 |
| 8 | Byte | Action | How to process the message | 0 |
| 9 | Byte | Type | The type of package being processed | 10 |
| 10 | UInt32 | Item ID | Unique identifier of the item | 1 |
The message definition below is used for returning a list of items back to the player.
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 38 |
| 2 | UInt16 | MsgType | Type of message | 1102 |
| 4 | UInt32 | ID | Identifier for a hero, NPC, or trunk | 8 |
| 8 | Byte | Action | How to process the message | 0 |
| 9 | Byte | Type | The type of package being processed | 10 |
| 10 | UInt16 | Amount | Amount of items to send | 1 |
| 12 | PackageItem[] | Items | Abbreviated item infos |
Package Item Definition
❓ Unverified
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt32 | Item ID | Unique identifier of the item | 1 |
| 4 | UInt32 | Item Type | Identifies the type of item | 730001 |
| 8 | Byte | Status | Condition bit flags on the item | 0 |
| 9 | Byte | Socket 1 | The gem in the first socket position | 0 |
| 10 | Byte | Socket 2 | The gem in the second socket position | 0 |
| 11 | Byte | Magic 1 | Reserved for rebirth magic effect | 0 |
| 12 | Byte | Magic 2 | Reserved for an unknown purpose | 0 |
| 13 | Byte | Magic 3 | Reserved for magical plus rating | 0 |
| 14 | Bool | Bound | True if the item is bound to an account | 0 |
| 15 | Byte | Bless | Reduced damage percentage taken by the character | 0 |
| 16 | Byte | Enchant | Added max life for the character | 0 |
| 17 | UInt16 | Data | Additional attributes for the item | 0 |
| 19 | Bool | Suspicious | Marked as suspicious for trading | 0 |
| 20 | Bool | Locked | Locked from being dropped or traded | 0 |
| 21 | Byte | Color | Color modifier for the item | 3 |
| 22 | UInt32 | Magic 3 Progress | Progress towards magical plus rating | 0 |
Action Type
❓ Unverified
| Val | Name | Description | Recipient | ID | Data |
|---|---|---|---|---|---|
| 0 | QUERY_LIST | Query for a list of items | Server | NPC ID | PackageItem[] |
| 1 | CHECK_IN | Deposit an item | Server | NPC ID | ItemID |
| 2 | CHECK_OUT | Withdraw an item | Server | NPC ID | ItemID |
Package Type
❓ Unverified
enum PackageType {
PACKAGE_TYPE_NONE = 0;
PACKAGE_TYPE_STORAGE = 10;
PACKAGE_TYPE_TRUNK = 20;
PACKAGE_TYPE_SASH = 30;
}
MsgPaint
MsgPCNum
This client message is sent to the account server after receiving MsgConnectEx and contains the client's mac address. The mac address field in this message is trailed by a null terminator at offset 48 (explicitly set by the client).
Table of Contents
Patch 5615
Message Definition
✅ Verified (Client)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 52 |
| 2 | UInt16 | MsgType | Type of message | 1100 |
| 4 | UInt32 | Account ID | Account id from the account server | 1 |
| 8 | Char[40] | Mac address | Mac address for the client interface | 0A0B0C0D0E0F |
MsgPCServerConfig
Undocumented
MsgPeerage
This message is used entirely for the Nobility (aka peerage) system where players can donate silver or CPs to achieve a peerage rank (Knight, Earl, King etc.), increase battle power and appear on a leaderboard.
Patch 5517 (Mac: 1029)
✅ Verified: This data was determined through reverse engineering the Mac Client Binary 1029 (same release date as PC 5517) and also reverse engineering the leaked server binaries (namely Peerage.dll in ZFServer)
Message Definition
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of message | - |
| 2 | UInt16 | MsgType | Type of message | 2064 |
| 4 | UInt16 | PeerageActionType | Action subtype | - |
| 6 | UInt16 | - | Padding 🔵 | 0 |
| 8 | Variable | Data | Action-specific payload, see PeerageActionType | - |
🔵 Padding here is intentional to align the data payload start to be offset 8 (UInt64)
PeerageActionType
| Val | Name | Description | Sender | Data |
|---|---|---|---|---|
| 1 | SEND_DONATION | Hero donates silver or CPs | Client | Amount (UInt64), CurrencyType🟣 (UInt16) |
| 1 | SEND_DONATION | Server confirms hero's donation | Server | Padding (UInt64), Padding (UInt64), Padding (UInt64), ContributeDonateInfoString (NetStringPacker) |
| 2 | LEADERBOARD | Request a leaderboard page | Client | PageNumber (UInt32) |
| 2 | LEADERBOARD | Return a leaderboard page | Server | See Leaderboard Response |
| 3 | REFRESH_RANK | Refresh hero's peerage rank & donation | Server | Hero ID (UInt32), Padding (UInt64), Padding (UInt64), Padding (UInt32), ContributeTipInfoString (NetStringPacker) |
| 4 | QUERY_MINIMUM | Query minimum donation to be a rank | Client | SelectedPeerageRank (UInt32) |
| 4 | QUERY_MINIMUM | Return minimum donation data | Server | RemainingDonationAmount (UInt64), Padding (UInt32), ExpectedLeaderboardPosition (UInt32), CurrentLeaderboardPosition (UInt32) |
🟣 CurrencyType values: 0 = Silver, 1 = EMoney (CPs), 2 = Bound EMoney (CPs).
Leaderboard Response
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 8 | UInt16 | CurrentVisibleLeaderboardPage | The visible page in the client leaderboard dialog | 2 |
| 10 | UInt16 | TotalLeaderboardPages | Total pages for leaderboard dialog | 5 |
| 12 | UInt32 | EntryCount | Number of entries in this message (the page) | 10 |
| 16 | UInt32 | - | Padding | 0 |
| 20 | UInt32 | - | Padding | 0 |
| 24 | UInt32 | - | Padding | 0 |
| 28 | UInt32 | - | Padding | 0 |
| 32 | Entry[EntryCount] | LeaderboardEntryStruct[] | Leaderboard entries | See below |
Leaderboard Entry Structure
Each entry is always 48 bytes.
| Pos | Type | Name | Description |
|---|---|---|---|
| 0 | UInt32 | Hero ID | The player's unique identifier |
| 4 | UInt8 | Hero Online | Boolean set to 1 if player is online (value is unused by the client) |
| 5 | UInt8 | - | Padding |
| 6 | UInt16 | - | Padding |
| 8 | UInt32 | Look Face | The player's mesh, to derive gender of the peerage rank |
| 12 | String | HeroName | Player's character name (16 bytes) |
| 28 | UInt32 | - | Padding |
| 32 | Int64 | PlayerTotalDonation | The player's cumulative total donation amount |
| 40 | UInt32 | PeerageRank | The player's peerage rank number, see Nobility |
| 44 | Int32 | Position | The player's position on the donation leaderboard (Start at 0, client adds 1) |
ContributeDonateInfoString
ContributeDonateInfoString is a space-separated string parsed by the client as "%u %u %lld %lld %u"
| Index | Format | Name | Description |
|---|---|---|---|
| 0 | UInt32 | Hero ID | The hero's UID |
| 1 | UInt32 | Unknown | Parsed but appears unused by the client |
| 2 | Int64 | DonationAmount | The confirmed amount donated by the hero |
| 3 | Int64 | TotalDonation | The hero's cumulative total donation amount |
| 4 | UInt32 | LeaderboardPosition | The hero's donation leaderboard rank (Start at 0, client adds 1) |
ContributeTipInfoString
ContributeTipInfoString is a space-separated string parsed by the client as "%u %lld %u %d".
| Index | Format | Name | Description |
|---|---|---|---|
| 0 | UInt32 | Hero ID | The hero's UID |
| 1 | Int64 | TotalDonation | The hero's cumulative total donation amount |
| 2 | UInt32 | PeerageRank | The hero's peerage rank number, see Nobility |
| 3 | Int32 | LeaderboardPosition | The hero's position on the donation leaderboard (Start at 0, client adds 1) |
MsgPetInfo
MsgPicKey
MsgPicKeyError
MsgPigeon
MsgPigeonQuery
MsgPing
Undocumented
MsgPKEliteMatchInfo
MsgPKEnable
MsgPKStatistic
MsgPlayer
This message is received by the client to spawn an entity on screen. Though the official name of the message suggests it spawns only players, it also spawns monsters on the game map. Entities must be less than or equal to 18 tiles away in both the x and y direction; otherwise, entities outside of that range will not spawn and automatically be cleaned up by the client.
In patches 5200 and above, this message is not enough to spawn equipment on the player. MsgPlayerAttribInfo must be sent afterwards to finish spawning equipment and calculate final attributes.
Table of Contents
Patch 4267
Player Message Definition
❓ Unverified
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 65 |
| 2 | UInt16 | MsgType | Type of message | 1014 |
| 4 | UInt32 | Hero ID | Unique identifier for the entity | 1000000 |
| 8 | UInt32 | Look Face | Mesh of the entity | 501002 |
| 12 | UInt32 | Status Effect | Status effect bitmap | 0 |
| 16 | UInt32 | Syn Mask | SynID << 4 | SynRank & 0x00FFFFFF | 0 |
| 20 | UInt32 | Garment | Garment's item type identifier | 0 |
| 24 | UInt32 | Armet | Headgear's item type identifier | 0 |
| 28 | UInt32 | Armor | Armor's item type identifier | 0 |
| 32 | UInt32 | Right Hand | Weapon's item type identifier | 0 |
| 36 | UInt32 | Left Hand | Weapon's item type identifier | 0 |
| 44 | UInt16 | X | X coordinate of the entity | 320 |
| 46 | UInt16 | Y | Y coordinate of the entity | 460 |
| 48 | UInt16 | Hair | Hairstyle and hair color | 535 |
| 50 | Byte | Direction | Entity direction | 0 |
| 51 | Byte | Pose | Player's current pose | 100 |
| 52 | NetStringPacker | Strings | Group of length prefixed strings |
NetStringPacker Fields
| Name | Description | Example |
|---|---|---|
| Name | Name of the player | Player |
| Mate | Name of the player's spouse | Mate |
Monster Message Definition
❓ Unverified
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 61 |
| 2 | UInt16 | MsgType | Type of message | 1014 |
| 4 | UInt32 | Hero ID | Unique identifier for the entity | 400001 |
| 8 | UInt32 | Look Face | Mesh of the entity | 102 |
| 12 | UInt32 | Status Effect | Status effect bitmap | 0 |
| 16 | UInt32 | Owner ID | Identifier of the pet's owner | 0 |
| 40 | UInt16 | Life | Hitpoints of the entity | 12 |
| 42 | UInt16 | Level | Level of the entity | 1 |
| 44 | UInt16 | X | X coordinate of the entity | 320 |
| 46 | UInt16 | Y | Y coordinate of the entity | 460 |
| 50 | Byte | Direction | Entity direction | 0 |
| 51 | Byte | Pose | Player's current pose | 100 |
| 52 | NetStringPacker | Strings | Group of length prefixed strings |
NetStringPacker Fields
| Name | Description | Example |
|---|---|---|
| Name | Name of the monster | Monster |
Patch 5103
Player Message Definition
❓ Unverified - Imported from legacy wiki
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 107 |
| 2 | UInt16 | MsgType | Type of message | 1014 |
| 4 | UInt32 | Look Face | Mesh of the entity | 501002 |
| 8 | UInt32 | Hero ID | Unique identifier for the entity | 1000000 |
| 12 | UInt32 | Syn Mask | SynID << 4 | SynRank & 0x00FFFFFF | 0 |
| 16 | UInt64 | Status Effect | Status effect bitmap | 0 |
| 24 | UInt32 | Garment | Garment's item type identifier | 0 |
| 28 | UInt32 | Armet | Headgear's item type identifier | 0 |
| 32 | UInt32 | Armor | Armor's item type identifier | 0 |
| 36 | UInt32 | Right Hand | Weapon's item type identifier | 0 |
| 40 | UInt32 | Left Hand | Weapon's item type identifier | 0 |
| 52 | UInt16 | Hair | Hairstyle and hair color | 535 |
| 54 | UInt16 | X | X coordinate of the entity | 320 |
| 56 | UInt16 | Y | Y coordinate of the entity | 460 |
| 58 | Byte | Direction | Entity direction | 0 |
| 59 | Byte | Pose | Player's current pose | 100 |
| 60 | UInt16 | Metempsychosis | Metempsychosis level | 0 |
| 70 | UInt16 | Shared BP | Battle power from mentor | 0 |
| 77 | UInt32 | Flower Rank | Flower ranking | 0 |
| 81 | UInt32 | Nobility Rank | Nobility ranking | 12 |
| 85 | UInt16 | Armor Color | Color of equipped armor | 3 |
| 87 | UInt16 | Shield Color | Color of equipped shield | 4 |
| 89 | UInt16 | Armet Color | Color of equipped headgear | 3 |
| 91 | UInt32 | Study Points | Quiz show points | 6546 |
| 95 | NetStringPacker | Strings | Group of length prefixed strings |
NetStringPacker Fields
| Name | Description | Example |
|---|---|---|
| Name | Name of the player | Player |
| Mate | Name of the player's spouse | Mate |
Monster Message Definition
❓ Unverified
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 103 |
| 2 | UInt16 | MsgType | Type of message | 10014 |
| 4 | UInt32 | Look Face | Mesh of the entity | 501002 |
| 8 | UInt32 | Hero ID | Unique identifier for the entity | 1000000 |
| 12 | UInt32 | Owner ID | Identifier of the pet's owner | 0 |
| 16 | UInt64 | Status Effect | Status effect bitmap | 0 |
| 48 | UInt16 | Life | Hitpoints of the entity | 12 |
| 54 | UInt16 | X | X coordinate of the entity | 320 |
| 56 | UInt16 | Y | Y coordinate of the entity | 460 |
| 58 | Byte | Direction | Entity direction | 0 |
| 59 | Byte | Pose | Player's current pose | 100 |
| 62 | UInt16 | Level | Level of the entity | 1 |
| 95 | NetStringPacker | Strings | Group of length prefixed strings |
NetStringPacker Fields
| Name | Description | Example |
|---|---|---|
| Name | Name of the monster | Monster |
MsgPlayerAttribInfo
This message is sent to the client to initialize the battle statistics panel with various damage and defense attributes, and is sent after the MsgUserInfo and MsgItemInfo messages to finish displaying equipped items. When a player's equipment is observed by another player using MsgAction, then this message is also sent to finish populating equipment.
New attributes were introduced with the introduction of Refinery, Stabilization, and Chi.
Table of Contents
Patch 5615
Message Definition
❓ Unverified
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 136 |
| 2 | UInt16 | MsgType | Type of message | 1040 |
| 4 | UInt32 | Hero ID | Unique identifier for the character | 1000000 |
| 8 | UInt32 | Life | Current hitpoints | 100 |
| 12 | UInt32 | Mana | Current mana points | 0 |
| 16 | UInt32 | MaxAttack | Physical max attack before modifiers | 7 |
| 20 | UInt32 | MinAttack | Physical min attack before modifiers | 14 |
| 24 | UInt32 | Defense | Effective defense before modifiers | 32 |
| 28 | UInt32 | MagicAttack | Magic attack modifier | 0 |
| 32 | UInt32 | MagicDefense | Magic defense modifier | 0 |
| 36 | UInt32 | DodgePercent | Dodge increase | 92 |
| 40 | UInt32 | Agility | Raw agility attribute | 20 |
| 44 | UInt32 | Accuracy | Hit rate accuracy | 10 |
| 48 | UInt32 | BonusAttackPercent | Physical attack increase | 0 |
| 52 | UInt32 | BonusMagicPercent | Magic attack increase | 0 |
| 56 | UInt32 | ReduceDamagePercent | Overall damage reduction | 7 |
| 60 | UInt32 | CurseDamagePercent | Cursed damage increase | 0 |
| 64 | UInt32 | BlessPercent | Bless damage reduction | 0 |
| 68 | UInt32 | CriticalStrikePercent | Physical critical hit increase | 0 |
| 72 | UInt32 | MagicCriticalStrikePercent | Magic critical hit increase | 0 |
| 76 | UInt32 | ImmunityPercent | Critical hit negation increase | 0 |
| 80 | UInt32 | PenetrationPercent | Magic defense negation | 0 |
| 84 | UInt32 | BlockPercent | Physical damage block | 0 |
| 88 | UInt32 | BreakthroughPercent | Max attack increase for higher BP | 0 |
| 92 | UInt32 | CounteractionPercent | Breakthrough counteraction | 0 |
| 96 | UInt32 | DetoxicationPercent | Poison attack reduction | 0 |
| 100 | UInt32 | FinalAttack | Final physical attack increase | 7 |
| 104 | UInt32 | FinalMagicAttack | Final magic attack increase | 0 |
| 108 | UInt32 | FinalDefense | Final physical attack reduction | 32 |
| 112 | UInt32 | FinalMagicDefense | Final magic attack reduction | 0 |
| 116 | UInt32 | MetalResistPercent | Metal boss damage reduction | 0 |
| 120 | UInt32 | WoodResistPercent | Wood boss damage reduction | 0 |
| 124 | UInt32 | WaterResistPercent | Water boss damage reduction | 0 |
| 128 | UInt32 | FireResistPercent | Fire boss damage reduction | 0 |
| 132 | UInt32 | EarthResistPercent | Earth boss damage reduction | 0 |
MsgPromotionAct
MsgPromotionInfo
MsgQualifyingDetailInfo
MsgQualifyingFightersList
MsgQualifyingInteractive
MsgQualifyingRank
MsgQualifyingSeasonRankList
MsgQuench
MsgQuiz
MsgQuizSponsor
MsgRaceTrackProp
MsgRaceTrackPropEffect
MsgRaceTrackStatus
MsgRank
MsgRegister
This message is sent from the game client containing initial character creation details from the character creation screen. To get this message, you must first send MsgTalk with the text "NEW_ROLE" on the login attribute. The expected response to this message from the server is MsgTalk with the text "ANSWER_OK" on the register attribute. Invalid registration attempts can be answered with the error on the register attribute rather than with "ANSWER_OK".
The identity shown in this message may not be the account identifier if you use an access token in place of the identifier in MsgConnectEx.
⚠️ WARNING
Character creation requests can be easily spoofed with invalid professions and models, so be sure to validate inputs. Character names may also contain invalid characters or phrases, such as "[GM]" or "[PM]".
Table of Contents
Patch 4267
Message Definition
❓ Unverified - Imported from the legacy wiki
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 60 |
| 2 | UInt16 | MsgType | Type of message | 1001 |
| 4 | Char[16] | Username | Account username from login | admin |
| 20 | Char[16] | Hero Name | Requested name to be checked | Player |
| 36 | Char[16] | Password | Account password (missing RC5 wrapper) | test |
| 52 | UInt16 | Hero Look | Selected character model | 1003 |
| 54 | UInt16 | Hero Profession | Selected character profession | 10 |
| 56 | UInt32 | Account ID | Account id from the account server | 1 |
Patch 5017
Message Definition
☑️ Assumed (Observed) - Comet
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 60 |
| 2 | UInt16 | MsgType | Type of message | 1001 |
| 4 | Char[16] | Username | Account username from login | admin |
| 20 | Char[16] | Hero Name | Requested name to be checked | Player |
| 36 | Char[16] | Masked Password | Hidden password | **** |
| 52 | UInt16 | Hero Look | Selected character model | 1003 |
| 54 | UInt16 | Hero Profession | Selected character profession | 10 |
| 56 | UInt32 | Account ID | Account id from the account server | 1 |
Patch 5065
Message Definition
☑️ Assumed (Observed) - Comet
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 60 |
| 2 | UInt16 | MsgType | Type of message | 1001 |
| 4 | Char[16] | Username | Account username from login | admin |
| 20 | Char[16] | Hero Name | Requested name to be checked | Player |
| 52 | UInt16 | Hero Look | Selected character model | 1003 |
| 54 | UInt16 | Hero Profession | Selected character profession | 10 |
| 56 | UInt32 | Account ID | Account id from the account server | 1 |
Patch 5165
Message Definition
❓ Unverified - Imported from the legacy wiki
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 104 |
| 2 | UInt16 | MsgType | Type of message | 1001 |
| 4 | Char[16] | Username | Account username from login | admin |
| 20 | Char[16] | Hero Name | Requested name to be checked | Player |
| 52 | UInt16 | Hero Look | Selected character model | 1003 |
| 54 | UInt16 | Hero Profession | Selected character profession | 10 |
| 56 | UInt32 | Account ID | Account id from the account server | 1 |
| 60 | UInt16[6] | MacAddress | Network device identifier | 00,10,5A,44,12,B5 |
MsgRegisterFaceBook
MsgRelation
MsgRequestKeyLogin
MsgSelfSynMemAwardRank
MsgServerInfo
MsgShowHandActivePlayer
MsgShowHandCallAction
MsgShowHandDealtCard
MsgShowHandEnter
MsgShowHandExit
MsgShowHandGameResult
MsgShowHandLayCard
MsgShowHandLostInfo
MsgShowHandOnlineStatus
MsgShowHandTrusteeship
MsgSlotAction
MsgSlotResult
MsgSolidify
Undocumented
MsgSponsor
MsgSponsorInfo
MsgSubPro
MsgSuitStatus
MsgSuperFlag
MsgSyncAction
Synchronizes the movement of multiple players. At time of writing this, only two players can be synchronized.
Synchronized actions were introduced as part of the couple interaction system. These actions are controlled using MsgInteract to request, accept, reject, perform, and end a synchronized action. This message is how synchronized movements are displayed to observing clients and the target of the interaction.
Table of Contents
Patch 5127
Message Definition
☑️ Assumed (Observed)
For walking:
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 24 |
| 2 | UInt16 | MsgType | Type of message | 1114 |
| 4 | UInt16 | Action | The synchronized action | 0 |
| 6 | Byte | Direction | Action direction | 0 |
| 7 | Byte | Movement Mode | Type of ground movement | 1 |
| 12 | UInt32 | Amount | Amount of players | 2 |
| 16 | UInt32 | Hero ID | Unique identifier for the character | 1000000 |
| 20 | UInt32 | Target | Unique identifier for the target | 1000001 |
For jumping:
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 24 |
| 2 | UInt16 | MsgType | Type of message | 1114 |
| 4 | UInt16 | Action | The synchronized action | 0 |
| 6 | UInt16 | X | X coordinate of the action | 320 |
| 8 | UInt16 | Y | Y coordinate of the action | 460 |
| 10 | UInt16 | Direction | Action direction | 0 |
| 12 | UInt32 | Amount | Amount of players | 2 |
| 16 | UInt32 | Hero ID | Unique identifier for the character | 1000000 |
| 20 | UInt32 | Target | Unique identifier for the target | 1000001 |
Action Type
✅ Verified (Client)
| Val | Name | Description |
|---|---|---|
| 0 | SYNC_DIRECTION | Change direction as a couple |
| 1 | SYNC_WALK | Step as a couple |
| 2 | SYNC_JUMP | Jump as a couple |
MsgSynChgDomName
MsgSynCompete
MsgSyndicate
This message is sent between the client and game server to request and respond to guild-related actions, such as joining and leaving a guild, managing allies and enemies, disbanding the guild, and more. Similar to MsgAction, the server responds to MsgSyndicate with either a specific action message (such as querying for the MsgSyndicateAttributeInfo message) or with the MsgSyndicate message itself (such as for applying for membership).
Table of Contents
Patch 4267
Message Definition
☑️ Assumed (Observed) - CoFuture + Soul
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 12 |
| 2 | UInt16 | MsgType | Type of message | 1107 |
| 4 | UInt32 | Action | Guild action being performed | 1 |
| 8 | UInt32 | Target | Target individual or guild identifier | 1000000 |
Action Types
☑️ Assumed (Observed) - CoFuture + Soul
🔶 Response data
| Val | Name | Description | Recipient | Target |
|---|---|---|---|---|
| 1 | APPLY_JOIN | Apply to join a guild (sends INVITE_JOIN) | Server | Target ID |
| 2 | INVITE_JOIN | Invite a player to join a guild | Client | Target ID |
| 3 | LEAVE_SYN | Request to leave current guild | Server | |
| 4 | KICKOUT_MEMBER | Kick a member from guild | Client | Target ID |
| 6 | QUERY_SYN_NAME | Sends MsgName with guild name | Server | Syndicate ID |
| 7 | ALLY_APPLY | Sets a guild as an ally | Server | Ally's Syndicate ID |
| 8 | CLEAR_ALLY | Removes an ally guild | Server | Ally's Syndicate ID |
| 9 | ANTAGONIZE | Sets a guild as an enemy | Server | Enemy's Syndicate ID |
| 10 | CLEAR_ANTAGONIZE | Removes an enemy guild | Server | Enemy's Syndicate ID |
| 11 | DONATE_MONEY | Add silver to the guild fund | Server | Amount |
| 12 | QUERY_SYNATTR | Query for guild attributes | Server | Target ID |
| 14 | SET_SYN | Sent on login to set syndicate ID | Client | Syndicate ID |
| 19 | DESTROY_SYN | Terminates a guild | Client | Syndicate ID |
MsgSyndicateAttributeInfo
This game server message is sent to the client to display details about a guild and the player's role and donations in that guild. In later versions of the client, this expanded to include other donation types, guild player requirements, how long the player has been enrolled in the guild for, etc.
Table of Contents
Patch 4267
Message Definition
☑️ Assumed (Observed) - CoFuture + Soul
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 40 |
| 2 | UInt16 | MsgType | Type of message | 1106 |
| 4 | UInt32 | Syndicate ID | Unique identifier of the player | 1000000 |
| 8 | UInt32 | Proffer | Silver amount offered as donation | 10000 |
| 12 | UInt32 | Fund | Total silver fund | 10000 |
| 16 | UInt32 | Population | Number of guild members | 1 |
| 20 | Byte | Rank | Position in the guild | 100 |
| 21 | Char[16] | Leader | Name of the guild leader | Player |
Syndicate Rank
☑️ Assumed (Observed) - CoFuture
enum SyndicateRank {
SYNDICATE_RANK_MEMBER = 50;
SYNDICATE_RANK_DEPUTY_LEADER = 90;
SYNDICATE_RANK_LEADER = 100;
}
Patch 5517
Message Definition
🚩 Incomplete
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 92 |
| 2 | UInt16 | MsgType | Type of message | 1106 |
| 4 | UInt32 | Syndicate ID | Unique identifier of the player | 1000000 |
| 8 | UInt32 | Proffer | Silver amount offered as donation | 10000 |
| 12 | UInt64 | Fund | Total silver fund | 10000 |
| 20 | UInt32 | EMoney Fund | Total CPs fund | 0 |
| 24 | UInt32 | Population | Number of guild members | 1 |
| 28 | Byte | Rank | Position in the guild | 100 |
| 32 | Char[16] | Leader | Name of the guild leader | Player |
| 48 | UInt32 | Level Req | Required minimum level for joining | 1 |
| 52 | UInt32 | Metempsychosis Req | Required minimum rebirth for joining | 1 |
| 56 | UInt32 | Profession Req | Required professions for joining as a bitmap | 0 |
| 60 | UInt32 | Level | Overall guild level | 1 |
| 67 | UInt32 | Registration Date | Day the guild was registered on in YYYYMMDD | 20150116 |
Syndicate Rank
🚩 Incomplete
enum SyndicateRank {
SYNDICATE_RANK_AGENT = 590,
SYNDICATE_RANK_AIDE = 0X25A,
SYNDICATE_RANK_ARSENAL_AGENT = 0X254,
SYNDICATE_RANK_ARS_FOLLOWER = 0X1F0,
SYNDICATE_RANK_A_SUPERVISOR = 0X358,
SYNDICATE_RANK_CP_AGENT = 0X255,
SYNDICATE_RANK_CP_FOLLOWER = 0X1F1,
SYNDICATE_RANK_CP_SUPERVISOR = 0X359,
SYNDICATE_RANK_DEPUTY_LEADER = 990,
SYNDICATE_RANK_DEPUTY_STEWARD = 650,
SYNDICATE_RANK_D_LEADER_AIDE = 0X263,
SYNDICATE_RANK_D_LEADER_SPOUSE = 620,
SYNDICATE_RANK_FOLLOWER = 490,
SYNDICATE_RANK_G_SUPERVISOR = 0X356,
SYNDICATE_RANK_GUIDE_AGENT = 0X252,
SYNDICATE_RANK_GUIDE_FOLLOWER = 0X1EE,
SYNDICATE_RANK_GUILD_LEADER = 0X3E8,
SYNDICATE_RANK_H_DEPUTY_LEADER = 980,
SYNDICATE_RANK_HONORARY_MANAGER = 880,
SYNDICATE_RANK_HONORARY_STEWARD = 680,
SYNDICATE_RANK_HONORARY_SUPERV = 840,
SYNDICATE_RANK_LEADER_SPOUSE = 920,
SYNDICATE_RANK_LILY_AGENT = 0X24F,
SYNDICATE_RANK_LILY_FOLLOWER = 0X1EB,
SYNDICATE_RANK_LILY_SUPERVISOR = 0X353,
SYNDICATE_RANK_L_SPOUSE_AIDE = 610,
SYNDICATE_RANK_MANAGER = 890,
SYNDICATE_RANK_MANAGER_AIDE = 510,
SYNDICATE_RANK_MANAGER_SPOUSE = 520,
SYNDICATE_RANK_MEMBER = 200,
SYNDICATE_RANK_NONE = 0,
SYNDICATE_RANK_ORCHID_AGENT = 0X256,
SYNDICATE_RANK_ORCHID_FOLLOWER = 0X1F2,
SYNDICATE_RANK_O_SUPERVISOR = 0X35A,
SYNDICATE_RANK_PK_AGENT = 0X251,
SYNDICATE_RANK_PK_FOLLOWER = 0X1ED,
SYNDICATE_RANK_PK_SUPERVISOR = 0X355,
SYNDICATE_RANK_ROSE_AGENT = 0X250,
SYNDICATE_RANK_ROSE_FOLLOWER = 0X1EC,
SYNDICATE_RANK_ROSE_SUPERVISOR = 0X354,
SYNDICATE_RANK_SENIOR_MEMBER = 210,
SYNDICATE_RANK_SILVER_AGENT = 0X253,
SYNDICATE_RANK_SILVER_FOLLOWER = 0X1EF,
SYNDICATE_RANK_S_SUPERVISOR = 0X357,
SYNDICATE_RANK_STEWARD = 690,
SYNDICATE_RANK_STEWARD_SPOUSE = 420,
SYNDICATE_RANK_SUPERVISOR = 850,
SYNDICATE_RANK_SUPERVISOR_AIDE = 0X1FF,
SYNDICATE_RANK_SUPERV_SPOUSE = 0X209,
SYNDICATE_RANK_T_SUPERVISOR = 0X35B,
SYNDICATE_RANK_TULIP_AGENT = 0X257,
SYNDICATE_RANK_TULIP_FOLLOWER = 0X1F3
}
Profession Requirement Bitmap
❓ Unverified
enum SyndicateProfessionRequirementFlags {
SYNDICATE_PROFESSION_REQ_NONE = 0x00000000;
SYNDICATE_PROFESSION_REQ_TROJAN = 0x00000001;
SYNDICATE_PROFESSION_REQ_WARRIOR = 0x00000002;
SYNDICATE_PROFESSION_REQ_TAOIST = 0x00000004;
SYNDICATE_PROFESSION_REQ_ARCHER = 0x00000008;
SYNDICATE_PROFESSION_REQ_NINJA = 0x00000010;
SYNDICATE_PROFESSION_REQ_MONK = 0x00000020;
}
MsgSynMemberInfo
MsgSynMemberList
MsgSynpOffer
This message is sent to the game client to list and update donations currently made to a guild / syndicate.
Table of Contents
Patch 5615
Message Definition
✅ Verified (Client)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 84 |
| 2 | UInt16 | MsgType | Type of message | 1058 |
| 4 | UInt32 | SynpOfferUpdateFlags | Which donations to update | 0 |
| 8 | Int32 | Money | Amount of money donated / debted | 0 |
| 12 | Int32 | EMoney | Amount of CPs donated / debted | 0 |
| 16 | UInt32 | Education | Amount of education points | 0 |
| 20 | UInt32 | Exploits | Amount of PK merit | 0 |
| 24 | UInt32 | Arsenal | Points in the arsenal | 0 |
| 28 | UInt32 | Roses | Flower points from roses | 0 |
| 32 | UInt32 | Orchids | Flower points from orchids | 0 |
| 36 | UInt32 | Lilies | Flower points from lilies | 0 |
| 40 | UInt32 | Tulips | Flower points from tulips | 0 |
| 44 | UInt32 | Faction | Amount of merit from faction PK | 0 |
SynpOffer Update Flags
✅ Verified (Client)
enum SynpOfferUpdateFlags {
NONE = 0;
MONEY = 1U << 0;
EMONEY = 1U << 1;
EDUCATION = 1U << 2;
EXPLOIT = 1U << 3;
ARSENAL = 1U << 4;
ROSE = 1U << 5;
ORCHID = 1U << 6;
LILY = 1U << 7;
TULIP = 1U << 8;
FACTION_PK_MERIT = 1U << 9;
}
MsgSynRecruitAdvertising
MsgSynRecruitAdvertisingList
MsgSynRecruitAdvertisingOpt
MsgTalk
This message is sent from the game client to send a message to other players, or sent from the game server to receive a message from another player. Messages can also originate from the server as SYSTEM and be can be addressed to ALLUSERS for messages sent to all players.
The following text messages can be sent by the game server to control the client before sign-on completes.
- NEW_ROLE (Login attribute): Opens the character creation screen after receiving MsgConnect.
- ANSWER_OK (Login / Register attribute): Character was created or the character exists.
Text attributes are used to control where the message appears in the client. For example, the text channel it appears in, as a system message in the top left corner, an announcement across the screen, etc. Text styles can also be used to add flare to messages; however, Conquer Online doesn't use this.
When constructing the string packer, character names remain the same length (max 16 characters). The max length for a message is 256 characters, and the max emotion is 16 characters.
Table of Contents
Patch 4267
Message Definition
☑️ Assumed (Observed) - Comet
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 42 |
| 2 | UInt16 | MsgType | Type of message | 1004 |
| 4 | Int32 | Text Color | ARGB32 color of the text | 00FF0000 |
| 8 | UInt16 | Text Attribute | Defines where the text appears | 2000 |
| 10 | Uint16 | Text Style | Defines how the text appears | 0 |
| 12 | UInt32 | Local Time | Hours and minutes | 1241 |
| 16 | NetStringPacker | Strings | Group of length prefixed strings |
NetStringPacker Fields
| Name | Description | Example |
|---|---|---|
| Speaker | Author of the message | SYSTEM |
| Header | Recipient of the message | ALLUSERS |
| Emotion | A prefix to the message | |
| Words | The body of the message | Testing |
Text Attribute
☑️ Assumed (Observed) - Comet
enum TextAttribute {
TXTATTRIB_UNSPECIFIED = 0;
TXTATTRIB_NORMAL = 2000;
TXTATTRIB_WHISPER = 2001;
TXTATTRIB_ACTION = 2002;
TXTATTRIB_TEAM = 2003;
TXTATTRIB_SYNDICATE = 2004;
TXTATTRIB_FAMILY = 2006;
TXTATTRIB_SYSTEM = 2007;
TXTATTRIB_YELL = 2008;
TXTATTRIB_FRIEND = 2009;
TXTATTRIB_GM = 2011;
TXTATTRIB_NOTIFICATION = 2012;
TXTATTRIB_GHOST = 2013;
TXTATTRIB_SERVICE = 2014;
TXTATTRIB_TIP = 2015;
TXTATTRIB_REGISTER = 2100;
TXTATTRIB_LOGIN = 2101;
TXTATTRIB_SHOP = 2102;
TXTATTRIB_PET = 2103;
TXTATTRIB_VENDOR = 2104;
TXTATTRIB_WEBPAGE = 2105;
TXTATTRIB_SYNWAR_FIRST = 2108;
TXTATTRIB_SYNWAR_NEXT = 2109;
TXTATTRIB_LEAVE_WORD = 2110;
TXTATTRIB_SYNANNOUNCE = 2111;
TXTATTRIB_TRADE_BOARD = 2201;
TXTATTRIB_FRIEND_BOARD = 2202;
TXTATTRIB_TEAM_BOARD = 2203;
TXTATTRIB_SYN_BOARD = 2204;
TXTATTRIB_OTHER_BOARD = 2205;
}
Text Style
☑️ Assumed (Observed) - Comet
enum TextStyle {
TXTSTYLE_NORMAL = 0;
TXTSTYLE_SCROLL = 0x01;
TXTSTYLE_FLASH = 0x02;
TXTSTYLE_BLAST = 0x08;
}
Patch 4354
Message Definition
☑️ Assumed (Observed) - Comet
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 50 |
| 2 | UInt16 | MsgType | Type of message | 1004 |
| 4 | Int32 | Text Color | ARGB32 color of the text | 00FF0000 |
| 8 | UInt16 | Text Attribute | Defines where the text appears | 2000 |
| 10 | Uint16 | Text Style | Defines how the text appears | 0 |
| 12 | UInt32 | Local Time | Hours and minutes | 1241 |
| 16 | UInt32 | Hearer View | Character view mesh for the hearer | 501002 |
| 20 | UInt32 | Speaker View | Character view mesh for the speaker | 501002 |
| 24 | NetStringPacker | Strings | Group of length prefixed strings |
NetStringPacker Fields
| Name | Description | Example |
|---|---|---|
| Speaker | Author of the message | SYSTEM |
| Header | Recipient of the message | ALLUSERS |
| Emotion | A prefix to the message | |
| Words | The body of the message | Testing |
Text Attribute
☑️ Assumed (Observed) - Comet
enum TextAttribute {
TXTATTRIB_UNSPECIFIED = 0;
TXTATTRIB_NORMAL = 2000;
TXTATTRIB_WHISPER = 2001;
TXTATTRIB_ACTION = 2002;
TXTATTRIB_TEAM = 2003;
TXTATTRIB_SYNDICATE = 2004;
TXTATTRIB_FAMILY = 2006;
TXTATTRIB_SYSTEM = 2007;
TXTATTRIB_YELL = 2008;
TXTATTRIB_FRIEND = 2009;
TXTATTRIB_GM = 2011;
TXTATTRIB_NOTIFICATION = 2012;
TXTATTRIB_GHOST = 2013;
TXTATTRIB_SERVICE = 2014;
TXTATTRIB_TIP = 2015;
TXTATTRIB_REGISTER = 2100;
TXTATTRIB_LOGIN = 2101;
TXTATTRIB_SHOP = 2102;
TXTATTRIB_PET = 2103;
TXTATTRIB_VENDOR = 2104;
TXTATTRIB_WEBPAGE = 2105;
TXTATTRIB_SYNWAR_FIRST = 2108;
TXTATTRIB_SYNWAR_NEXT = 2109;
TXTATTRIB_LEAVE_WORD = 2110;
TXTATTRIB_SYNANNOUNCE = 2111;
TXTATTRIB_TRADE_BOARD = 2201;
TXTATTRIB_FRIEND_BOARD = 2202;
TXTATTRIB_TEAM_BOARD = 2203;
TXTATTRIB_SYN_BOARD = 2204;
TXTATTRIB_OTHER_BOARD = 2205;
TXTATTRIB_BROADCAST = 2500;
}
Text Style
☑️ Assumed (Observed) - Comet
enum TextStyle {
TXTSTYLE_NORMAL = 0;
TXTSTYLE_SCROLL = 0x01;
TXTSTYLE_FLASH = 0x02;
TXTSTYLE_BLAST = 0x08;
}
Patch 5615
Message Definition
☑️ Assumed (Observed) - Chimera
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 52 |
| 2 | UInt16 | MsgType | Type of message | 1004 |
| 4 | Int32 | Text Color | ARGB32 color of the text | 00FF0000 |
| 8 | UInt16 | Text Attribute | Defines where the text appears | 2000 |
| 10 | Uint16 | Text Style | Defines how the text appears | 0 |
| 12 | UInt32 | Local Time | Hours and minutes | 1241 |
| 16 | UInt32 | Hearer View | Character view mesh for the hearer | 501002 |
| 20 | UInt32 | Speaker View | Character view mesh for the speaker | 501002 |
| 24 | NetStringPacker | Strings | Group of length prefixed strings |
NetStringPacker Fields
| Name | Description | Example |
|---|---|---|
| Speaker | Author of the message | SYSTEM |
| Header | Recipient of the message | ALLUSERS |
| Emotion | A prefix to the message | |
| Words | The body of the message | Testing |
| Unknown | Not referenced in the client assembly | |
| Unknown | Not referenced in the client assembly |
Text Attribute
☑️ Assumed (Observed) - Chimera
enum TextAttribute {
TXTATTRIB_UNSPECIFIED = 0;
TXTATTRIB_NORMAL = 2000;
TXTATTRIB_WHISPER = 2001;
TXTATTRIB_ACTION = 2002;
TXTATTRIB_TEAM = 2003;
TXTATTRIB_SYNDICATE = 2004;
TXTATTRIB_FAMILY = 2006;
TXTATTRIB_SYSTEM = 2007;
TXTATTRIB_YELL = 2008;
TXTATTRIB_FRIEND = 2009;
TXTATTRIB_GM = 2011;
TXTATTRIB_NOTIFICATION = 2012;
TXTATTRIB_GHOST = 2013;
TXTATTRIB_SERVICE = 2014;
TXTATTRIB_TIP = 2015;
TXTATTRIB_WORLD = 2021,
TXTATTRIB_QUALIFIER = 2022,
TXTATTRIB_STUDY = 2024,
TXTATTRIB_REGISTER = 2100;
TXTATTRIB_LOGIN = 2101;
TXTATTRIB_SHOP = 2102;
TXTATTRIB_PET = 2103;
TXTATTRIB_VENDOR = 2104;
TXTATTRIB_WEBPAGE = 2105;
TXTATTRIB_SYNWAR_FIRST = 2108;
TXTATTRIB_SYNWAR_NEXT = 2109;
TXTATTRIB_LEAVE_WORD = 2110;
TXTATTRIB_SYNANNOUNCE = 2111;
TXTATTRIB_AGATE = 2115;
TXTATTRIB_TRADE_BOARD = 2201;
TXTATTRIB_FRIEND_BOARD = 2202;
TXTATTRIB_TEAM_BOARD = 2203;
TXTATTRIB_SYN_BOARD = 2204;
TXTATTRIB_OTHER_BOARD = 2205;
TXTATTRIB_BROADCAST = 2500;
}
Text Style
☑️ Assumed (Observed) - Chimera
enum TextStyle {
TXTSTYLE_NORMAL = 0;
TXTSTYLE_SCROLL = 0x01;
TXTSTYLE_FLASH = 0x02;
TXTSTYLE_BLAST = 0x08;
}
Patch 5808
Message Definition
❓ Unverified - Imported from the legacy wiki
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 56 |
| 2 | UInt16 | MsgType | Type of message | 1004 |
| 4 | UInt32 | System Time | Milliseconds of system uptime | 1579535985 |
| 8 | Int32 | Text Color | ARGB32 color of the text | 00FF0000 |
| 12 | UInt16 | Text Attribute | Defines where the text appears | 2000 |
| 14 | Uint16 | Text Style | Defines how the text appears | 0 |
| 16 | UInt32 | Local Time | Hours and minutes | 1241 |
| 20 | UInt32 | Hearer View | Character view mesh for the hearer | 501002 |
| 24 | UInt32 | Speaker View | Character view mesh for the speaker | 501002 |
| 28 | NetStringPacker | Strings | Group of length prefixed strings |
NetStringPacker Fields
| Name | Description | Example |
|---|---|---|
| Speaker | Author of the message | SYSTEM |
| Header | Recipient of the message | ALLUSERS |
| Emotion | A prefix to the message | |
| Words | The body of the message | Testing |
| Unknown | Not referenced in the client assembly | |
| Unknown | Not referenced in the client assembly |
Text Attribute
❓ Unverified - Imported from the legacy wiki
enum TextAttribute {
TXTATTRIB_UNSPECIFIED = 0;
TXTATTRIB_NORMAL = 2000;
TXTATTRIB_WHISPER = 2001;
TXTATTRIB_ACTION = 2002;
TXTATTRIB_TEAM = 2003;
TXTATTRIB_SYNDICATE = 2004;
TXTATTRIB_FAMILY = 2006;
TXTATTRIB_SYSTEM = 2007;
TXTATTRIB_YELL = 2008;
TXTATTRIB_FRIEND = 2009;
TXTATTRIB_GM = 2011;
TXTATTRIB_NOTIFICATION = 2012;
TXTATTRIB_GHOST = 2013;
TXTATTRIB_SERVICE = 2014;
TXTATTRIB_TIP = 2015;
TXTATTRIB_WORLD = 2021,
TXTATTRIB_QUALIFIER = 2022,
TXTATTRIB_STUDY = 2024,
TXTATTRIB_REGISTER = 2100;
TXTATTRIB_LOGIN = 2101;
TXTATTRIB_SHOP = 2102;
TXTATTRIB_PET = 2103;
TXTATTRIB_VENDOR = 2104;
TXTATTRIB_WEBPAGE = 2105;
TXTATTRIB_SYNWAR_FIRST = 2108;
TXTATTRIB_SYNWAR_NEXT = 2109;
TXTATTRIB_LEAVE_WORD = 2110;
TXTATTRIB_SYNANNOUNCE = 2111;
TXTATTRIB_AGATE = 2115;
TXTATTRIB_TRADE_BOARD = 2201;
TXTATTRIB_FRIEND_BOARD = 2202;
TXTATTRIB_TEAM_BOARD = 2203;
TXTATTRIB_SYN_BOARD = 2204;
TXTATTRIB_OTHER_BOARD = 2205;
TXTATTRIB_BROADCAST = 2500;
}
Text Style
❓ Unverified - Imported from the legacy wiki
enum TextStyle {
TXTSTYLE_NORMAL = 0;
TXTSTYLE_SCROLL = 0x01;
TXTSTYLE_FLASH = 0x02;
TXTSTYLE_BLAST = 0x08;
}
MsgTaskDetailInfo
MsgTaskDialog
MsgTaskStatus
MsgTeam
This message performs simple team commands at the request of a client for managing the team and team members.
Table of Contents
Patch 4267
Message Definition
☑️ Assumed (Soul)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 8 |
| 2 | UInt16 | MsgType | Type of message | 1023 |
| 4 | UInt32 | Action | The command being requested | 1 |
| 8 | UInt32 | Player | Hero ID of the target | 1000001 |
Action Type
☑️ Assumed (Soul)
enum TeamActionTypes {
TEAM_ACTION_CREATE = 0;
TEAM_ACTION_APPLY_JOIN = 1;
TEAM_ACTION_LEAVE = 2;
TEAM_ACTION_ACCEPT_INVITE = 3;
TEAM_ACTION_INVITE = 4;
TEAM_ACTION_ACCEPT_JOIN = 5;
TEAM_ACTION_DISMISS = 6;
TEAM_ACTION_KICK_OUT = 7;
TEAM_ACTION_CLOSE_TEAM = 8;
TEAM_ACTION_OPEN_TEAM = 9;
TEAM_ACTION_CLOSE_MONEY_ACCESS = 10;
TEAM_ACTION_OPEN_MONEY_ACCESS = 11;
TEAM_ACTION_CLOSE_ITEM_ACCESS = 12;
TEAM_ACTION_OPEN_ITEM_ACCESS = 13;
}
MsgTeamArenaFightingMemberInfo
MsgTeamArenaFightingTeamList
MsgTeamArenaHeroData
MsgTeamArenaInteractive
MsgTeamArenaRank
MsgTeamArenaScore
MsgTeamArenaYTop10List
MsgTeamAward
Undocumented
MsgTeamMember
This message is sent to the client to update the team member list. It can include one or more team members, but each message must be all additions or all removals. Visually in the client, this is the vertical list of members' faces and healths along the right side of the screen.
Table of Contents
Patch 4267
Message Definition
☑️ Assumed (Soul)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 34 |
| 2 | UInt16 | MsgType | Type of message | 1026 |
| 4 | Byte | Action | Adding or removing | 1 |
| 5 | Byte | Amount | Number of team members being acted upon | 1 |
| 6 | TeamMember | Members | Repeated list of team members |
Team Member Definition
☑️ Assumed (Soul)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | Char[16] | Name | Hero name | Player |
| 16 | UInt32 | ID | Hero ID of the member | 1000001 |
| 20 | UInt32 | Look Face | Mesh of the entity | 501002 |
| 24 | UInt16 | Max HP | Total HP the member can have | 92 |
| 26 | UInt16 | HP | Total HP the member has | 54 |
Team Member Action Type
☑️ Assumed (Soul)
enum TeamMemberActionTypes {
TEAM_MEMBER_ACTION_ADD_MEMBER = 0;
TEAM_MEMBER_ACTION_DROP_MEMBER = 1;
}
MsgTeamPKArenic
MsgTeamPKArenicScore
MsgTeamPKMatchInfo
MsgTeamPKRankInfo
MsgTeamPopPKArenic
MsgTeamPopPKArenicScore
MsgTeamPopPKMatchInfo
MsgTeamPopPKRankInfo
MsgTeamRoll
Undocumented
MsgTexasInteractive
MsgTexasNpcInfo
MsgTick
This message is sent from the game server to the client, and then back again from the client to the game server in a round-trip for checking network congestion. The message is responsible for the "Warning: the network is congested" message that appears in the top-left of the client screen. It's secondary purpose is for verifying that the user is not a bot (Conquer 1.0 and early Conquer 2.0).
The timestamp sent with this message is XORed with the hero ID. The check data at the end of the message is a checksum of the first two characters of the hero's name. This appears as the following in COPSv7:
static uint32_t checksum(const char* aName)
{
if (aName == nullptr || aName[0] == '\0' || strlen(aName) < 4)
return UINT32_C(0x9D4B5703);
else
{
uint16_t val = ((uint16_t*)aName)[0];
#if BYTE_ORDER == BIG_ENDIAN
val = bswap16(val);
#endif // BYTE_ORDER == BIG_ENDIAN
return val ^ UINT16_C(0x9823);
}
}
Table of Contents
Patch 5065
Message Definition
☑️ Assumed (Observed) - COPSv7 + Soul
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 20 |
| 2 | UInt16 | MsgType | Type of message | 1012 |
| 4 | UInt32 | Hero ID | Unique identifier for the character | 1000000 |
| 8 | UInt32 | System Time | Milliseconds of system uptime ^ Hero ID | 1579846705 |
| 12 | UInt32 | Message Count | The total number of messages sent | 12 |
| 16 | UInt32 | Check Data | Checksum using first two letters of the character's name | 2638960387 |
MsgTitle
Player titles are earned through in-game events, and can be collected, selected, and removed by the player. This message allows players to view and manager their titles. Titles are associated with an ID, defined in the client's Title.ini file.
Table of Contents
Patch 5635
Message Definition
✅ Verified (Client)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 12 |
| 2 | UInt16 | MsgType | Type of message | 1130 |
| 4 | UInt32 | Hero ID | Unique identifier for the character | 1000000 |
| 8 | Byte | TitleID | Title ID as it appears in Title.ini | 11 |
| 9 | Byte | Action | How to process the message | 4 |
| 10 | Byte | Amount | Number of titles to list | 1 |
| 11 | Byte[] | Titles | An array of titles | 11 |
Title Action
✅ Verified (Client)
| Val | Name | Description | Recipient |
|---|---|---|---|
| 1 | ADD_TITLE | Adds a title | Client |
| 2 | LOSE_TITLE | Removes a title | Client |
| 3 | SET_TITLE | Sets a title for the player | Both |
| 4 | LIST_TITLES | Gets titles for the player | Both |
MsgTotemPole
MsgTotemPoleInfo
MsgTrade
This message is sent by the client to request and manage a trade with another player.
When adding an item to the trade window, the server will receive a request to offer an item for trade and then respond by sending MsgItemInfo to show the item to the target player.
Table of Contents
Patch 4267
Message Definition
☑️ Assumed (Observed) - CoFuture + Soul
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 12 |
| 2 | UInt16 | MsgType | Type of message | 1056 |
| 4 | UInt32 | Data | Data or a unique Identifier | 10 |
| 8 | UInt16 | Action Type | The type of trade message | 6 |
Action Type
☑️ Assumed (Observed) - CoFuture + Soul
| Val | Name | Description | Recipient | Data |
|---|---|---|---|---|
| 1 | APPLY | Request trade | Both | Requester's Hero ID |
| 2 | QUIT | Request cancel | Server | |
| 3 | OPEN | Open trade window | Client | Target's Hero ID |
| 4 | SUCCESS | Successful trade | Client | |
| 5 | FALSE | Failed trade | Client | |
| 6 | ADDITEM | Add item to trade window | Server | Item ID |
| 7 | ADDMONEY | Add money to trade window | Server | Money |
| 8 | PLAYERTOTALMONEY | Total money traded by target | Client | Money |
| 9 | HEROTOTALMONEY | Total money traded by hero | Client | Money |
| 10 | OK | Confirm trade | Both | |
| 11 | ADDITEM_FALSE | Cannot add item for trade | Client | Item ID |
Patch 5017
Message Definition
❓ Unverified
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 12 |
| 2 | UInt16 | MsgType | Type of message | 1056 |
| 4 | UInt32 | Data | Data or a unique Identifier | 10 |
| 8 | UInt16 | Action Type | The type of trade message | 6 |
Action Type
❓ Unverified
| Val | Name | Description | Recipient | Data |
|---|---|---|---|---|
| 1 | APPLY | Request trade | Both | Requester's Hero ID |
| 2 | QUIT | Request cancel | Server | |
| 3 | OPEN | Open trade window | Client | Target's Hero ID |
| 4 | SUCCESS | Successful trade | Client | |
| 5 | FALSE | Failed trade | Client | |
| 6 | ADDITEM | Add item to trade window | Server | Item ID |
| 7 | ADDMONEY | Add money to trade window | Server | Money |
| 8 | PLAYERTOTALMONEY | Total money traded by target | Client | Money |
| 9 | HEROTOTALMONEY | Total money traded by hero | Client | Money |
| 10 | OK | Confirm trade | Both | |
| 11 | ADDITEM_FALSE | Cannot add item for trade | Client | Item ID |
| 12 | PLAYERTOTALEMONEY | Total CPs traded by target | Client | CPs |
| 13 | ADDEMONEY | Add CPs to trade window | Server | CPs |
| 14 | HEROTOTALEMONEY | Total CPs traded by hero | Client | CPs |
Patch 5022
Message Definition
❓ Unverified
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 12 |
| 2 | UInt16 | MsgType | Type of message | 1056 |
| 4 | UInt32 | Data | Data or a unique Identifier | 10 |
| 8 | UInt16 | Action Type | The type of trade message | 6 |
Action Type
❓ Unverified
| Val | Name | Description | Recipient | Data |
|---|---|---|---|---|
| 1 | APPLY | Request trade | Both | Requester's Hero ID |
| 2 | QUIT | Request cancel | Server | |
| 3 | OPEN | Open trade window | Client | Target's Hero ID |
| 4 | SUCCESS | Successful trade | Client | |
| 5 | FALSE | Failed trade | Client | |
| 6 | ADDITEM | Add item to trade window | Server | Item ID |
| 7 | ADDMONEY | Add money to trade window | Server | Money |
| 8 | PLAYERTOTALMONEY | Total money traded by target | Client | Money |
| 9 | HEROTOTALMONEY | Total money traded by hero | Client | Money |
| 10 | OK | Confirm trade | Both | |
| 11 | ADDITEM_FALSE | Cannot add item for trade | Client | Item ID |
| 12 | PLAYERTOTALEMONEY | Total CPs traded by target | Client | CPs |
| 13 | ADDEMONEY | Add CPs to trade window | Server | CPs |
| 14 | HEROTOTALEMONEY | Total CPs traded by hero | Client | CPs |
| 15 | SUSPICIOUS_PROMPT | Prompt hero before confirm | Client | |
| 16 | SUSPICIOUS_OK | Confirm suspicious trade | Server |
MsgTradeBuddy
MsgTradeBuddyInfo
MsgTraining
MsgTrainingInfo
MsgTrainingVitality
MsgTrainingVitalityInfo
MsgTrainingVitalityScore
MsgTransportor
MsgUserAttrib
This message is sent by the game server to update one or more numeric user attributes in the game client. It can target the hero or another player on the game map.
Of the possibly attribute types, the user status attribute is one of the more complicated types. Statuses are a bitmap of effects that can be placed on a hero or entity, and are loaded from the StatusEffect.ini file. Some examples of statuses found in the game include being poisoned, lucky, shielded, etc. They're also used for PK event haloes in later versions.
Table of Contents
Patch 4267
Message Definition
☑️ Assumed (Soul)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 24 |
| 2 | UInt16 | MsgType | Type of message | 1017 |
| 4 | UInt32 | Hero ID | Unique identifier for the character | 1000000 |
| 8 | UInt32 | AttributeNum | Amount of attributes to update | 1 |
| 12 | UserAttrib[] | Attributes | Attributes list | See below |
UserAttrib Definition
☑️ Assumed (Soul)
| Type | Name | Description | Example |
|---|---|---|---|
| UInt32 | AttribType | The attribute to update | 2 |
| UInt32[2] | Data | The new value of the attribute | 10 |
UserAttrib Type
☑️ Assumed (Observed) - CoFuture
enum UserAttribTypes {
USERATTRIB_LIFE = 0;
USERATTRIB_MAXLIFE = 1;
USERATTRIB_MANA = 2;
USERATTRIB_MAXMANA = 3;
USERATTRIB_MONEY = 4;
USERATTRIB_EXP = 5;
USERATTRIB_PK = 6;
USERATTRIB_PROFESSION = 7;
USERATTRIB_SIZE_ADD = 8;
USERATTRIB_PP = 9;
USERATTRIB_ADDPOINT = 11;
USERATTRIB_LOOK = 12;
USERATTRIB_LEV = 13;
USERATTRIB_SOUL = 14;
USERATTRIB_HEALTH = 15;
USERATTRIB_FORCE = 16;
USERATTRIB_SPEED = 17;
USERATTRIB_BLESS_SECONDS = 18;
USERATTRIB_DOUBLE_XP_SECONDS = 19;
USERATTRIB_SYN_WAR_POLE = 20;
USERATTRIB_CURSE_SECONDS = 21;
USERATTRIB_TIME_ADD_SECONDS = 22;
USERATTRIB_METEMPSYCHOSIS = 23;
USERATTRIB_USERSTATUS = 26;
USERATTRIB_HAIR = 27;
USERATTRIB_XP = 28;
}
UserAttrib Special Values
☑️ Assumed (Observed) - COPSv6
enum UserAttribSizeAddFlags {
USERATTRIB_SIZE_ADD_NONE = 0;
USERATTRIB_SIZE_ADD_CURSED = 1;
USERATTRIB_SIZE_ADD_BLESSED = 2;
}
enum UserStatusFlags {
USERSTATUS_NORMAL = 0x00000000;
USERSTATUS_FLASHING_NAME = 0x00000001;
USERSTATUS_POISONED = 0x00000002;
USERSTATUS_INVISIBLE = 0x00000004;
USERSTATUS_XPFULL = 0x00000010;
USERSTATUS_TEAM_LEADER = 0x00000040;
USERSTATUS_ADJUST_DODGE = 0x00000080;
USERSTATUS_SHIELD = 0x00000100;
USERSTATUS_STIGMA = 0x00000200;
USERSTATUS_GHOST = 0x00000400;
USERSTATUS_DISAPPEARING = 0x00000800;
USERSTATUS_RED_NAME = 0x00004000;
USERSTATUS_BLACK_NAME = 0x00008000;
USERSTATUS_SUPERMAN = 0x00040000;
USERSTATUS_CYCLONE_ = 0x00800000;
USERSTATUS_DODGE = 0x04000000;
USERSTATUS_FLY = 0x08000000;
}
Patch 5017
Message Definition
☑️ Assumed (Soul)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 24 |
| 2 | UInt16 | MsgType | Type of message | 1017 |
| 4 | UInt32 | Hero ID | Unique identifier for the character | 1000000 |
| 8 | UInt32 | AttributeNum | Amount of attributes to update | 1 |
| 12 | UserAttrib[] | Attributes | Attributes list | See below |
UserAttrib Definition
☑️ Assumed (Soul)
| Type | Name | Description | Example |
|---|---|---|---|
| UInt32 | AttribType | The attribute to update | 2 |
| UInt32[2] | Data | The new value of the attribute | 10 |
UserAttrib Type
☑️ Assumed (Observed) - COPSv6
enum UserAttribTypes {
USERATTRIB_LIFE = 0;
USERATTRIB_MAXLIFE = 1;
USERATTRIB_MANA = 2;
USERATTRIB_MAXMANA = 3;
USERATTRIB_MONEY = 4;
USERATTRIB_EXP = 5;
USERATTRIB_PK = 6;
USERATTRIB_PROFESSION = 7;
USERATTRIB_SIZE_ADD = 8;
USERATTRIB_PP = 9;
USERATTRIB_ADDPOINT = 11;
USERATTRIB_LOOK = 12;
USERATTRIB_LEV = 13;
USERATTRIB_SOUL = 14;
USERATTRIB_HEALTH = 15;
USERATTRIB_FORCE = 16;
USERATTRIB_SPEED = 17;
USERATTRIB_BLESS_SECONDS = 18;
USERATTRIB_DOUBLE_XP_SECONDS = 19;
USERATTRIB_SYN_WAR_POLE = 20;
USERATTRIB_CURSE_SECONDS = 21;
USERATTRIB_TIME_ADD_SECONDS = 22;
USERATTRIB_METEMPSYCHOSIS = 23;
USERATTRIB_USERSTATUS = 26;
USERATTRIB_HAIR = 27;
USERATTRIB_LUCKY_SECONDS = 29;
USERATTRIB_EMONEY = 30;
USERATTRIB_XP = 31;
USERATTRIB_OFFLINE_TRAINING_PROGRESS = 32;
}
UserAttrib Special Values
☑️ Assumed (Observed) - COPSv6
enum UserAttribSizeAddFlags {
USERATTRIB_SIZE_ADD_NONE = 0;
USERATTRIB_SIZE_ADD_CURSED = 1;
USERATTRIB_SIZE_ADD_BLESSED = 2;
}
enum UserStatusFlags {
USERSTATUS_NORMAL = 0x00000000;
USERSTATUS_FLASHING_NAME = 0x00000001;
USERSTATUS_POISONED = 0x00000002;
USERSTATUS_INVISIBLE = 0x00000004;
USERSTATUS_XPFULL = 0x00000010;
USERSTATUS_TEAM_LEADER = 0x00000040;
USERSTATUS_ADJUST_DODGE = 0x00000080;
USERSTATUS_SHIELD = 0x00000100;
USERSTATUS_STIGMA = 0x00000200;
USERSTATUS_GHOST = 0x00000400;
USERSTATUS_DISAPPEARING = 0x00000800;
USERSTATUS_RED_NAME = 0x00004000;
USERSTATUS_BLACK_NAME = 0x00008000;
USERSTATUS_SUPERMAN = 0x00040000;
USERSTATUS_CYCLONE_ = 0x00800000;
USERSTATUS_DODGE = 0x04000000;
USERSTATUS_FLY = 0x08000000;
USERSTATUS_CAST_PRAY = 0x40000000;
USERSTATUS_PRAYING = 0x80000000;
}
Patch 5517
☑️ Assumed (Observed) - Reverse Engineering Client and Observing Client
Message Definition
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 52 |
| 2 | UInt16 | MsgType | Type of message | 10017 |
| 4 | UInt32 | Hero ID | Unique identifier for the character | 1000000 |
| 8 | UInt32 | AttributeNum | Amount of attributes to update | 1 |
| 12 | UserAttrib[] | Attributes | Attributes list | See below |
UserAttrib Definition
| Pos (relative) | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt32 | AttribType | The attribute to update | 17 |
| 4 | UInt64 | Data1 | Primary value for AttribType | 259200 |
| 12 | UInt64 | Data2 | Secondary value | 0 |
UserAttrib Type
enum UserAttribTypes {
USERATTRIB_LIFE = 0;
USERATTRIB_MAXLIFE = 1;
USERATTRIB_MANA = 2;
USERATTRIB_MAXMANA = 3;
USERATTRIB_MONEY = 4;
USERATTRIB_EXP = 5;
USERATTRIB_PK_POINTS = 6;
USERATTRIB_PROFESSION = 7;
USERATTRIB_STAMINA = 8;
USERATTRIB_WAREHOUSE_MONEY = 9; // Warehouse Dialog (CDlgDepot) needs to be open (refreshes it)
USERATTRIB_ADDPOINT = 10; // Allocatable Attribute Points
USERATTRIB_LOOK = 11;
USERATTRIB_LEVEL = 12;
USERATTRIB_SOUL = 13; // Spirit attribute points
USERATTRIB_HEALTH = 14; // Vitality attribute points
USERATTRIB_FORCE = 15; // Strength attribute points
USERATTRIB_SPEED = 16; // Agility attribute points
USERATTRIB_BLESS_SECONDS = 17; // Heaven blessing remaining seconds
USERATTRIB_DOUBLE_XP_SECONDS = 18;
USERATTRIB_SYN_DONATION = 19; // Guild Donation
USERATTRIB_CURSE_SECONDS = 20; // No XP Gain & Prevent City Teleport Scrolls remaining seconds
USERATTRIB_METEMPSYCHOSIS = 22; // Rebirth Count
USERATTRIB_USERSTATUS = 25; // 128-bit status bitwise flag: Data1=bits 0-63, Data2=bits 64-127 See: UserStatusFlags
USERATTRIB_HAIR = 26;
USERATTRIB_XP_CIRCLE = 27; // XP Skill Circle % (0-100)
USERATTRIB_LUCKY_SECONDS = 28; // Lucky time remaining milliseconds
USERATTRIB_EMONEY = 29; // Conquer Points
USERATTRIB_ONLINE_TRAINING = 31; // Online training state See: UserAttribOnlineTrainingState
USERATTRIB_ENTHRALLMENT_UPDATE_STATE = 32;
USERATTRIB_ENTHRALLMENT_ONLINE_TIME_SYNC = 33;
USERATTRIB_ENTHRALLMENT_OFFLINE_TIME_SYNC = 34;
USERATTRIB_ENTHRALLMENT_RESET = 35;
USERATTRIB_EXTRA_BATTLE_POWER = 36;
USERATTRIB_MENTOR_LEVEL = 37;
USERATTRIB_MERCHANT = 38;
USERATTRIB_VIP_LEVEL = 39;
USERATTRIB_QUIZ_POINTS = 40;
USERATTRIB_ENLIGHT_POINTS = 41;
USERATTRIB_HONOR_POINTS = 42;
USERATTRIB_DOUBLE_ARENA_PARTNER_HP = 43; // Arena Partner's HP in a double arena match
USERATTRIB_GUILD_BP = 44;
USERATTRIB_BOUND_EMONEY = 45; // Bound Conquer Points
USERATTRIB_HORSE_RACING_POINTS = 47;
USERATTRIB_FACTION_PK_REST_TIME = 48; // Populates Faction PK Status Icon Text (STR_FACTION_PK_ICON_TIP)
USERATTRIB_AZURE_SHIELD = 49; // See: AzureShieldSubType
USERATTRIB_FIR_METE_PROF = 50; // Profession during first rebirth
USERATTRIB_BIRTH_PROF = 51; // Original Profession
USERATTRIB_TEAM_ID = 52; // PK Team / Arena Team ID
USERATTRIB_SOUL_SHACKLE = 54; // Stops player from reviving
USERATTRIB_EXPBALL_USE_TIMES = 128; // ExpBalls used today (Used in calculation for ExpBall Action MsgBox) (Data1=(day_of_month + 100 * month) * 10 + use_count)
}
UserAttrib Special Values
enum AzureShieldSubType {
// USERATTRIB_AZURE_SHIELD.
// Data1 Low = Type (93/113) High = Timer (Seconds)
// Data2 Low = Reduction Percentage Data2 High = Shield Level
AZURE_SHIELD_ACTIVE = 93;
AZURE_SHIELD_BLOCK = 113;
}
enum UserStatusFlags {
// USERATTRIB_USERSTATUS Data1 (bits 0-63) Flags
USERSTATUS_NORMAL = 0x00000000;
USERSTATUS_FLASHING_NAME = 0x00000001;
USERSTATUS_POISONED = 0x00000002;
USERSTATUS_INVISIBLE = 0x00000004;
USERSTATUS_XPFULL = 0x00000010;
USERSTATUS_TEAM_LEADER = 0x00000040;
USERSTATUS_ADJUST_DODGE = 0x00000080;
USERSTATUS_SHIELD = 0x00000100;
USERSTATUS_STIGMA = 0x00000200;
USERSTATUS_GHOST = 0x00000400;
USERSTATUS_DISAPPEARING = 0x00000800;
USERSTATUS_RED_NAME = 0x00004000;
USERSTATUS_BLACK_NAME = 0x00008000;
USERSTATUS_SUPERMAN = 0x00040000;
USERSTATUS_CYCLONE = 0x00800000;
USERSTATUS_DODGE = 0x04000000;
USERSTATUS_FLY = 0x08000000;
USERSTATUS_CAST_PRAY = 0x40000000;
USERSTATUS_PRAYING = 0x80000000;
USERSTATUS_HEAVEN_BLESS = 0x200000000;
}
enum UserStatusFlagsData2 {
// USERATTRIB_USERSTATUS Data2 (bits 64-127)
USERSTATUS_TYRANT_AURA = 0x400000000; // Tyrant - increases critical strike
USERSTATUS_FEND_AURA = 0x1000000000; // Fend - increases immunity
USERSTATUS_METAL_AURA = 0x4000000000; // Elemental Aura - Metal Resistance
USERSTATUS_WOOD_AURA = 0x10000000000; // Elemental Aura - Wood Resistance
USERSTATUS_WATER_AURA = 0x40000000000; // Elemental Aura - Water Resistance
USERSTATUS_FIRE_AURA = 0x100000000000; // Elemental Aura - Fire Resistance
USERSTATUS_EARTH_AURA = 0x400000000000; // Elemental Aura - Earth Resistance
}
enum UserAttribOnlineTrainingState {
// USERATTRIB_ONLINE_TRAINING
ONLINE_TRAINING_START = 0;
ONLINE_TRAINING_ACTIVE = 1;
ONLINE_TRAINING_READY = 2;
ONLINE_TRAINING_ADD_POINTS = 3;
ONLINE_TRAINING_COLLECTING = 4; // Status Icon Animation
ONLINE_TRAINING_END = 5;
}
MsgUserCityInfo
MsgUserInfo
This message is sent to the game client from the game server to initialize the hero role with character data. It's expected to be sent after the game server processes MsgConnect after sending ANSWER_OK using MsgTalk. In response to this message, the client will then send a MsgAction message requesting the location of the character.
Table of Contents
Patch 4267
Message Definition
☑️ Assumed (Observed) - Comet
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 73 |
| 2 | UInt16 | MsgType | Type of message | 1006 |
| 4 | UInt32 | Hero ID | Unique identifier for the character | 1000000 |
| 8 | UInt32 | Look | Character view mesh | 501002 |
| 12 | UInt16 | Hair | Hairstyle and hair color | 535 |
| 16 | UInt32 | Money | Earned virtual player currency in pocket | 10000 |
| 20 | UInt64 | Experience | Leveling experience | 1000 |
| 40 | UInt16 | Strength | Physical attack power | 7 |
| 42 | UInt16 | Agility | Physical accuracy | 2 |
| 44 | UInt16 | Vitality | Health increase | 4 |
| 46 | UInt16 | Spirit | Mana increase | 0 |
| 48 | UInt16 | Attributes | Unspent attribute points | 0 |
| 50 | UInt16 | Life | Current health of the character | 99 |
| 52 | UInt16 | Mana | Current mana of the character | 0 |
| 54 | UInt16 | Pk | PK points from slaying other players | 0 |
| 56 | Byte | Level | Character level | 1 |
| 57 | Byte | Profession | Current profession | 10 |
| 59 | Byte | Metempsychosis | Number of rebirths | 0 |
| 60 | Bool | AutoAllot | True to automatically allot attributes | 1 |
| 61 | NetStringPacker | Strings | Group of length prefixed strings |
NetStringPacker Fields
| Name | Description | Example |
|---|---|---|
| Name | Name of the character | Player |
| Mate | The character the player is married to | None |
Patch 4343
Message Definition
☑️ Assumed (Observed) - Comet
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 77 |
| 2 | UInt16 | MsgType | Type of message | 1006 |
| 4 | UInt32 | Hero ID | Unique identifier for the character | 1000000 |
| 8 | UInt32 | Look | Character view mesh | 501002 |
| 12 | UInt16 | Hair | Hairstyle and hair color | 535 |
| 14 | UInt32 | Money | Earned virtual player currency in pocket | 10000 |
| 18 | UInt32 | EMoney | Paid virtual player currency in pocket | 0 |
| 22 | UInt64 | Experience | Leveling experience | 1000 |
| 44 | UInt16 | Strength | Physical attack power | 7 |
| 46 | UInt16 | Agility | Physical accuracy | 2 |
| 48 | UInt16 | Vitality | Health increase | 4 |
| 50 | UInt16 | Spirit | Mana increase | 0 |
| 52 | UInt16 | Attributes | Unspent attribute points | 0 |
| 54 | UInt16 | Life | Current health of the character | 99 |
| 56 | UInt16 | Mana | Current mana of the character | 0 |
| 58 | UInt16 | Pk | PK points from slaying other players | 0 |
| 60 | Byte | Level | Character level | 1 |
| 61 | Byte | Profession | Current profession | 10 |
| 63 | Byte | Metempsychosis | Number of rebirths | 0 |
| 64 | Bool | AutoAllot | True to automatically allot attributes | 1 |
| 65 | NetStringPacker | Strings | Group of length prefixed strings |
NetStringPacker Fields
| Name | Description | Example |
|---|---|---|
| Name | Name of the character | Player |
| Mate | The character the player is married to | None |
Patch 5017
Message Definition
☑️ Assumed (Observed) - Comet
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 79 |
| 2 | UInt16 | MsgType | Type of message | 1006 |
| 4 | UInt32 | Hero ID | Unique identifier for the character | 1000000 |
| 8 | UInt32 | Look | Character view mesh | 501002 |
| 12 | UInt16 | Hair | Hairstyle and hair color | 535 |
| 14 | UInt32 | Money | Earned virtual player currency in pocket | 10000 |
| 18 | UInt32 | EMoney | Paid virtual player currency in pocket | 0 |
| 22 | UInt64 | Experience | Leveling experience | 1000 |
| 46 | UInt16 | Strength | Physical attack power | 7 |
| 48 | UInt16 | Agility | Physical accuracy | 2 |
| 50 | UInt16 | Vitality | Health increase | 4 |
| 52 | UInt16 | Spirit | Mana increase | 0 |
| 54 | UInt16 | Attributes | Unspent attribute points | 0 |
| 56 | UInt16 | Life | Current health of the character | 99 |
| 58 | UInt16 | Mana | Current mana of the character | 0 |
| 60 | UInt16 | Pk | PK points from slaying other players | 0 |
| 62 | Byte | Level | Character level | 1 |
| 63 | Byte | Profession | Current profession | 10 |
| 64 | Byte | Previous Profession | Profession before latest rebirth | 0 |
| 65 | Byte | Metempsychosis | Number of rebirths | 0 |
| 66 | Bool | AutoAllot | True to automatically allot attributes | 1 |
| 67 | NetStringPacker | Strings | Group of length prefixed strings |
NetStringPacker Fields
| Name | Description | Example |
|---|---|---|
| Name | Name of the character | Player |
| Mate | The character the player is married to | None |
Patch 5065
Message Definition
☑️ Assumed (Observed) - Comet
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 83 |
| 2 | UInt16 | MsgType | Type of message | 1006 |
| 4 | UInt32 | Hero ID | Unique identifier for the character | 1000000 |
| 8 | UInt32 | Look | Character view mesh | 501002 |
| 12 | UInt16 | Hair | Hairstyle and hair color | 535 |
| 14 | UInt32 | Money | Earned virtual player currency in pocket | 10000 |
| 18 | UInt32 | EMoney | Paid virtual player currency in pocket | 0 |
| 22 | UInt64 | Experience | Leveling experience | 1000 |
| 50 | UInt16 | Strength | Physical attack power | 7 |
| 52 | UInt16 | Agility | Physical accuracy | 2 |
| 54 | UInt16 | Vitality | Health increase | 4 |
| 56 | UInt16 | Spirit | Mana increase | 0 |
| 58 | UInt16 | Attributes | Unspent attribute points | 0 |
| 60 | UInt16 | Life | Current health of the character | 99 |
| 62 | UInt16 | Mana | Current mana of the character | 0 |
| 64 | UInt16 | Pk | PK points from slaying other players | 0 |
| 66 | Byte | Level | Character level | 1 |
| 67 | Byte | Profession | Current profession | 10 |
| 68 | Byte | Previous Profession | Profession before latest rebirth | 0 |
| 69 | Byte | Metempsychosis | Number of rebirths | 0 |
| 70 | Bool | AutoAllot | True to automatically allot attributes | 1 |
| 71 | NetStringPacker | Strings | Group of length prefixed strings |
NetStringPacker Fields
| Name | Description | Example |
|---|---|---|
| Name | Name of the character | Player |
| Mate | The character the player is married to | None |
Patch 5095
Message Definition
☑️ Assumed (Observed) - CoEmu
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 91 |
| 2 | UInt16 | MsgType | Type of message | 1006 |
| 4 | UInt32 | Hero ID | Unique identifier for the character | 1000000 |
| 8 | UInt32 | Look | Character view mesh | 501002 |
| 12 | UInt16 | Hair | Hairstyle and hair color | 535 |
| 14 | UInt32 | Money | Earned virtual player currency in pocket | 10000 |
| 18 | UInt32 | EMoney | Paid virtual player currency in pocket | 0 |
| 22 | UInt64 | Experience | Leveling experience | 1000 |
| 54 | UInt16 | Strength | Physical attack power | 7 |
| 56 | UInt16 | Agility | Physical accuracy | 2 |
| 58 | UInt16 | Vitality | Health increase | 4 |
| 60 | UInt16 | Spirit | Mana increase | 0 |
| 62 | UInt16 | Attributes | Unspent attribute points | 0 |
| 64 | UInt16 | Life | Current health of the character | 99 |
| 66 | UInt16 | Mana | Current mana of the character | 0 |
| 68 | UInt16 | Pk | PK points from slaying other players | 0 |
| 70 | Byte | Level | Character level | 1 |
| 71 | Byte | Profession | Current profession | 10 |
| 72 | Byte | Previous Profession | Profession before latest rebirth | 0 |
| 73 | Byte | Metempsychosis | Number of rebirths | 0 |
| 74 | Bool | AutoAllot | True to automatically allot attributes | 1 |
| 75 | UInt32 | Quiz Points | Total quiz points | 0 |
| 79 | NetStringPacker | Strings | Group of length prefixed strings |
NetStringPacker Fields
| Name | Description | Example |
|---|---|---|
| Name | Name of the character | Player |
| Mate | The character the player is married to | None |
Patch 5165
Message Definition
❓ Unverified - Assumed from Impulse + Comet
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 99 |
| 2 | UInt16 | MsgType | Type of message | 1006 |
| 4 | UInt32 | Hero ID | Unique identifier for the character | 1000000 |
| 8 | UInt32 | Look | Character view mesh | 501002 |
| 12 | UInt16 | Hair | Hairstyle and hair color | 535 |
| 14 | UInt32 | Money | Earned virtual player currency in pocket | 10000 |
| 18 | UInt32 | EMoney | Paid virtual player currency in pocket | 0 |
| 22 | UInt64 | Experience | Leveling experience | 1000 |
| 50 | UInt16 | Strength | Physical attack power | 7 |
| 52 | UInt16 | Agility | Physical accuracy | 2 |
| 54 | UInt16 | Vitality | Health increase | 4 |
| 56 | UInt16 | Spirit | Mana increase | 0 |
| 58 | UInt16 | Attributes | Unspent attribute points | 0 |
| 60 | UInt16 | Life | Current health of the character | 99 |
| 62 | UInt16 | Mana | Current mana of the character | 0 |
| 64 | UInt16 | Pk | PK points from slaying other players | 0 |
| 66 | Byte | Level | Character level | 1 |
| 67 | Byte | Profession | Current profession | 10 |
| 68 | Byte | Previous Profession | Profession before latest rebirth | 0 |
| 69 | Byte | Metempsychosis | Number of rebirths | 0 |
| 68 | Byte | First Profession | Profession before first rebirth (if on second) | 0 |
| 70 | Bool | AutoAllot | True to automatically allot attributes | 1 |
| 71 | UInt32 | Quiz Points | Total quiz points | 0 |
| 75 | UInt16 | Enlighten Points | Enlightenment points progress | 0 |
| 77 | UInt16 | Enlighten Exp | Enlightenment experience | 0 |
| 87 | NetStringPacker | Strings | Group of length prefixed strings |
NetStringPacker Fields
| Name | Description | Example |
|---|---|---|
| Name | Name of the character | Player |
| Mate | The character the player is married to | None |
Patch 5517 (Mac: 1029)
Message Definition
🚩 Incomplete - Reverse engineering Mac Client Binary 1029 (same release date as PC 5517), some unknown fields (possibly padding) remain
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 120 |
| 2 | UInt16 | MsgType | Type of message | 1006 |
| 4 | UInt32 | Hero ID | Unique identifier for the character | 1000000 |
| 8 | UInt16 | ShowType | Character display type | 2 |
| 10 | UInt32 | Look | Character view mesh | 501002 |
| 14 | UInt16 | Hair | Hairstyle and hair color | 535 |
| 16 | UInt32 | Money | Earned virtual player currency in pocket | 10000 |
| 20 | UInt32 | EMoney | Paid virtual player currency in pocket | 0 |
| 24 | UInt64 | Experience | Leveling experience | 1000 |
| 32 | UInt32 | Unknown | Unknown | - |
| 36 | UInt32 | Unknown | Unknown | - |
| 40 | UInt32 | Unknown | Unknown | - |
| 44 | UInt32 | Unknown | Unknown | - |
| 48 | UInt32 | Unknown | Unknown | - |
| 52 | UInt16 | Strength | Physical attack power | 7 |
| 54 | UInt16 | Agility | Physical accuracy | 2 |
| 56 | UInt16 | Vitality | Health increase | 4 |
| 58 | UInt16 | Spirit | Mana increase | 0 |
| 60 | UInt16 | Attributes | Unspent attribute points | 0 |
| 62 | UInt16 | Life | Current health of the character | 99 |
| 64 | UInt16 | Mana | Current mana of the character | 0 |
| 66 | UInt16 | Pk | PK points from slaying other players | 0 |
| 68 | Byte | Level | Character level | 1 |
| 69 | Byte | Profession | Current profession | 10 |
| 70 | Byte | Previous Profession | Profession before latest rebirth | 0 |
| 71 | Byte | First Profession | Profession before first rebirth | 0 |
| 72 | Byte | Unknown | Unknown | - |
| 73 | Byte | Metempsychosis | Number of rebirths | 0 |
| 74 | Byte | Unknown | Unknown | - |
| 75 | UInt32 | Quiz Points | Total quiz points | 0 |
| 79 | UInt16 | Enlighten Points | Enlightenment points progress | 0 |
| 81 | UInt16 | Enlighten Exp | Enlightenment experience | 0 |
| 83 | UInt16 | Unknown | Unknown | - |
| 85 | UInt16 | Unknown | Unknown | - |
| 87 | UInt32 | VIP Level | VIP level | 2 |
| 91 | UInt16 | Title ID | ID of title text next to name and effect (from title.ini) | 0 |
| 93 | UInt32 | Unknown | Unknown | - |
| 97 | Byte | Unknown | Unknown | - |
| 98 | UInt32 | Unknown | Unknown | - |
| 102 | UInt32 | Unknown | Unknown | - |
| 106 | UInt32 | Unknown | Unknown | - |
| 110 | NetStringPacker | Strings | Group of length prefixed strings |
NetStringPacker Fields
| Name | Description | Example |
|---|---|---|
| Name | Name of the character | Player |
| Empty | Empty | |
| Mate | The character the player is married to | None |
MsgUserIPInfo
MsgVerifyCheck
MsgVipFunctionValidNotify
This message is sent from the game server to the client to enable VIP feature buttons in the VIP Dialog. The message contains a single bitwise flag that determines which VIP buttons are visible. The server should send this message during the login sequence while processing MsgUserInfo
This message cannot be sent to the server by the client.
Table of Contents
Patch 5517
Message Definition
✅ Verified (Client): Confirmed by reverse engineering the client binary Mac 1029 (same release date at PC 5517)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 8 |
| 2 | UInt16 | MsgType | Type of message | 1129 |
| 4 | UInt32 | VipFunctionFlags | Bitwise flag to show or hide VIP buttons | 0xFFFF |
MsgVipUserHandle
MsgWalk
This message is sent from the game client when the player moves on the ground in a direction. The server responds by validating the movement and then sending the movement to all observers within the player's screen. If the observer receives a MsgWalk message for a player that doesn't exist on their screen, then that'll trigger a MsgAction request for that player using the QueryPlayer action.
⚠️ WARNING
Although the client checks for invalid coordinates, a modified client can walk on invalid tiles or across occupied spaces (such as the guild gate). Be sure to validate the coordinates of movements on the server side.
Table of Contents
Patch 4267
Message Definition
☑️ Assumed (Soul)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 10 |
| 2 | UInt16 | MsgType | Type of message | 1005 |
| 4 | UInt32 | Hero ID | Unique identifier for the character | 1000000 |
| 8 | Byte | Direction | Movement direction | 0 |
| 9 | Bool | Run | True if the player is running | 1 |
Patch 5165
Message Definition
☑️ Assumed (Observed)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 16 |
| 2 | UInt16 | MsgType | Type of message | 1005 |
| 4 | UInt32 | Direction | Movement direction | 0 |
| 8 | UInt32 | Hero ID | Unique identifier for the character | 1000000 |
| 12 | UInt32 | Movement Mode | Type of ground movement | 1 |
Movement Modes
☑️ Assumed (Observed)
enum MovementModes {
MOVEMENT_MODE_WALK = 0;
MOVEMENT_MODE_RUN = 1;
MOVEMENT_MODE_MOUNTED = 9;
}
Patch 5517
Message Definition
☑️ Assumed (Observed)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 24 |
| 2 | UInt16 | MsgType | Type of message | 10005 |
| 4 | UInt32 | Direction | Movement direction | 0 |
| 8 | UInt32 | Hero ID | Unique identifier for the character | 1000000 |
| 12 | UInt32 | Movement Mode | Type of ground movement | 1 |
| 16 | UInt32 | System Time | Milliseconds of system uptime | 10000 |
| 20 | UInt32 | Map ID | Map identifier | 1002 |
Movement Modes
☑️ Assumed (Observed)
enum MovementModes {
MOVEMENT_MODE_WALK = 0;
MOVEMENT_MODE_RUN = 1;
MOVEMENT_MODE_MOUNTED = 9;
}
Patch 6132
Message Definition
❓ Unverified - Imported from the legacy wiki
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 24 |
| 2 | UInt16 | MsgType | Type of message | 10005 |
| 4 | Bytes | Protobuf | Serialized protobuf fields |
Protobuf Fields
❓ Unverified - Imported from the legacy wiki
| Type | Name | ID | Description | Example |
|---|---|---|---|---|
| UInt32 | direction | 1 | Movement direction | 0 |
| UInt32 | hero_id | 2 | Unique identifier for the character | 1000000 |
| UInt32 | movement_mode | 3 | Type of ground movement | 1 |
| UInt32 | system_time | 4 | Milliseconds of system uptime | 10000 |
| UInt32 | map_id | 5 | Map identifier | 1002 |
Movement Modes
❓ Unverified - Imported from the legacy wiki
enum MovementModes {
MOVEMENT_MODE_WALK = 0;
MOVEMENT_MODE_RUN = 1;
MOVEMENT_MODE_MOUNTED = 9;
}
MsgWarFlag
MsgWeaponsInfo
MsgWeaponSkill
This message is sent by the game server to update the client's proficiency levels and experience.
Table of Contents
Patch 4267
Message Definition
☑️ Assumed (Soul)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 16 |
| 2 | UInt16 | MsgType | Type of message | 1025 |
| 4 | UInt32 | Type | The weapon skill type | 490 |
| 8 | UInt32 | Level | The new weapon skill level | 1 |
| 12 | UInt32 | Exp | The new weapon skill experience | 0 |
MsgWeather
This message updates the weather on a game map.
Table of Contents
Patch 4267
Message Definition
☑️ Assumed (Soul)
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | UInt16 | MsgSize | Size of the message | 20 |
| 2 | UInt16 | MsgType | Type of message | 1016 |
| 4 | UInt32 | Weather | The type of weather to display | 2 |
| 8 | UInt32 | Intensity | Scale of 1 to 1024 | 50 |
| 12 | Int32 | Direction | Angle delta of plus or minus 60 | 14 |
| 16 | UInt32 | Color | ARGB color | 0x00FFFFFF |
Weather Type
☑️ Assumed (Soul)
enum WeatherTypes {
WEATHER_NONE = 0;
WEATHER_FINE = 1;
WEATHER_RAINY = 2;
WEATHER_SNOWY = 3;
WEATHER_SANDS = 4;
WEATHER_LEAF = 5;
WEATHER_FLOWER = 7;
WEATHER_FLY = 8;
WEATHER_DANDELION = 9;
WEATHER_WORM = 10;
WEATHER_CLOUD = 11;
}
NetStringPacker
As stated on the Network overview page, Conquer Online uses a custom binary protocol in Little-endian. In order to send a string over the protocol, Conquer Online will either use a fixed length character buffer or prefix the string with a byte length.
TQ Digital Entertainment's NetStringPacker is a collection of byte length prefixed strings, prefixed by the total size of the collection (also represented as a byte).
Structure
| Type | Name | Description |
|---|---|---|
| Byte | Amount | Total number of strings |
| PString[] | Strings | Array of length-prefixed strings |
Example
The following example is from MsgTalk.
| Pos | Type | Name | Description | Example |
|---|---|---|---|---|
| 0 | Byte | Amount | Total number of strings | 4 |
| 1 | Byte | Length | Length of the first string | 6 |
| 2 | Char[6] | Speaker | Author of the message | SYSTEM |
| 8 | Byte | Length | Length of the second string | 8 |
| 9 | Char[8] | Header | Recipient of the message | ALLUSERS |
| 17 | Byte | Length | Length of the third string | 0 |
| 18 | Byte | Length | Length of the fourth string | 7 |
| 19 | Char[7] | Words | The body of the message | Testing |
The total size of this NetStringPacker is 26 bytes.
Timestamps
Some messages sent by the client include a time or timestamp.
Local Time
☑️ Assumed (Soul)
Messages such as MsgTalk use a time calculated using the following formula:
DWORD SysTimeGet(void)
{
time_t long_time;
time(&long_time); /* Get time as long integer. */
struct tm* pTime;
pTime = localtime(&long_time); /* Convert to local time. */
DWORD dwTime = pTime->tm_hour * 100 + pTime->tm_min;
return dwTime;
}
Considering that Conquer Online is a global game across multiple timezones, the local time being sent to the server cannot be used for any sort of visual element for observing players. However, it can be used for general spam detection or idempotency checks.
System Time
☑️ Assumed (Soul)
Messages such as MsgInteract use the system time, which is the timeGetTime function in the Windows API. The precision for these time fields can be five milliseconds or more, depending on the machine; therefore, it's unreasonable to use these timestamps to check for attack timing.
⚠️ WARNING
This is a 32-bit timestamp, meaning a possible range of 0 to 2^32 milliseconds (about 49.71 days). Do not use these timestamps to validate timing on the server unless the wrap around is taken into consideration.
Features
This section documents in-game systems & mechanics, covering how interact with the server and client.
Subsections
- VIP: VIP levels & benefits
Enthrallment (China Anti-Addiction System)
⚠️ WARNING
The document is written by observing client patch 5517. There may be significant differences between client patches.
This feature exists in the client binary but is fully gated by a region check. This feature cannot be used unless the client is patched. It is documented for informational purposes.
Enthrallment is the client-side implementation of China's Anti-Addiction regulation, introduced circa 2007. Players in China were required to link their account with their personal ID card. Under-18s had strict online time thresholds which, when reached, progressively restrict game rewards and actions.
This entire system is gated on the client locale, which is found in a hardcoded value in GraphicData.dll. On Chinese clients this value returns 中文 (Chinese). On all other locales (e.g. English) the check fails and the system is entirely inactive; all messages related to Enthrallment are skipped.
The server tracks how long a player has been online and offline in a day (midnight to midnight). The server sends Enthrallment updates to the client via MsgUserAttrib.
States and Thresholds
From archived official documentation and reverse engineering the binary, the thresholds and states a player under 18 would reach are:
| Hours Online | State | XP-Gain | Item Drop Rate | Reminder | Other |
|---|---|---|---|---|---|
| 0-3 hours | Healthy | Normal | Normal | System Message (String: #11070) every 1hr | Game plays as without restrictions |
| 3-5 hours | Fatigue | Halved | Halved | Popup (String: #11060) every 30min | Client blocks all item and action operations (equip, use, sell, buy, pick up, trade, attack) with a 'Operation Failed' System Message |
| > 5 hours | Unhealthy | None | None | Popup (String: #11061) every 15min | Client blocks all item and action operations (equip, use, sell, buy, pick up, trade, attack) with a 'Operation Failed' System Message |
Translated Strings
The Chinese strings related to Enthrallment can be found in StrRes.ini. Using Google Translate, these strings translate to:
String 11060 (3-5 hours, Fatigue)
"Because you are under 18, you have been placed under the Anti-Addiction system. You have now entered fatigue game time and your game rewards will be reduced to 0. Please see details [link_redacted]."
String 11061 (> 5 hours, Unhealthy)
"Because you are under 18, you have been placed under the Anti-Addiction system. You have now entered unhealthy game time and your game rewards will be reduced to 0. Please see details [link_redacted]."
String 11066 (Status Icon Tooltip Template)
"You have been enrolled in the Anti-Addiction system. Current cumulative online time: %d hours %d minutes %d seconds, offline time: %d hours %d minutes %d seconds. Game rewards: %s"
String 11067 (State Label: Healthy)
"Normal"
String 11068 (State Label: Unhealthy)
"reduced to 0"
String 11069 (State Label: Fatigue)
"reduced to 0"
String 11070 (System Message Summary)
"You have been enrolled in the Anti-Addiction system. After 3 cumulative hours online, game rewards will be 0 and you may only chat and walk. Current cumulative online time: %d hours %d minutes %d seconds, cumulative offline time: %d hours %d minutes %d seconds."
Message Flow
⚠️ WARNING
The flow of the messages is inferred
On player login, the server sends two MsgUserAttrib packets: MsgUserAttrib: USERATTRIB_ENTHRALLMENT_ONLINE_TIME_SYNC to set CHero::SetOnLineTime(Data1) and MsgUserAttrib: USERATTRIB_ENTHRALLMENT_OFFLINE_TIME_SYNC to set CHero::SetOffLineTime(Data1), where Data1 is the player's accumulated online/offline time in seconds since midnight. MsgUserAttrib: USERATTRIB_ENTHRALLMENT_ONLINE_TIME_SYNC also sets CHero::SetEnthrallment(true) and records the synchronization time in CHero::SetLastSynchronizeTime(TimeGet()). Once both values are received, the System Message Summary and a Status Icon are shown.
The client starts its own timer for the Status Icon, but the server sends MsgUserAttrib: USERATTRIB_ENTHRALLMENT_ONLINE_TIME_SYNC periodically and when Data1 equals 3600 (1hr), 7200 (2hr) or 10800 (3hr) it triggers the System Message Summary to display again as a reminder.
When the player reaches three hours of accumulated online time, the server sends MsgUserAttrib: USERATTRIB_ENTHRALLMENT_UPDATE_STATE with Data1 set to 50. This sets CHero::SetEnthrallmentState(50). It also displays two dialogs - one to tell the user they are in the Fatigue state and another dialog with a countdown to teleport the player to Twin City.

When the player reaches five hours of accumulated online time, the server sends MsgUserAttrib: USERATTRIB_ENTHRALLMENT_UPDATE_STATE with Data1 set to 0. This sets CHero::SetEnthrallmentState(0). It also displays a single dialog - informing the user they are in an Unhealthy state.
At midnight, the server sends MsgUserAttrib: USERATTRIB_ENTHRALLMENT_RESET which clears both the online and offline accumulated time and sets CHero::SetEnthrallmentState(100) (Healthy).
Patching Script
To enable Enthrallment on a non-Chinese client, patch GraphicData.dll to replace the hardcoded locale string English with the GBK encoding of 中文 (\xD6\xD0\xCE\xC4), null-padded to the original length.
You should back up the original GraphicData.dll.
import sys
with open(sys.argv[1], "rb") as f:
data = f.read()
idx = data.find(b"English")
if idx == -1:
print("ERROR: 'English' not found already patched or wrong file?")
sys.exit(1)
patched = data[:idx] + b"\xD6\xD0\xCE\xC4\x00\x00\x00" + data[idx + len(b"English"):] # 中文 + padding
with open(sys.argv[1], "wb") as f:
f.write(patched)
print(f"Patched at offset 0x{idx:x}")
Usage: python patch_graphicdata.py GraphicData.dll
Other Chinese-Gated Features
The following features share the same 中文 locale gate:
PK Map Entry Notification: When MsgMapInfo arrives with PKType as 1 or 2, a system chat message is shown to say whether PK is allowed on the map or not.
Nobility (Peerage)
⚠️ WARNING
The document is written by observing client patch 5517. There may be significant differences between client patches.
A player can donate silver or CPs (Conquer Points) to earn nobility on the server. It was introduced in patch 5017, with gender-specific ranks added in patch 5302. Depending on how much the player donates in total, their hero name can appear on a leaderboard, they get an increase in battle power & 3DEffect appears on their character model each time they are loaded into view.
Peerage Ranks
The table below shows the peerage ranks & the official requirements. Coincidentally, the rank number is also the same value as the increase in battle power.
| Rank Number | Title | Max Per Server | Requirement |
|---|---|---|---|
| 12 | King / Queen | 3 | Leaderboard Rank 1-3 |
| 9 | Prince / Princess | 12 | Leaderboard Rank 4-15 |
| 7 | Duke / Duchess | 35 | Leaderboard Rank 16-50 |
| 5 | Earl / Countess | No Limit | 200,000,000 silvers |
| 3 | Baron / Baroness | No Limit | 100,000,000 silvers |
| 1 | Knight / Lady | No Limit | 30,000,000 silvers |
| 0 | Commoner | N/A | N/A |
Nobility titles, status button and effects are all defined in the file peerage.ini with the ini-heading formula calculated by:
(Rank Number * 10) + Gender (1=Male 2= Female)
For example, ini-heading [72] in peerage.ini is the female version of the 7th Rank (Duchess)
Client Implementation
Status Button
The hero's peerage rank should be sent by the server to the client shortly after the game server initializes the hero (after MsgUserInfo) by sending the message MsgPeerage: REFRESH_RANK. This message is required for the nobility status button to appear, even if the hero has never donated (as they will be Rank Commoner).
The nobility status icon has a hover-over tooltip with the hero's total donation amount, their nobility rank and position on the leaderboard. The values of this tooltip come from the MsgPeerage: REFRESH_RANK payload. If the hero has not achieved a rank then their rank is displayed as --.
Submitting Donation
After clicking the nobility status button, the dialog DlgContribution appears. There is a field where the player can enter the amount of silver to donate. The minimum amount of silver is 3,000,000 (hardcoded in the client binary). After clicking submit, the player is prompted whether they wish to donate using CPs (Bound CPs are used first, then Non-Bound) instead of silver, where 1CP is equivalent to 50,000 silver (hardcoded in the client binary). After confirming the donation currency, the client sends the message MsgPeerage: SEND_DONATION with the donation amount & currency-type.
There is client-side validation to ensure the hero has enough currency before submitting the donation, but the server should also validate and action the request. The server replies back with MsgPeerage: SEND_DONATION to confirm the donation amount, the hero's total donation, and, if applicable, the hero's new position on the leaderboard.
The server should also send MsgPeerage: REFRESH_RANK again to refresh the hero's status icon & rank.
Query Minimum Amount
On the Nobility Contribution dialog (DlgContribution) there is a section 'Minimum Donation', where the player can click on a button for each and any rank higher than their current peerage rank. When they click on a rank button, the client sends MsgPeerage: QUERY_MINIMUM with the rank number clicked on.
The server then calculates the minimum amount of silver the hero must donate for that rank and responds with MsgPeerage: QUERY_MINIMUM with the rank number clicked on.
Leaderboard
❗ IMPORTANT
Leaderboard positions are zero-indexed. The top donor (rank 1) is sent as position 0 by the server, and the client adds 1 to this.
On the Nobility Contribution dialog (DlgContribution) the top 5 most-donated players are shown. The client requests the top 5 players by sending MsgPeerage: LEADERBOARD and the server responds with the same message with an array of the top 5 players' details.
The player can also select 'More' on the leaderboard, which will be a paginated list of top donated players. The client sends the requested page via MsgPeerage: LEADERBOARD and the server responds back with MsgPeerage: LEADERBOARD.
VIP
⚠️ WARNING
The document is written by observing client patch 5517. There may be significant differences between client patches.
A player can be a VIP, it was introduced around patch 5395 and the level was set by how much real-life money the player had spent on the game.
On client version 5517, there are six levels of VIP where each level subsequently opens up additional features.
VIP Levels
The features & benefits of each VIP level:
| Feature | Level 1 | Level 2 | Level 3 | Level 4 | Level 5 | Level 6 |
|---|---|---|---|---|---|---|
| Remote warehouse (Market, Twin City) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Free flowers per day 🟠 | 2 | 3 | 5 | 10 | 15 | 30 |
| Extra Lottery chances 🟠 | +10 | +20 | +30 | +40 | +50 | +60 |
| Bonus Blessing time 🟠 | +10% | +15% | +20% | +30% | +30% | +30% |
| Max friends 🟠 | 55 | 60 | 70 | 80 | 90 | 100 |
| Offline Training hours 🟠 | 16 | 17 | 18 | 19 | 21 | 24 |
| Refine/Purify time extension 🟠 | +1 day | +2 days | +4 days | +7 days | +7 days | +7 days |
| Free Labyrinth entry 🟠 | every 7d | every 6d | every 5d | every 4d | every 3d | every 2d |
| Remote warehouse (Desert City) | ✓ | ✓ | ✓ | ✓ | ✓ | |
| Remote repair equipped items | ✓ | ✓ | ✓ | ✓ | ✓ | |
| VIP Furniture 🟠 | ✓ | ✓ | ✓ | ✓ | ✓ | |
| City Teleport 🟠 | ✓ | ✓ | ✓ | ✓ | ✓ | |
| Remote warehouse (Ape City) | ✓ | ✓ | ✓ | ✓ | ||
| Remote compose items | ✓ | ✓ | ✓ | ✓ | ||
| Extra Demon Exterminators quest per day | ✓ | ✓ | ✓ | ✓ | ||
| Portal Teleport 🟠🔷 | ✓ | ✓ | ✓ | ✓ | ||
| City Teleport Team 🟠♦️ | ✓ | ✓ | ✓ | ✓ | ||
| Remote warehouse (Bird Island) | ✓ | ✓ | ✓ | |||
| Keep 50% EXP on PK death | ✓ | ✓ | ✓ | |||
| VIP Avatars 🟠 | ✓ | ✓ | ✓ | |||
| VIP Hairstyles 🟠 | ✓ | ✓ | ✓ | |||
| Frozen Grotto 5F free entries/day 🟠 | 1 | 3 | 5 | |||
| Extra Study Points quest 🟠 | ✓ | ✓ | ✓ | |||
| Remote warehouse (Phoenix Castle) | ✓ | ✓ | ||||
| Remote all warehouses | ✓ | |||||
| Portal Teleport Team 🟠🔷♦️ | ✓ |
🟠 Sourced from Client 5517 CN_Res.ini. If not marked, then it is sourced from official documentation
♦️ If the player is part of a Team, they can invoke a teleport for the whole team. A message is sent to each team member asking to confirm the teleport. The team teleport functionality appears to be handled via MsgVipUserHandle (further analysis is required)
🔷 Portal Teleport enables teleporting to specific parts of some maps (Like the Turtledoves Section of WindPlain) These values can be found in the client's VipTrans.ini file. It is also referred to as 'SuperSend' in GUI.ini
VIP Level in MsgUserInfo
The hero's VIP level is first sent to the client when the game server initializes the hero in MsgUserInfo as a UInt32.
The hero's VIP level is used in comparisons both server-side & client-side. For example, a level 3 VIP can have up to 70 friends, this is validated both in the client & should be validated server-side when adding a friend.
VIP Dialog Buttons via MsgVipFunctionValidNotify
The hero must be at least VIP Level 1 before the VIP button is shown above the chat bar. The VIP dialog will always show 'RemoteWarehouse', 'RemoteRepair' and 'RemoteCompose'. Remote-Compose is greyed-out and disabled until VIP Level 3. For the other buttons, the server must send a bitwise flag in the packet MsgVipFunctionValidNotify to the client to determine if the button is visible. The server should send this message during the login sequence while processing MsgUserInfo.
The values of the bitwise flag can be found in the client's GUI.ini file, with the ini-heading [338-$BIT_POSITION], inside the ini-section would be the VIP Button Function. For example: [338-11] -> Vip_HairstyleBtn - shows that the 11th bitflag decides whether or not to show a button in the VIP dialog with hover-over text that the hero has access to VIP Hairstyles.
Some buttons perform an action, such as opening the Teleport Team dialog. Some buttons only have hover-over text such as informing how many flowers the hero can send based on their VIP level and have no action.
The values of the bitwise flag to show or hide a button in the VIP dialog for client 5517 are:
enum VipDialogButtons {
PORTAL_TELEPORT = 0x0001; // Button opens a dialog
VIP_AVATARS = 0x0002; // Button opens a dialog
EXTRA_FLOWERS = 0x0004; // Hover-over button text only
FROZEN_GROTTO_5F = 0x0008; // Hover-over button text only
PORTAL_TELEPORT_TEAM = 0x0010; // Button opens a dialog
CITY_TELEPORT = 0x0020; // Button opens a dialog
CITY_TELEPORT_TEAM = 0x0040; // Button opens a dialog
EXTRA_BLESSING_TIME = 0x0080; // Hover-over button text only
OFFLINE_TRAINING_HOURS = 0x0100; // Hover-over button text only
REFINE_PURIFY_EXTENSION = 0x0200; // Hover-over button text only
ADDITIONAL_FRIEND_SLOTS = 0x0400; // Hover-over button text only
VIP_HAIRSTYLES = 0x0800; // Hover-over button text only
FREE_LABYRINTH_ACCESS = 0x1000; // Hover-over button text only
MORE_DAILY_QUESTS = 0x2000; // Hover-over button text only
VIP_FURNITURE = 0x4000; // Hover-over button text only
MORE_LOTTERY_CHANCES = 0x8000; // Hover-over button text only
}
Therefore, the bitflag values for each VIP Level that the server must send via MsgVipFunctionValidNotify are:
enum VipLevel {
VIP_LEVEL_1 = 0x9784;
VIP_LEVEL_2 = 0xD7A4;
VIP_LEVEL_3 = 0xD7E5;
VIP_LEVEL_4 = 0xFFEF;
VIP_LEVEL_5 = 0xFFEF;
VIP_LEVEL_6 = 0xFFFF;
}
Renderers
This section documents how the client renders an entity or object on screen.
Conquer Online is written in TQ Digital's custom game engine, called Conquer III (C3). The C3 engine is originally built on DirectX 8.1, but has been ported before to DirectX 9 and OpenGL. Although the C3 engine has been open-sourced officially before, it is no longer available and never perfectly matched up with running online games by TQ.
Hero
Item
NPC
Map
Monster
Security
This section documents security protocols and ciphers, which establish rules for data transfer and communication exchanges between the client and game servers.
DH Key Exchange
RC5
SRP6
RSA File Cipher
TQ uses RSA PKCS#1 2048-bit asymmetric encryption to protect some game data files. This page explains how the cipher works and how to decrypt these files.
⚠️ WARNING
Some data files use a different encryption/decryption method. This cipher only decrypts & encrypts files marked as 'RSA' on DAT. Other encryption types like TQ File Cipher will not work with this method.
ℹ️ Information
All information on this page is derived from the publicly distributed client binaries. The extracted key is an RSA public key and therefore is public by design.
Table of Contents
Cipher Overview
TQ first gzip-compresses then encrypts the file using their 2048-bit RSA private key before the client is compiled. The client has the public key baked into the binary and uses it to decrypt the file then decompress it.
It's possible to extract the public key from the client binary to decrypt the files. However, without the original private key, it is not possible to re-encrypt the file. Instead, the alternative is to patch the client binary (see Encryption)
The compressed & encrypted file is split into 256-byte ciphertext blocks. Each block is decrypted with the public key then concatenated together & decompressed.
Extracting Public Key
The client binary obfuscates the baked-in public key modulus. The constructor of CConfigMgr reconstructs the public key by fetching a static array of 64 uint32 words, then applying a rolling XOR over adjacent elements. This gives the deobfuscated modulus, which, along with the standard public exponent 65537, is the RSA public key.
In the Mac binary, the 64 uint32 words are stored a contiguous static array, making it very easy to extract. However, in the Windows binary, they are not contiguous but use a mix of mov instructions (which is still extractable, but not as easy).
Below is a script which can deobfuscate the public key. You must supply it the 64 uint32 obfuscated modulus words which can be found in the client binary in the CConfigMgr constructor.
obfuscated = [ 0x..., 0x..., 0x..., ... ] # Replace this with the extracted 64 uint32 obfuscated modulus words from binary in CConfigMgr constructor.
modulus_words = [0] * 64
# Rolling XOR
idx = 17 # Starting position for XOR loop (hardcoded in binary)
for j in range(63):
modulus_words[idx % 64] = obfuscated[j] ^ obfuscated[j + 1]
idx += 1
modulus_words[idx % 64] = obfuscated[63]
# Assemble into a single 2048-bit integer (Deobfuscated RSA Modulus n)
n = 0
for w in modulus_words:
n = (n << 32) | w
e = 65537 # Standard RSA public exponent
Example Extracted Deobfuscated Modulus
To verify your extraction using the above process was successful. You can compare your extraction output with the expected deobfuscated RSA modulus (n) verified on patch 5517 as a 512-character hex string:
bef5bd339b6bac0c957fa68ec010a7d7c38a2b03a9d2084f0e107b2644e246b3
fab03ac76235ae40a0731714783d49caa99ac78a8a39d8b944f168b3aea3b216
2220f2a7444735e07e70a66dd7843c899b64e6a5ee88e4f87b255c2395299899
296e043ea19b6b9b38dfbf671a80a77693fedc7030be7b241726d208010a8dd3
9780e60c2d47dedaa720f56517657eed9e88fe1c9b37591599210ab095e4c251
bd9ea7faf4450cb15a5078a2093cf112e99f34648154d2cc94c38392d724f0fa
fc629e70cd1b97ee4eb82c11c2b0954cef918560ef9f2c7da60b33e767f5d626
cd3d0a6082a06650e54926be71b66e39c33b6e18b7c703830b87a2e4d8805409
This deobfuscated RSA modulus (n) is likely to be the same on other patches, but only 5517 was tested.
Decryption
With the public key extracted, we can now decrypt the game files via this process:
- Split the encrypted data file into 256-byte ciphertext blocks.
- For each block, standard RSA public-decrypt:
chunk = pow(c, e, n)(c= a 256-byte ciphertext block,e= the exponent (65537),n= the deobfuscated RSA modulus) - Strip the PKCS#1 padding from the decrypted chunk
- Concatenate all decrypted chunks.
- Gzip-decompress the concatenated payload.
The following snippet implements the above logic in python. This script has no error handling, checks or dependencies as it is intentionally minimal for readability. This script takes an encrypted game data file path as arg1.
The result will be written to the same directory as the encrypted file with the suffix _decrypted, if the decrypted file already exists it will be overwritten!
import sys, zlib
# Replace n with deobfuscated RSA modulus. Below is from patch 5517 (but likely suitable for all other patches)
n = int("bef5bd339b6bac0c957fa68ec010a7d7c38a2b03a9d2084f0e107b2644e246b3"
"fab03ac76235ae40a0731714783d49caa99ac78a8a39d8b944f168b3aea3b216"
"2220f2a7444735e07e70a66dd7843c899b64e6a5ee88e4f87b255c2395299899"
"296e043ea19b6b9b38dfbf671a80a77693fedc7030be7b241726d208010a8dd3"
"9780e60c2d47dedaa720f56517657eed9e88fe1c9b37591599210ab095e4c251"
"bd9ea7faf4450cb15a5078a2093cf112e99f34648154d2cc94c38392d724f0fa"
"fc629e70cd1b97ee4eb82c11c2b0954cef918560ef9f2c7da60b33e767f5d626"
"cd3d0a6082a06650e54926be71b66e39c33b6e18b7c703830b87a2e4d8805409", 16) # Hex-String to Int
e = 65537
filename = sys.argv[1]
name, ext = filename.rsplit(".", 1)
out_filename = name + "_decrypted." + ext
with open(filename, "rb") as f:
data = f.read()
# Decrypt each 256 chunk in big endian & remove any padding
payload = b""
for i in range(0, len(data), 256):
ciphertext_block = int.from_bytes(data[i:i + 256], byteorder="big")
chunk = pow(ciphertext_block, e, n).to_bytes(256, byteorder="big")
padding_end = chunk.index(b"\x00", 2) # Locate end of PKCS#1 padding
payload += chunk[padding_end + 1:]
with open(out_filename, "wb") as f:
f.write(zlib.decompress(payload, wbits=47)) # Gzip decompress
Example: python3 co_rsa_decrypt.py server.dat
Encryption
Re-encrypting the file is not possible without TQ's private key. Some possible solutions, but out of scope for this page are:
- Generate your own RSA 2048-bit keypair, encrypt the files with your private key, and patch the client binary to replace the obfuscated modulus with your own.
- Patch the binary to skip RSA decryption entirely, so files are read as plaintext.
TQ
TQ File Cipher
TQ uses a symmetric file cipher used to encrypt & decrypt some data files. This page explains how to decrypt and encrypt game data files using this cipher.
⚠️ WARNING
Some data files use a different encryption/decryption method. This cipher only decrypts & encrypts files marked as 'TQ File Cipher' on DAT. Other encryption types like RSA will not work with this method.
Table of Contents
Cipher Overview
This cipher uses Microsoft's classic rand() algorithm, called "Linear Congruential Generator" (LCG) to generate pseudorandom numbers as the key, so using the same seed value will produce the same output (set of random numbers) every time. For each byte, the cipher then performs an XOR with the key & a bitrotate to decrypt (the inverse to encrypt).
In order to decrypt or encrypt the data file, we need to know the seed value. The seed is hardcoded in the client binary, but a list can be found in: DAT
Key Generation
The key size is hardcoded in the client binary, it is 128. The key bytes will always be the same value when given the same seed. With the seed, we can derive the 128 independent key bytes by implementing Microsoft's classic rand:
n = seed * 0x343FD + 0x269EC3
seed = n & 0xFFFFFFFF
key[i] = ((n >> 16) & 0x7FFF) % 0x100
We now have a key[128], where each element in the array is a value 0-255 (a byte).
We then process the file byte-by-byte:
To Decrypt Each Byte:
- XOR the byte with
key[i % 128] - Right rotate the byte by
i % 8bits
To Encrypt Each Byte:
- Left Rotate the byte by
i % 8bits - XOR with
key[i % 128]
Example Scripts
The following snippets implement the above logic in python. These scripts have no error handling, checks or dependencies as they are intentionally minimal for readability.
Decryption
This script takes an encrypted game data file as arg1 and the seed value as arg2 in either decimal (9527) or hex (0x2537). The seeds for each file can be found in: DAT. It is important to use the correct seed value; otherwise, the decrypted output will be garbled.
The result will be written to the same directory as the encrypted file with the suffix _decrypted, if the decrypted file already exists it will be overwritten!
import sys
filename = sys.argv[1]
seed = int(sys.argv[2], 0)
name, ext = filename.rsplit(".", 1)
out_filename = name + "_decrypted." + ext
key_size = 128
# Step 1: Key Generation
key = []
for _ in range(key_size):
n = seed * 0x343FD + 0x269EC3
seed = n & 0xFFFFFFFF
key.append(((n >> 16) & 0x7FFF) % 0x100)
data = open(filename, "rb").read()
# Step 2: Byte-for-byte of the file
result = []
for i in range(len(data)):
b = data[i]
xored = b ^ key[i % key_size] # XOR byte with key byte
rotated = ((xored >> (i % 8)) | (xored << (8 - i % 8))) & 0xFF # Right Rotate
result.append(rotated)
open(out_filename, "wb").write(bytes(result))
Example: python3 tqdecrypt.py magictypeop.dat 9527
Encryption
This script takes an unencrypted game data file as arg1 and seed value as arg2 in either decimal (9527) or hex (0x2537). The seeds for each file can be found in: DAT. It is important to use the correct seed value, otherwise the client will not be able to decrypt the file and throw an error.
The result will be written to the same directory as the encrypted file with the suffix _encrypted, if the encrypted file already exists it will be overwritten!
import sys
filename = sys.argv[1]
seed = int(sys.argv[2], 0)
name, ext = filename.rsplit(".", 1)
out_filename = name + "_encrypted." + ext
key_size = 128
# Step 1: Key Generation
key = []
for _ in range(key_size):
n = seed * 0x343FD + 0x269EC3
seed = n & 0xFFFFFFFF
key.append(((n >> 16) & 0x7FFF) % 0x100)
data = open(filename, "rb").read()
# Step 2: Byte-for-byte of the file
result = []
for i in range(len(data)):
b = data[i]
rotated = ((b >> (8 - i % 8)) + (b << (i % 8))) & 0xFF # Left Rotate
result.append(rotated ^ key[i % key_size]) # XOR byte with key byte
open(out_filename, "wb").write(bytes(result))
Example: python3 tqencrypt.py magictypeop.dat 9527