Conquer Online

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.

DigitQuality
1Normal
2Refined
3Super

Gem Types

Gem TypeNormal ItemIDRefined ItemIDSuper ItemIDEffect
Phoenix700001700002700003+5% / +10% / +15% magic attack
Dragon700011700012700013+5% / +10% / +15% physical attack
Fury700021700022700023+5% / +10% / +15% hitting accuracy
Rainbow700031700032700033+10% / +15% / +25% killing experience
Kylin700041700042700043+50% / +100% / +200% durability
Violet700051700052700053+30% / +50% / +100% weapon experience
Moon700061700062700063+15% / +30% / +50% magic experience
Tortoise700071700072700073-2% / -4% / -6% damage taken
Thunder700101700102700103Heaven Fan only: +100 / +300 / +500 Attack & Magic Attack
Glory700121700122700123Star 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:

FieldFormulaDescription
Item Qualityid % 10Quality grade (0-9)
Item Levelfloor(id / 10) % 100Level of the item (name / stats)
Categoryfloor(id / 10000) % 100Two-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

DigitName
0Fixed
1Starting Gear for New Players (Normal)
2Unused 🔵
3Normal (Base Stats)
4Normal (Typically Base + Slight Stat Increase)
5Normal (Typically Base + Further Stat Increase)
6Refined
7Unique
8Elite
9Super

🔵 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

DigitName
1Normal
2Refined
3Super

Overall Item ID Ranges

ID RangeDescription
100000-199999Equipment (Head, Necklace, Ring, Bracelets, Armor, Garments)
200000-209999Mount Armor, Fan & Tower
300000-309999Mounts (Only Single Entry: Steed)
400000-499999Single-hand weapons (excluding Katanas & Beads)
500000-599999Two-hand weapons
600000-699999Single-hand Weapons: Katanas (Ninja) & Beads (Monk)
700000-799999Gems, Item Packs, Quest Items, Furniture, Refinery Items
800000-899999Dragon & Martial Souls
900000-999999Shields
1000000-1099999Consumables, arrows, ores, Dragonball/Meteor & Silver/Gold
2000000-2999999Gourd & 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 RangeEquipment type
110000-119999Head gear
120000-129999Necklaces
130000-139999Body armor
140000-149999Head gear
150000-159999Rings, bracelets
160000-169999Boots
180000-189999Garments
190000-199999Garments

Weapon Ranges

Single-hand (4xxxxx & 6xxxxx):
ID RangeWeapon type
410000-419999Blade
420000-429999Sword
430000-439999Hook
440000-449999Whip
450000-459999Axe
460000-469999Hammer
480000-489999Club
490000-499999Dagger
600000-609999Katana
610000-619999Prayer Beads
Two-hand (5xxxxx):
ID RangeWeapon type
500000-509999Bow
510000-519999Glaive
530000-539999Poleaxe
540000-549999Long Hammer
560000-560999Spear
561000-561999Wand
562000-562001Pickaxe & Hoe
580000-589999Halberd

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

OffsetTypeDescription
0UInt32Number of records in the file

Record Structure

OffsetTypeDescription
0UInt32Checksum 1
4UInt32Action Index
8UInt32Checksum 2
12UInt32Frame Interval (ms)
16UInt32Checksum 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 ActionType ACTION_WALKL (Walk Left)

For 999999110, the frame interval is 25, so each frame in the animation has a 25ms delay.

Example Entries

Action IndexFrame Interval (ms)
99999910066
99999910166
99999911025
99999912025
99999913033
......

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

OffsetTypeDescription
0UInt32ProfessionCount
4UInt32LevelCount

Profession Index

After the header is an array of ProfessionType. i is the array index, starting from zero:

OffsetTypeDescription
8 + (i * 4)UInt32ProfessionType

Data Records

Then an array of ProfessionCount * LevelCount records, ordered by ProfessionType then level:

Offset (per record)TypeDescription
0UInt32Strength
4UInt32Agility
8UInt32Vitality
12UInt32Spirit

Level is not stored, it is implicit from the position in the array.

Example Entries

ProfessionTypeLevelStrengthAgilityVitalitySpirit
115230
127240
138350
1410450
1511560
..................

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

ValueEncodingRegion
936GBKSimplified Chinese
950Big5Traditional Chinese
932Shift-JISJapanese
949EUC-KRKorean
1256Windows-1256Arabic

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>
PartDescription
fontnameFont filename in the client root, or an installed Windows font name.
sizeDefault 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
FieldTypeDescription
ChatFontSizeintSize used for chat and floating text.
ChatFontstringFont filename in the client root, or an installed Windows font name, used for chat text.
GUIFontstringFont 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

OffsetSizeTypeDescription
04UInt32Number of records in the file

Record Structure

OffsetSizeTypeDescriptionExample
04UInt32Map ID1000
44UInt32Length of the filepath17
8[Length]StringMap path (Ascii Unterminated)map/map/desert.7z
8 + Length4UInt32Puzzle Size256

Example Entries

Map IDMap PathPuzzle Size
1000map/map/desert.7z256
1001map/map/d_antre01.7z256
1002map/map/newplain.7z256
1003map/map/mine01.7z256
.........

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

FieldNameTypeDescription
1iduint32Item ID
2namestringItem Name
3req_professionuint8Required Hero Profession
4req_weaponskilluint8Required Weapon Proficiency level
5req_leveluint8Minimum character level required to equip or use
6req_sexuint8Hero gender restriction (0=any, 1=Male , 2=Female)
7req_forceuint16Required Strength attribute amount
8req_speeduint16Required Agility attribute amount
9req_healthuint16Required Vitality attribute amount
10req_souluint16Required Spirit attribute amount
11monopolyuint8Bitmask trade, warehouse, bound, lock & drop restrictions
12weightuint16Used on a few event item tooltips
13priceint32NPC buy price in silver
14id_actionint32Script or action ID to trigger on use or equip (0 = none)
15attack_maxuint16Maximum physical attack
16attack_minuint16Minimum physical attack
17defenseuint16Physical defense bonus
18agilityuint16Agility bonus
19dodgeuint16Dodge bonus
20lifeuint16HP bonus
21manauint16MP bonus
22durabilityuint16Default durability. In the item tooltip this is displayed as floor(value / 100)
23durability_limituint16Maximum durability. In the item tooltip this is displayed as floor(value / 100)
24identifieduint8Unused
25gem1uint8Socket 1 Gem Item ID (0 = empty socket)
26gem2uint8Socket 2 Gem Item ID (0 = empty socket)
27magic1int32Unused, set via MsgItemInfo
28magic2uint8Unused, set via MsgItemInfo
29n_amountuint8+N item value & +N item stones
30dataint32Unused, set via MsgItemInfo for additional attributes (socket progress, container amount)
31magic_atkuint16Magic attack bonus
32magic_defuint16Magic defense bonus
33atk_rangeuint16Attack range
34atk_speeduint16Attack speed
35fray_modeuint8Unknown 0 on all normal equipment. 2 on garments & mount armor. (Suspected: Different durability algorithm for garments)
36repair_modeuint8Unknown 0 on normal equipment. 2 on garments & mount armor. 3 on gourds. (Suspected: Different repair mechanic for garments / gourds)
37type_maskuint8Is set to 1 on Cosmetic Equipment (Garments / Mounts) appears client uses it in Character Pose Actions (Unknown purpose)
38emoney_priceint32Conquer Points (CP) shop price. 0 = not sold for CP
39emoney_bound_priceint32Bound Conquer Points (CP) Shop Price. 0 = not sold for Bound CP
40expiry_timeint32Item duration in minutes. Used on some mounts, cosmetics & quest items
41soul_atk_1int32Soul - Critical Strike percentage bonus (value / 100)%
42soul_atk_2int32Soul - Skill Critical Strike percentage bonus (value / 100)%
43soul_def_1int32Soul - Immunity percentage bonus (value / 100)%
44soul_atk_3int32Soul - Penetration percentage bonus (value / 100)%
45soul_def_2int32Soul - Block percentage bonus (value / 100)%
46soul_atk_4int32Soul - Breakthrough percentage bonus (value / 10)%
47soul_def_3int32Soul - Counteraction percentage bonus (value / 10)%
48max_stack_sizeint32Maximum amount the same item can be stacked in same item slot
49elem_res_metalint32Metal element resistance bonus (unused)
50elem_res_woodint32Wood element resistance bonus
51elem_res_waterint32Water element resistance bonus
52elem_res_fireint32Fire element resistance bonus
53elem_res_earthint32Earth element resistance bonus
54item_typestringTooltip description of the item type
55descriptionstringTooltip long description about the item
56quality_colorint32For non-equipment, the item name color. Quality value same as Equipment Quality
57dragonsoul_phaseuint16Dragonsoul phase number (1-6)
58dragonsoul_reqint32Dragonsoul requirement to reach next phase
59crop_qualityint32Only 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:

OffsetTypeDescription
i * 4UInt32EXP 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

LevelEXP Required
159
2195
3203
4320
5573
......

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)

FieldTypeDescriptionExample
StartStringStarting TME to play at start of processingrain01.TME
LastStringLasting TME playing until effect is removedwindblade7-1.TME
EndStringEnding TME to play at the end of processingline05.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
FieldTypeDescription
NamestringDisplay name shown above the NPC in-game. Can be overridden by MsgNpcInfo
SimpleObjIDuintID of the object in C3 Simple Objects
StandByMotionint64Motion ID in C3 for Standing-Still NPC (Not Interacted With)
BlazeMotionint64Motion ID in C3 when Hovering-Over or Interacting with NPC
RestMotionint64Motion ID in C3 that plays periodically when on-screen & not interacting
EffectstringName of a 3DEffect in C3 to add to the NPC. Default is none.
ASBintAlpha Source Blend. See: 3DEffect.ini
ADBintAlpha Destination Blend 3DEffect.ini
FixDiruintFixed facing direction. 0 = NPC rotates to where player is on interaction. 1 = NPC stays fixed direction
ZoomPercentint(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
FieldTypeDescription
NamestringDisplay name shown above the NPC in-game. Can be overridden by MsgNpcInfo
AddSizeintUnknown, always 1.
ScaleuintModel scale as a percentage. Defaults to 100
FixDiruintFixed facing direction. 0 = NPC rotates to where player is on interaction. 1 = NPC stays fixed direction
LookuintThis is the overall look of the NPC (body & armor) from C3 under mix_body
HeaduintSeems to always be zero, as Armet takes precedence (and no Head items in C3)
HairuintSeems to always be zero, as Armet takes precedence. But can be Hairstyle
ArmetuintHelmet item ID. 0 = none.
ArmetColorintColor/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.
ArmoruintSeems to always be zero, as look takes precedence.
ArmorColorintThe armor quality, by default this is 3. Unused as Armor is zero.
RWeaponuintRight-hand weapon item ID. 0 = none.
LWeaponuintLeft-hand weapon item ID. 0 = none.
MiscuintAlways 0, there's only one Misc in C3 and unrelated to this.
MountuintAlways 0, but can be set to a mount from C3 (8010001) - but breaks the model
EffectstringName 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 NumberTitle
12King / Queen
9Prince / Princess
7Duke / Duchess
5Earl / Countess
3Baron / Baroness
1Knight / Lady
0Commoner

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
FieldTypeDescription
NamestringDisplay name of the rank used in various places during string formatting
Icon16stringSmall DDS icon for the rank in the leaderboard (data/interface/Style01/nobility)
Icon32stringMedium DDS icon for the rank in the leaderboard (data/interface/Style01/nobility)
Icon64stringLarge DDS icon for the rank in the leaderboard (data/interface/Style01/nobility)
Font16stringSmall DDS glowing text for the rank in the leaderboard (data/interface/Style01/nobility)
Font32stringMedium DDS glowing text for the rank in the leaderboard (data/interface/Style01/nobility)
Font64stringLarge DDS glowing text for the rank in the leaderboard (data/interface/Style01/nobility)
StatusIconIDuintStatus button icon ID for the rank. Defined in StatusTips.ini (data/pic/Contribute)
StatusIconEffectstringGlowing status icon in C3 (c3/effect/other/rank)
Effect1stringText 3D effect that appears on the hero in C3 (c3/effect/other/rank/letter)
Effect2stringCrown effect that appears on the hero in C3 (c3/effect/other/rank/coronet)
ButtonstringButton for the rank in the Contribute Dialog. Defined in Control.ani (data/interface/Style01/checontribute)
ChatIconstringRank icon in the whisper chat window. Defined in chatContribute.ani (data/interface/Style01/chatsystem/nobility_JPG)
ChatFontstringRank 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:

RangeClass
10 - 15Trojan
20 - 25Warrior
40 - 45Archer
100+Taoist

File Format

This is a plain-text file with one entry per line, comma-separated:

<ProfessionType>,<Name>

Example Entries

ProfessionTypeName
10InternTrojan
11Trojan
12VeteranTrojan
13TigerTrojan
14DragonTrojan
15TrojanMaster
20InternWarrior
21Warrior
22BrassWarrior
23SilverWarrior
24GoldWarrior
25WarriorMaster
......

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)

PosTypeNameDescriptionExample
0Int64IndexStatus index1
1Char[64]3DEffect3D effect namepoisonstate
2Char[64]2DEffect2D effect nameNULL

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.

RangeSubsystem
10000 - 50000Interface
100000 - 2000003DRole
300000 - 4000003DGameMap
500000 - 6000003DBaseCode

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>
FieldTypeDescription
IndexintThe order within the group
Groupint1 = City Teleport, 0 = Portal Teleport
LocationNamestringName 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)

PosTypeNameDescriptionExample
0UInt32LevelWeapon skill level1
1UInt32ExpWeapon skill experience0

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)

PosTypeNameDescriptionExample
0UInt32IndexWeapon skill type index490
1Char[16]NameWeapon skill nameDagger

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.datUnencrypted - Plain Text
./ini/UserHelpInfo.datTQ File Cipher (Seed: 9527 / 0x2537)
./ini/Action.datUnencrypted - Binary Encoded. Unused File (Remnant)
./ini/Monster.datTQ File Cipher (Seed: 9527 / 0x2537)
./ini/GameMap.datUnencrypted - Binary Encoded
./ini/AutoAllot.datUnencrypted - Binary Encoded. Unused File (Remnant)
./ini/MyAnimate.datRSA Encrypted
./ini/LevelExp.datCustom Encrypted: XOR with Hardcoded 27-Byte Key. Unused File (Remnant)
./ini/Shop.datUnencrypted - Plain Text
./ini/Play.datCustom Encrypted: Subtract 6 from each byte (Used in play.exe launcher)
./ini/ShowHandTable.datRSA Encrypted
./ini/suittype.datRSA Encrypted
./ini/RaceTrackProp.datRSA Encrypted
./ini/magictypeop.datTQ File Cipher (Seed: 9527 / 0x2537)
./ini/slient.datTQ File Cipher (Seed: 9527 / 0x2537)
./ini/mounttype.datTQ File Cipher (Seed: 9527 / 0x2537)
./ini/levexp.datTQ File Cipher (Seed: 1234 / 0x04D2)
./ini/tqist.datUnknown (Referenced in ndist.dll)
./ini/UserHelpInfo.ini.datTQ File Cipher (Seed: 9527 / 0x2537)
./ini/MagicType.datTQ File Cipher (Seed: 9527 / 0x2537)
./ini/showhandlayout.datRSA Encrypted
./ini/itemtype.datTQ File Cipher (Seed: 9527 / 0x2537)
./ini/MapDestination.datTQ File Cipher (Seed: 9527 / 0x2537)
./ini/Tips.datUnencrypted - Binary Encoded
./version.datUnencrypted - Plain Text
./res.datUnencrypted - Plain Text
./Server.datRSA Encrypted
./data/main/start.datSWF - Shockwave Flash File
./data/main/role.datSWF - Shockwave Flash File
./data/main/start-facebook.datSWF - 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.

MinMaxNameDescription
00000010000299999SceneScenery NPC
00000010000099999System NPCStatically spawned NPC
01000010000199999Dynamic NPCDynamically spawned NPC
04000010000499999MonsterWorld monster spawn
05000010000599999PetSyndicate monster spawn
07000010000799999Call PetPlayer monster spawn
09000010000989999Magic TrapPlayer spell trap from MsgMapItem
09900010000999999System TrapSystem trap from MsgMapItem
10000003999999999HeroPlayer 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).

PosTypeDescriptionExample
0UInt16Message Size60
2UInt16Message Type1001

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.

TypeNameAbstract
1001MsgRegisterNew character creation
1004MsgTalkGame chat and system messages to clients
1005 (10005)MsgWalkRole movement on the ground
1006MsgUserInfoCharacter information on login
1008MsgItemInfoDetails on an player owned item
1009MsgItemRequest to use an item
1010 (10010)MsgActionGeneral action for a player or entity
1012MsgTickRound-trip tick validation
1014 (10014)MsgPlayerSpawn a player or entity
1015MsgNameClient string update request
1016MsgWeatherSet weather on the game map
1017 (10017)MsgUserAttribSet user attributes for client
1019MsgFriendManages friend and enemy lists
1022MsgInteractInteract or attack player or entity
1023MsgTeamManages a team of players
1024MsgAllotAllot attribute points
1025MsgWeaponSkillWeapon proficiency update
1026MsgTeamMemberDetails on multiple teammates
1027MsgGemEmbedEmbed gem in an item
1028MsgFuseFuse material to an item
1029MsgTeamAward
1032MsgBattleEffectiveness
1033MsgDataGeneral integer data message
1034MsgDetainItemInfoDetails on a detailed item
1036MsgGodExp
1037MsgPing
1038MsgSolidify
1039MsgNpcPath
1040MsgPlayerAttribInfoPlayer's battle statistics
1041MsgEnemyList
1042MsgMonsterTransform
1043MsgTeamRoll
1044MsgLoadMap
1045MsgMailOperation
1046MsgMailList
1047MsgMailNotify
1048MsgMailContent
1049MsgPCServerConfig
1051MsgAccountLogin authentication request
1052MsgConnectGame server authorization request
1055MsgConnectExGame server connect info
1056MsgTradeTrade items and money with a player
1057MsgConnectWithBgp
1058MsgSynpOfferSyndicate donation
1059MsgEncryptCodeGenerated RC5 seed
1060MsgAccountLogin authentication request
1061MsgDutyMinContri
1062MsgSynCompete
1063MsgSelfSynMemAwardRank
1064MsgSponsor
1065MsgSponsorInfo
1066MsgMeteSpecial
1067MsgLoginNotice
1070MsgHangUp
1071MsgCompleteRank
1072MsgCampFight
1073MsgCampFightInfo
1074MsgPicKeyError
1075MsgPicKey
1081MsgCheatingProgram
1083MsgRequestKeyLogin
1084MsgConfirmKeyLogin
1086MsgAccountLogin authentication request
1090MsgLoginAccountEx
1098MsgConfirmKeyLoginMobile
1100MsgPCNumMac address of the client
1101MsgMapItemDropped item on the map floor
1102MsgAccountSoftKb
1102MsgPackageItem storage / warehouses
1103MsgMagicInfoMagic spell the player can cast
1104MsgFlushExpMagic spell or skill experience update
1105MsgMagicEffectCast a magical attack or effect
1106MsgSyndicateAttributeInfoGuild and guild member details
1107MsgSyndicateGuild action request
1108MsgItemInfoExItem details extended for a feature
1109MsgNpcInfoExNPC spawn with health
1110MsgMapInfoMap type flags
1111MsgMessageBoardCategorized message board
1112MsgSynMemberInfo
1113MsgDiceDice game messages
1114MsgSyncActionTwo-player synchronized actions
1115MsgDisconnect
1121MsgFacebookAccount
1124MsgAccountSRP6Requests SRP6 password exchange
1125MsgAccountKalydo
1126MsgInviteTrans
1127MsgMentorPlayer
1128MsgVipUserHandle
1129MsgVipFunctionValidNotifyDetermine the visibility of VIP function buttons in VIP Dialog
1130MsgTitleList or change player title
1134MsgTaskStatus
1135MsgTaskDetailInfo
1136MsgAchievement
1150MsgFlower
1151MsgRank
1202MsgRegisterFaceBook
1203MsgConnectFaceBook
1213MsgLoginChallengeSSends SRP6 challenge
1214MsgLoginProofCReply for SRP6 challenge
1312MsgFamilyClan action request
1313MsgFamilyOccupy
1314MsgLottery
1315MsgOperatingAct
1316MsgOperatingActInfo
1320MsgAuction
1321MsgAuctionItem
1322MsgAuctionQuery
1323MsgPromotionAct
1324MsgPromotionInfo
1350MsgGameServerShutDownShutdown notification
1351MsgSlotAction
1352MsgSlotResult
1518MsgConnectLegalitySpec
1542MsgAccountSRP6ExRequests SRP6 password exchange
1636MsgAccountSRP6ExRequests SRP6 password exchange
2030MsgNpcInfoNPC spawn information
2031MsgNpcNPC interaction
2032MsgTaskDialog
2033MsgFriendInfo
2035MsgPetInfo
2036MsgDataArray
2041MsgAnnounceList
2042MsgAnnounceInfo
2043MsgTrainingInfo
2044MsgTraining
2045MsgAuraGroup
2046MsgTradeBuddy
2047MsgTradeBuddyInfo
2048MsgEquipLock
2050MsgPigeon
2051MsgPigeonQuery
2064MsgPeerage
2065MsgGuide
2066MsgGuideInfo
2067MsgContribute
2068MsgQuiz
2069MsgQuizSponsor
2070MsgSuitStatus
2071MsgRelation
2072MsgRaceTrackProp
2073MsgRaceTrackPropEffect
2075MsgRaceTrackStatus
2076MsgQuench
2077MsgItemStatus
2078MsgUserIPInfo
2079MsgServerInfo
2080MsgChangeName
2081MsgDeadMark
2082MsgUserCityInfo
2090MsgShowHandEnter
2091MsgShowHandDealtCard
2092MsgShowHandActivePlayer
2093MsgShowHandCallAction
2094MsgShowHandLayCard
2095MsgShowHandGameResult
2096MsgShowHandExit
2097MsgShowHandOnlineStatus
2098MsgShowHandLostInfo
2099MsgShowHandTrusteeship
2101MsgFactionRankInfo
2102MsgSynMemberList
2103MsgSynChgDomName
2110MsgSuperFlag
2170MsgLeaveWord
2171MsgTexasInteractive
2172MsgTexasNpcInfo
2201MsgTotemPoleInfo
2202MsgWeaponsInfo
2203MsgTotemPole
2205MsgQualifyingInteractive
2206MsgQualifyingFightersList
2207MsgQualifyingRank
2208MsgQualifyingSeasonRankList
2209MsgQualifyingDetailInfo
2210MsgArenicScore
2211MsgArenicWitness
2218MsgElitePKArenic
2219MsgPKEliteMatchInfo
2220MsgPKStatistic
2221MsgPKEnable
2222MsgElitePKScore
2223MsgElitePKGameRankInfo
2224MsgWarFlag
2225MsgSynRecruitAdvertising
2226MsgSynRecruitAdvertisingList
2227MsgSynRecruitAdvertisingOpt
2230MsgTeamPKArenic
2231MsgTeamPKArenicScore
2232MsgTeamPKMatchInfo
2233MsgTeamPKRankInfo
2240MsgDominateTeamName
2241MsgTeamArenaInteractive
2242MsgTeamArenaFightingTeamList
2243MsgTeamArenaRank
2244MsgTeamArenaYTop10List
2245MsgTeamArenaHeroData
2246MsgTeamArenaScore
2247MsgTeamArenaFightingMemberInfo
2250MsgTeamPopPKArenic
2251MsgTeamPopPKArenicScore
2252MsgTeamPopPKMatchInfo
2253MsgTeamPopPKRankInfo
2260MsgDominateTeamPopPkName
2261Msg2ndPsw
2262MsgPaint
2286MsgMapItem
2320MsgSubPro
2330MsgFactionMatch
2331MsgFMRoundRobin
2332MsgFMMatch
2333MsgFactionMatchWitness
2400MsgTransportor
2401MsgInstance
2410MsgAura
2420MsgVerifyCheck
2430MsgNationality
2501MsgCrossSwitch
2502MsgCrossFlagWar
2504MsgCrossFlagWarMerit
2505MsgCrossFlagWarAltar
2506MsgCrossFlagWarFlag
2507MsgCrossFlagWarRank
2510MsgFactionChiefBase
2521MsgKickOut
2533MsgTrainingVitality
2534MsgTrainingVitalityInfo
2535MsgTrainingVitalityScore
2600MsgGLRankingList
2601MsgGLHeroDetail
2602MsgGLLastSeasonTopScore
2603MsgGLChampionList
2604MsgGLInteractive
2700MsgOwnKongfuBase
2701MsgOwnKongfuImproveSummaryInfo
2702MsgOwnKongfuImproveFeedback
2703MsgOwnKongRank
2704MsgOwnKongfuPKSetting
2710MsgMagicCoat

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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message52
2UInt16MsgTypeType of message1051
4Char[16]AccountFixed string of the usernamePlayer
20Char[16]PasswordEncrypted buffer containing the passwordRC5(Password)
36Char[16]ServerFixed string of the game serverMeteor

Patch 5165

Message Definition

✅ Verified (Client)

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message276
2UInt16MsgTypeType of message1086
4Char[128]AccountFixed string of the usernamePlayer
132Char[128]PasswordEncrypted buffer containing the passwordRC5(Password)
260Char[16]ServerFixed string of the game serverMeteor

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)

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message240
2UInt16MsgTypeType of message1124
8Char[128]AccountFixed string of the usernamePlayer
136Char[16]ServerFixed string of the game serverMeteor

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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message312
2UInt16MsgTypeType of message1636
8Char[128]AccountFixed string of the usernamePlayer
136Char[16]ServerFixed string of the game serverMeteor
152Char[16]Mac AddressMac address of connecting interface0A0B0C0D0E0F
193Char[4]DataContents of the Res.dat file0010
244Byte[64]RandomRandom buffer used as a KDF in SRP6
308UInt32EncryptCodeExchange seed for SRP610000

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)

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message28
2UInt16MsgTypeType of message1010
4UInt32System TimeMilliseconds of system uptime1579535985
8UInt32Hero IDUnique identifier for the character1000000
12UInt16XX coordinate of the action or hero320
14UInt16YY coordinate of the action or hero460
16UInt32DirectionAction direction0
20UInt32DataPayload or target identifier0
24UInt32ActionHow to process the message0

Action Type

☑️ Assumed (Soul)

🔶 Response data

ValNameDescriptionRecipientIDData
124CHANGE_DIRChange facing directionServerHero ID
126CHANGE_EMOTIONChange emoting actionServerHero IDAction
130CHANGE_MAPChange map (portal)ServerHero ID
137ENTER_MAPRequest hero locationServerHero IDMap ID 🔶
138GET_ITEMSLoad items on loginServerHero ID
139GET_FRIENDSLoad friends on loginServerHero ID
141LEAVE_MAPRemove role entity from mapClientRole ID
142JUMPRole entity jumpServerRole IDLOW: X HIGH: Y
146UP_LEVELNotify new levelServerHero ID
147XP_CLEARNotify clear XPServerHero ID
148REVIVERequest reviveServerHero ID
149DEL_ROLEDelete heroServerHero ID
150GET_WEAPON_SKILLSLoad skills on loginServerHero ID
151GET_MAGICLoad spells on loginServerHero ID
152SET_PK_MODESet PK modeServerHero IDMode
153GET_SYN_ATTRGet guild infoServerHero ID
154GHOSTNotify deathServerHero ID
155SYNCHROSynchronize screenServerHero ID
156QUERY_FRIEND_INFOGet friend infoServerHero IDTarget ID
157QUERY_LEAVE_WORDGet offline messagesServerHero ID
158CHANGE_FACEChange teammate or own avatarBothHero IDFace
159MINEMine with pickaxeServerHero ID
160TEAM_MEMBER_POSTeammate positionClientHero IDLOW: X HIGH: Y
161QUERY_PLAYERGet player spawnServerHero ID
162ABORT_MAGICCancel magic or chargeupServerHero ID
164MAP_ARGBSet game map ARGBClientARGB
166QUERY_MEMBERGet team member infoServerHero IDTarget ID
167CREATE_BOOTHCreate market boothBothHero IDLOW: X HIGH: Y
168SUSPEND_BOOTHPause market booth (unused)ServerHero ID
169RESUME_BOOTHResume market boothBothHero IDLOW: X HIGH: Y
170DESTROY_BOOTHRemove market boothServerHero ID
172POST_CMDRun client commandClientHero IDCommand
173QUERY_EQUIPMENTGet player's equipmentServerHero ID
174ABORT_TRANSFORMCancel transformationServerHero ID
176LANDINGCancel flightServerHero ID
177GET_MONEYPick up moneyClientHero IDAmount
179ENEMY_INFOGet enemy infoServerHero ID
181KICKBACKRubberband to coordClientHero IDLOW: X HIGH: Y
182DROP_MAGICRemove magic typeClientHero IDMagic Type
183DROP_SKILLRemove weapon skillClientHero IDWeapon Skill Type
184SOUND_EFFECTMonster sound at coordClientHero IDMonster Type
186POST_DIALOGOpen a dialog windowClientHero IDDialog ID

Patch 5017

Message Definition

☑️ Assumed (Observed) - Redux

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message24
2UInt16MsgTypeType of message1010
4UInt32System TimeMilliseconds of system uptime1579535985
8UInt32Hero IDUnique identifier for the character1000000
12UInt32DataPayload or target identifier0
16UInt16XX coordinate of the action or hero320
18UInt16YY coordinate of the action or hero460
20UInt16DirectionAction direction0
22UInt16ActionHow to process the message0

Action Type

☑️ Assumed (Observed) - COPSv6

🔶 Response data

ValNameDescriptionRecipientIDData
74GET_POSITIONRequest hero locationServerHero IDMap ID 🔶
75GET_ITEMSLoad items on loginServerHero ID
76GET_FRIENDSLoad friends on loginServerHero ID
77GET_WEAPON_SKILLSLoad skills on loginServerHero ID
78GET_MAGICLoad spells on loginServerHero ID
79CHANGE_DIRChange facing directionServerHero ID
81CHANGE_EMOTIONChange emoting actionServerHero IDEmotion
85CHANGE_MAPChange map (portal)ServerHero ID
86ENTER_MAPAdd entity to mapServerRole IDMap ID
92UP_LEVELNotify new levelServerHero ID
93XP_CLEARNotify clear XPServerHero ID
94REVIVERequest reviveServerHero ID
95DEL_ROLEDelete heroServerHero ID
96SET_PK_MODESet PK modeServerHero IDMode
97GET_SYN_ATTRGet guild infoServerHero ID
99MINEMine with pickaxeServerHero ID
101TEAM_LEAD_POSGet team leader positionClientHero IDGame Map Type
102QUERY_PLAYERGet player spawnServerHero ID
104MAP_ARGBSet game map ARGBClientARGB
105QUERY_MEMBERGet team member infoServerHero IDTarget ID
106TEAM_MEMBER_POSTeammate positionClientHero IDLOW: X HIGH: Y
108KICKBACKRubberband to coordClientHero IDLOW: X HIGH: Y
109DROP_MAGICRemove magic typeClientHero IDMagic Type
110DROP_SKILLRemove weapon skillClientHero IDWeapon Skill Type
111CREATE_BOOTHCreate market boothBothHero IDLOW: X HIGH: Y
112SUSPEND_BOOTHPause market booth (unused)ServerHero ID
113RESUME_BOOTHResume market boothBothHero IDLOW: X HIGH: Y
114DESTROY_BOOTHRemove market boothServerHero ID
116POST_CMDRun client commandClientHero IDCommand
117QUERY_EQUIPMENTGet player's equipmentServerHero ID
118ABORT_TRANSFORMCancel transformationServerHero ID
120LANDINGCancel flightServerHero ID
121GET_MONEYPick up moneyClientHero IDAmount
123ENEMY_INFOGet enemy infoServerHero ID
126POST_DIALOGOpen a dialog windowClientHero IDDialog ID
130QUERY_LEAVE_WORDGet offline messagesServerHero ID
132LEAVE_MAPRemove role entity from mapClientRole ID
133JUMPRole entity jumpServerRole IDLOW: X HIGH: Y
137GHOSTNotify deathServerHero ID
138SYNCHROSynchronize screenServerHero ID
140QUERY_FRIEND_INFOGet friend infoServerHero IDTarget ID
142CHANGE_FACEChange teammate or own avatarBothHero IDFace
162PATHFINDINGTrigger pathfinding to X, YClientHero ID
163ABORT_MAGICCancel magic or chargeupServerHero 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)

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message8
2UInt16MsgTypeType of message1024
4ByteForcePoints towards strength1
5ByteSpeedPoints towards dexterity2
6ByteHealthPoints towards vitality5
7ByteSoulPoints towards spirit0

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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message28
2UInt16MsgTypeType of message1052
4UInt32Account IDAccount id from the account server1
8UInt32DataContents of the Res.dat file10
12Char[16]InfoName of the fileRes.dat

Game Server Message Definition

☑️ Assumed (Observed) - Comet

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message28
2UInt16MsgTypeType of message1052
4UInt32Account IDAccount id from the account server1
8UInt32DataEncryption key generator parameter6351601
12Char[16]InfoBuild version and language117 English

Patch 4343

Account Server Message Definition

☑️ Assumed (Observed) - Comet

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message28
2UInt16MsgTypeType of message1052
4UInt32Account IDAccount id from the account server1
8UInt32DataContents of the Res.dat file10
12Char[16]InfoName of the fileRes.dat

Game Server Message Definition

☑️ Assumed (Observed) - Comet

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message28
2UInt16MsgTypeType of message1052
4UInt32Account IDAccount id from the account server1
8UInt32DataEncryption key generator parameter6351601
12UInt16BuildBuild version of the client123
14Char[10]LanguageISO 639-1 language codeEn
24UInt32InfoContents of the Res.dat file10

Patch 5065

Account Server Message Definition

☑️ Assumed (Observed) - Comet

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message28
2UInt16MsgTypeType of message1052
4UInt32Account IDAccount id from the account server1
8UInt32DataContents of the Res.dat file10
12Char[16]InfoName of the fileRes.dat

Game Server Message Definition

☑️ Assumed (Observed) - Comet

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message28
2UInt16MsgTypeType of message1052
4UInt32Account IDAccount id from the account server1
8UInt32DataEncryption key generator parameter6351601
12UInt16BuildBuild version of the client123
14Char[2]LanguageISO 639-1 language codeEn
16Char[8]Mac AddressMac address of connecting interface0A0B0C0D0E0F
24UInt32InfoContents of the Res.dat file10

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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message32
2UInt16MsgTypeType of message1055
4UInt32Account IDAccount id from the account server1
8UInt32DataEncryption key generator parameter6351601
12Char[16]InfoGame server's IP address192.168.1.2
28UInt32PortGame server's port5816

Reject Message Definition

☑️ Assumed (Observed) - Comet

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message28
2UInt16MsgTypeType of message1055
8UInt32DataRejection type10
12Char[16]InfoRejection message in GB2312 encoding帐号名或口令错

Rejection Type

☑️ Assumed (Observed) - Comet

TypeChineseEnglish
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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message32
2UInt16MsgTypeType of message1055
4UInt32Account IDAccount id from the account server1
8UInt32DataEncryption key generator parameter6351601
12Char[16]InfoGame server's IP address192.168.1.2
28UInt32PortGame server's port5816

Reject Message Definition

☑️ Assumed (Observed) - Comet

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message12
2UInt16MsgTypeType of message1055
8UInt32DataRejection type10

Rejection Type

☑️ Assumed (Observed) - Comet

TypeDescription
1Invalid account name or password
10Server down
11Try again later
12Account banned
20Server busy
22Account locked
30Account not activated
31Account activation failed
42Server timed out
51Max login attempts
70Server locked
73Old protocol
999Unknown error

Patch 5517

Accept Message Definition

❓ Unverified

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message52
2UInt16MsgTypeType of message1055
4UInt32Account IDAccount id from the account server1
8UInt32DataEncryption key generator parameter6351601
12UInt32PortGame server's port5816
20Char[32]InfoGame server's IP address192.168.1.2

Reject Message Definition

❓ Unverified

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message12
2UInt16MsgTypeType of message1055
8UInt32DataRejection type10

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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message36
2UInt16MsgTypeType of message1033
4UInt32Data TypeHow to process the message0
8UInt32[]Data ValuesArray of data values

Data Type

☑️ Assumed (Observed) - Chimera

ValNameDescriptionData
0DATETIMESet server datetimeYear, month, weekday, day, hour, minute, second

Patch 5165

Message Definition

☑️ Assumed (Observed) - Chimera

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message36
2UInt16MsgTypeType of message1033
4UInt32Data TypeHow to process the message0
8UInt32[]Data ValuesArray of data values

Data Type

☑️ Assumed (Observed) - Chimera

ValNameDescriptionData
0DATETIMESet server datetimeYear, month, weekday, day, hour, minute, second
2VIGORSet 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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message112
2UInt16MsgTypeType of message1034
4UInt32Reward IDUnique identifier of the reward record103
8UInt32Item IDUnique identifier for the item (unless someone else's item)1
12UInt32Item TypeIdentifies the type of item730001
16UInt16AmountCurrent durability or amount of the item10000
18UInt16Max AmountTotal durability or amount the item can have10000
20ByteActionHow item info should be processed1
21ByteStatusCondition bit flags on the item0
22BytePositionPosition where the item appears0
24UInt32Socket ProgressProgress on creating a socket0
28ByteSocket 1The gem in the first socket position0
29ByteSocket 2The gem in the second socket position0
30ByteMagic 1Reserved for rebirth magic effect0
31ByteMagic 2Reserved for an unknown purpose0
32ByteMagic 3Reserved for magical plus rating0
33ByteBlessReduced damage percentage taken by the character0
34BoolBoundTrue if the item can't be traded0
35ByteEnchantAdded max life for the character0
36UInt32DataAdditional attributes for the item0
40BoolSuspiciousMarked as suspicious for trading0
42BoolLockedLocked from being dropped or traded0
44ByteColorColor modifier for the item3
48UInt32Owner IDRole ID of the item owner1000000
52Char[16]Owner NameOwner's character namePlayer
68UInt32Hunter IDRole ID of the hunter1000001
72Char[16]Hunter NameHunter's character nameHunter
88UInt32Capture DateDate string in the format YYYYMMDD20161001
96UInt32CPsCost for claiming1950
100BoolExpiredTrue if the detain window has expired1
108UInt32DaysDays remaining to detain6

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)

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message20
2UInt16MsgTypeType of message1113
4ByteActionHow to process the message0
5ByteAmountAmount of data or time1
6UInt32NPC IDRole ID of the NPC169
10StructDiceDataPayload for dices

Action Type

☑️ Assumed (Soul)

ValNameDescriptionRecipient
0CHIPINShows a new betBoth
1CHIPIN_CONFIRMConfirms a betClient
2CANCELCHIPRemoves a betBoth
3CANCELCHIP_CONFIRMConfirms removalClient
4BEGINCHIPStart a betting windowClient
5ENDCHIPStops betting windowClient
6DICEResults of the roleClient

Dice Data

☑️ Assumed (Soul)

PosTypeNameDescriptionExample
0ByteTypeDice Value for betting1
1UInt32DataAmount of money or array of dice1000

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)

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message8
2UInt16MsgTypeType of message1059
4UInt32SeedGenerated seed for RC510000

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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message88
2UInt16MsgTypeType of message1312
4UInt32ActionHow the message will be processed29
8UInt32Target IDUnique identifier for the character or clan1000000
16UInt32NetStringPackerStrings5 10 FamilyName 8 UserName 18 FamilyOccupyString 18 FamilyDominatedMap 19 FamilyChallengedMap

Alternative:

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message88
2UInt16MsgTypeType of message1312
4UInt32ActionHow the message will be processed29
8UInt32Target IDUnique identifier for the character or clan1000000
16UInt32

Clan Action Type

❗ Incomplete

🔶 Response data

ValNameDescriptionRecipientNetStringPacker
1QUERY
4QUERY_MEMBERS
9RECRUIT
10ACCEPT_RECRUIT
11JOIN
12ACCEPT_JOIN
13SHOW_ENEMY
14ADD_ENEMY
15DEL_ENEMY
16SHOW_ALLY
17ADD_ALLY
18ACCEPT_ALLY
20DEL_ALLY
21ABDICATE
22KICK_MEMBER
23QUIT
24SHOW_ANNOUNCE
25SET_ANNOUNCE
26DEDICATE
29QUERY_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)

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message12
2UInt16MsgTypeType of message1104
4UInt32ExpUpdated experience towards leveling the spell0
8UInt16TypeMagic or skill type identifier1001
10UInt16ActionThe type of experience being updated0

Action Type

☑️ Assumed (Soul)

ValNameDescriptionFile
0WEAPON_SKILLWeapon skill proficiencyWeaponSkillLevelExp.ini
1MAGICMagic spell experienceMagicType.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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message28
2UInt16MsgTypeType of message1019
4UInt32Hero IDUnique identifier for the friend1000000
8ByteActionHow to process the message11
9ByteIsOnlineTrue if the friend is online1
12Char[16]NameCharacter name as a fixed stringPlayer

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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message36
2UInt16MsgTypeType of message1019
4UInt32Hero IDUnique identifier for the friend1000000
8ByteActionHow to process the message11
9ByteIs OnlineTrue if the friend is online1
12UInt32Nobility RankNobility ranking3
16UInt32Flower RankFlower ranking0
20Char[16]NameCharacter name as a fixed stringPlayer

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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message68
2UInt16MsgTypeType of message1019
4UInt32Hero IDUnique identifier for the friend1000000
8ByteActionHow to process the message11
9ByteIs OnlineTrue if the friend is online1
12UInt32Nobility RankNobility ranking3
16UInt32Flower RankFlower ranking0
20Char[16]NameCharacter name as a fixed stringPlayer
36Char[32]Facebook IDIdentifier 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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message22
2UInt16MsgTypeType of message1028
4UInt32UserHero ID of the player1000001
8UInt16ActionThe type of fuse being performed0
10UInt32CountThe number of items included2
14UInt32[]ItemsArray 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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message12
2UInt16MsgTypeType of message1350
4UInt32ActionHow the message will be processed0
8UInt32Message IDThe message to display10

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)

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message20
2UInt16MsgTypeType of message1027
4UInt32UserHero ID of the player1000001
8UInt32ItemIdentifier for the item1
12UInt32GemIdentifier for the gem2
16UInt16PosGem socket to embed into or remove from1
18UInt16ActionEmbed or remove the gem0

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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message28
2UInt16MsgTypeType of message1022
4UInt32System TimeMilliseconds of system uptime10000
8UInt32SenderRole ID of the initiator1000000
12UInt32TargetRole ID of the target1000001
16UInt16XX coordinate of the interaction320
18UInt16YY coordinate of the interaction460
20UInt32TypeHow to process the message14
24UInt32DataValue associated with the interaction1

Interaction Type

☑️ Assumed (Observed) - CoFuture + Soul

🔶 Response data

ValNameDescriptionRecipientData
2ATTACKPhysical attackServerDamage 🔶
8COURTPropose to a playerServer
9MARRYAccept a proposalServer
14KILLConfirms kill of an entityClientCount
21MAGIC_ATTACKMagical attackServerHIGH: MagicType
23REFLECT_WEAPONReflect a physical attackClientDamage
24BUMPBumped from dashClientDirection
25SHOOTShoot projectileServerDamage 🔶
26REFLECT_MAGICReflect a magical attackClientDamage

Patch 5017

Message Definition

☑️ Assumed (Observed) - COPSv6

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message28
2UInt16MsgTypeType of message1022
4UInt32System TimeMilliseconds of system uptime10000
8UInt32SenderRole ID of the initiator1000000
12UInt32TargetRole ID of the target1000001
16UInt16XX coordinate of the interaction320
18UInt16YY coordinate of the interaction460
20UInt32TypeHow to process the message14
24UInt32DataValue associated with the interaction1
28UInt32ProgressProgress on an interaction0

Interaction Type

☑️ Assumed (Observed) - COPSv6

🔶 Response data

ValNameDescriptionRecipientDataProgress
2ATTACKPhysical attackServerDamage 🔶
8COURTPropose to a playerServer
9MARRYAccept a proposalServer
14KILLConfirms kill of an entityClientCount
21MAGIC_ATTACKMagical attackServerHIGH: MagicType
23REFLECT_WEAPONReflect a physical attackClientDamage
24BUMPBumped from dashClientDirection
25SHOOTShoot projectileServerDamage 🔶
26REFLECT_MAGICReflect a magical attackClientDamage
30JAR_PROGRESSCloud Saint Jar countServer0Count 🔶

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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message20
2UInt16MsgTypeType of message1009
4UInt32IDUnique identifier for the item or role1000000
8UInt32DataPayload usually of the item type or position730001
12UInt32ActionHow to process the message2
16UInt32System TimeMilliseconds of system uptime1579535985

Item Action

☑️ Assumed (Observed) - CoFuture + Soul

🔶 Response data

ValNameDescriptionRecipientIDData
1BUYPurchase from shopServerNPCItem Type
2SELLSell to shopServerNPCItem ID
3DROPDrops an item or removes itServerItemLOW: X HIGH: Y 🔶
4EQUIPEquip to position on bodyServerItemPosition
5UPDATEUpdates an itemClientItemPosition
6UNEQUIPForce unequipClientItemPosition
8COMBINECombine two of same typeServerItemItem ID
9QUERY_MONEYRequest warehouse moneyServerNPCMoney 🔶
10SAVE_MONEYDeposit warehouse moneyServerNPCMoney
11DRAW_MONEYWithdraw warehouse moneyServerNPCMoney
12DROP_MONEYDrop money on the floorServerMoneyLOW: X HIGH: Y
14REPAIRRepair durabilityServerItem
17DURABILITYUpdate durabilityClientPositionDurability
18DROP_EQUIPMENTForce delete equipmentClientItemPosition
19IMPROVEQuality upgradeServerItemDragonball Item ID
20UPLEVLevel upgradeServerItemMeteor Item ID
21BOOTH_QUERYShow booth itemServerItem
22BOOTH_ADDAdd to boothServerItemMoney
23BOOTH_DELRemove from boothServerItemShop
24BOOTH_BUYBuy from a boothServerItemShop
27PINGLatency checkServerPlayer

Patch 5017

Message Definition

☑️ Assumed (Observed) - ApexConquer

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message24
2UInt16MsgTypeType of message1009
4UInt32IDUnique identifier for the item or role1000000
8UInt32DataPayload usually of the item type or position730001
12UInt32ActionHow the server processes the message2
16UInt32System TimeMilliseconds of system uptime1579535985
20UInt32AmountAmount of items being purchased or used0

Item Action

☑️ Assumed (Observed) - ApexConquer

🔶 Response data

ValNameDescriptionRecipientIDData
1BUYPurchase from shopServerNPCItem Type
2SELLSell to shopServerNPCItem ID
3DROPDrops an item or removes itServerItemLOW: X HIGH: Y 🔶
4EQUIPEquip to position on bodyServerItemPosition
5UPDATEUpdates an itemClientItemPosition
6UNEQUIPForce unequipClientItemPosition
8COMBINECombine two of same typeServerItemItem ID
9QUERY_MONEYRequest warehouse moneyServerNPCMoney 🔶
10SAVE_MONEYDeposit warehouse moneyServerNPCMoney
11DRAW_MONEYWithdraw warehouse moneyServerNPCMoney
12DROP_MONEYDrop money on the floorServerMoneyLOW: X HIGH: Y
14REPAIRRepair durabilityServerItem
17DURABILITYUpdate durabilityClientPositionDurability
18DROP_EQUIPMENTForce delete equipmentClientItemPosition
19IMPROVEQuality upgradeServerItemDragonball Item ID
20UPLEVLevel upgradeServerItemMeteor Item ID
21BOOTH_QUERYShow booth itemServerItem
22BOOTH_ADDAdd to boothServerItemMoney
23BOOTH_DELRemove from boothServerItemShop
24BOOTH_BUYBuy from a boothServerItemShop
27PINGLatency checkServerPlayer
28ENCHANTEnchant itemServerItemGem Item ID
29BOOTH_ADD_EMONEYAdd EMoney to boothServerItemEMoney

Patch 5517

Message Definition

☑️ Assumed (Observed) - ApexConquer

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message60
2UInt16MsgTypeType of message1009
4UInt32IDUnique identifier for the item or role1000000
8UInt32DataPayload usually of the item type or position730001
12UInt32ActionHow the server processes the message2
16UInt32System TimeMilliseconds of system uptime1579535985
20UInt32AmountAmount of items being purchased or used0
24UInt32[9]EquipmentEquipment in order of slot position0

Item Action

☑️ Assumed (Observed) - ConquerServerV3

🔶 Response data

ValNameDescriptionRecipientIDData
1BUYPurchase from shopServerNPCItem Type
2SELLSell to shopServerNPCItem ID
4EQUIPEquip to position on bodyServerItemPosition
5UPDATEUpdates an itemClientItemPosition
6UNEQUIPForce unequipClientItemPosition
9QUERY_MONEYRequest warehouse moneyServerNPCMoney 🔶
10SAVE_MONEYDeposit warehouse moneyServerNPCMoney
11DRAW_MONEYWithdraw warehouse moneyServerNPCMoney
14REPAIRRepair durabilityServerItem
17DURABILITYUpdate durabilityClientPositionDurability
18DROP_EQUIPMENTForce delete equipmentClientItemPosition
19IMPROVEQuality upgradeServerItemDragonball Item ID
20UPLEVLevel upgradeServerItemMeteor Item ID
21BOOTH_QUERYShow booth itemServerItem
22BOOTH_ADDAdd to boothServerItemMoney
23BOOTH_DELRemove from boothServerItemShop
24BOOTH_BUYBuy from a boothServerItemShop
27PINGLatency checkServerHero
28ENCHANTEnchant itemServerItemGem Item ID
29BOOTH_ADD_EMONEYAdd EMoney to boothServerItemEMoney
33DETAIN_REDEEMRedeem a detained itemServerItem
35SOCKETSocket a talismanServerItemItem ID
36SOCKET_EMONEYSocket talisman with EMoneyServerItemEMoney
37DROPDrops an item or removes itServerItem
38DROP_MONEYDrop money on the floorServerMoney
40UPBLESSUpgrade blessServerItem
41SHOW_ACCESSORYShow an accessoryServerItem
46SHOW_EQUIPMENTResponse for MsgActionClientHero
48COMBINECombine two of same typeServerItemItem ID
49SPLITSplit into twoServerItem
52SHOW_ITEMItem cardClientItem

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)

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message24
2UInt16MsgTypeType of message1008
4UInt32Item IDUnique identifier for the item (unless someone else's item)1
8UInt32Item TypeIdentifies the type of item730001
12UInt16AmountCurrent durability or amount of the item10000
14UInt16Max AmountTotal durability or amount the item can have10000
16ByteActionHow item info should be processed1
17ByteStatusCondition bit flags on the item0
18BytePositionPosition where the item appears0
19ByteSocket 1The gem in the first socket position0
20ByteSocket 2The gem in the second socket position0
21ByteMagic 1Reserved for rebirth magic effect0
22ByteMagic 2Reserved for an unknown purpose0
23ByteMagic 3Reserved for magical plus rating0

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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message30
2UInt16MsgTypeType of message1008
4UInt32Item IDUnique identifier for the item (unless someone else's item)1
8UInt32Item TypeIdentifies the type of item730001
12UInt16AmountCurrent durability or amount of the item10000
14UInt16Max AmountTotal durability or amount the item can have10000
16ByteActionHow item info should be processed1
17ByteStatusCondition bit flags on the item0
18BytePositionPosition where the item appears0
19ByteSocket 1The gem in the first socket position0
20ByteSocket 2The gem in the second socket position0
21ByteMagic 1Reserved for rebirth magic effect0
22ByteMagic 2Reserved for an unknown purpose0
23ByteMagic 3Reserved for magical plus rating0
24ByteBlessReduced damage percentage taken by the character0
25ByteEnchantAdded max life for the character0
26UInt32DataAdditional attributes for the item0

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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message36
2UInt16MsgTypeType of message1008
4UInt32Item IDUnique identifier for the item (unless someone else's item)1
8UInt32Item TypeIdentifies the type of item730001
12UInt16AmountCurrent durability or amount of the item10000
14UInt16Max AmountTotal durability or amount the item can have10000
16ByteActionHow item info should be processed1
17ByteStatusCondition bit flags on the item0
18BytePositionPosition where the item appears0
20UInt32Socket ProgressProgress on creating a socket0
24ByteSocket 1The gem in the first socket position0
25ByteSocket 2The gem in the second socket position0
26ByteMagic 1Reserved for rebirth magic effect0
27ByteMagic 2Reserved for an unknown purpose0
28ByteMagic 3Reserved for magical plus rating0
29ByteBlessReduced damage percentage taken by the character0
30ByteEnchantAdded max life for the character0
32UInt32DataAdditional attributes for the item0

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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message48
2UInt16MsgTypeType of message1008
4UInt32Item IDUnique identifier for the item (unless someone else's item)1
8UInt32Item TypeIdentifies the type of item730001
12UInt16AmountCurrent durability or amount of the item10000
14UInt16Max AmountTotal durability or amount the item can have10000
16ByteActionHow item info should be processed1
17ByteStatusCondition bit flags on the item0
18BytePositionPosition where the item appears0
19UInt32Socket ProgressProgress on creating a socket0
23ByteSocket 1The gem in the first socket position0
24ByteSocket 2The gem in the second socket position0
25ByteMagic 1Reserved for rebirth magic effect0
26ByteMagic 2Reserved for an unknown purpose0
27ByteMagic 3Reserved for magical plus rating0
28ByteBlessReduced damage percentage taken by the character0
29BoolBoundTrue if the item can't be traded0
30ByteEnchantAdded max life for the character0
32UInt32DataAdditional attributes for the item0
36BoolSuspiciousMarked as suspicious for trading0
38BoolLockedLocked from being dropped or traded0
40ByteColorColor modifier for the item3
44UInt32Magic 3 ProgressProgress towards magical plus rating0

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)

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message37
2UInt16MsgTypeType of message1108
4UInt32IDUnique identifier for the item10
8UInt32Owner IDUnique identifier for the target player1000000
12UInt32PriceCost of the item if vending100
16UInt32Item TypeIdentifies the type of item730001
20UInt16AmountCurrent durability or amount of the item10000
22UInt16Max AmountTotal durability or amount the item can have10000
24ByteActionHow item info is extended1
25ByteStatusCondition bit flags on the item0
26BytePositionPosition where the item appears0
27ByteSocket 1The gem in the first socket position0
28ByteSocket 2The gem in the second socket position0
29ByteMagic 1Reserved for rebirth magic effect0
30ByteMagic 2Reserved for an unknown purpose0
31ByteMagic 3Reserved for magical plus rating0
32UInt32DataAdditional attributes for the item0
36NetStringPackerStringsGroup of length prefixed strings

Action Type

☑️ Assumed (Soul)

ValNameDescriptionStrings
1BOOTHVending at a player booth
2EQUIPMENTUpdates 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)

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message653
2UInt16MsgTypeType of message1213
4ByteB LengthServer's public ephemeral length
5Byte[]BServer's public ephemeral value
391ByteS LengthSalt length
392Byte[]SThe 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)

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message262
2UInt16MsgTypeType of message1214
4ByteA LengthClient's public ephemeral length
5Byte[]AClient's public ephemeral value
133ByteC LengthClient's proof of K length
134Byte[]CClient'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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message36
2UInt16MsgTypeType of message1105
4UInt32UserUnique identifier of the role1000000
8UInt32TargetUnique identifier of the target or a coordinateLOW: 320 HIGH: 460
12UInt16TypeType of magic being cast1001
14UInt16LevelLevel of the magic being cast1
16UInt32Effect NumNumber of effects to display1
20RoleInfo[]EffectsEffects to display on roles

Magic Effect Role Info

🚩 Incomplete

PosTypeNameDescriptionExample
0UInt32RoleRole ID of the target in the area effect1000001
1UInt32DataDamage associated with the area effect1
2UInt32ReservedUnknown0

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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message12
2UInt16MsgTypeType of message1103
4UInt32ExpCurrent experience towards leveling the spell0
8UInt16TypeMagic type identifier1001
10UInt16LevelLevel of the spell1

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)

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message16
2UInt16MsgTypeType of message1110
4UInt32Map IDMap identifier1002
8UInt32Doc IDDMap identifier1002
12UInt32TypeMap type flags0

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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message18
2UInt16MsgTypeType of message1101
4UInt32IDMap item identifier1
8UInt32TypeMap item type or trap look0
12UInt16Pos XX coordinate of the item or trap320
14UInt16Pos YY coordinate of the item or trap460
16UInt16ActionHow to process the message1

Action Type

☑️ Assumed (Observed) - CoFuture + Soul

ValNameDescriptionRecipientIDType
1CREATECreate map itemClientMap Item IDItem Type
2DELETEDelete map itemClientMap Item ID
3PICKRequest to pick up map itemServerMap Item ID
10CAST_TRAPPlace a floor trapClientTrap IDLook
11SYNCHRO_TRAPUpdate a floor trapClientTrap IDLook
12DROP_TRAPStop a floor trapClientTrap ID

Patch 5095

Message Definition

☑️ Assumed (Observed) - Elite-CoEmu

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message24
2UInt16MsgTypeType of message1101
4UInt32IDMap item identifier1
8UInt32TypeMap item type or trap look0
12UInt16Pos XX coordinate of the item or trap320
14UInt16Pos YY coordinate of the item or trap460
16UInt16ColorColor modifier for the item3
18UInt16ActionHow to process the message1
20UInt32UnusedConfirmed unused by the client0

Action Type

☑️ Assumed (Observed) - Elite-CoEmu

ValNameDescriptionRecipientIDType
1CREATECreate map itemClientMap Item IDItem Type
2DELETEDelete map itemClientMap Item ID
3PICKRequest to pick up map itemServerMap Item ID
4PICK_EFFECTPick up item with an effectClientMap Item ID
10CAST_TRAPPlace a floor trapClientTrap IDLook
11SYNCHRO_TRAPUpdate a floor trapClientTrap IDLook
12DROP_TRAPStop a floor trapClientTrap 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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message9
2UInt16MsgTypeType of message1111
4UInt16IndexMessage index for continuation0
6UInt16ChannelText Attributes2201
8ByteActionMessage action type2
9NetStringPackerStrings

Message Board Action

☑️ Assumed (Observed) - Soul + COPSv6

ValNameDescriptionRecipientStrings
1DELDeletes a message on the boardServer1 4 Hero
2GET_LISTFetches list of messages by indexServer
3LISTList of messages for a requested indexClient(See format)
4GET_WORDSRequest MsgTalk message for a postServer

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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message10
2UInt16MsgTypeType of message1015
4UInt32DataA parameter, target role ID, or coordinates1000001
8ByteAction TypeThe type of contents in the message6
9NetStringPackerStringsGroup of length prefixed strings

Action Type

☑️ Assumed (Observed) - CoFuture + Soul

🔶 Response data

ValNameDescriptionRecipientDataNetStringPacker
1FIREWORKSSpawn fireworksClientHero ID1 4 Test
3CHANGE_SYNUpdate guild nameClientGuild ID1 4 Name
6MATEUpdate mateClientHero ID1 4 Mate
9MAP_EFFECTSpawn effect at coordinatesClientLOW: X HIGH: Y1 7 rainbow
10ROLE_EFFECTSpawn effect on roleClientRole ID1 9 warrior-s
11MEMBER_LISTGet guild member listServerIndex1 6 Member 🔶
16QUERY_MATEGet mate's nameServerHero ID1 4 Mate 🔶
17ADD_DICE_PLAYERAdd player / open gameServerDice Game ID 🔶1 6 Player
18DEL_DICE_PLAYERDelete player / close gameServerDice Game ID1 6 Player
19DICE_BONUSUpdate money bonusClientMoney1 6 Player
20PLAYER_WAVEPlay DX SoundClientLOW: X HIGH: Y1 11 sound/1.wav

Patch 5017

Message Definition

☑️ Assumed (Observed) - CoFuture

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message10
2UInt16MsgTypeType of message1015
4UInt32DataA parameter, target role ID, or coordinates1000001
8ByteAction TypeThe type of contents in the message6
9NetStringPackerStringsGroup of length prefixed strings

Action Type

☑️ Assumed (Observed) - CoFuture + Soul

🔶 Response data

ValNameDescriptionRecipientDataNetStringPacker
1FIREWORKSSpawn fireworksClientHero ID1 4 Test
3CHANGE_SYNUpdate guild nameClientGuild ID1 4 Name
6MATEUpdate mateClientHero ID1 4 Mate
9MAP_EFFECTSpawn effect at coordinatesClientLOW: X HIGH: Y1 7 rainbow
10ROLE_EFFECTSpawn effect on roleClientRole ID1 9 warrior-s
11MEMBER_LISTGet guild member listServerIndex1 6 Member 🔶
16QUERY_MATEGet mate's nameServerHero ID1 4 Mate 🔶
17ADD_DICE_PLAYERAdd player / open gameServerDice Game ID 🔶1 6 Player
18DEL_DICE_PLAYERDelete player / close gameServerDice Game ID1 6 Player
19DICE_BONUSUpdate money bonusClientMoney1 6 Player
20PLAYER_WAVEPlay DX SoundClientLOW: X HIGH: Y1 11 sound/1.wav
26WHISPER_DIALOGDialog window detailsServerSee below 🔶

Whisper NetStringPacker Fields

NameDescriptionExample
NameTarget playerPlayer
DetailsHeroID Level Potency GuildName1000001 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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message16
2UInt16MsgTypeType of message2031
4UInt32IDUnique identifier1
8UInt32DataOption or coordinate of the action10
12UInt16EventHow to process the message0
14UInt16RoleThe RoleType of the NPC0

NPC Event Type

☑️ Assumed (Soul)

🔶 Response data

ValNameDescriptionRecipientIDData
0ACTIVATEActivates an NPC for dialogServerNPC ID
1ADD_NPCAdds an NPC to the mapServerNPC ID
2LEAVE_MAPDeletes an NPC from the mapClientNPC ID
3DEL_NPCRequests an NPC be deletedServerNPC ID
4CHANGE_POSChange the position of the NPCBothNPC IDLOW: X HIGH: Y 🔶
5LAY_NPCNotifies the client to start placingClientLookface

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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message18
2UInt16MsgTypeType of message2030
4UInt32IDUnique identifier1
8UInt16XX coordinate of the NPC320
10UInt16YY coordinate of the NPC460
12UInt16RoleThe role the NPC plays1
14UInt16LookfaceThe type and direction of the NPC10
16UInt16SortSort flags or action type the NPC performs1
18NetStringPackerStringsOptional name of the NPC

NPC Sort Flags

☑️ Assumed (Observed) - CoFuture + Soul

ValNameDescriptionStrings
0NONENPC that responds as dialog
1TASKNPC that opens a window in the client
2RECYCLENPC that is dynamically relocated

Patch 5065

Message Definition

❓ Unverified

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message20
2UInt16MsgTypeType of message2030
4UInt32IDUnique identifier1
8UInt16XX coordinate of the NPC320
10UInt16YY coordinate of the NPC460
12UInt16LookfaceThe type and direction of the NPC10
14UInt16RoleThe role the NPC plays1
16UInt16SortSort flags or action type the NPC performs1
18NetStringPackerStringsOptional name of the NPC

NPC Sort Flags

❓ Unverified

ValNameDescriptionStrings
0NONENPC that responds as dialog
1TASKNPC that opens a window in the client
2RECYCLENPC that is dynamically relocated

Patch 5517

Message Definition

❓ Unverified

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message32
2UInt16MsgTypeType of message2030
4UInt32IDUnique identifier1
8UInt32IDStatic identifier1
12UInt16XX coordinate of the NPC320
14UInt16YY coordinate of the NPC460
16UInt16LookfaceThe type and direction of the NPC10
18UInt16RoleThe role the NPC plays1
20UInt16SortSort flags or action type the NPC performs1
22NetStringPackerStringsOptional name of the NPC

NPC Sort Flags

❓ Unverified

ValNameDescriptionStrings
0NONENPC that responds as dialog
1TASKNPC that opens a window in the client
2RECYCLENPC 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)

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message36
2UInt16MsgTypeType of message1109
4UInt32IDUnique identifier6701
8UInt32Max LifeMaximum health of the NPC10000000
12UInt32LifeCurrent health of the NPC10000000
16UInt16XX coordinate of the NPC163
18UInt16YY coordinate of the NPC211
20UInt16RoleThe role the NPC plays26
22UInt16LookfaceThe type and direction of the NPC241
24UInt16SortSort flags or action type the NPC performs1
26NetStringPackerStringsOptional name of the NPC1 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.

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message14
2UInt16MsgTypeType of message1102
4UInt32IDIdentifier for a hero, NPC, or trunk8
8ByteActionHow to process the message0
9ByteTypeThe type of package being processed10
10UInt32Item IDUnique identifier of the item1

The message definition below is used for returning a list of items back to the player.

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message28
2UInt16MsgTypeType of message1102
4UInt32IDIdentifier for a hero, NPC, or trunk8
8ByteActionHow to process the message0
9ByteTypeThe type of package being processed10
10UInt16AmountAmount of items to send1
12PackageItem[]ItemsAbbreviated item infos

Package Item Definition

❓ Unverified

PosTypeNameDescriptionExample
0UInt32Item IDUnique identifier of the item1
4UInt32Item TypeIdentifies the type of item730001
8ByteStatusCondition bit flags on the item0
9ByteSocket 1The gem in the first socket position0
10ByteSocket 2The gem in the second socket position0
11ByteMagic 1Reserved for rebirth magic effect0
12ByteMagic 2Reserved for an unknown purpose0
13ByteMagic 3Reserved for magical plus rating0
14ByteBlessReduced damage percentage taken by the character0
15ByteEnchantAdded max life for the character0

Action Type

☑️ Assumed (Observed) - CoFuture + Soul

ValNameDescriptionRecipientIDData
0QUERY_LISTQuery for a list of itemsServerNPC IDPackageItem[]
1CHECK_INDeposit an itemServerNPC IDItemID
2CHECK_OUTWithdraw an itemServerNPC IDItemID

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.

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message14
2UInt16MsgTypeType of message1102
4UInt32IDIdentifier for a hero, NPC, or trunk8
8ByteActionHow to process the message0
9ByteTypeThe type of package being processed10
10UInt32Item IDUnique identifier of the item1

The message definition below is used for returning a list of items back to the player.

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message38
2UInt16MsgTypeType of message1102
4UInt32IDIdentifier for a hero, NPC, or trunk8
8ByteActionHow to process the message0
9ByteTypeThe type of package being processed10
10UInt16AmountAmount of items to send1
12PackageItem[]ItemsAbbreviated item infos

Package Item Definition

❓ Unverified

PosTypeNameDescriptionExample
0UInt32Item IDUnique identifier of the item1
4UInt32Item TypeIdentifies the type of item730001
8ByteStatusCondition bit flags on the item0
9ByteSocket 1The gem in the first socket position0
10ByteSocket 2The gem in the second socket position0
11ByteMagic 1Reserved for rebirth magic effect0
12ByteMagic 2Reserved for an unknown purpose0
13ByteMagic 3Reserved for magical plus rating0
14BoolBoundTrue if the item is bound to an account0
15ByteBlessReduced damage percentage taken by the character0
16ByteEnchantAdded max life for the character0
17UInt16DataAdditional attributes for the item0
19BoolSuspiciousMarked as suspicious for trading0
20BoolLockedLocked from being dropped or traded0
21ByteColorColor modifier for the item3
22UInt32Magic 3 ProgressProgress towards magical plus rating0

Action Type

❓ Unverified

ValNameDescriptionRecipientIDData
0QUERY_LISTQuery for a list of itemsServerNPC IDPackageItem[]
1CHECK_INDeposit an itemServerNPC IDItemID
2CHECK_OUTWithdraw an itemServerNPC IDItemID

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)

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message52
2UInt16MsgTypeType of message1100
4UInt32Account IDAccount id from the account server1
8Char[40]Mac addressMac address for the client interface0A0B0C0D0E0F

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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of message-
2UInt16MsgTypeType of message2064
4UInt16PeerageActionTypeAction subtype-
6UInt16-Padding 🔵0
8VariableDataAction-specific payload, see PeerageActionType-

🔵 Padding here is intentional to align the data payload start to be offset 8 (UInt64)

PeerageActionType
ValNameDescriptionSenderData
1SEND_DONATIONHero donates silver or CPsClientAmount (UInt64), CurrencyType🟣 (UInt16)
1SEND_DONATIONServer confirms hero's donationServerPadding (UInt64), Padding (UInt64), Padding (UInt64), ContributeDonateInfoString (NetStringPacker)
2LEADERBOARDRequest a leaderboard pageClientPageNumber (UInt32)
2LEADERBOARDReturn a leaderboard pageServerSee Leaderboard Response
3REFRESH_RANKRefresh hero's peerage rank & donationServerHero ID (UInt32), Padding (UInt64), Padding (UInt64), Padding (UInt32), ContributeTipInfoString (NetStringPacker)
4QUERY_MINIMUMQuery minimum donation to be a rankClientSelectedPeerageRank (UInt32)
4QUERY_MINIMUMReturn minimum donation dataServerRemainingDonationAmount (UInt64), Padding (UInt32), ExpectedLeaderboardPosition (UInt32), CurrentLeaderboardPosition (UInt32)

🟣 CurrencyType values: 0 = Silver, 1 = EMoney (CPs), 2 = Bound EMoney (CPs).

Leaderboard Response

PosTypeNameDescriptionExample
8UInt16CurrentVisibleLeaderboardPageThe visible page in the client leaderboard dialog2
10UInt16TotalLeaderboardPagesTotal pages for leaderboard dialog5
12UInt32EntryCountNumber of entries in this message (the page)10
16UInt32-Padding0
20UInt32-Padding0
24UInt32-Padding0
28UInt32-Padding0
32Entry[EntryCount]LeaderboardEntryStruct[]Leaderboard entriesSee below

Leaderboard Entry Structure

Each entry is always 48 bytes.

PosTypeNameDescription
0UInt32Hero IDThe player's unique identifier
4UInt8Hero OnlineBoolean set to 1 if player is online (value is unused by the client)
5UInt8-Padding
6UInt16-Padding
8UInt32Look FaceThe player's mesh, to derive gender of the peerage rank
12StringHeroNamePlayer's character name (16 bytes)
28UInt32-Padding
32Int64PlayerTotalDonationThe player's cumulative total donation amount
40UInt32PeerageRankThe player's peerage rank number, see Nobility
44Int32PositionThe 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"

IndexFormatNameDescription
0UInt32Hero IDThe hero's UID
1UInt32UnknownParsed but appears unused by the client
2Int64DonationAmountThe confirmed amount donated by the hero
3Int64TotalDonationThe hero's cumulative total donation amount
4UInt32LeaderboardPositionThe 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".

IndexFormatNameDescription
0UInt32Hero IDThe hero's UID
1Int64TotalDonationThe hero's cumulative total donation amount
2UInt32PeerageRankThe hero's peerage rank number, see Nobility
3Int32LeaderboardPositionThe 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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message65
2UInt16MsgTypeType of message1014
4UInt32Hero IDUnique identifier for the entity1000000
8UInt32Look FaceMesh of the entity501002
12UInt32Status EffectStatus effect bitmap0
16UInt32Syn MaskSynID << 4 | SynRank & 0x00FFFFFF0
20UInt32GarmentGarment's item type identifier0
24UInt32ArmetHeadgear's item type identifier0
28UInt32ArmorArmor's item type identifier0
32UInt32Right HandWeapon's item type identifier0
36UInt32Left HandWeapon's item type identifier0
44UInt16XX coordinate of the entity320
46UInt16YY coordinate of the entity460
48UInt16HairHairstyle and hair color535
50ByteDirectionEntity direction0
51BytePosePlayer's current pose100
52NetStringPackerStringsGroup of length prefixed strings

NetStringPacker Fields

NameDescriptionExample
NameName of the playerPlayer
MateName of the player's spouseMate

Monster Message Definition

❓ Unverified

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message61
2UInt16MsgTypeType of message1014
4UInt32Hero IDUnique identifier for the entity400001
8UInt32Look FaceMesh of the entity102
12UInt32Status EffectStatus effect bitmap0
16UInt32Owner IDIdentifier of the pet's owner0
40UInt16LifeHitpoints of the entity12
42UInt16LevelLevel of the entity1
44UInt16XX coordinate of the entity320
46UInt16YY coordinate of the entity460
50ByteDirectionEntity direction0
51BytePosePlayer's current pose100
52NetStringPackerStringsGroup of length prefixed strings

NetStringPacker Fields

NameDescriptionExample
NameName of the monsterMonster

Patch 5103

Player Message Definition

❓ Unverified - Imported from legacy wiki

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message107
2UInt16MsgTypeType of message1014
4UInt32Look FaceMesh of the entity501002
8UInt32Hero IDUnique identifier for the entity1000000
12UInt32Syn MaskSynID << 4 | SynRank & 0x00FFFFFF0
16UInt64Status EffectStatus effect bitmap0
24UInt32GarmentGarment's item type identifier0
28UInt32ArmetHeadgear's item type identifier0
32UInt32ArmorArmor's item type identifier0
36UInt32Right HandWeapon's item type identifier0
40UInt32Left HandWeapon's item type identifier0
52UInt16HairHairstyle and hair color535
54UInt16XX coordinate of the entity320
56UInt16YY coordinate of the entity460
58ByteDirectionEntity direction0
59BytePosePlayer's current pose100
60UInt16MetempsychosisMetempsychosis level0
70UInt16Shared BPBattle power from mentor0
77UInt32Flower RankFlower ranking0
81UInt32Nobility RankNobility ranking12
85UInt16Armor ColorColor of equipped armor3
87UInt16Shield ColorColor of equipped shield4
89UInt16Armet ColorColor of equipped headgear3
91UInt32Study PointsQuiz show points6546
95NetStringPackerStringsGroup of length prefixed strings

NetStringPacker Fields

NameDescriptionExample
NameName of the playerPlayer
MateName of the player's spouseMate

Monster Message Definition

❓ Unverified

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message103
2UInt16MsgTypeType of message10014
4UInt32Look FaceMesh of the entity501002
8UInt32Hero IDUnique identifier for the entity1000000
12UInt32Owner IDIdentifier of the pet's owner0
16UInt64Status EffectStatus effect bitmap0
48UInt16LifeHitpoints of the entity12
54UInt16XX coordinate of the entity320
56UInt16YY coordinate of the entity460
58ByteDirectionEntity direction0
59BytePosePlayer's current pose100
62UInt16LevelLevel of the entity1
95NetStringPackerStringsGroup of length prefixed strings

NetStringPacker Fields

NameDescriptionExample
NameName of the monsterMonster

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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message136
2UInt16MsgTypeType of message1040
4UInt32Hero IDUnique identifier for the character1000000
8UInt32LifeCurrent hitpoints100
12UInt32ManaCurrent mana points0
16UInt32MaxAttackPhysical max attack before modifiers7
20UInt32MinAttackPhysical min attack before modifiers14
24UInt32DefenseEffective defense before modifiers32
28UInt32MagicAttackMagic attack modifier0
32UInt32MagicDefenseMagic defense modifier0
36UInt32DodgePercentDodge increase92
40UInt32AgilityRaw agility attribute20
44UInt32AccuracyHit rate accuracy10
48UInt32BonusAttackPercentPhysical attack increase0
52UInt32BonusMagicPercentMagic attack increase0
56UInt32ReduceDamagePercentOverall damage reduction7
60UInt32CurseDamagePercentCursed damage increase0
64UInt32BlessPercentBless damage reduction0
68UInt32CriticalStrikePercentPhysical critical hit increase0
72UInt32MagicCriticalStrikePercentMagic critical hit increase0
76UInt32ImmunityPercentCritical hit negation increase0
80UInt32PenetrationPercentMagic defense negation0
84UInt32BlockPercentPhysical damage block0
88UInt32BreakthroughPercentMax attack increase for higher BP0
92UInt32CounteractionPercentBreakthrough counteraction0
96UInt32DetoxicationPercentPoison attack reduction0
100UInt32FinalAttackFinal physical attack increase7
104UInt32FinalMagicAttackFinal magic attack increase0
108UInt32FinalDefenseFinal physical attack reduction32
112UInt32FinalMagicDefenseFinal magic attack reduction0
116UInt32MetalResistPercentMetal boss damage reduction0
120UInt32WoodResistPercentWood boss damage reduction0
124UInt32WaterResistPercentWater boss damage reduction0
128UInt32FireResistPercentFire boss damage reduction0
132UInt32EarthResistPercentEarth boss damage reduction0

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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message60
2UInt16MsgTypeType of message1001
4Char[16]UsernameAccount username from loginadmin
20Char[16]Hero NameRequested name to be checkedPlayer
36Char[16]PasswordAccount password (missing RC5 wrapper)test
52UInt16Hero LookSelected character model1003
54UInt16Hero ProfessionSelected character profession10
56UInt32Account IDAccount id from the account server1

Patch 5017

Message Definition

☑️ Assumed (Observed) - Comet

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message60
2UInt16MsgTypeType of message1001
4Char[16]UsernameAccount username from loginadmin
20Char[16]Hero NameRequested name to be checkedPlayer
36Char[16]Masked PasswordHidden password****
52UInt16Hero LookSelected character model1003
54UInt16Hero ProfessionSelected character profession10
56UInt32Account IDAccount id from the account server1

Patch 5065

Message Definition

☑️ Assumed (Observed) - Comet

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message60
2UInt16MsgTypeType of message1001
4Char[16]UsernameAccount username from loginadmin
20Char[16]Hero NameRequested name to be checkedPlayer
52UInt16Hero LookSelected character model1003
54UInt16Hero ProfessionSelected character profession10
56UInt32Account IDAccount id from the account server1

Patch 5165

Message Definition

❓ Unverified - Imported from the legacy wiki

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message104
2UInt16MsgTypeType of message1001
4Char[16]UsernameAccount username from loginadmin
20Char[16]Hero NameRequested name to be checkedPlayer
52UInt16Hero LookSelected character model1003
54UInt16Hero ProfessionSelected character profession10
56UInt32Account IDAccount id from the account server1
60UInt16[6]MacAddressNetwork device identifier00,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:

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message24
2UInt16MsgTypeType of message1114
4UInt16ActionThe synchronized action0
6ByteDirectionAction direction0
7ByteMovement ModeType of ground movement1
12UInt32AmountAmount of players2
16UInt32Hero IDUnique identifier for the character1000000
20UInt32TargetUnique identifier for the target1000001

For jumping:

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message24
2UInt16MsgTypeType of message1114
4UInt16ActionThe synchronized action0
6UInt16XX coordinate of the action320
8UInt16YY coordinate of the action460
10UInt16DirectionAction direction0
12UInt32AmountAmount of players2
16UInt32Hero IDUnique identifier for the character1000000
20UInt32TargetUnique identifier for the target1000001

Action Type

✅ Verified (Client)

ValNameDescription
0SYNC_DIRECTIONChange direction as a couple
1SYNC_WALKStep as a couple
2SYNC_JUMPJump 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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message12
2UInt16MsgTypeType of message1107
4UInt32ActionGuild action being performed1
8UInt32TargetTarget individual or guild identifier1000000

Action Types

☑️ Assumed (Observed) - CoFuture + Soul

🔶 Response data

ValNameDescriptionRecipientTarget
1APPLY_JOINApply to join a guild (sends INVITE_JOIN)ServerTarget ID
2INVITE_JOINInvite a player to join a guildClientTarget ID
3LEAVE_SYNRequest to leave current guildServer
4KICKOUT_MEMBERKick a member from guildClientTarget ID
6QUERY_SYN_NAMESends MsgName with guild nameServerSyndicate ID
7ALLY_APPLYSets a guild as an allyServerAlly's Syndicate ID
8CLEAR_ALLYRemoves an ally guildServerAlly's Syndicate ID
9ANTAGONIZESets a guild as an enemyServerEnemy's Syndicate ID
10CLEAR_ANTAGONIZERemoves an enemy guildServerEnemy's Syndicate ID
11DONATE_MONEYAdd silver to the guild fundServerAmount
12QUERY_SYNATTRQuery for guild attributesServerTarget ID
14SET_SYNSent on login to set syndicate IDClientSyndicate ID
19DESTROY_SYNTerminates a guildClientSyndicate 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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message40
2UInt16MsgTypeType of message1106
4UInt32Syndicate IDUnique identifier of the player1000000
8UInt32ProfferSilver amount offered as donation10000
12UInt32FundTotal silver fund10000
16UInt32PopulationNumber of guild members1
20ByteRankPosition in the guild100
21Char[16]LeaderName of the guild leaderPlayer

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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message92
2UInt16MsgTypeType of message1106
4UInt32Syndicate IDUnique identifier of the player1000000
8UInt32ProfferSilver amount offered as donation10000
12UInt64FundTotal silver fund10000
20UInt32EMoney FundTotal CPs fund0
24UInt32PopulationNumber of guild members1
28ByteRankPosition in the guild100
32Char[16]LeaderName of the guild leaderPlayer
48UInt32Level ReqRequired minimum level for joining1
52UInt32Metempsychosis ReqRequired minimum rebirth for joining1
56UInt32Profession ReqRequired professions for joining as a bitmap0
60UInt32LevelOverall guild level1
67UInt32Registration DateDay the guild was registered on in YYYYMMDD20150116

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)

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message84
2UInt16MsgTypeType of message1058
4UInt32SynpOfferUpdateFlagsWhich donations to update0
8Int32MoneyAmount of money donated / debted0
12Int32EMoneyAmount of CPs donated / debted0
16UInt32EducationAmount of education points0
20UInt32ExploitsAmount of PK merit0
24UInt32ArsenalPoints in the arsenal0
28UInt32RosesFlower points from roses0
32UInt32OrchidsFlower points from orchids0
36UInt32LiliesFlower points from lilies0
40UInt32TulipsFlower points from tulips0
44UInt32FactionAmount of merit from faction PK0

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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message42
2UInt16MsgTypeType of message1004
4Int32Text ColorARGB32 color of the text00FF0000
8UInt16Text AttributeDefines where the text appears2000
10Uint16Text StyleDefines how the text appears0
12UInt32Local TimeHours and minutes1241
16NetStringPackerStringsGroup of length prefixed strings

NetStringPacker Fields

NameDescriptionExample
SpeakerAuthor of the messageSYSTEM
HeaderRecipient of the messageALLUSERS
EmotionA prefix to the message
WordsThe body of the messageTesting

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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message50
2UInt16MsgTypeType of message1004
4Int32Text ColorARGB32 color of the text00FF0000
8UInt16Text AttributeDefines where the text appears2000
10Uint16Text StyleDefines how the text appears0
12UInt32Local TimeHours and minutes1241
16UInt32Hearer ViewCharacter view mesh for the hearer501002
20UInt32Speaker ViewCharacter view mesh for the speaker501002
24NetStringPackerStringsGroup of length prefixed strings

NetStringPacker Fields

NameDescriptionExample
SpeakerAuthor of the messageSYSTEM
HeaderRecipient of the messageALLUSERS
EmotionA prefix to the message
WordsThe body of the messageTesting

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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message52
2UInt16MsgTypeType of message1004
4Int32Text ColorARGB32 color of the text00FF0000
8UInt16Text AttributeDefines where the text appears2000
10Uint16Text StyleDefines how the text appears0
12UInt32Local TimeHours and minutes1241
16UInt32Hearer ViewCharacter view mesh for the hearer501002
20UInt32Speaker ViewCharacter view mesh for the speaker501002
24NetStringPackerStringsGroup of length prefixed strings

NetStringPacker Fields

NameDescriptionExample
SpeakerAuthor of the messageSYSTEM
HeaderRecipient of the messageALLUSERS
EmotionA prefix to the message
WordsThe body of the messageTesting
UnknownNot referenced in the client assembly
UnknownNot 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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message56
2UInt16MsgTypeType of message1004
4UInt32System TimeMilliseconds of system uptime1579535985
8Int32Text ColorARGB32 color of the text00FF0000
12UInt16Text AttributeDefines where the text appears2000
14Uint16Text StyleDefines how the text appears0
16UInt32Local TimeHours and minutes1241
20UInt32Hearer ViewCharacter view mesh for the hearer501002
24UInt32Speaker ViewCharacter view mesh for the speaker501002
28NetStringPackerStringsGroup of length prefixed strings

NetStringPacker Fields

NameDescriptionExample
SpeakerAuthor of the messageSYSTEM
HeaderRecipient of the messageALLUSERS
EmotionA prefix to the message
WordsThe body of the messageTesting
UnknownNot referenced in the client assembly
UnknownNot 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)

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message8
2UInt16MsgTypeType of message1023
4UInt32ActionThe command being requested1
8UInt32PlayerHero ID of the target1000001

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)

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message34
2UInt16MsgTypeType of message1026
4ByteActionAdding or removing1
5ByteAmountNumber of team members being acted upon1
6TeamMemberMembersRepeated list of team members

Team Member Definition

☑️ Assumed (Soul)

PosTypeNameDescriptionExample
0Char[16]NameHero namePlayer
16UInt32IDHero ID of the member1000001
20UInt32Look FaceMesh of the entity501002
24UInt16Max HPTotal HP the member can have92
26UInt16HPTotal HP the member has54

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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message20
2UInt16MsgTypeType of message1012
4UInt32Hero IDUnique identifier for the character1000000
8UInt32System TimeMilliseconds of system uptime ^ Hero ID1579846705
12UInt32Message CountThe total number of messages sent12
16UInt32Check DataChecksum using first two letters of the character's name2638960387

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)

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message12
2UInt16MsgTypeType of message1130
4UInt32Hero IDUnique identifier for the character1000000
8ByteTitleIDTitle ID as it appears in Title.ini11
9ByteActionHow to process the message4
10ByteAmountNumber of titles to list1
11Byte[]TitlesAn array of titles11

Title Action

✅ Verified (Client)

ValNameDescriptionRecipient
1ADD_TITLEAdds a titleClient
2LOSE_TITLERemoves a titleClient
3SET_TITLESets a title for the playerBoth
4LIST_TITLESGets titles for the playerBoth

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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message12
2UInt16MsgTypeType of message1056
4UInt32DataData or a unique Identifier10
8UInt16Action TypeThe type of trade message6

Action Type

☑️ Assumed (Observed) - CoFuture + Soul

ValNameDescriptionRecipientData
1APPLYRequest tradeBothRequester's Hero ID
2QUITRequest cancelServer
3OPENOpen trade windowClientTarget's Hero ID
4SUCCESSSuccessful tradeClient
5FALSEFailed tradeClient
6ADDITEMAdd item to trade windowServerItem ID
7ADDMONEYAdd money to trade windowServerMoney
8PLAYERTOTALMONEYTotal money traded by targetClientMoney
9HEROTOTALMONEYTotal money traded by heroClientMoney
10OKConfirm tradeBoth
11ADDITEM_FALSECannot add item for tradeClientItem ID

Patch 5017

Message Definition

❓ Unverified

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message12
2UInt16MsgTypeType of message1056
4UInt32DataData or a unique Identifier10
8UInt16Action TypeThe type of trade message6

Action Type

❓ Unverified

ValNameDescriptionRecipientData
1APPLYRequest tradeBothRequester's Hero ID
2QUITRequest cancelServer
3OPENOpen trade windowClientTarget's Hero ID
4SUCCESSSuccessful tradeClient
5FALSEFailed tradeClient
6ADDITEMAdd item to trade windowServerItem ID
7ADDMONEYAdd money to trade windowServerMoney
8PLAYERTOTALMONEYTotal money traded by targetClientMoney
9HEROTOTALMONEYTotal money traded by heroClientMoney
10OKConfirm tradeBoth
11ADDITEM_FALSECannot add item for tradeClientItem ID
12PLAYERTOTALEMONEYTotal CPs traded by targetClientCPs
13ADDEMONEYAdd CPs to trade windowServerCPs
14HEROTOTALEMONEYTotal CPs traded by heroClientCPs

Patch 5022

Message Definition

❓ Unverified

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message12
2UInt16MsgTypeType of message1056
4UInt32DataData or a unique Identifier10
8UInt16Action TypeThe type of trade message6

Action Type

❓ Unverified

ValNameDescriptionRecipientData
1APPLYRequest tradeBothRequester's Hero ID
2QUITRequest cancelServer
3OPENOpen trade windowClientTarget's Hero ID
4SUCCESSSuccessful tradeClient
5FALSEFailed tradeClient
6ADDITEMAdd item to trade windowServerItem ID
7ADDMONEYAdd money to trade windowServerMoney
8PLAYERTOTALMONEYTotal money traded by targetClientMoney
9HEROTOTALMONEYTotal money traded by heroClientMoney
10OKConfirm tradeBoth
11ADDITEM_FALSECannot add item for tradeClientItem ID
12PLAYERTOTALEMONEYTotal CPs traded by targetClientCPs
13ADDEMONEYAdd CPs to trade windowServerCPs
14HEROTOTALEMONEYTotal CPs traded by heroClientCPs
15SUSPICIOUS_PROMPTPrompt hero before confirmClient
16SUSPICIOUS_OKConfirm suspicious tradeServer

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)

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message24
2UInt16MsgTypeType of message1017
4UInt32Hero IDUnique identifier for the character1000000
8UInt32AttributeNumAmount of attributes to update1
12UserAttrib[]AttributesAttributes listSee below

UserAttrib Definition

☑️ Assumed (Soul)

TypeNameDescriptionExample
UInt32AttribTypeThe attribute to update2
UInt32[2]DataThe new value of the attribute10

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)

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message24
2UInt16MsgTypeType of message1017
4UInt32Hero IDUnique identifier for the character1000000
8UInt32AttributeNumAmount of attributes to update1
12UserAttrib[]AttributesAttributes listSee below

UserAttrib Definition

☑️ Assumed (Soul)

TypeNameDescriptionExample
UInt32AttribTypeThe attribute to update2
UInt32[2]DataThe new value of the attribute10

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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message52
2UInt16MsgTypeType of message10017
4UInt32Hero IDUnique identifier for the character1000000
8UInt32AttributeNumAmount of attributes to update1
12UserAttrib[]AttributesAttributes listSee below

UserAttrib Definition

Pos (relative)TypeNameDescriptionExample
0UInt32AttribTypeThe attribute to update17
4UInt64Data1Primary value for AttribType259200
12UInt64Data2Secondary value0
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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message73
2UInt16MsgTypeType of message1006
4UInt32Hero IDUnique identifier for the character1000000
8UInt32LookCharacter view mesh501002
12UInt16HairHairstyle and hair color535
16UInt32MoneyEarned virtual player currency in pocket10000
20UInt64ExperienceLeveling experience1000
40UInt16StrengthPhysical attack power7
42UInt16AgilityPhysical accuracy2
44UInt16VitalityHealth increase4
46UInt16SpiritMana increase0
48UInt16AttributesUnspent attribute points0
50UInt16LifeCurrent health of the character99
52UInt16ManaCurrent mana of the character0
54UInt16PkPK points from slaying other players0
56ByteLevelCharacter level1
57ByteProfessionCurrent profession10
59ByteMetempsychosisNumber of rebirths0
60BoolAutoAllotTrue to automatically allot attributes1
61NetStringPackerStringsGroup of length prefixed strings

NetStringPacker Fields

NameDescriptionExample
NameName of the characterPlayer
MateThe character the player is married toNone

Patch 4343

Message Definition

☑️ Assumed (Observed) - Comet

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message77
2UInt16MsgTypeType of message1006
4UInt32Hero IDUnique identifier for the character1000000
8UInt32LookCharacter view mesh501002
12UInt16HairHairstyle and hair color535
14UInt32MoneyEarned virtual player currency in pocket10000
18UInt32EMoneyPaid virtual player currency in pocket0
22UInt64ExperienceLeveling experience1000
44UInt16StrengthPhysical attack power7
46UInt16AgilityPhysical accuracy2
48UInt16VitalityHealth increase4
50UInt16SpiritMana increase0
52UInt16AttributesUnspent attribute points0
54UInt16LifeCurrent health of the character99
56UInt16ManaCurrent mana of the character0
58UInt16PkPK points from slaying other players0
60ByteLevelCharacter level1
61ByteProfessionCurrent profession10
63ByteMetempsychosisNumber of rebirths0
64BoolAutoAllotTrue to automatically allot attributes1
65NetStringPackerStringsGroup of length prefixed strings

NetStringPacker Fields

NameDescriptionExample
NameName of the characterPlayer
MateThe character the player is married toNone

Patch 5017

Message Definition

☑️ Assumed (Observed) - Comet

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message79
2UInt16MsgTypeType of message1006
4UInt32Hero IDUnique identifier for the character1000000
8UInt32LookCharacter view mesh501002
12UInt16HairHairstyle and hair color535
14UInt32MoneyEarned virtual player currency in pocket10000
18UInt32EMoneyPaid virtual player currency in pocket0
22UInt64ExperienceLeveling experience1000
46UInt16StrengthPhysical attack power7
48UInt16AgilityPhysical accuracy2
50UInt16VitalityHealth increase4
52UInt16SpiritMana increase0
54UInt16AttributesUnspent attribute points0
56UInt16LifeCurrent health of the character99
58UInt16ManaCurrent mana of the character0
60UInt16PkPK points from slaying other players0
62ByteLevelCharacter level1
63ByteProfessionCurrent profession10
64BytePrevious ProfessionProfession before latest rebirth0
65ByteMetempsychosisNumber of rebirths0
66BoolAutoAllotTrue to automatically allot attributes1
67NetStringPackerStringsGroup of length prefixed strings

NetStringPacker Fields

NameDescriptionExample
NameName of the characterPlayer
MateThe character the player is married toNone

Patch 5065

Message Definition

☑️ Assumed (Observed) - Comet

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message83
2UInt16MsgTypeType of message1006
4UInt32Hero IDUnique identifier for the character1000000
8UInt32LookCharacter view mesh501002
12UInt16HairHairstyle and hair color535
14UInt32MoneyEarned virtual player currency in pocket10000
18UInt32EMoneyPaid virtual player currency in pocket0
22UInt64ExperienceLeveling experience1000
50UInt16StrengthPhysical attack power7
52UInt16AgilityPhysical accuracy2
54UInt16VitalityHealth increase4
56UInt16SpiritMana increase0
58UInt16AttributesUnspent attribute points0
60UInt16LifeCurrent health of the character99
62UInt16ManaCurrent mana of the character0
64UInt16PkPK points from slaying other players0
66ByteLevelCharacter level1
67ByteProfessionCurrent profession10
68BytePrevious ProfessionProfession before latest rebirth0
69ByteMetempsychosisNumber of rebirths0
70BoolAutoAllotTrue to automatically allot attributes1
71NetStringPackerStringsGroup of length prefixed strings

NetStringPacker Fields

NameDescriptionExample
NameName of the characterPlayer
MateThe character the player is married toNone

Patch 5095

Message Definition

☑️ Assumed (Observed) - CoEmu

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message91
2UInt16MsgTypeType of message1006
4UInt32Hero IDUnique identifier for the character1000000
8UInt32LookCharacter view mesh501002
12UInt16HairHairstyle and hair color535
14UInt32MoneyEarned virtual player currency in pocket10000
18UInt32EMoneyPaid virtual player currency in pocket0
22UInt64ExperienceLeveling experience1000
54UInt16StrengthPhysical attack power7
56UInt16AgilityPhysical accuracy2
58UInt16VitalityHealth increase4
60UInt16SpiritMana increase0
62UInt16AttributesUnspent attribute points0
64UInt16LifeCurrent health of the character99
66UInt16ManaCurrent mana of the character0
68UInt16PkPK points from slaying other players0
70ByteLevelCharacter level1
71ByteProfessionCurrent profession10
72BytePrevious ProfessionProfession before latest rebirth0
73ByteMetempsychosisNumber of rebirths0
74BoolAutoAllotTrue to automatically allot attributes1
75UInt32Quiz PointsTotal quiz points0
79NetStringPackerStringsGroup of length prefixed strings

NetStringPacker Fields

NameDescriptionExample
NameName of the characterPlayer
MateThe character the player is married toNone

Patch 5165

Message Definition

❓ Unverified - Assumed from Impulse + Comet

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message99
2UInt16MsgTypeType of message1006
4UInt32Hero IDUnique identifier for the character1000000
8UInt32LookCharacter view mesh501002
12UInt16HairHairstyle and hair color535
14UInt32MoneyEarned virtual player currency in pocket10000
18UInt32EMoneyPaid virtual player currency in pocket0
22UInt64ExperienceLeveling experience1000
50UInt16StrengthPhysical attack power7
52UInt16AgilityPhysical accuracy2
54UInt16VitalityHealth increase4
56UInt16SpiritMana increase0
58UInt16AttributesUnspent attribute points0
60UInt16LifeCurrent health of the character99
62UInt16ManaCurrent mana of the character0
64UInt16PkPK points from slaying other players0
66ByteLevelCharacter level1
67ByteProfessionCurrent profession10
68BytePrevious ProfessionProfession before latest rebirth0
69ByteMetempsychosisNumber of rebirths0
68ByteFirst ProfessionProfession before first rebirth (if on second)0
70BoolAutoAllotTrue to automatically allot attributes1
71UInt32Quiz PointsTotal quiz points0
75UInt16Enlighten PointsEnlightenment points progress0
77UInt16Enlighten ExpEnlightenment experience0
87NetStringPackerStringsGroup of length prefixed strings

NetStringPacker Fields

NameDescriptionExample
NameName of the characterPlayer
MateThe character the player is married toNone

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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message120
2UInt16MsgTypeType of message1006
4UInt32Hero IDUnique identifier for the character1000000
8UInt16ShowTypeCharacter display type2
10UInt32LookCharacter view mesh501002
14UInt16HairHairstyle and hair color535
16UInt32MoneyEarned virtual player currency in pocket10000
20UInt32EMoneyPaid virtual player currency in pocket0
24UInt64ExperienceLeveling experience1000
32UInt32UnknownUnknown-
36UInt32UnknownUnknown-
40UInt32UnknownUnknown-
44UInt32UnknownUnknown-
48UInt32UnknownUnknown-
52UInt16StrengthPhysical attack power7
54UInt16AgilityPhysical accuracy2
56UInt16VitalityHealth increase4
58UInt16SpiritMana increase0
60UInt16AttributesUnspent attribute points0
62UInt16LifeCurrent health of the character99
64UInt16ManaCurrent mana of the character0
66UInt16PkPK points from slaying other players0
68ByteLevelCharacter level1
69ByteProfessionCurrent profession10
70BytePrevious ProfessionProfession before latest rebirth0
71ByteFirst ProfessionProfession before first rebirth0
72ByteUnknownUnknown-
73ByteMetempsychosisNumber of rebirths0
74ByteUnknownUnknown-
75UInt32Quiz PointsTotal quiz points0
79UInt16Enlighten PointsEnlightenment points progress0
81UInt16Enlighten ExpEnlightenment experience0
83UInt16UnknownUnknown-
85UInt16UnknownUnknown-
87UInt32VIP LevelVIP level2
91UInt16Title IDID of title text next to name and effect (from title.ini)0
93UInt32UnknownUnknown-
97ByteUnknownUnknown-
98UInt32UnknownUnknown-
102UInt32UnknownUnknown-
106UInt32UnknownUnknown-
110NetStringPackerStringsGroup of length prefixed strings

NetStringPacker Fields

NameDescriptionExample
NameName of the characterPlayer
EmptyEmpty
MateThe character the player is married toNone

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)

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message8
2UInt16MsgTypeType of message1129
4UInt32VipFunctionFlagsBitwise flag to show or hide VIP buttons0xFFFF

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)

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message10
2UInt16MsgTypeType of message1005
4UInt32Hero IDUnique identifier for the character1000000
8ByteDirectionMovement direction0
9BoolRunTrue if the player is running1

Patch 5165

Message Definition

☑️ Assumed (Observed)

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message16
2UInt16MsgTypeType of message1005
4UInt32DirectionMovement direction0
8UInt32Hero IDUnique identifier for the character1000000
12UInt32Movement ModeType of ground movement1

Movement Modes

☑️ Assumed (Observed)

enum MovementModes {

    MOVEMENT_MODE_WALK = 0;
    MOVEMENT_MODE_RUN = 1;
    MOVEMENT_MODE_MOUNTED = 9;
}

Patch 5517

Message Definition

☑️ Assumed (Observed)

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message24
2UInt16MsgTypeType of message10005
4UInt32DirectionMovement direction0
8UInt32Hero IDUnique identifier for the character1000000
12UInt32Movement ModeType of ground movement1
16UInt32System TimeMilliseconds of system uptime10000
20UInt32Map IDMap identifier1002

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

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message24
2UInt16MsgTypeType of message10005
4BytesProtobufSerialized protobuf fields

Protobuf Fields

❓ Unverified - Imported from the legacy wiki

TypeNameIDDescriptionExample
UInt32direction1Movement direction0
UInt32hero_id2Unique identifier for the character1000000
UInt32movement_mode3Type of ground movement1
UInt32system_time4Milliseconds of system uptime10000
UInt32map_id5Map identifier1002

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)

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message16
2UInt16MsgTypeType of message1025
4UInt32TypeThe weapon skill type490
8UInt32LevelThe new weapon skill level1
12UInt32ExpThe new weapon skill experience0

MsgWeather

This message updates the weather on a game map.

Table of Contents

Patch 4267

Message Definition

☑️ Assumed (Soul)

PosTypeNameDescriptionExample
0UInt16MsgSizeSize of the message20
2UInt16MsgTypeType of message1016
4UInt32WeatherThe type of weather to display2
8UInt32IntensityScale of 1 to 102450
12Int32DirectionAngle delta of plus or minus 6014
16UInt32ColorARGB color0x00FFFFFF

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

TypeNameDescription
ByteAmountTotal number of strings
PString[]StringsArray of length-prefixed strings

Example

The following example is from MsgTalk.

PosTypeNameDescriptionExample
0ByteAmountTotal number of strings4
1ByteLengthLength of the first string6
2Char[6]SpeakerAuthor of the messageSYSTEM
8ByteLengthLength of the second string8
9Char[8]HeaderRecipient of the messageALLUSERS
17ByteLengthLength of the third string0
18ByteLengthLength of the fourth string7
19Char[7]WordsThe body of the messageTesting

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 OnlineStateXP-GainItem Drop RateReminderOther
0-3 hoursHealthyNormalNormalSystem Message (String: #11070) every 1hrGame plays as without restrictions
3-5 hoursFatigueHalvedHalvedPopup (String: #11060) every 30minClient blocks all item and action operations (equip, use, sell, buy, pick up, trade, attack) with a 'Operation Failed' System Message
> 5 hoursUnhealthyNoneNonePopup (String: #11061) every 15minClient 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.

Enthrallment

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 NumberTitleMax Per ServerRequirement
12King / Queen3Leaderboard Rank 1-3
9Prince / Princess12Leaderboard Rank 4-15
7Duke / Duchess35Leaderboard Rank 16-50
5Earl / CountessNo Limit200,000,000 silvers
3Baron / BaronessNo Limit100,000,000 silvers
1Knight / LadyNo Limit30,000,000 silvers
0CommonerN/AN/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:

FeatureLevel 1Level 2Level 3Level 4Level 5Level 6
Remote warehouse (Market, Twin City)
Free flowers per day 🟠235101530
Extra Lottery chances 🟠+10+20+30+40+50+60
Bonus Blessing time 🟠+10%+15%+20%+30%+30%+30%
Max friends 🟠5560708090100
Offline Training hours 🟠161718192124
Refine/Purify time extension 🟠+1 day+2 days+4 days+7 days+7 days+7 days
Free Labyrinth entry 🟠every 7devery 6devery 5devery 4devery 3devery 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 🟠135
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:

  1. Split the encrypted data file into 256-byte ciphertext blocks.
  2. 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)
  3. Strip the PKCS#1 padding from the decrypted chunk
  4. Concatenate all decrypted chunks.
  5. 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:

  1. XOR the byte with key[i % 128]
  2. Right rotate the byte by i % 8 bits

To Encrypt Each Byte:

  1. Left Rotate the byte by i % 8 bits
  2. 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

Strings

Account Password

Account Username

Hero Name