Smooth
Administrateurs
-
Adhésion
-
Dernière visite
-
Actuellement
Ajout d'un article de blog dans : c25f89372458901ba5ba2ca865bdbe9d
Tout ce qui a été publié par Smooth
-
CharacterNameSuggestionEvent
A server-generated character name proposal. Kind eventArea Game.CharacterNamed by beta, gamemapping The answer to CharacterNameSuggestionRequest: one proposed name, which the client offers as the player's next candidate. IT IS A PROPOSAL, NOT A RESERVATION. Nothing is held for you - the name can be taken between the suggestion and your creation request. When you may send it Requires authenticated observed Related messages Arrives after CharacterNameSuggestionRequest Fields #FieldTypeMeaningYou set it 1suggestionstringThe proposed character name.never Recovered with score 220, confidence 0.86, margin 220 over the runner-up. A margin close to the score means nothing else came near; a thin margin means a decoy nearly won. Members recovered: 1 of 1.
-
CharacterLook
A character's rendered appearance and breed, nested inside its basic information. Kind structArea Game.Character.ManagementNamed by beta The appearance layer of a Character. look is a full EntityLook - the same appearance record used everywhere else in the protocol, so whatever you already do with actor looks works here. breed_id is the class. It is the cheapest useful thing in this record: it tells you what the character IS without resolving any art. The record also carries strings and further branches that are not proven and are left with their obfuscated names rather than guessed at. Not sent on its own — it is only ever a branch of CharacterBasicInformation. inferred Used by CharacterBasicInformation Fields #FieldTypeMeaningYou set it 3lookEntityLookThe character's appearance. An EntityLook.never 6breed_idint32The character's class. (breed id)never 7base_informationCharacterBaseInformationThe base-information branch read by the client's character projection. See CharacterBaseInformation.never Recovered with score 115, confidence 0.96, margin 115 over the runner-up. A margin close to the score means nothing else came near; a thin margin means a decoy nearly won. Members recovered: 3 of 7.
-
CharacterLoadingCompleteEvent
The selected character has finished loading; the world-entry burst starts here. Kind eventArea Game.ContextNamed by beta, gamemapping Carries no payload. Arrival is the server's "you are in" signal, closing the long inbound burst that follows CharacterSelectionRequest. IT DOES NOT CREATE THE GAME CONTEXT. That is ContextCreationRequest, which the real client sends about 1.4 seconds later as step 5 of a seven-step burst: sequence number, the contact and warning settings, the guild requests, context creation, then the api-token and channel requests. NONE OF THAT BURST IS OBLIGATORY. A bot that skips it stays connected and simply never learns the data those requests fetch. When you may send it Requires character_selected observed State it changes Establishes character_loaded observed — the client begins its world-entry request burst on this cue Related messages Arrives after CharacterSelectionRequest No fields you may set. Recovered with score 225, confidence 0.88, margin 225 over the runner-up. A margin close to the score means nothing else came near; a thin margin means a decoy nearly won. Members recovered: 0 of 2.
-
CharacterListEvent
The account's characters on this server, with everything needed to select one. Kind eventArea Game.Character.ManagementNamed by beta, gamemapping Answers CharacterListRequest. THIS IS THE ONLY SOURCE OF A CHARACTER ID. The id you put in CharacterSelectionRequest must come from here - an id from another account, another server, or an earlier session is rejected. Each entry carries the character's look and level as well as its id, so the list is enough to choose without any further request. When you may send it Requires authenticated observed Related messages Arrives after CharacterListRequest Fields #FieldTypeMeaningYou set it 1charactersrepeated CharacterOne entry per character on the account for this server.never Recovered with score 121, confidence 0.98, margin 121 over the runner-up. A margin close to the score means nothing else came near; a thin margin means a decoy nearly won. Members recovered: 1 of 1.
-
CharacterLifeStatusEvent
Whether the played character is alive, dead or a phantom, and where its phoenix statue stands. Kind eventArea Game.CharacterNamed by beta, gamemapping, stringtable THE MESSAGE THAT TELLS YOU YOU ARE DEAD. Any script that fights needs to handle it: after a death the character is still connected, still receives events, and can still be told to walk - it just cannot do anything useful. It arrives once during the connection state burst, so the first one you see is not a death; it is the current state. Every later one is a real transition. phoenix_map_id is where the character would revive - the map holding its phoenix statue. It is meaningful whether or not you are currently dead, and it is a map id in the same space as MapInformationRequest.map_id. When you may send it Requires character_selected observed Related messages Unsolicited - nothing you send causes this sent in the connection burst and again on every death and resurrection Fields #FieldTypeMeaningYou set it 1statetype not documented yetWhether the character is alive, dead or a phantom.never 2phoenix_map_idint64The map holding the phoenix statue this character would revive at. (map id)never Recovered with score 380, confidence 0.92, margin 380 over the runner-up. A margin close to the score means nothing else came near; a thin margin means a decoy nearly won. Members recovered: 2 of 2.
-
CharacterLevelUpEvent
Your character reached a new level; this is that level. Kind eventArea Game.CharacterNamed by beta, gamemapping Your character just levelled up. The value is the NEW level, not an increment. WHAT THE CLIENT DOES WITH IT. It stores the new level on the played character, works out the rewards unlocked for your class at that level, and opens the level-up window. IF YOU TRACK LEVEL YOURSELF, overwrite it with this value. Experience figures arrive separately in CharacterCharacteristicsEvent and CharacterExperienceGainEvent. When you may send it Requires character_selected inferred Related messages Unsolicited - nothing you send causes this the client reacts to it without having asked for anything Fields #FieldTypeMeaningYou set it 1new_levelint32The level the character has just reached. The new level itself, not a number of levels gained.never Recovered with score 260, confidence 0.90, margin 260 over the runner-up. A margin close to the score means nothing else came near; a thin margin means a decoy nearly won. Members recovered: 1 of 1.
-
CharacterExperienceGainEvent
Experience the played character just earned, on a kill, quest turn-in, harvest or craft. Kind eventArea Game.CharacterNamed by beta, gamemapping A gain notification, so the client can animate the experience bar. It is a DELTA, not a total - the totals live in CharacterCharacteristics. THE CURRENT MESSAGE CARRIES ONLY THE CHARACTER'S OWN EXPERIENCE. The reference build declared mount and guild experience alongside it and the current build does not: that is a real schema reduction, confirmed by the client's own localisation strings, not a gap in recovery. Do not go looking for the other two. Useful as an activity signal: it fires on kills, quest turn-ins, harvests and crafts, which makes it a cheap way to tell that something you did actually worked. When you may send it Requires character_selected observed Related messages Unsolicited - nothing you send causes this the server reports gains as they happen Fields #FieldTypeMeaningYou set it 2character_experienceint64The experience the played character just earned. (experience points) A delta, not a total. The reference build declared mount and guild amounts beside it; the current schema has dropped them.never Recovered with score 280, confidence 0.91, margin 280 over the runner-up. A margin close to the score means nothing else came near; a thin margin means a decoy nearly won. Members recovered: 1 of 2.
-
CharacterDeletionPrepareEvent
The server naming the character about to be destroyed and stating whether a secret answer is required. Kind eventArea Game.CharacterNamed by beta, gamemapping STEP 2 OF 3. Read need_secret_answer before doing anything else: it decides whether CharacterDeletionRequest must carry a hash, and it is per character. character_id IS GONE FROM THIS MESSAGE. The reference build declared one and NO dumped build carries it - the client already knows which character it asked about. Do not expect it and do not treat its absence as a decode failure. THE TWO STRINGS ARE DELIBERATELY UNNAMED. One is the character's NAME and the other is the SECRET QUESTION, and nothing available separates them: both are singular strings, so type says nothing; declaration order is untrustworthy throughout this protocol; and the client's read order was measured and does not settle it either. They stand with their obfuscated names rather than being guessed - which matters here, because showing the player the wrong string in a deletion confirmation is worse than showing none. When you may send it Requires authenticated observed Related messages You must then send CharacterDeletionRequest inferred — the flow is left open until the client either confirms or abandons it Arrives after PrepareCharacterDeletionRequest Sequence Step character_deletion.2 inferred — of 3 steps; the flow is a fixed ask / terms / confirm exchange Fields #FieldTypeMeaningYou set it 3need_secret_answerboolWhether confirming the deletion must carry a hashed secret answer. Decided per character. Read it before building step 3.never Recovered with score 155, confidence 0.85, margin 155 over the runner-up. A margin close to the score means nothing else came near; a thin margin means a decoy nearly won. Members recovered: 1 of 3.
-
CharacterCreationResultEvent
Says whether the character was created, and when the name was the problem, exactly what was wrong with it. Kind eventArea Game.Character.ManagementNamed by beta, gamemapping Answers CharacterCreationRequest - success and every kind of refusal arrive through this one message. READ THE RESULT FIRST, THE REASON SECOND TWO MEMBERS, AND ONLY ONE OF THEM ALWAYS MEANS SOMETHING. The result says what happened. The reason describes the NAME, and it is meaningful only when the result says the name was the problem - on every other outcome it is whatever the server left it at, usually the zero value, and reading it will tell you the name was fine while the creation failed for some other reason entirely. SUCCESS IS THE ZERO VALUE of the result. That is the client's own test: it treats zero as created and anything greater as a refusal, then switches on the refusal to choose what to show. The distinct refusals the 3.6.10.10 client recognises are, in its own words: no reason given, the name was invalid, you already have too many characters, and you are not allowed to - which its popup calls "not a subscriber". Newer values exist in the enum that the client does not handle individually. WHAT TO DO WITH IT ON SUCCESS, RE-READ THE CHARACTER LIST. The event carries no character: it does not tell you the id, the name or anything else about what was created. The real client marks the creation validated and moves on; the new character reaches it through the list, not through this message. ON AN INVALID NAME, THE REASON IS ACTIONABLE - it is the only refusal where you learn something you can fix without asking the player. IT ARRIVES BY TYPE. The request went out uncorrelated, so nothing links this event back to it by uid. Do not wait for a matching uid; wait for the event. BEWARE THE PADDING. The message is padded with a member of the SAME enum type as the result, and which member is padding changes between builds. Read by role, never by field number. When you may send it Requires authenticated observed Related messages Arrives after CharacterCreationRequest Fields #FieldTypeMeaningYou set it 2resultCharacterCreationResultWhether the character was created, and if not, which class of refusal it was.never 3reasonNameComplianceWhat was wrong with the name. Only meaningful when the result says the name was rejected.never Recovered with score 190, confidence 0.89, margin 190 over the runner-up. A margin close to the score means nothing else came near; a thin margin means a decoy nearly won. Members recovered: 2 of 3.
-
CharacterCreationResult
Whether the character was created, and broadly why not. Kind enumArea Game.Character.ManagementNamed by beta THE OUTCOME OF A CHARACTER CREATION. Only CREATE_OK means the character exists. CREATE_ERROR_INVALID_NAME is the one that carries detail: the companion NameCompliance member says which naming rule was broken. Every other value is the whole story on its own. EXPECT VALUES YOU DO NOT KNOW. This enum has grown twice since the reference build - six values became eight, then nine - and the newer ones have no published names. Treat any value other than CREATE_OK as a refusal, show the server's own message if you have one, and do not switch exhaustively on it. Not sent on its own — it is a member type of CharacterCreationResultEvent, never sent alone. proven Used by CharacterCreationResultEvent Values ValueNumberMeaning CREATE_OK0The character was created. The name is the reference build's, matched by NUMBER. Values 0-5 are present on every dumped build; the enum has only ever GROWN (6 values through 3.4.18.19, 8 from 3.5.3.1, 9 from 3.6.10.10), which is what makes the low numbers safe to carry across. No dumped client distinguishes one value from another, so only the NUMBER is proven. CREATE_ERROR_NO_REASON1Refused, and the server gives no reason. The name is the reference build's, matched by NUMBER. Values 0-5 are present on every dumped build; the enum has only ever GROWN (6 values through 3.4.18.19, 8 from 3.5.3.1, 9 from 3.6.10.10), which is what makes the low numbers safe to carry across. No dumped client distinguishes one value from another, so only the NUMBER is proven. CREATE_ERROR_INVALID_NAME2Refused because of the name; read the companion reason for which rule it broke. The name is the reference build's, matched by NUMBER. Values 0-5 are present on every dumped build; the enum has only ever GROWN (6 values through 3.4.18.19, 8 from 3.5.3.1, 9 from 3.6.10.10), which is what makes the low numbers safe to carry across. No dumped client distinguishes one value from another, so only the NUMBER is proven. CREATE_ERROR_TOO_MANY_CHARACTERS3You already hold as many characters as this account allows. The name is the reference build's, matched by NUMBER. Values 0-5 are present on every dumped build; the enum has only ever GROWN (6 values through 3.4.18.19, 8 from 3.5.3.1, 9 from 3.6.10.10), which is what makes the low numbers safe to carry across. No dumped client distinguishes one value from another, so only the NUMBER is proven. CREATE_ERROR_NOT_ALLOWED4Creation is not permitted for this account right now. The name is the reference build's, matched by NUMBER. Values 0-5 are present on every dumped build; the enum has only ever GROWN (6 values through 3.4.18.19, 8 from 3.5.3.1, 9 from 3.6.10.10), which is what makes the low numbers safe to carry across. No dumped client distinguishes one value from another, so only the NUMBER is proven. CREATE_ERROR_NEW_PLAYER_NOT_ALLOWED5Creation is not permitted for a new player on this server. The name is the reference build's, matched by NUMBER. Values 0-5 are present on every dumped build; the enum has only ever GROWN (6 values through 3.4.18.19, 8 from 3.5.3.1, 9 from 3.6.10.10), which is what makes the low numbers safe to carry across. No dumped client distinguishes one value from another, so only the NUMBER is proven. Recovered with score 205, confidence 0.88, margin 205 over the runner-up. A margin close to the score means nothing else came near; a thin margin means a decoy nearly won. Members recovered: 6 of 9.
-
CharacterColors
The palettes a character owns, plus the slot counts that bound them. Kind structArea Game.CosmeticNamed by gamemapping The owned palettes, plus how many palette slots exist. The list is a REPLACEMENT of what you held before, not an addition. Alongside the list this record carries small integers describing the slot budget - in a captured trace, one owned palette against a total of sixteen slots. Which integer is which is NOT named here; see the signature notes. Not sent on its own — it is the payload of CharacterAppearanceCollectionEvent.colors, never sent alone. proven Used by CharacterAppearanceCollectionEvent Fields #FieldTypeMeaningYou set it 1palettesrepeated ColorPaletteEvery colour palette the character owns.never Recovered with score 140, confidence 0.86, margin 140 over the runner-up. A margin close to the score means nothing else came near; a thin margin means a decoy nearly won. Members recovered: 1 of 3.
-
CharacterCharacteristicsEvent
The played character's full characteristic sheet, sent as a complete replacement. Kind eventArea Game.CharacterNamed by beta, gamemapping The character sheet: level progression, kamas, alignment, every characteristic and the current spell modifiers. IT REPLACES, IT DOES NOT PATCH. The client throws away its cached characteristic state and rebuilds it from this message. Do the same - a merge leaves you holding modifiers that have expired. IT ALSO CARRIES KAMAS, AND SO DOES InventoryContentEvent. The client treats this one as authoritative: it compares the value here against the balance its inventory service holds and pushes this one over the top when they differ. If your two sources disagree, this is the winner. Everything is inside CharacterCharacteristics. Note that the schema declares more than one field of that type and only one is ever populated - read the named one. When you may send it Requires character_selected observed Related messages Unsolicited - nothing you send causes this it arrives in the login burst and again whenever the sheet changes; no request asks for it Fields #FieldTypeMeaningYou set it 2statsCharacterCharacteristicsThe complete characteristic sheet. See CharacterCharacteristics. The schema declares more than one member of this type; only this one is consumed.never Recovered with score 95, confidence 0.94, margin 95 over the runner-up. A margin close to the score means nothing else came near; a thin margin means a decoy nearly won. Members recovered: 1 of 2.
-
CharacterCharacteristics
The played character's progression, wealth, alignment, characteristics and spell modifiers. Kind structArea Game.CharacterNamed by beta, gamemapping Everything on the character sheet in one record. THE FOUR EXPERIENCE VALUES ARE A PROGRESS BAR, NOT A LEVEL. Read them together: experience_level_floor what you needed for the level you have experience where you are now experience_next_level_floor what you need for the next level so progress through the current level is (experience - experience_level_floor) / (experience_next_level_floor - experience_level_floor). NONE OF THESE IS THE LEVEL ITSELF - the level is not in this record. experience_bonus_limit is a separate ceiling: the point up to which the character still earns a bonus rate. It is not the next level. characteristics is the real sheet - one row per characteristic, as CharacterCharacteristic. A live capture carried 120 rows, so index it by id rather than scanning. kamas here is authoritative over the inventory's copy; see CharacterCharacteristicsEvent. Not sent on its own — it is only ever carried by CharacterCharacteristicsEvent. inferred Used by CharacterCharacteristicsEvent Fields #FieldTypeMeaningYou set it 1alignment_informationAlignmentInformationThe character's alignment state. See AlignmentInformation.never 3critical_hit_weaponint32The weapon critical-hit bonus. The client narrows this to 16 bits when projecting the character.never 4experience_level_floorint64The experience total required to have reached the current level. (experience points) Lower bound of the current level's progress bar.never 5characteristicsrepeated CharacterCharacteristicEvery characteristic the character has, as id-and-value rows. Element type CharacterCharacteristic. A live 3.6.10.10 capture carried 120 rows - index by id, do not scan.never 6experienceint64The character's current total experience. (experience points)never 7probation_timeint64The probation period still applied to the character.never 8experience_next_level_floorint64The experience total required to reach the next level. (experience points) Upper bound of the current level's progress bar.never 9spell_modifiersrepeated SpellModifierThe per-spell modifiers currently in effect. Element type SpellModifier, whose members are not individually recovered.never 10experience_bonus_limitint64The experience ceiling up to which the character still earns a bonus rate. (experience points) Not the next level threshold - a separate ceiling.never 11kamasint64The character's current kamas balance. (kamas) Authoritative over the balance carried by InventoryContentEvent.kamas.never Recovered with score 165, confidence 0.91, margin 165 over the runner-up. A margin close to the score means nothing else came near; a thin margin means a decoy nearly won. Members recovered: 10 of 11.
-
CharacterCharacteristicValue
The simplest characteristic shape: a single total with no breakdown. Kind structArea Game.CommonNamed by beta A bare total. It is the smallest of the three shapes a CharacterCharacteristic row can take. The current build pads this message with a message-typed member beside total. That member is not part of the contract and stands with its obfuscated name. Not sent on its own — it is only ever the value branch of CharacterCharacteristic. proven Used by CharacterCharacteristic Fields #FieldTypeMeaningYou set it 1totalint64The characteristic's value.never Recovered with score 130, confidence 0.82, margin 130 over the runner-up. A margin close to the score means nothing else came near; a thin margin means a decoy nearly won. Members recovered: 1 of 1.
-
CharacterCharacteristicDetailedUsable
A characteristic's six-part breakdown plus how much of it has been used. Kind structArea Game.CommonNamed by beta, gamemapping The usable shape of a characteristic row: the same six parts as CharacterCharacteristicDetailed, plus a used component. IT IS FOR CHARACTERISTICS THAT GET SPENT. In live data only action points and movement points arrive in this shape - exactly the two a turn consumes. used is how much has been spent. THE CLIENT KEEPS ALL SEVEN. It builds its usable stat from exactly these seven members. Read them by name: all seven are int32 and their field numbers move between builds. Not sent on its own — it is only ever the usable branch of CharacterCharacteristic. proven Used by CharacterCharacteristic Fields #FieldTypeMeaningYou set it 1usedint32How much of the characteristic has already been spent. Only this variant carries it; in live data it arrives for action and movement points.never 2additionalint32The additional part on top of the base.never 3alignment_gift_bonusint32The bonus granted by alignment gifts.never 4context_modificationint32The modification applied by the current context.never 5temporaryint32The temporary part of the characteristic.never 6objects_and_mount_bonusint32The bonus coming from equipped items and the mount.never 7baseint32The base part of the characteristic.never Recovered with score 255, confidence 0.92, margin 255 over the runner-up. A margin close to the score means nothing else came near; a thin margin means a decoy nearly won. Members recovered: 7 of 7.
-
CharacterCharacteristicDetailed
A characteristic split into the parts it is made of: base, additional, equipment and mount, alignment gift, context and temporary. Kind structArea Game.CommonNamed by beta, gamemapping The detailed shape of a characteristic row: the same value, kept as six separate parts instead of one total. This is what the character sheet needs to show where a characteristic comes from. THE CLIENT KEEPS ALL SIX. It builds its detailed stat from exactly these six members and no others, so a bot that wants the client's view should keep them separately too. READ THE PARTS BY NAME. All six are int32 and their field numbers move between builds; the recovered names are the only stable key. Anything else this message declares is padding the client never reads. If the row also has a used component it arrives as CharacterCharacteristicDetailedUsable instead, not as this message. Not sent on its own — it is only ever the detailed branch of CharacterCharacteristic. proven Used by CharacterCharacteristic Fields #FieldTypeMeaningYou set it 1temporaryint32The temporary part of the characteristic.never 3additionalint32The additional part on top of the base.never 4context_modificationint32The modification applied by the current context.never 5baseint32The base part of the characteristic.never 7alignment_gift_bonusint32The bonus granted by alignment gifts.never 8objects_and_mount_bonusint32The bonus coming from equipped items and the mount.never Recovered with score 245, confidence 0.92, margin 245 over the runner-up. A margin close to the score means nothing else came near; a thin margin means a decoy nearly won. Members recovered: 6 of 8.
-
CharacterCharacteristic
One characteristic and its value, in one of three shapes of increasing detail. Kind structArea Game.CommonNamed by beta One row of the sheet. characteristic_id says which characteristic; a oneof says how much detail came with it. BRANCH ON THE ONEOF - THE THREE SHAPES ARE NOT INTERCHANGEABLE: value a single total, no breakdown detailed base, bonuses and modifiers separately usable the detailed breakdown plus a used component WHICH BRANCH ARRIVES IS THE SERVER'S CHOICE, NOT A PROPERTY OF THE CHARACTERISTIC. In live data only actively used characteristics come through as usable. A script that reads value unconditionally gets a zero for every detailed row, which is indistinguishable from a genuine zero. If all you want is the number, take the total from whichever branch is set rather than assuming value. DO NOT TELL detailed FROM usable BY SIZE. Their declared member counts are padded differently in every build, and in some builds detailed is the larger of the two. Read the recovered names, or check which one carries a used component. characteristic_id is left unnamed on any build that declares a second singular int32 beside it - on those builds it stands obfuscated rather than guessed at. Not sent on its own — it is only ever a row of CharacterCharacteristics.characteristics. proven Used by CharacterCharacteristics Fields #FieldTypeMeaningYou set it 4characteristic_idint32Which characteristic this row describes. (characteristic id)never 1usableCharacterCharacteristicDetailedUsableThe detailed breakdown plus a used component. See CharacterCharacteristicDetailedUsable. In live data only action and movement points arrive in this shape.never 2valueCharacterCharacteristicValueThe characteristic as a single total, with no breakdown. See CharacterCharacteristicValue. Only meaningful when this is the branch that is set.never 3detailedCharacterCharacteristicDetailedThe characteristic broken down into base, bonuses and modifiers. See CharacterCharacteristicDetailed. Only meaningful when this is the branch that is set.never Recovered with score 215, confidence 0.89, margin 215 over the runner-up. A margin close to the score means nothing else came near; a thin margin means a decoy nearly won. Members recovered: 4 of 4.
-
CharacterBasicInformation
A character's name, level and appearance, nested inside its list entry. Kind structArea Game.Character.ManagementNamed by beta The readable half of a Character. level HAS EXPLICIT PRESENCE, so absent and level 0 are different things. The client reads it through a presence-aware accessor; a character with no level value is not a level-zero character. The appearance is one level further down, in CharacterLook. Other members of this record are not individually proven and stand with their obfuscated names. Not sent on its own — it is only ever a branch of Character. inferred Used by Character Fields #FieldTypeMeaningYou set it 4levelint32The character's level. Explicit presence: absent is not the same as zero.never 5namestringThe character's display name.never 1character_lookCharacterLookThe character's appearance, breed and base information. See CharacterLook.never Recovered with score 115, confidence 0.96, margin 115 over the runner-up. A margin close to the score means nothing else came near; a thin margin means a decoy nearly won. Members recovered: 3 of 5.
-
CharacterBaseInformation
A branch of the character look carrying the character's gender and one of three optional complements. Kind structArea Game.Character.ManagementNamed by beta The type is Ankama's and is proven by the accessor several client consumers use to reach it. gender IS NAMED. It is the character's Gender; together with the class id from CharacterLook it is what selects the character's portrait. THE REST IS NOT NAMED. The remaining members form a oneof of three complements - the reference build calls them epic information, party member information and party invitation information - but no independent evidence separates them yet, so they keep their obfuscated names. Guessing from field order is how this protocol punishes people. Not sent on its own — it is only ever a branch of CharacterLook. inferred Used by CharacterLook Fields #FieldTypeMeaningYou set it 4genderGenderThe character's gender. Portraits are keyed by class id followed by this value: Head_<class id><gender>.never Recovered with score 160, confidence 0.97, margin 160 over the runner-up. A margin close to the score means nothing else came near; a thin margin means a decoy nearly won. Members recovered: 1 of 4.
-
CharacterAppearanceCollectionEvent
The colour palettes your character owns, and how many palette slots exist. Kind eventArea Game.CosmeticNamed by gamemapping YOUR COLLECTION OF COLOUR PALETTES. Each palette is a set of six colours you can apply to your character; this message lists the ones you own and states how many palette slots your account has. WHEN IT ARRIVES Unprompted, once the game context is up, and again whenever the collection changes. Treat it as a REPLACEMENT: the client discards its previous list and rebuilds it from what arrives. READING A PALETTE A palette is six packed RGB integers - 8025436 is 0x7A75DC. A palette entry may legitimately be short or empty, in which case the missing colours fall back to your breed's defaults; the client does exactly that, looking the breed up in its game data before filling the gaps. So do not assume six values are always present. WHAT IT NO LONGER CARRIES Up to 3.5.3.1 this message also carried the character's FACES collection alongside the colours. From 3.5.17.26 on it carries colours only. If you are reading an older capture, expect the extra member. When you may send it Requires context_ready observed Related messages Unsolicited - nothing you send causes this no client code builds it; the inventory service only ever receives it Fields #FieldTypeMeaningYou set it 1colorsCharacterColorsThe palettes you own, with the slot counts that bound them.never Recovered with score 265, confidence 0.88, margin 265 over the runner-up. A margin close to the score means nothing else came near; a thin margin means a decoy nearly won. Members recovered: 1 of 1.
-
Character
One character on the account, as offered in the selection list. Kind structArea Game.Character.ManagementNamed by beta, gamemapping One selectable character. It is what you read to decide which CharacterSelectionRequest to send, and id is the value that request wants. THE INTERESTING PARTS ARE NESTED, NOT FLAT. The name, level and appearance are one level down in CharacterBasicInformation, and the appearance one further down again in CharacterLook. Do not expect a flat record. character_remodeling_information is an ALTERNATIVE representation used while a character is being remodelled - it is the other branch of the same oneof as the basic information. Branch on which one is set: a remodelling character has no basic information to read. Members beyond the ones named here exist and stand with their obfuscated names. They are not decoys - they are simply not proven yet, so do not read meaning into their position. Not sent on its own — it is only ever an element of CharacterListEvent. inferred Used by CharacterListEvent Success Fields #FieldTypeMeaningYou set it 3idint64The character id, and the value CharacterSelectionRequest addresses it by. (character id)never 1character_remodeling_informationCharacterRemodelingInformationThe alternative representation used while the character is being remodelled. The other branch of the same oneof as the basic information. See CharacterRemodelingInformation.never 2character_basic_informationCharacterBasicInformationThe character's name, level and appearance. See CharacterBasicInformation. One branch of a oneof - check it is the one that is set.never Recovered with score 233, confidence 0.99, margin 233 over the runner-up. A margin close to the score means nothing else came near; a thin margin means a decoy nearly won. Members recovered: 3 of 3.
-
ChannelUpdateEvent
One chat channel was enabled or disabled for the player. Kind eventArea Game.ChatNamed by beta The single-channel delta: set that channel's bit when enable is true, clear it when false. Nothing else in the payload is used by the client. It arrives both on its own and as part of the volley that follows a community change - see SetCommunityChannelRequest. Keep one channel mask and apply this to it. The bulk counterpart is ChatChannelsEnabledEvent, and the two can disagree if you apply them out of order - the later message wins. When you may send it Requires character_loaded observed Related messages Unsolicited - nothing you send causes this the server toggles channels as availability changes Fields #FieldTypeMeaningYou set it 1enableboolTrue when the channel becomes available, false when it is withdrawn.never 2channelChannelThe channel whose state changed. A Channel value.never Recovered with score 155, confidence 0.93, margin 155 over the runner-up. A margin close to the score means nothing else came near; a thin margin means a decoy nearly won. Members recovered: 2 of 2.
-
Channel
Which chat channel a line belongs to, from global and party through to the cross-server community channels. Kind enumArea Game.ChatNamed by beta, stringtable The channel identifier used by every chat message and by the subscription messages. ZERO IS GLOBAL, NOT "UNSPECIFIED". This enum has no unspecified member, and the chat messages carry it without explicit presence - so an unset channel field reads as GLOBAL, the loudest channel in the game. Always set it deliberately. TWO VALUES THE SERVER MAY STILL SEND ARE NO LONGER MAPPED BY THE CLIENT: NOOB and ADS. The client's normalisation switch falls through on them and yields no channel at all. They are kept here because the server can still put them on the wire; handle them as "unknown channel", not as an error. THREE MORE WIRE VALUES - 17, 18 and 19 - resolve to internal ids the client's readable enum does not name. Two of them are named here from in-game confirmation; the third is our own invention. See TUMULT. The value names are proven rather than assumed: each wire value was followed through the client's normalisation switch to an internal channel bit, and that bit through the chat metadata table to an unobfuscated name. That chain produces some non-obvious results - wire 9 is ARENA, 10 is PRIVATE, 12 is INFO, 13 is FIGHT_LOG - which is exactly why they are not read off the declaration order. Not sent on its own — an enum is never sent on its own. inferred Used by ChannelUpdateEvent ChatChannelMessageEvent ChatChannelMessageRequest ChatChannelsEnabledEvent SubscribeMultipleChannelRequest Values ValueNumberMeaning GLOBAL0Open channel visible to everyone nearby. Also the value an unset channel field reads as. TEAM1Team channel. GUILD2Guild channel. ALLIANCE3Alliance channel. PARTY4Party channel. SALES5Trade channel used to advertise goods for sale. SEEK6Recruitment channel used to look for players or groups. NOOB7Newcomer channel. THE CURRENT CLIENT NO LONGER MAPS THIS VALUE - its normalisation switch falls through with a warning and yields no channel. The server may still send it. ADMIN8Moderation channel reserved for staff. ARENA9Arena channel. Wire value 9, which the declaration order does not suggest. PRIVATE10Direct messages between two players. Wire value 10. COMMUNITY11Community channel - the language-segregated public channel. Added after the reference build; the name comes from the client's own readable chat-channel metadata enum. Which community you are on is set by SetCommunityChannelRequest. INFO12Informational notices from the server. Wire value 12. FIGHT_LOG13Combat log channel. Wire value 13. ADS14Advertisement channel. THE CURRENT CLIENT NO LONGER MAPS THIS VALUE, the same as NOOB. The server may still send it. EVENT15Event announcements. EXCHANGE16Exchange channel. TUMULT17Wire value 17, whose meaning is not attested by any oracle. WE CHOSE THIS NAME. No oracle carries an identifier for value 17. Do not rely on the spelling; the NUMBER is the contract. TERRITORY18Territory channel. Confirmed in game on 3.6.10.10. Absent before 3.5.3.1 - the value did not exist in the older builds. GUILD_RAID19Guild raid channel. Confirmed in game on 3.6.10.10. The newest member of the enum, absent from every earlier build. Recovered with score 100, confidence 0.93, margin 100 over the runner-up. A margin close to the score means nothing else came near; a thin margin means a decoy nearly won. Members recovered: 20 of 20.
-
CanCreateNewCharacter
Whether the account may create another character: allowed, out of slots, or refused. Kind enumArea Game.AccountNamed by invented This name is not Ankama's. It was chosen for this documentation from proven client behaviour, and is a label rather than protocol documentation. THE THREE MEANINGS ARE PROVEN; THE THREE NAMES ARE OURS. The client copies this value unchanged into a player-service property, and the character-selection screen is its only consumer. That screen branches exactly three ways, which is what fixes the meanings: 0 the create button is enabled and its click handler attached 1 the button is disabled with a "buy more slots" tooltip 2 the button is disabled with no such offer VALUE 1 IS A REFUSAL, NOT A YES. This field was a BOOL on earlier builds, so code carried across reads 1 as true and offers character creation that the server will decline. See AccountCapabilitiesEvent. Not sent on its own — an enum is never sent on its own. inferred Used by AccountCapabilitiesEvent Values ValueNumberMeaning ALLOWED0Character creation is permitted. WE CHOSE THIS NAME. Proven: the only value for which the client enables the create button. TOO_MANY_CHARACTERS1Refused because the account's slots are full, with more available to buy. WE CHOSE THIS NAME. Proven: the branch that disables the button and offers more slots. REFUSED2Refused for a reason the client does not spell out. WE CHOSE THIS NAME. Proven: the client's else branch - disabled, with no offer. Recovered with score 135, confidence 0.95, margin 135 over the runner-up. A margin close to the score means nothing else came near; a thin margin means a decoy nearly won. Members recovered: 3 of 3.
-
BonusesEvent
Every bonus currently in force, as a full replacement list. Kind eventArea Game.BonusNamed by invented This name is not Ankama's. It was chosen for this documentation from proven client behaviour, and is a label rather than protocol documentation. THE COMPLETE SET, EVERY TIME. Overwrite your bonus state with this list rather than merging into it - the client throws its cache away and rebuilds it from scratch on every arrival. WHAT A BONUS IS Each entry is an amount plus the kind of bonus it applies to: extra job experience, extra mount experience, extra quest kamas, and so on. Several entries may share one kind, and they stack - a captured trace carried five separate entries for a single kind. So the useful shape is kind -> list of amounts, which is exactly what the client builds. WHEN IT ARRIVES Unprompted, once the game context is up. There is no request for it. It arrives again whenever the server changes what is active, and each arrival replaces the previous set. READING THE KIND The kind is an enumeration the client keys its cache by. Its VALUES are not named here: see the signature notes for why the obvious client-side mapping is not proven. Treat an unfamiliar kind as data you do not display, not as an error. When you may send it Requires context_ready observed Related messages Unsolicited - nothing you send causes this no client code builds it; the bonus service only ever receives it Fields #FieldTypeMeaningYou set it 1bonusesrepeated BonusEvery bonus currently active. A replacement, not a delta.never Recovered with score 265, confidence 0.89, margin 265 over the runner-up. A margin close to the score means nothing else came near; a thin margin means a decoy nearly won. Members recovered: 1 of 2.