The Mana server protocol

When playing on a Mana server, the player will interact with different other entities, includinf his/her own character, use item, chat, fight monsters, use skills, ...

In order to deal with all players real-time requests in an efficient way, a Mana server message protocol has been defined to give the client all the necessary information, in a minimalistic approach, to save bandwidth and server computation cycles.

The protocol has been defined in a way that if the client can compute a data, it will have to do it as the server will try to avoid unnecessary computation for the clients.

This page will then describe what kind of data, in which order, and in which case they are used.

Network layer

the Mana server is using Enet (http://enet.bespin.org) as its network layer. Enet is a cross-platform reliable UDP layer, and it's a good compromise between speed and reliability. Thus, to be able to get into communication with a Mana server, you'll have to be aware that Enet encapsulates the data in its own format, first.

Message types

Each data object has its own set of properties and things it can do in the game. A number of messages in the protocol can be grouped on these types. We'll go through each of them separately.

In the messages described the following data types are being used:

S - String, char array (null terminated) B - Byte (1 byte) W - Word (2 bytes) D - Double word (4 bytes)

Messages naming convention

The message described in the protocol.h file are following a naming convention, to ease their understanding:

  • Components: B Byte, W Word, D Double word, S Variable-size string, C Tile-based coordinates (B*3)
  • Hosts: P (Player's client), A (Account server), C (Char server), G (Game server)

Hence, here are how we prefix the messages: * PAMSG_*: from client to account server * APMSG_*: from account server to client * PCMSG_*: from client to chat server * CPMSG_*: from chat server to client * PGMSG_*: from client to game server * GPMSG_*: from game server to client * GAMSG_*: from game server to account server

and here is an example: GPMSG_BEINGS_MOVE 0x0280 { W being id, B flags [, Wx2 position, B speed] }

The GPMSG_BEINGS_MOVE message is starting with GPMSG, meaning that the message is going from the game server to the client. The 0x0280 hexadecimal value is the actual message starting value sent to the receiver (here the client). The wording between brackets is indicating what will be sent next to the message. Here a Word, a B flag, and potentially, hence the [] two Word data and a Bit one.

The network message will then be: <0x0280><W><B><W><W><B>

Login-Register messages

Message name Hex value Values sent
**PAMSG_REGISTER** 0x0000 **D** protocol version, **S** username, **S** password, **S** email, **S** captcha response
**APMSG_REGISTER_RESPONSE** 0x0002 **B** error, **S** updatehost, **S** client data url, **B** number of character slots
__Error return values:__
**REGISTER_INVALID_VERSION** (0x40): The user is using too old protocol version. (Must be \&gt;= to **`PROTOCOL_VERSION`**)
**REGISTER_EXISTS_USERNAME** (0x41): There is already a registered account with this username.
**REGISTER_EXISTS_EMAIL** (0x42): There is already an account with this email address.
**REGISTER_CAPTCHA_WRONG** (0x43): The user didn't solve the captcha correctly.
**GAMSG_REGISTER** 0x0500 **S** address, **W** port, **S** password, **D** items db revision, { **W** map id }\*
**AGMSG_REGISTER_RESPONSE** 0x0501 **C** item version, **C** password response
__Item version return values:__
**DATA_VERSION_OK** (0x00): Item DB version is ok.
**DATA_VERSION_OUTDATED** (0x01): Item DB version is outdated.
__Password return values:__
**PASSWORD_OK** (0x00): Password accepted.
**PASSWORD_BAD** (0x01): Invalid password. Registering failed.
**PAMSG_UNREGISTER** 0x0003 **S** username, **S** password
**APMSG_UNREGISTER_RESPONSE** 0x0004 **B** error
**PAMSG_REQUEST_REGISTER_INFO** 0x0005 None
**APMSG_REGISTER_INFO_RESPONSE** 0x0006 **B** registration Allowed, **B** min name Length, **B** max name length, **S** captcha URL, **S** captcha instructions
**PAMSG_LOGIN** 0x0010 **D** protocol version, **S** username, **S** password
**APMSG_LOGIN_RESPONSE** 0x0012 **B** error, **S** updatehost, **S** client data url, **B** number of character slots
__Error return values:__
**LOGIN_INVALID_VERSION** (0x40): The user is using a too old protocol version. (Must be \&gt;= to **`PROTOCOL_VERSION`**)
**LOGIN_INVALID_TIME** (0x50): The user tried logging in too fast.
**LOGIN_BANNED** (0x51) : The user is currently banned.
**PAMSG_LOGOUT** 0x0013 None
**APMSG_LOGOUT_RESPONSE** 0x0014 **B** error
**PAMSG_CHAR_CREATE** 0x0020 **S** name, **B** hair style, **B** hair color, **B** gender, **B** character slot, {**W** statistics}N times (See [attributes.xml](attributes.xml.md))
__Gender values:__
**GENDER_MALE** (0): Male gender.
**GENDER_FEMALE** (1): Female gender.
**GENDER_UNSPECIFIED** (2): When not specified yet. Should not happen.
**APMSG_CHAR_CREATE_RESPONSE** 0x0021 **B** error
__Error return values:__
**CREATE_INVALID_HAIRSTYLE** (0x40): Invalid Hairstyle value.
**CREATE_INVALID_HAIRCOLOR** (0x41): Invalid hair color value.
**CREATE_INVALID_GENDER** (0x42): Invalid Gender value.
**CREATE_ATTRIBUTES_TOO_HIGH** (0x43): Some attributes are too high.
**CREATE_ATTRIBUTES_TOO_LOW** (0x44): Some attributes are too low.
**CREATE_ATTRIBUTES_OUT_OF_RANGE** (0x45): Some attribute are out of the permitted range.
**CREATE_EXISTS_NAME** (0x46): Character name already exists.
**CREATE_TOO_MUCH_CHARACTERS** (0x47): The maximum of characters has already been created. Cannot create a new one.
**CREATE_INVALID_SLOT** (0x48): In invalid or occupied slot was selected.
**PAMSG_CHAR_DELETE** 0x0022 **B** character slot.
**APMSG_CHAR_DELETE_RESPONSE** 0x0023 **B** error
**APMSG_CHAR_INFO** 0x0024 **B** character slot, **S** name, **B** gender, **B** hair style, **B** hair color, **W** level, **W** character points, **W** correction points, **D** money, **W**x6 statistics
__Gender values:__
**GENDER_MALE** (0): Male gender.
**GENDER_FEMALE** (1): Female gender.
**GENDER_UNSPECIFIED** (2): When not specified yet. Should not happen.
**PAMSG_CHAR_SELECT** 0x0026 **B** index
**APMSG_CHAR_SELECT_RESPONSE** 0x0027 **B** error, **B**x32 token, **S** game address, **W** game port, **S** chat address, **W** chat port
**PAMSG_EMAIL_CHANGE** 0x0030 **S** email
**APMSG_EMAIL_CHANGE_RESPONSE** 0x0031 **B** error
__Error return values:__
**ERRMSG_OK** (0): Modification done.
**ERRMSG_EMAIL_ALREADY_EXISTS**: New email already exists for another account. Cannot change.
**PAMSG_PASSWORD_CHANGE** 0x0034 **S** old password, **S** new password
**APMSG_PASSWORD_CHANGE_RESPONSE** 0x0035 **B** error
**PGMSG_CONNECT** 0x0050 **B**x32 token
**GPMSG_CONNECT_RESPONSE** 0x0051 **B** error
**PCMSG_CONNECT** 0x0053 **B**x32 token
**CPMSG_CONNECT_RESPONSE** 0x0054 **B** error
**PGMSG_DISCONNECT** 0x0060 **B** reconnect account
**GPMSG_DISCONNECT_RESPONSE** 0x0061 **B** error, **B**x32 token
**PCMSG_DISCONNECT** 0x0063 None
**CPMSG_DISCONNECT_RESPONSE** 0x0064 **B** error
**PAMSG_RECONNECT** 0x0065 **B**x32 token
**APMSG_RECONNECT_RESPONSE** 0x0066 **B** error
Message name Hex value Values sent
**GPMSG_PLAYER_MAP_CHANGE** 0x0100 **S** filename, **W** x, **W** y
**GPMSG_PLAYER_SERVER_CHANGE** 0x0101 **B**x32 token, **S** game address, **W** game port
**GPMSG_PLAYER_ATTRIBUTE_CHANGE** 0x0130 **W** attribute, **W** base value, **W** modified value }\*
**GPMSG_PLAYER_EXP_CHANGE** 0x0140 { **W** skill, **D** exp got, **D** exp needed }\*
**GPMSG_LEVELUP** 0x0150 **W** new level, **W** character points, **W** correction points
**GPMSG_LEVEL_PROGRESS** 0x0151 **B** percent completed to next level up
**PGMSG_RAISE_ATTRIBUTE** 0x0160 **B** attribute
**GPMSG_RAISE_ATTRIBUTE_RESPONSE** 0x0161 **B** error, **B** attribute
__Error return values:__
**ATTRIBMOD_OK** (ERRMSG_OK \[0\]): Modification done without errors.
**ATTRIBMOD_INVALID_ATTRIBUTE** (0x40): Invalid attribute ID.
**ATTRIBMOD_NO_POINTS_LEFT** (0x41): No point left permitting modification.
**ATTRIBMOD_DENIED** (0x42): Modification not permitted.
**PGMSG_LOWER_ATTRIBUTE** 0x0170 **B** attribute
**GPMSG_LOWER_ATTRIBUTE_RESPONSE** 0x0171 **B** error, **B** attribute
**See __GPMSG_RAISE_ATTRIBUTE_RESPONSE__.**
**PGMSG_RESPAWN** 0x0180 None
**AGMSG_PLAYER_ENTER** 0x0510 **B**x32 token, **D** id, **S** name, serialised character data. FIXME: Explain what is contained into the character's serialized data.
**GAMSG_PLAYER_DATA** 0x0520 **D** id, serialised character data
**GAMSG_REDIRECT** 0x0530 **D** id
**AGMSG_REDIRECT_RESPONSE** 0x0531 **D** id, **B**x32 token, **S** game address, **W** game port
**GAMSG_PLAYER_RECONNECT** 0x0532 **D** id, **B**x32 token
**GAMSG_PLAYER_SYNC** 0x0533 serialised sync data
__Return values:__
**SYNC_CHARACTER_POINTS** (0x01), **D** Character ID, **D** Character Points, **D** Correction Points, **B** Attribute ID, **D** Attribute value.
**SYNC_CHARACTER_SKILL** (0x02), **D** Character ID, **B** Skill ID, **D** Skill value.
**SYNC_ONLINE_STATUS** (0x03), **D** Character ID, **B** {0x00 = offline, 0x01 = online}.
**SYNC_END_OF_BUFFER** (0xFF) shows, that the buffer ends here.
Message name Hex value Values sent
**PGMSG_PICKUP** 0x0110 **W**x2 position
**PGMSG_DROP** 0x0111 **W** slot, **W** amount
**PGMSG_EQUIP** 0x0112 **W** inventory slot
**PGMSG_UNEQUIP** 0x0113 **W** item Instance id
**PGMSG_MOVE_ITEM** 0x0114 **W** slot1, **W** slot2, **W** amount
**GPMSG_INVENTORY** 0x0120 { **W** slot, **W** item id \[, **W** amount\] (if item id is not zero) }\*
**GPMSG_INVENTORY_FULL** 0x0121 **W** inventory slot count { **W** slot, **W** itemId, **W** amount }, { **W** equip slot, **W** item Id, **W** item instance id}
**GPMSG_EQUIP** 0x0122 **W** item Id, **W** equip slot type count, plus the two following possibilities: { **W** equip slot, **W** capacity used}\* \&lt;- When equipping, or { **W** item instance, **W** 0}\* \&lt;- When unequipping.

Items messages

Message name Hex value Values sent
**GPMSG_ITEMS** 0x0281 { **W** item id, **W**x2 position }\*
**GPMSG_ITEM_APPEAR** 0x0202 **W** item id, **W**x2 position
**PGMSG_USE_ITEM** 0x0300 **B** slot
**GPMSG_USE_RESPONSE** 0x0301 **B** error

Beings messages

Message name Hex value Values sent
**GPMSG_BEING_ENTER** 0x0200 **B** type, **W** being id, **B** action, **W**x2 position, **B** direction
**Characters:** **S** name, **B** hair style, **B** hair color, **B** gender, **B** item bitmask, { **W** item id }\*
**Monsters:** **W** type id
**Npcs:** **W** type id
__Being type values:__
**OBJECT_ITEM** (0): A simple item.
**OBJECT_ACTOR** (1): An item that toggle map/quest actions (doors, switchs, ...) and can speak (map panels).
**OBJECT_NPC** (2): Non-Playable-Character is an actor capable of movement and maybe actions.
**OBJECT_MONSTER** (3): A monster (moving actor with AI. Should be able to toggle map/quest actions, too).
**OBJECT_CHARACTER** (4): A normal being.
**OBJECT_EFFECT** (5): A effect to be shown.
**OBJECT_OTHER** (6): Server-only object.
**GPMSG_BEING_LEAVE** 0x0201 **W** being id
**GPMSG_BEING_LOOKS_CHANGE** 0x0210 **W** weapon, **W** hat, **W** top clothes, **W** bottom clothes
__Sprite layer values (used in clothes messages):__
**SPRITE_BASE** (0): the sprite representing the character.
**SPRITE_SHOE** (1): The character feet sprite layer.
**SPRITE_BOTTOMCLOTHES** (2): The bottom-clothes layer
**SPRITE_TOPCLOTHES** (3): The top clothes layer.
**SPRITE_HAIR** (4): The hair layer.
**SPRITE_HAT** (5): The hat layer.
**SPRITE_WEAPON** (6): The weapon layer.
**PGMSG_WALK** 0x0260 **W**x2 destination
**PGMSG_ACTION_CHANGE** 0x0270 **B** Action
__Action type values:__
**STAND** (0): Simply stand.
**WALK** (1): Simply walks.
**ATTACK** (2): A normal attack action.
**SIT** (3): Sit on the ground.
**DEAD** (4): Is on the ground unconscious.
**HURT** (5): Is being hurt.
**GPMSG_BEING_ACTION_CHANGE** 0x0271 **W** being id, **B** action
**PGMSG_DIRECTION_CHANGE** 0x0272 **B** Direction
__Direction type values (Bitmask):__
**DOWN** (1): Looks down (bottom of screen).
**LEFT** (2): Looks to the left.
**UP** (4): Looks to the north.
**RIGHT** (8): Looks to the right.
(Opposite concatenated directions are obviously unaccepted.)
**GPMSG_BEING_DIR_CHANGE** 0x0273 **W** being id, **B** direction
**GPMSG_BEING_HEALTH_CHANGE** 0x0274 **W** being id, **W** health
**GPMSG_BEINGS_MOVE** 0x0280 { **W** being id, **B** flags \[, **W**x2 position, **B** speed\] }\*
__Flag values:__
**MOVING_POSITION** (1): The next Wx2 values will contain the current being position.
**MOVING_DESTINATION** (2): The next Wx2 values will contain the being destination.
**GPMSG_BEINGS_DAMAGE** 0x0310 { **W** being id, **W** amount }\*
**PGMSG_ATTACK** 0x0290 **W** being id
**GPMSG_BEING_ATTACK** 0x0291 **W** being id, **B** direction, **B** attack type
__Attack type values:__
**HIT** (0x00): Simple physical hit.
**CRITICAL** (0x0a): Critical hit.
**MULTI** (0x08): A multi-hit attack.
**REFLECT** (0x04): A counter-attack.
**FLEE** (0x0b): A missed attack.
**PGMSG_USE_SPECIAL** 0x0292 **B** special ID
**GPMSG_SPECIAL_STATUS** 0x0293 { **B** special ID, **D** current, **D** max, **D** recharge }

Effects spawning messages

Message name Hex value Values sent
**GPMSG_CREATE_EFFECT_POS** 0x0320 **W** effect id, **W**x2 position
**GPMSG_CREATE_EFFECT_BEING** 0x0321 **W** effect id, **W** BeingID

Npc messages

Message name Hex value Values sent
**GPMSG_NPC_CHOICE** 0x02B0 **W** being id, { **S** text }\*
**GPMSG_NPC_MESSAGE** 0x02B1 **W** being id, **B** \* text
**PGMSG_NPC_TALK** 0x02B2 **W** being id
**PGMSG_NPC_TALK_NEXT** 0x02B3 **W** being id
**PGMSG_NPC_SELECT** 0x02B4 **W** being id, **B** choice
**GPMSG_NPC_BUY** 0x02B5 **W** being id, { **W** item id, **W** amount, **W** cost }\*
**GPMSG_NPC_SELL** 0x02B6 **W** being id, { **W** item id, **W** amount, **W** cost }\*
**PGMSG_NPC_BUYSELL** 0x02B7 **W** item id, **W** amount
**GPMSG_NPC_ERROR** 0x02B8 **B** error
**GPMSG_NPC_CLOSE** 0x02B9 **W** being id
**GPMSG_NPC_POST** 0x02D0 **W** being id
**PGMSG_NPC_POST_SEND** 0x02D1 **W** being id, { **S** name, **S** text, **W** item id }
**GPMSG_NPC_POST_GET** 0x02D2 **W** being id, { **S** name, **S** text, **W** item id }
**PGMSG_NPC_NUMBER** 0x02D3 **W** being id, **D** number
**PGMSG_NPC_STRING** 0x02D4 **W** being id, **S** string
**GPMSG_NPC_NUMBER** 0x02D5 **W** being id, **D** max, **D** min, **D** default
**GPMSG_NPC_STRING** 0x02D6 **W** being id

Chat messages

General chat messages

Message name Hex value Values sent
**PGMSG_SAY** 0x02A0 **S** text
**GPMSG_SAY** 0x02A1 **W** being id, **S** text
**CPMSG_ERROR** 0x0401 **B** error
__Error return values:__
**CHAT_USING_BAD_WORDS** (0x40): Detected pre-configured slangs in the chat sentence.
**CHAT_UNHANDLED_COMMAND** (0x41): Not handled command entered in chat prompt.
**CPMSG_ANNOUNCEMENT** 0x0402 **S** text
**CPMSG_PRIVMSG** 0x0403 **S** user, **S** text
**CPMSG_PUBMSG** 0x0404 **W** channel, **S** user, **S** text
**PCMSG_CHAT** 0x0410 **S** text, **W** channel
**PCMSG_ANNOUNCE** 0x0411 **S** text
**PCMSG_PRIVMSG** 0x0412 **S** user, **S** text
**PCMSG_WHO** 0x0415 None
**CPMSG_WHO_RESPONSE** 0x0416 { **S** user }

Chat channeling messages

Message name Hex value Values sent
**CPMSG_CHANNEL_EVENT** 0x0430 **W** channel, **B** event, **S** info
__Event values:__
**CHAT_EVENT_NEW_PLAYER** (0): A new player entered the channel.
**CHAT_EVENT_LEAVING_PLAYER** (1): A player left the channel.
**CHAT_EVENT_TOPIC_CHANGE** (2): Channel topic changed.
**CHAT_EVENT_MODE_CHANGE** (3): Channel mode changed.
**CHAT_EVENT_KICKED_PLAYER** (4): A player was kicked from the channel.
FIXME: Document info values.
**PCMSG_ENTER_CHANNEL** 0x0440 **S** channel, **S** password
**CPMSG_ENTER_CHANNEL_RESPONSE** 0x0441 **B** error, **W** id, **S** name, **S** topic, **S** userlist
**PCMSG_QUIT_CHANNEL** 0x0443 **W** channel id
**CPMSG_QUIT_CHANNEL_RESPONSE** 0x0444 **B** error, **W** channel id
**PCMSG_LIST_CHANNELS** 0x0445 None
**CPMSG_LIST_CHANNELS_RESPONSE** 0x0446 **S** names, **W** number of users
**PCMSG_LIST_CHANNELUSERS** 0x0460 **S** channel
**CPMSG_LIST_CHANNELUSERS_RESPONSE** 0x0461 **S** channel, { **S** user, **B** mode }
**PCMSG_TOPIC_CHANGE** 0x0462 **W** channel id, **S** topic

Trade protocol messages

Message name Hex value Values sent
**PGMSG_TRADE_REQUEST** 0x02C0 **W** being id
**GPMSG_TRADE_REQUEST** 0x02C1 **W** being id
**GPMSG_TRADE_START** 0x02C2 None
**GPMSG_TRADE_COMPLETE** 0x02C3 None
**PGMSG_TRADE_CANCEL** 0x02C4 None
**GPMSG_TRADE_CANCEL** 0x02C5 None
**PGMSG_TRADE_AGREED** 0x02C6 None
**GPMSG_TRADE_AGREED** 0x02C7 None
**PGMSG_TRADE_CONFIRM** 0x02C8 None
**GPMSG_TRADE_CONFIRM** 0x02C9 None
**PGMSG_TRADE_ADD_ITEM** 0x02CA **B** slot, **B** amount
**GPMSG_TRADE_ADD_ITEM** 0x02CB **W** item id, **B** amount
**PGMSG_TRADE_SET_MONEY** 0x02CC **D** amount
**GPMSG_TRADE_SET_MONEY** 0x02CD **D** amount
**GPMSG_TRADE_BOTH_CONFIRM** 0x02CE None

Party messages

Message name Hex value Values sent
**PCMSG_PARTY_INVITE** 0x03A0 **S** name
**CPMSG_PARTY_INVITE_RESPONSE** 0x03A1 **B** error, **S** name
**CPMSG_PARTY_INVITED** 0x03A2 **S** name
**PCMSG_PARTY_ACCEPT_INVITE** 0x03A5 **S** name
**CPMSG_PARTY_ACCEPT_INVITE_RESPONSE** 0x03A6 **B** error, { **S** name }
**PCMSG_PARTY_REJECT_INVITE** 0x03A7 **S** name
**CPMSG_PARTY_REJECTED** 0x03A8 **S** name
**PCMSG_PARTY_QUIT** 0x03AA None
**CPMSG_PARTY_QUIT_RESPONSE** 0x03AB **B** error
**CPMSG_PARTY_NEW_MEMBER** 0x03B0 **W** being id, **S** name
**CPMSG_PARTY_MEMBER_LEFT** 0x03B1 **W** being id
**CGMSG_CHANGED_PARTY** 0x0590 **D** character id, **D** party id

Guild messages

Message name Hex value Values sent
**PCMSG_GUILD_CREATE** 0x0350 **S** name
**CPMSG_GUILD_CREATE_RESPONSE** 0x0351 **B** error, **W** guild, **B** rights, **W** channel
**PCMSG_GUILD_INVITE** 0x0352 **W** id, **S** name
**CPMSG_GUILD_INVITE_RESPONSE** 0x0353 **B** error
**PCMSG_GUILD_ACCEPT** 0x0354 **W** id
**CPMSG_GUILD_ACCEPT_RESPONSE** 0x0355 **B** error, **W** guild, **B** rights, **W** channel
**PCMSG_GUILD_GET_MEMBERS** 0x0356 **W** id
**CPMSG_GUILD_GET_MEMBERS_RESPONSE** 0x0357 **S** names, **B** online
**CPMSG_GUILD_UPDATE_LIST** 0x0358 **W** id, **S** name, **B** event
__Events values:__
**GUILD_EVENT_NEW_PLAYER** (0): A new player joinded the guild.
**GUILD_EVENT_LEAVING_PLAYER** (1): A player left the guild.
**GUILD_EVENT_ONLINE_PLAYER** (2): A guild member has joined the game.
**GUILD_EVENT_OFFLINE_PLAYER** (3): A guild member left the game.
**PCMSG_GUILD_QUIT** 0x0360 **W** id
**CPMSG_GUILD_QUIT_RESPONSE** 0x0361 **B** error
**PCMSG_GUILD_PROMOTE_MEMBER** 0x0365 **W** guild, **S** name, **B** rights
**CPMSG_GUILD_PROMOTE_MEMBER_RESPONSE** 0x0366 **B** error
**PCMSG_GUILD_KICK_MEMBER** 0x0370 **W** guild, **S** name
**CPMSG_GUILD_KICK_MEMBER_RESPONSE** 0x0371 **B** error
**CPMSG_GUILD_INVITED** 0x0388 **S** char name, **S** guild name, **W** id
**CPMSG_GUILD_REJOIN** 0x0389 **S** name, **W** guild, **W** rights, **W** channel, **S** announce

User mode messages

Message name Hex value Values sent
**PCMSG_USER_MODE** 0x0465 **W** channel id, **S** name, **B** mode
**PCMSG_KICK_USER** 0x0466 **W** channel id, **S** name
**GAMSG_BAN_PLAYER** 0x0550 **D** id, **W** duration
**GAMSG_CHANGE_PLAYER_LEVEL** 0x0555 **D** id, **W** level
**GAMSG_CHANGE_ACCOUNT_LEVEL** 0x0556 **D** id, **W** level

Quests messages

Message name Hex value Values sent
**GAMSG_SET_QUEST** 0x0540 **D** id, **S** name, **S** value
**GAMSG_GET_QUEST** 0x0541 **D** id, **S** name
**AGMSG_GET_QUEST_RESPONSE** 0x0542 **D** id, **S** name, **S** value

Postal system messages

Message name Hex value Values sent
**GCMSG_REQUEST_POST** 0x05A0 **D** character id
**CGMSG_POST_RESPONSE** 0x05A1 **D** receiver id, { **S** sender name, **S** letter, **W** num attachments { **W** attachment item id, **W** quantity } }
**GCMSG_STORE_POST** 0x05A5 **D** sender id, **S** receiver name, **S** letter, { **W** attachment item id, **W** quantity }
**CGMSG_STORE_POST_RESPONSE** 0x05A6 **D** id, **B** error

Inter-server messages

Message name Hex value Values sent
**AGMSG_ACTIVE_MAP** 0x0502 **W** map id
**GAMSG_STATISTICS** 0x0560 { **W** map id, **W** thing nb, **W** monster nb, **W** player nb, { **D** character id }\* }\*
**GAMSG_TRANSACTION** 0x0600 **D** character id, **D** action, **S** message

Maximum message value limit (Do not use)

Message name Hex value Values sent
**XXMSG_INVALID** 0x7FFF None

Other values

The protocol version

In order to only accept connections from sufficiently up-to-date clients, the server is requesting a minimal protocol version which must be at least equal to the PROTOCOL_VERSION value.

Generic return values

Here are values returned to sender corresponding to generic events (found in many places.)

Return value Description
**ERRMSG_OK** (0) Everything is fine.
**ERRMSG_FAILURE** (1) The action failed.
**ERRMSG_NO_LOGIN** (2) The user is not yet logged.
**ERRMSG_NO_CHARACTER_SELECTED** (3) The user needs a character first.
**ERRMSG_INSUFFICIENT_RIGHTS** (4) The user is not privileged enough to do so.
**ERRMSG_INVALID_ARGUMENT** (5) Part of the received message was invalid.
**ERRMSG_EMAIL_ALREADY_EXISTS** (6) The Email Address already exists.
**ERRMSG_ALREADY_TAKEN** (7) Character or account name used was already taken.
**ERRMSG_SERVER_FULL** (8) The server is overloaded.
**ERRMSG_TIME_OUT** (9) Data failed to arrive in due time.
**ERRMSG_LIMIT_REACHED** (10) Server limit reached.
**ERRMSG_ADMINISTRATIVE_LOGOFF** (11) The connection with the client was closed on purpose. (E.g.: The client was kicked or banned.)