Aller au contenu
Afficher dans l'application

Une meilleure façon de naviguer. En savoir plus.

Asterobot

Une application plein écran sur votre écran d'accueil avec notifications push, badges et plus encore.

Pour installer cette application sur iOS et iPadOS
  1. Appuyez sur Icône de partage dans Safari
  2. Faites défiler le menu et appuyez sur Ajouter à l'écran d'accueil.
  3. Appuyez sur Ajouter dans le coin supérieur droit.
Pour installer cette application sur Android
  1. Appuyez sur le menu à trois points (⋮) dans le coin supérieur droit du navigateur.
  2. Appuyez sur Ajouter à l'écran d'accueil ou Installer l'application.
  3. Confirmez en appuyant sur Installer.

Protocole Dofus

Le protocole Dofus actuellement pris en charge par Asterobot
One interactive element re-published because its state changed - harvested, unlocked, become usable.
Kind event · Area Game.Interactive
The delta counterpart of InteractiveMapUpdateEvent: the server re-sending ONE element because something about it changed.
RE-READ BOTH SKILL LISTS AND REPLACE THE ELEMENT WHOLESALE. The change is usually a skill MOVING between the enabled and disabled lists - a resource harvested, a door unlocking - so a script that only looks at InteractiveElement.enabled_skills and merges will keep a stale skill it should have dropped.
Match the incoming record to your model by InteractiveElement.element_id.
The current build pads this message with two members the payload never carries; they stand with their obfuscated names.
When you may send it
Requires context_ready inferred Related messages
Unsolicited - nothing you send causes this the server publishes state changes as they happen Fields
#FieldTypeMeaningYou set it 1interactive_elementInteractiveElementThe element whose state changed.
A whole InteractiveElement - replace your copy rather than patching it.never
  • summary: One interactive element re-published because its state changed - harvested, unlocked, become usable.
  • area: Game.Interactive
  • 68 vues
Every interactive element on the map, sent when the character arrives. The snapshot a harvest plan is built from.
Kind event · Area Game.Interactive
The map's interactive snapshot. Build your model of what is harvestable here, then keep it current by applying InteractiveElementUpdatedEvent on top.
IT IS A SNAPSHOT, NOT A DELTA - REPLACE THE MAP'S ELEMENTS, DO NOT MERGE. It arrives once per map arrival, so treat each arrival as a fresh world.
Drop any element whose InteractiveElement.on_current_map is false, exactly as the client does.
The current build pads this message with one member no dumped build reads; it stands with its obfuscated name.
When you may send it
Requires context_ready inferred Related messages
Unsolicited - nothing you send causes this the server sends the snapshot on map arrival; no request asks for it directly Fields
#FieldTypeMeaningYou set it 1interactive_elementsrepeated InteractiveElementEvery interactive element on the map.
Element type InteractiveElement.never
  • summary: Every interactive element on the map, sent when the character arrives. The snapshot a harvest plan is built from.
  • area: Game.Interactive
  • 72 vues
An entity has started using an interactive element: the element, the skill, how long it takes, and whether it can still move.
Kind event · Area Game.Interactive
Announces the BEGINNING of an interaction - chopping a tree, mining an ore, opening a door, taking a zaap - not its result. Nothing here says whether the harvest succeeded or what it yielded.
IT IS BOTH AN ANSWER AND A BROADCAST. When the actor is you, it is the server accepting your InteractiveUseRequest (a refusal comes as InteractiveUseErrorEvent instead, and this event is then never sent). It is also broadcast for every other character, monster and NPC that starts an interaction, so most arrivals are about someone else.
HOW TO RECOGNISE THE ANSWER TO YOUR OWN REQUEST - it does not echo the request:
- entity_id is your character's id; - element_id is the element you sent in the request; - skill_id is the skill_id of the action you picked - the request carried that action's skill_instance_uid, which never comes back.
WHAT TO DO WHEN IT NAMES YOU
1. Consider the request answered: you may use that element again later. 2. If duration is above zero, the use is TIMED and you are busy: it lasts duration x 100 ms (duration is in TENTHS OF A SECOND - 30 is three seconds). Send no further InteractiveUseRequest, for any element, until InteractiveUseEndedEvent for this element closes the interaction. The official client does exactly this. 3. If can_move is false - absent on the wire, which is how false arrives - the character is locked in place for the use: send no movement request until it is over.
A script that fires its next action immediately is acting during an interaction the server still considers in progress.
element_id joins this to InteractiveElement and to StatedElement, so it is how you tell WHICH node someone just started on.
LIVE CAPTURE (3.6.12.16): duration 30, element_id 537803, entity_id 676609130790, skill_id 68, can_move absent (false) - a three-second use during which the character could not move. Fields at their default value (0, false) are simply absent from the wire, as here.
When you may send it
Requires context_ready inferred Related messages
Arrives after InteractiveUseRequest Fields
#FieldTypeMeaningYou set it 1element_idint32The interactive element being used. (interactive element id)
Observed: 537803 (live capture, 3.6.12.16)
The same id as InteractiveElement.element_id and StatedElement.element_id.never 2can_moveboolWhether the actor may still move while the interaction runs.
Observed: absent, i.e. false, on a three-second use (live capture 3.6.12.16)
False locks the actor in place for the duration.
False is the default and is not sent on the wire: an absent can_move means the actor cannot move during the use.never 3durationint32How long the interaction will run. (tenths of a second)
Observed: 30 (three seconds, live capture 3.6.12.16)
The client multiplies it by 100 and runs the use for that many milliseconds, so 30 means three seconds.
Above zero and about you, the client also treats you as busy until InteractiveUseEndedEvent for that element arrives.never 4entity_idint64The entity that started the interaction: a character, a monster or an NPC. (entity id)
Observed: 676609130790 (a character, live capture 3.6.12.16)
Compare against your own id before treating the interaction as yours.never 5skill_idint32Which action is being performed - what distinguishes cutting from mining from opening. (skill id)
Observed: 68 (live capture, 3.6.12.16)
The same id space as InteractiveElementSkill.skill_id.
It is the skill_id of the action, never the skill_instance_uid an InteractiveUseRequest sends: match your own request by element_id, entity_id and this skill_id.never
  • summary: An entity has started using an interactive element: the element, the skill, how long it takes, and whether it can still move.
  • area: Game.Interactive
  • 75 vues
The character's entire inventory and kamas balance, pushed by the server as a full snapshot.
Kind event · Area Game.Inventory
The whole inventory in one message: every item the character holds, plus the kamas balance.
IT IS A SNAPSHOT, NOT A DELTA - REPLACE YOUR MODEL, DO NOT MERGE. An item that is absent from this message is an item the character no longer has. A script that merges keeps phantom stacks forever, most visibly after a trade, a bank withdrawal, or any server-side resynchronisation.
Each element is an ObjectItemInventory: the item itself plus where it sits and how the player tagged it. The item is an ObjectItem, whose ObjectItem.uid is the handle every later request needs - destroy, drop, move, exchange. Index your model by that uid and nothing else.
KAMAS IS A 64-BIT VALUE and a wealthy character exceeds 2^31. A 32-bit accumulator overflows.
Do not assume you see this exactly once. It arrives at login and can arrive again unprompted at any time.
When you may send it
Requires character_selected observed Related messages
Unsolicited - nothing you send causes this the server pushes it during the login burst and again whenever it resynchronises; no request asks for it Fields
#FieldTypeMeaningYou set it 2objectsrepeated ObjectItemInventoryEvery item the character holds, each wrapped with its inventory position and tags.
Element type is ObjectItemInventory, not ObjectItem - the item is one level down.never 4kamasint64The character's kamas balance at the moment of the snapshot. (kamas)
64-bit; do not narrow it.never
  • summary: The character's entire inventory and kamas balance, pushed by the server as a full snapshot.
  • area: Game.Inventory
  • 77 vues
How full your inventory is, and how full it can get. Both numbers, every time.
Kind event · Area Game.Inventory
BOTH NUMBERS, EVERY TIME. The server does not send "you gained 12 weight"; it sends the current weight and the ceiling together, so you can overwrite your state rather than accumulate into it. If you are tracking pods, this message IS your state - do not try to keep a running total from item pickups and drops.
WHEN IT ARRIVES
Whenever what you are carrying changes, and once when the inventory first loads. Treat it as a refresh, not a delta.
READ IT BY ROLE, NOT BY NUMBER. The two members swap field numbers between builds - on some the weight is #1 and the ceiling #2, on others the reverse, and on the current build they are #1 and #3 with a decoy between them. The recovered names are what to key on.
WHAT THE CLIENT DOES WITH IT
It feeds a progress gauge: the current weight becomes the bar's value and the maximum its full extent. That is the whole handling - no thresholds, no warnings in this message. If you want an "overloaded" signal you have to compare the two yourself.
ONE DECLARED MEMBER IS PADDING and no dumped client has ever read it.
When you may send it
Requires context_ready observed Related messages
Unsolicited - nothing you send causes this the server sends it whenever what you carry changes; nothing requests it Fields
#FieldTypeMeaningYou set it 1inventory_weightint32How much your inventory currently weighs.never 2weight_maxint32The most it can weigh before you are overloaded.never
  • summary: How full your inventory is, and how full it can get. Both numbers, every time.
  • area: Game.Inventory
  • 58 vues
An item described by its template and effects, plus either a quantity or NPC-shop sale terms.
Kind struct · Area Game.Common
An item that is not in your inventory: its template, its effects, and one complement. In an NPC shop's stock (ExchangeNpcShopStartedEvent.objects) the complement is ItemMinimalInformation.item_to_sell_in_npc_shop, the price and purchase allowance.
The client builds a shop entry ONLY for elements whose complement is the shop branch. An element carrying the other branch (a bare quantity) is skipped and never shown.
Read the effects as you would an inventory item's: they are the same ObjectEffect values.
Not sent on its own — it is reached inside ExchangeNpcShopStartedEvent.objects. proven
Used by
ExchangeNpcShopStartedEvent Fields
#FieldTypeMeaningYou set it 1effectsrepeated ObjectEffectThe effects the item carries.
Element type ObjectEffect - branch on its oneof.never 2object_gidint32The item's template id. (item template id)
Observed: 6857never 4item_to_sell_in_npc_shopItemToSellInNpcShopThe item's sale terms when it is offered by an NPC shop.
Type ItemToSellInNpcShop. Set on every element of an NPC shop's stock; the client skips elements that carry the other branch.never
  • summary: An item described by its template and effects, plus either a quantity or NPC-shop sale terms.
  • area: Game.Common
  • 65 vues
How many kamas you are carrying.
Kind event · Area Game.Inventory
Your carried kamas. The inventory snapshot in InventoryContentEvent brings the first value; this message keeps it current afterwards.
TREAT IT AS THE AMOUNT, NOT A CHANGE. The client hands the number unchanged to every open storage window as the kamas figure to display. Overwrite what you track rather than adding to it.
ONLY THE WALLET YOU CARRY. The kamas held in the bank arrive in StorageKamasUpdateEvent; both messages move the client's total-wealth figure.
ONE DECLARED MEMBER IS PADDING. Read the recovered name; the client never reads the other member.
When you may send it
Requires character_selected inferred Related messages
Unsolicited - nothing you send causes this the client handles it without having asked for anything Fields
#FieldTypeMeaningYou set it 2quantityint64How many kamas you are carrying. (kamas)
An amount to overwrite, not a delta: the client displays it as is.never
  • summary: How many kamas you are carrying.
  • area: Game.Inventory
  • 61 vues
Your character started regenerating life: one point every `regen_rate` tenths of a second.
Kind event · Area Game.Character
Your character's life now comes back on its own, one point every regen_rate tenths of a second, until UpdateLifePointsEvent stops it.
TO TRACK LIFE THE WAY THE CLIENT DOES
1. When this arrives, note the time T0 and your current life L0. 2. Your life is then L0 + floor(milliseconds since T0 / (regen_rate x 100)), never above your maximum life. The client recomputes it every regen_rate x 100 ms. 3. When UpdateLifePointsEvent arrives, stop adding: keep the life you have at that moment. 4. Another LifePointsRegenBeginEvent restarts the count from the life you have then, with the new rate. A rate of 0 regenerates nothing.
The server's characteristics (CharacterCharacteristicsEvent) stay the reference; this is the client's estimate between them.
The other declared member is padding the client never reads; the generated proto marks it unread.
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 1regen_rateint32Time between two regenerated life points, in tenths of a second: the client waits regen_rate x 100 ms per point. (tenths of a second per life point)
0 regenerates nothing.never
  • summary: Your character started regenerating life: one point every `regen_rate` tenths of a second.
  • area: Game.Character
  • 67 vues
An actor on the current map has turned to face a new direction.
Kind event · Area Game.Gamemap
Broadcast whenever any actor in your current roleplay context changes orientation - including your own character, echoing back your MapChangeOrientationRequest.
IT IS A FIRE-AND-FORGET STATE PATCH. No timestamp, no throttling, no correlation. Apply it straight to your entity table: set that actor's facing and move on. There is nothing to acknowledge.
Track other actors' facing if you care about line of sight or backstab positioning - that is the whole reason this is broadcast rather than private.
The client reads exactly two members off it and passes both, unchanged, into a single call on its own entity service. Nothing else in the message is used.
When you may send it
Requires context_ready inferred Related messages
Arrives after MapChangeOrientationRequest Fields
#FieldTypeMeaningYou set it 1directionDirectionThe facing the actor now has.
A Direction value.never 2actor_idint64Which actor turned. (actor id)
Includes your own character when the server echoes your request back.never
  • summary: An actor on the current map has turned to face a new direction.
  • area: Game.Gamemap
  • 64 vues
Everything on the map the character just loaded: actors, interactive and stated elements, running fights and the map's complement.
Kind event · Area Game.Gamemap
The contents of the map the character is on: who stands on it, its interactive and stated elements, the fights running on it, and one complement saying what kind of place it is.
IT ARRIVES AFTER EVERY MAP LOAD. The client asks for it with MapInformationRequest each time a map finishes loading - teleport, zaap, map change, fight exit - and the map is not usable until it arrives.
TREAT IT AS A SNAPSHOT OF THE NEW MAP. It replaces what you knew about the previous one. Changes after that arrive separately: actors who walk in through GameRolePlayShowActorsEvent, element changes through InteractiveElementUpdatedEvent and StatedElementUpdatedEvent.
THE CLIENT REPUBLISHES TWO OF ITS LISTS. It copies interactive_elements into an InteractiveMapUpdateEvent and stated_elements into a StatedMapUpdateEvent, so code that already handles those two events can reuse that path for the initial state.
map_id IS AN INT64 HERE while MapInformationRequest asks with an int32: same map, different width.
specific_complementary_information carries at most one complement saying what kind of place the map is: a haven bag (with its owner), the house you are inside, the map's world coordinates, an open anomaly, or your guild hall.
SOME NAMES ARE CONDITIONAL. houses, in_house_information, anomaly_information, coordinates, guild_hall_information and colored_cells are named only while the client code that proves them can be traced; on a client where it cannot, those members keep obfuscated names while the rest of the message is still recovered. guild_hall_information and colored_cells are invented names - no Ankama dump names those two fields.
STILL OBFUSCATED ON PURPOSE: the obstacles list (the client hands each obstacle to its cell service through an interface the dumps cannot follow) and a boolean the client never reads. They carry real data; their names cannot be proven.
When you may send it
Requires context_ready inferred Related messages
Arrives after MapInformationRequest Fields
#FieldTypeMeaningYou set it 2stated_elementsrepeated StatedElementThe current state of every stated element on the map.
Element type StatedElement.
The client republishes this list as a StatedMapUpdateEvent.never 3actorsrepeated ActorPositionInformationEvery actor already standing on the map when it loads.
Element type ActorPositionInformation.
Actors who arrive later come through GameRolePlayShowActorsEvent instead.never 5housesrepeated type not documented yetThe houses standing on this map.
Element type is House, not yet recovered; each entry becomes the client's house object, including its door cells on this map.
Named only while the client's house UI can be traced; otherwise left obfuscated.never 7interactive_elementsrepeated InteractiveElementEvery interactive element on the map, with the skills it offers now.
Element type InteractiveElement.
The client republishes this list as an InteractiveMapUpdateEvent.never 8colored_cellsrepeated type not documented yetCells of this map the client paints in a colour.
NAME INVENTED - no dump names this field. The client's type table calls the element type ColoredCell, with a nested CellColor.
Each entry pairs a cell id with a colour the client turns into an RGBA Color32.never 10map_idint64The map these contents describe. (map id)
Observed: 153879299
The same map MapInformationRequest asked for, carried here as int64.
The client checks it against the haven-bag map table.never 12subarea_idint32The subarea the map belongs to. (subarea id)
Observed: 450
The client looks it up in the subarea table, for example for the area level shown with an anomaly.never 16fightsrepeated FightCommonInformationThe fights currently running on the map.
Element type is FightCommonInformation, not yet recovered.
The client creates a map fight entry per element and lists party members' fights from it.never 1anomaly_informationMapComplementaryAnomalyInformationSet when the map belongs to an open anomaly.
Carries the anomaly's closing time; the client shows the anomaly panel with the subarea's level.
One of the complement branches; named only while the client's anomaly UI can be traced.never 6haven_bag_informationtype not documented yetSet when the map is a haven bag; names the haven bag's owner.
The owner is a Character; the client reads the owner's id and name.
One of the complement branches; at most one is set.never 9in_house_informationtype not documented yetSet when the character is inside a house: the house being visited.
The client compares the house's account tag with the player's to tell whether it is the player's own house, then opens the house panel.
One of the complement branches; named only while the client's house UI can be traced.never 15guild_hall_informationtype not documented yetSet when the map is the player's guild hall.
NAME INVENTED - no dump names this field. The client's type table calls its theme part MyGuildHall.ThemeSelectionInfo.
The client reads the hall's current theme and the themes available to it.
One of the complement branches; named only while the client's guild-hall UI can be traced.never
  • summary: Everything on the map the character just loaded: actors, interactive and stated elements, running fights and the map's complement.
  • area: Game.Gamemap
  • 110 vues
The server agreeing that the character has stopped moving. Closes the movement handshake.
Kind response · Area Game.Gamemap
Acknowledges MapMovementConfirmRequest. Receiving it means the server has you standing still.
READ ITS PAYLOAD DEFENSIVELY. It was empty from the earliest dumped build through to the mid-3.4 ones; the current build declares a six-value enum. Unlike its request - where the client's own writer provably populates nothing - an INBOUND message offers no such proof, so whether that enum is a decoy or a genuine status has NOT been established. Do not assume it is always zero, and do not build logic on a specific value.
This is one of the few genuine Responses in the map area: the whole Gamemap file declares thirty-one messages and exactly one of them is a Response, which is a large part of why the identification holds.
When you may send it
Requires context_ready inferred Related messages
Arrives after MapMovementConfirmRequest
  • summary: The server agreeing that the character has stopped moving. Closes the movement handshake.
  • area: Game.Gamemap
  • 113 vues
The path an actor will actually walk, broadcast to everyone on the map.
Kind event · Area Game.Gamemap
The server granting a movement. THIS IS THE AUTHORITATIVE PATH - walk cells, not what you requested. It may be shorter.
CHECK character_id AGAINST YOUR OWN BEFORE ACTING ON IT. The event is broadcast for every actor that moves on the map, so most of the ones you receive are other players and monsters. A script that treats every arrival as its own move will walk phantom paths.
For an actor that is not you, this is how you keep a live world model: apply the path to that actor's position and facing.
When the granted path is YOURS and you have finished walking it, close the handshake with MapMovementConfirmRequest. Until you do, the server considers you still in motion.
direction is the facing the walk starts in, as a Direction ordinal. It is the only member of this message with explicit presence on the wire, so absent and zero are genuinely different: absent means unchanged, zero means east.
When you may send it
Requires context_ready inferred Related messages
You must then send MapMovementConfirmRequest inferred — the movement handshake stays open until the client reports that the walk finished Arrives after MapMovementRequest Fields
#FieldTypeMeaningYou set it 1cellsrepeated int32The authoritative path the actor will walk, as ordered map cell ids. (map cell ids)
May be shorter than the path that was requested. Walk this one.never 2directionint32The facing the walk starts in.
Explicit presence: absent is not the same as zero.
A Direction ordinal.
Absent means unchanged; 0 means east. Do not conflate them.never 3cautiousboolWhether the actor is walking in cautious mode.never 4character_idint64Which actor is moving. (actor id)
Broadcast for other actors too - compare against your own id first.never
  • summary: The path an actor will actually walk, broadcast to everyone on the map.
  • area: Game.Gamemap
  • 98 vues
The structured links attached to a chat line - items and monster groups - as opposed to the line's words.
Kind struct · Area Game.Chat
What rides ALONGSIDE a chat line's text. When a player shift-clicks an item or links a monster group into chat, the visible words stay in the message's content and the structured link data comes here, so the recipient's client can render the link and show a tooltip on hover.
It is carried by the chat messages that can hold a link, and it is normally PRESENT BUT EMPTY: an ordinary text line still carries it. Treat an empty one as the common case.
TO SEND A LINK
1. Write the link's text into the message's content (the client writes {chatitem,<uid>,<gid>} for an item). 2. Add the linked item to Metadata.objects, or the linked monster group to Metadata.monster_groups. One entry per link. 3. For plain text, send this record empty.
TO READ ONE
Read Metadata.objects for item tooltips and Metadata.monster_groups for monster-group links. If you only need the words, read content and ignore this.
Not sent on its own — it is only ever carried by a chat message. proven
Used by
ChatChannelMessageEvent ChatChannelMessageRequest ChatPrivateCopyMessageEvent ChatPrivateMessageRequest Fields
#FieldTypeMeaningYou set it 1objectsrepeated ObjectItemThe items linked into the line, one per link.
Each entry is the item's full ObjectItem (uid, gid, quantity, effects); the line's text carries the matching {chatitem,<uid>,<gid>} marker.
Beta carried the same list on the chat message itself, as object.optional 2monster_groupsrepeated MonsterGroupThe monster groups linked into the line, one per link.
Each entry is a MonsterGroup: position, leader, group id and make-up.optional
  • summary: The structured links attached to a chat line - items and monster groups - as opposed to the line's words.
  • area: Game.Chat
  • 73 vues
A creature family together with a count, as the monster-count branch of an item effect.
Kind struct · Area Game.Inventory
Two integers: which creature family, and how many.
It is easy to confuse with ObjectEffectMinMaxValue - both are two-integer messages in the same oneof - so branch on which member of ObjectEffect is set rather than on shape.
Not sent on its own — it is only ever the monster_count branch of ObjectEffect. inferred
Used by
ObjectEffect Fields
#FieldTypeMeaningYou set it 2creature_familyint32Which creature family the count applies to. (creature family id)never 3countint32How many.never
  • summary: A creature family together with a count, as the monster-count branch of an item effect.
  • area: Game.Inventory
  • 65 vues
One monster inside a group: what it is, its grade, an optional level override, and its appearance.
Kind struct · Area Game.Common
The compact per-monster entry inside a monster group - the record a script reads to decide whether a group on the map is worth fighting.
grade IS ONE-BASED. The client subtracts one before indexing its grade list, so grade 1 is the first grade, not the second. Off-by-one here silently reads the wrong difficulty.
level IS AN OVERRIDE, NOT ALWAYS THE LEVEL. The client tests it for a positive value and only then uses it in its experience calculation; a non-positive value means "use the monster's own level from the data centre" rather than "level zero".
gid identifies WHAT the monster is; resolve it against your own monster data.
look is a full EntityLook.
Not sent on its own — it is only ever an element of a monster-group payload. inferred
Used by
MonsterGroupStaticInformation MonstersInGroupAlternativeInformation Fields
#FieldTypeMeaningYou set it 2gradeint32The monster's grade.
ONE-BASED. The client subtracts one before indexing its grade list.never 3lookEntityLookThe monster's appearance.
An EntityLook.never 4levelint32A level override for this monster.
Only used when positive; otherwise the monster's own level applies.never 5gidint32Which monster this is. (monster id)never
  • summary: One monster inside a group: what it is, its grade, an optional level override, and its appearance.
  • area: Game.Common
  • 60 vues
Why a character name was refused.
Kind enum · Area Game.Character.Management
WHY THE NAME WAS REFUSED, when CharacterCreationResult says the name was the problem.
NAME_OK means the name itself is fine - so seeing it here does NOT mean the creation succeeded; read the result first and only consult this when the result blames the name.
Most of these are client-checkable before you ever send: length, alphabet, forbidden characters, dash placement, capitalisation, runs of identical letters. Checking locally saves a round trip. Two are not checkable and must come from the server - the name is already taken, and the name is reserved - and one, SERVICE_UNAVAILABLE, means name validation itself is down and the same name may work later.
Not sent on its own — it is a member type of CharacterCreationResultEvent, never sent alone. proven
Used by
CharacterCreationResultEvent Values
ValueNumberMeaning NAME_OK0The name is acceptable.
The name is the reference build's, matched by NUMBER. Beta 2.73.7.7 and every dumped build from 3.2.7.15 to 3.6.10.11 declare exactly twelve values, so the set has not moved in four years - but no dumped client distinguishes one value from another, so only the NUMBER is proven here. NAME_ERROR_SERVICE_UNAVAILABLE1Name checking is down; the server could not validate it.
The name is the reference build's, matched by NUMBER. Beta 2.73.7.7 and every dumped build from 3.2.7.15 to 3.6.10.11 declare exactly twelve values, so the set has not moved in four years - but no dumped client distinguishes one value from another, so only the NUMBER is proven here. NAME_ERROR_ALREADY_EXISTS2Another character already has this name.
The name is the reference build's, matched by NUMBER. Beta 2.73.7.7 and every dumped build from 3.2.7.15 to 3.6.10.11 declare exactly twelve values, so the set has not moved in four years - but no dumped client distinguishes one value from another, so only the NUMBER is proven here. NAME_ERROR_BAD_ALPHABET3The name uses characters from a disallowed alphabet.
The name is the reference build's, matched by NUMBER. Beta 2.73.7.7 and every dumped build from 3.2.7.15 to 3.6.10.11 declare exactly twelve values, so the set has not moved in four years - but no dumped client distinguishes one value from another, so only the NUMBER is proven here. NAME_ERROR_BAD_LENGTH4The name is too short or too long.
The name is the reference build's, matched by NUMBER. Beta 2.73.7.7 and every dumped build from 3.2.7.15 to 3.6.10.11 declare exactly twelve values, so the set has not moved in four years - but no dumped client distinguishes one value from another, so only the NUMBER is proven here. NAME_ERROR_BAD_CHAR5The name contains a character that is not allowed.
The name is the reference build's, matched by NUMBER. Beta 2.73.7.7 and every dumped build from 3.2.7.15 to 3.6.10.11 declare exactly twelve values, so the set has not moved in four years - but no dumped client distinguishes one value from another, so only the NUMBER is proven here. NAME_ERROR_INVALID_DASH_POSITION6A dash is in a position the rules forbid - leading, trailing or doubled.
The name is the reference build's, matched by NUMBER. Beta 2.73.7.7 and every dumped build from 3.2.7.15 to 3.6.10.11 declare exactly twelve values, so the set has not moved in four years - but no dumped client distinguishes one value from another, so only the NUMBER is proven here. NAME_ERROR_NAME_WITH_BAD_CASE7The name's capitalisation is wrong.
The name is the reference build's, matched by NUMBER. Beta 2.73.7.7 and every dumped build from 3.2.7.15 to 3.6.10.11 declare exactly twelve values, so the set has not moved in four years - but no dumped client distinguishes one value from another, so only the NUMBER is proven here. NAME_ERROR_TOO_MANY_CONSECUTIVE_IDENTICAL8Too many identical characters in a row.
The name is the reference build's, matched by NUMBER. Beta 2.73.7.7 and every dumped build from 3.2.7.15 to 3.6.10.11 declare exactly twelve values, so the set has not moved in four years - but no dumped client distinguishes one value from another, so only the NUMBER is proven here. NAME_ERROR_TOO_MANY_SPECIAL9Too many special characters.
The name is the reference build's, matched by NUMBER. Beta 2.73.7.7 and every dumped build from 3.2.7.15 to 3.6.10.11 declare exactly twelve values, so the set has not moved in four years - but no dumped client distinguishes one value from another, so only the NUMBER is proven here. NAME_ERROR_FORBIDDEN10The name is on the forbidden list.
The name is the reference build's, matched by NUMBER. Beta 2.73.7.7 and every dumped build from 3.2.7.15 to 3.6.10.11 declare exactly twelve values, so the set has not moved in four years - but no dumped client distinguishes one value from another, so only the NUMBER is proven here. NAME_ERROR_RESERVED11The name is reserved and cannot be taken.
The name is the reference build's, matched by NUMBER. Beta 2.73.7.7 and every dumped build from 3.2.7.15 to 3.6.10.11 declare exactly twelve values, so the set has not moved in four years - but no dumped client distinguishes one value from another, so only the NUMBER is proven here.
  • summary: Why a character name was refused.
  • area: Game.Character.Management
  • 59 vues
The player's complete set of notification flags - the markers behind the interface's "new" badges.
Kind event · Area Game.Notification
The persisted markers behind the little "new" badges on menus, tabs and features.
IT IS THE COMPLETE SET, NOT AN ADDITION - REPLACE, DO NOT MERGE. A flag missing from this message is a flag the player no longer has. There is a separate canonical sibling that REMOVES notifications and it carries an identical payload shape, so if you are matching messages by shape rather than by type you will confuse the two and accumulate badges forever.
The flag values are opaque identifiers into the client's own notification data; the protocol says nothing about what each one means.
Low value for most scripts - it drives interface decoration, and nothing depends on it.
When you may send it
Requires character_loaded observed Related messages
Unsolicited - nothing you send causes this sent in the connection burst and again whenever the server resynchronises the whole set Fields
#FieldTypeMeaningYou set it 2flagsrepeated int32The player's complete set of notification flags.
Opaque identifiers into the client's notification data.
COMPLETE, not additive.never
  • summary: The player's complete set of notification flags - the markers behind the interface's "new" badges.
  • area: Game.Notification
  • 58 vues
Your NPC action was refused. It carries no reason.
Kind event · Area Game.Npc
THE NEGATIVE ANSWER TO NpcGenericActionRequest, AND IT IS EMPTY.
It tells you THAT the action was refused and never why. There is no code, no reason string and no echo of what you asked for - so if you have more than one NPC action outstanding you cannot tell which one this refers to. SEND THEM ONE AT A TIME and treat this as the answer to the outstanding request.
WHY IT MATTERS THAT IT IS EMPTY
The success path does not answer this message at all: it answers with the action itself - a dialogue's own messages, a shop's own messages. So this event is your ONLY negative signal. Without it a refused action is indistinguishable from a slow one, which is why you should arm a timeout on the request and treat this event as the early, definitive failure.
Some builds pad it with one member (a bool on 3.5.9.11, a nested record on 3.6.10.10). The client never reads it; ignore it.
Common causes, none of them reported: the NPC is not on your current map, the action is not one that NPC offers, or the map id you sent is stale.
When you may send it
Requires character_loaded inferred Related messages
Arrives after NpcGenericActionRequest
  • summary: Your NPC action was refused. It carries no reason.
  • area: Game.Npc
  • 63 vues
One item and what it currently sells for on average.
Kind struct · Area Game.Exchange
One entry of ObjectAveragePricesEvent, declared nested inside it.
READ BOTH MEMBERS BY NAME. Their field numbers and their declared types move between builds: across the seven dumped builds the gid is number 1, 2 or 3 and the price is 1, 2 or 3, and on four of them a decoy of the SAME scalar type sits next to the real member. Position, number and type are all worthless here; only the recovered names are stable.
The gid is the same template id as ObjectItem.gid, so this list joins directly onto inventory contents.
Not sent on its own — it is only ever reached as an element of ObjectAveragePricesEvent.objects_average_prices. inferred
Used by
ObjectAveragePricesEvent Fields
#FieldTypeMeaningYou set it 1object_gidint32The item's template id, as used everywhere else in the protocol. (item template id)
Observed: 16384 - the lowest gid in the observed cataloguenever 2average_priceint64The item's average market price. (kamas)
64-bit because prices exceed the 32-bit range. Do not narrow it.never
  • summary: One item and what it currently sells for on average.
  • area: Game.Exchange
  • 67 vues
The market average price of every tradeable item, as one list of item-and-price pairs.
Kind event · Area Game.Exchange
The answer to ObjectAveragePricesRequest: one entry per tradeable item, carrying the item's template gid and its average market price. It is what the client shows in item tooltips and in the auction house.
IT ARRIVES AS AN EVENT, NOT A RESPONSE. There is no correlation id to match on - match it by arrival after your request.
THE LIST IS HUGE. The observed reply carried 9711 entries with gids running consecutively from 16384, i.e. the whole catalogue. Build a lookup table once and keep it; do not scan the list per item.
Prices are 64-bit and genuinely exceed the 32-bit range. See ObjectAveragePrice.
When you may send it
Requires character_loaded inferred Related messages
Arrives after ObjectAveragePricesRequest Fields
#FieldTypeMeaningYou set it 3objects_average_pricesrepeated ObjectAveragePriceEvery tradeable item's average market price, as item-and-price pairs.
Element type ObjectAveragePrice.
Observed at 9711 entries in one 3.6.10.10 capture.never
  • summary: The market average price of every tradeable item, as one list of item-and-price pairs.
  • area: Game.Exchange
  • 68 vues
One effect on an item, as a oneof over every shape an effect's value can take.
Kind struct · Area Game.Inventory
One rolled or intrinsic effect. action says WHICH effect this is; the oneof says what its value looks like.
BRANCH ON THE ONEOF. NEVER READ A MEMBER POSITIONALLY. In protobuf an unset branch reads back as a zero, not as an absence, so a script that reads value_int unconditionally sees 0 for every string, dice and date effect and cannot tell that apart from a genuine zero. Ask which branch is set first.
action IS AN OPAQUE EFFECT ID, NOT AN ENUM IN THIS SCHEMA. Its meaning lives in the game's own data centre, not in the protocol; the same number carries the same meaning across builds, but nothing here tells you what it is. Look it up in your own data.
The branches, and what each is for:
value_int a single number - the ordinary case value_string a text value min_max a range - see ObjectEffectMinMaxValue dice a roll - see ObjectEffectDiceValue date a point in time duration_minute a duration, counted in minutes creature_family a creature family id monster_count a creature family plus a count TWO OF THESE HAVE CHANGED SINCE THE 2.x PROTOCOL AND OLD NOTES WILL MISLEAD YOU. date is now a structured five-integer message, not a string. The historical mount branch is gone from the current build entirely.
Not sent on its own — it is only ever reached as an element of an item or an action. inferred
Used by
Alteration BidExchangerObject BidItem ExchangeBidHouseInListUpdatedEvent GameActionItemObject ItemMinimalInformation ObjectItem SetUpdateEvent Fields
#FieldTypeMeaningYou set it 10actionint32Which effect this is: an opaque effect id resolved against the game's data centre. (effect id)
Present on every branch. It is the only member you can read without first checking the oneof.never 1duration_minuteint64The effect's value when it is a duration. The branch is only meaningful when it is the one that is set; reading it otherwise yields a zero value, not an absent one. (minutes)
The client converts it through a minute-valued time span in both directions, which is what fixes the unit.never 2monster_countMonsterCountThe effect's value when it is a creature family together with a count. The branch is only meaningful when it is the one that is set; reading it otherwise yields a zero value, not an absent one.never 3value_stringstringThe effect's value when it is text. The branch is only meaningful when it is the one that is set; reading it otherwise yields a zero value, not an absent one.never 4creature_familyint32The effect's value when it is a creature family. The branch is only meaningful when it is the one that is set; reading it otherwise yields a zero value, not an absent one. (creature family id)never 5value_intint32The effect's value when it is a single number. The branch is only meaningful when it is the one that is set; reading it otherwise yields a zero value, not an absent one.never 7datetype not documented yetThe effect's value when it is a point in time, as five integer components. The branch is only meaningful when it is the one that is set; reading it otherwise yields a zero value, not an absent one.
A STRUCTURED MESSAGE ON THIS BUILD. The 2.x protocol carried a string here; notes written against that schema are wrong.never 8min_maxObjectEffectMinMaxValueThe effect's value when it is a range. The branch is only meaningful when it is the one that is set; reading it otherwise yields a zero value, not an absent one.
See ObjectEffectMinMaxValue.never 9diceObjectEffectDiceValueThe effect's value when it is a dice roll. The branch is only meaningful when it is the one that is set; reading it otherwise yields a zero value, not an absent one.
See ObjectEffectDiceValue.never
  • summary: One effect on an item, as a oneof over every shape an effect's value can take.
  • area: Game.Inventory
  • 73 vues
An effect expressed as a dice roll: how many dice, how many sides, plus a flat constant.
Kind struct · Area Game.Inventory
The dice branch of ObjectEffect, read as num dice of side sides plus const.
num IS DECLARED 64-BIT ON THIS BUILD even though the client stores it in a narrower slot. Read the declared width, not the client's.
The record declares a fourth integer that neither direction of the client's own conversion touches. It has no recovered meaning - it may be a decoy or a field the game has not started using. It stands with its obfuscated name; do not guess at it.
Not sent on its own — it is only ever reached as the dice branch of ObjectEffect. inferred
Used by
ObjectEffect Fields
#FieldTypeMeaningYou set it 1numint64How many dice are rolled.
Declared 64-bit here; the client narrows it on the way in.never 2sideint32How many sides each die has.never 4constint32A flat value added to the roll.never
  • summary: An effect expressed as a dice roll: how many dice, how many sides, plus a flat constant.
  • area: Game.Inventory
  • 65 vues
The low and high bounds of an effect that rolls within a range.
Kind struct · Area Game.Inventory
The min_max branch of ObjectEffect. Two numbers, in semantic order: the lower bound first.
The order is recovered from where the client copies each value, not from the field numbers, so read by name. Nothing guarantees min <= max on the wire; the server has never been observed sending them inverted, but a script that subtracts them should not assume a non-negative result.
Not sent on its own — it is only ever reached as the min_max branch of ObjectEffect. inferred
Used by
ObjectEffect Fields
#FieldTypeMeaningYou set it 1maxint32The upper bound of the effect's range.never 3minint32The lower bound of the effect's range.never
  • summary: The low and high bounds of an effect that rolls within a range.
  • area: Game.Inventory
  • 63 vues
You just harvested this many of an item; the client shows the amount with the item's icon.
Kind event · Area Game.Inventory
A harvest finished and produced items. object_gid is the item (an id from the items table) and quantity is how many this harvest gave.
IT IS A NOTIFICATION, NOT AN INVENTORY UPDATE. The client only displays it: it looks the item up for its icon and shows the gained amount over your character. The stack itself changes through the inventory messages - for an item you already hold that is ObjectQuantityEvent, whose quantity is the new total. Do not add this quantity to your inventory as well, or you will count the harvest twice.
A harvest that also produced bonus items arrives as the "with bonus" variant instead, which carries a third number the client shows in a second colour.
When you may send it
Requires character_selected inferred Related messages
Unsolicited - nothing you send causes this it arrives when a harvest completes; the client does not ask for it Fields
#FieldTypeMeaningYou set it 2quantityint32How many of the item this harvest produced.
A gain, not a stack total; the inventory change arrives in its own message.never 3object_gidint32The item that was harvested, as an id from the items table.
The client resolves it with the items table to show the item's icon.never
  • summary: You just harvested this many of an item; the client shows the amount with the item's icon.
  • area: Game.Inventory
  • 66 vues
One item stack: which item it is, how many, its unique handle, and the effects rolled onto it.
Kind struct · Area Game.Inventory
One item instance. The same record is reused across the inventory, exchange and storage protocols, so everything below applies wherever it appears.
THE TWO IDS ARE BOTH INT32 AND ARE TRIVIAL TO SWAP. THIS IS THE EASIEST BUG TO WRITE AGAINST THIS PROTOCOL.
gid the TEMPLATE id - WHAT KIND of item this is. Every copy of the same item in the game shares one gid. Use it to look the item up in your own data. uid the handle for THIS stack, unique within the character. This is the value a destroy, drop, move or exchange request wants. Send a gid where a uid belongs and you address a different stack or none at all. Nothing in the declaration separates them: on the current build both are int32 and the field numbers were shuffled, so read by NAME, never by position.
effects is the roll on this instance - see ObjectEffect. It is a oneof: branch on which member is set, never read positionally.
storage_quantities is not an Ankama name - see InventoryQuantity.
Not sent on its own — it is only ever reached as a member of another message. proven
Used by
ExchangeCraftResultWithObjectDescription Metadata ObjectItemInventory Fields
#FieldTypeMeaningYou set it 1storage_quantitiesrepeated InventoryQuantityHow this stack is split across the character's storages, counted per storage.
WE CHOSE THIS NAME. The beta build predates the field, so there is no Ankama name to check it against.
See InventoryQuantity for what the element actually carries.never 3quantityint32How many units are in this stack.
Range: 1 or more for a stack that existsnever 4gidint32The item template id: what kind of item this is. (item template id)
Declared int64 in the beta build and int32 here; the value is the same id.
Shared by every instance of that item. NOT a handle - see uid.never 5uidint32The unique handle for this stack, and the value later requests address it by. (item instance id)
Unique within one character's storages, not globally.
This is what ObjectUidWithQuantity.uid wants.never 7effectsrepeated ObjectEffectThe effects rolled onto this particular instance.
Element type ObjectEffect, a oneof - branch on it.never
  • summary: One item stack: which item it is, how many, its unique handle, and the effects rolled onto it.
  • area: Game.Inventory
  • 75 vues

Compte

Navigation

Recherche

Recherche

Configurer les notifications push du navigateur

Chrome (Android)
  1. Appuyez sur l'icône de cadenas à côté de la barre d'adresse.
  2. Tap Autorisations → Notifications.
  3. Ajustez vos préférences.
Chrome (Desktop)
  1. Cliquez sur l'icône représentant un cadenas dans la barre d'adresse..
  2. Select Paramètres du site.
  3. Find Notifications et ajustez vos préférences.