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 scenery object whose visual state the server drives: a door, a lever, a gate, a harvested stump.
Kind struct · Area Game.Interactive
A map object whose STATE the server owns. Where InteractiveElement says what you may do with an object, this says what it currently looks like: open or closed, full or harvested.
state IS AN OPAQUE PER-ELEMENT VALUE, NOT A SHARED ENUM. The client feeds it straight to its animation layer; what state 2 means depends entirely on the element type. Compare it against the previous value for the same element rather than assigning meanings to numbers.
element_id is the SAME id as InteractiveElement.element_id and InteractiveUsedEvent.element_id. That is what makes the two element families join: the interactive record tells you a node is harvestable, this one tells you it is currently full.
cell_id is a single map cell index. A DOFUS map has 560 cells, which is why the client can safely narrow this value to 16 bits.
on_current_map FALSE MEANS DROP IT, as with interactive elements.
Not sent on its own — it travels inside the stated snapshot or update events. inferred
Used by
MapComplementaryInformationEvent StatedElementUpdatedEvent StatedMapUpdateEvent Fields
#FieldTypeMeaningYou set it 2on_current_mapboolWhether the element belongs to the map the character is standing on.never 3element_idint32Identity of the stated element, shared with the interactive element of the same object. (interactive element id)never 4cell_idint32The map cell the element stands on. (map cell id)
Range: 0-559 on a standard mapnever 5stateint32The visual state the server is putting the element into.
Opaque and per-element-type: open/closed, full/harvested and so on.
The client passes it straight to its animation layer.never
  • summary: One scenery object whose visual state the server drives: a door, a lever, a gate, a harvested stump.
  • area: Game.Interactive
  • 68 vues
One stated element changing state: a door opening, a lever thrown, a resource going from full to harvested.
Kind event · Area Game.Interactive
The delta counterpart of StatedMapUpdateEvent.
THIS IS THE MESSAGE THAT TELLS YOU A RESOURCE WAS TAKEN. Combined with InteractiveElementUpdatedEvent it is how a harvesting script learns that a node it was heading for is no longer worth walking to - including when somebody else took it.
Match by StatedElement.element_id and replace the element in your model.
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 1stated_elementStatedElementThe element whose state changed.
A whole StatedElement - replace your copy rather than patching it.never
  • summary: One stated element changing state: a door opening, a lever thrown, a resource going from full to harvested.
  • area: Game.Interactive
  • 69 vues
The state of every stated element on the map, sent when the character arrives.
Kind event · Area Game.Interactive
The map's stated-element snapshot, and the baseline that StatedElementUpdatedEvent deltas apply on top of.
IT IS A SNAPSHOT - REPLACE, DO NOT MERGE. It arrives once per map arrival.
Read it together with InteractiveMapUpdateEvent: the two lists describe the same objects from different angles and join on StatedElement.element_id. Neither alone tells you both what a node IS and what state it is IN.
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 Fields
#FieldTypeMeaningYou set it 1stated_elementsrepeated StatedElementEvery stated element on the map.
Element type StatedElement.never
  • summary: The state of every stated element on the map, sent when the character arrives.
  • area: Game.Interactive
  • 65 vues
The seven availability states a character can be in, from offline to solo.
Kind enum · Area Game.Common
The states carried by CharacterStatus. Every dumped build declares exactly these seven, numbered 0 to 6 in this order, so the numbering is the real wire contract rather than a declaration-order artefact.
TWO OF THEM LOOK ALIKE AND ARE NOT. STATUS_IDLE is set by the CLIENT when it notices inactivity; STATUS_AFK is set deliberately by the PLAYER. Reporting AFK when you merely went quiet is a claim about intent that the real client does not make on its own.
STATUS_PRIVATE and STATUS_SOLO both decline contact but differ in kind: the first is "do not disturb", the second declines party and group invitations specifically.
Not sent on its own — an enum is never sent on its own. inferred
Used by
CharacterStatus Values
ValueNumberMeaning STATUS_OFFLINE0Not connected. STATUS_AVAILABLE1Connected and open to contact. The normal state. STATUS_IDLE2Connected but inactive.
Set by the CLIENT on noticing inactivity, not by the player. STATUS_AFK3Away from keyboard.
Set DELIBERATELY by the player. Not the same as idle. STATUS_PRIVATE4Do not disturb: visible, but declining contact. STATUS_SOLO5Playing alone - declines party and group invitations. STATUS_UNKNOWN6Unknown or unrepresentable state.
  • summary: The seven availability states a character can be in, from offline to solo.
  • area: Game.Common
  • 64 vues
One look attached to another: a mount carrying its rider, a pet beside its owner, an entity being lifted.
Kind struct · Area Game.Common
The element of EntityLook.sub_entities. It nests an EntityLook of its own, SO THE STRUCTURE IS RECURSIVE - bound your traversal.
binding_point_category says what the attachment IS (see BindingPointCategoryEnum); binding_point_index says which slot within that category. The category is the one worth reading: it is how you tell a rider from a pet from a carried entity.
THE NUMBERS ARE REVERSED ON THIS BUILD - the look is 1, the index 3 and the category 4, with a decoy string sitting at 2. None of the three is read from its number.
Not sent on its own — it is only ever an element of EntityLook.sub_entities. proven
Used by
EntityLook Fields
#FieldTypeMeaningYou set it 1binding_point_indexint32Which slot within that category the sub-entity occupies.never 3sub_entity_lookEntityLookThe attached entity's own appearance.
An EntityLook, which may carry sub-entities of its own.never 4binding_point_categoryBindingPointCategoryEnumWhat kind of attachment this is.
A BindingPointCategoryEnum value.never
  • summary: One look attached to another: a mount carrying its rider, a pet beside its owner, an entity being lifted.
  • area: Game.Common
  • 60 vues
A system notification, sent as a message id plus arguments, optionally forcing a blocking display.
Kind event · Area Game.Chat
Like TextInformationEvent, this carries an id and arguments rather than text - but it is the SYSTEM notification path, and one flag on it matters a great deal.
hang_up TRUE IS THE DISCONNECT WARNING. The client takes a different branch for it: before rendering anything it invokes an action on its connection service, and only then displays the message through the blocking path. In practice this is the "you are being disconnected" class of notice. A script that ignores it keeps playing into a session that is about to end.
message_id is resolved against the same information-message table as TextInformationEvent.message_id but with a SYSTEM-MESSAGE NAMESPACE OFFSET ADDED FIRST. The raw ids from the two messages are not interchangeable.
parameters are the positional substitution arguments, same rules as the information line.
IGNORE THE EXTRA FIELD. Most builds pad this message with one more member whose type changes from build to build: an int32 on 3.4, a string list on 3.6.10, a two-value enum on 3.6.12 and a five-value enum on 3.7. The unobfuscated beta and 3.2 declare only the three members above, and no handler reads the extra one on any build. It is obfuscator padding with no meaning: do not branch on it.
When you may send it
Requires character_loaded observed Related messages
Unsolicited - nothing you send causes this the server raises system notices on its own Fields
#FieldTypeMeaningYou set it 2hang_upboolWhether this notice is on the disconnecting path.
True makes the client call its connection service before displaying, and display through the blocking path.never 3parametersrepeated stringOrdered substitution arguments for the localised text.
Positional; their meaning depends on the message id.never 4message_idint32Which system message this is. (info message id)
Resolved after adding the system-message namespace offset - not the same id space as TextInformationEvent.message_id raw.never
  • summary: A system notification, sent as a message id plus arguments, optionally forcing a blocking display.
  • area: Game.Chat
  • 57 vues
A system line pushed into the chat log, sent as a message id plus substitution arguments rather than as text.
Kind event · Area Game.Chat
ONE OF THE HIGHEST-VALUE INBOUND MESSAGES THERE IS. Almost everything the server tells you in words - fight results, PvP notices, item and object notifications, entity speech, event announcements - arrives here.
THE SERVER DOES NOT SEND YOU TEXT. It sends message_id, an identifier into the client's own information-message table, plus parameters, an ordered list of substitution arguments. The CLIENT renders the localised sentence. A script that expects a readable string finds none.
So match on message_id, not on words. That is both more reliable and language-independent: the same event carries the same id whatever locale the client runs in. If you need the sentence, you need the client's information-message table to resolve the id and its template.
message_type selects what KIND of line this is and therefore which chat channel it lands in.
parameters are positional and their meaning depends entirely on which message id they accompany. The client splits and inspects individual entries before formatting, so do not assume they are all plain strings.
When you may send it
Requires character_loaded observed Related messages
Unsolicited - nothing you send causes this the server narrates whatever it wants to narrate; no request asks for it Fields
#FieldTypeMeaningYou set it 2message_idint32Which information message this is, as an id into the client's message table. (info message id)
MATCH ON THIS, not on rendered text - it is stable across locales.never 3message_typeTextInformationTypeWhat kind of information line this is, and therefore which chat channel it lands in.never 4parametersrepeated stringOrdered substitution arguments for the localised template.
Positional; their meaning depends on the message id.
The client splits and inspects individual entries rather than treating them all as plain text.never
  • summary: A system line pushed into the chat log, sent as a message id plus substitution arguments rather than as text.
  • area: Game.Chat
  • 58 vues
Which channel a server text message is routed to.
Kind enum · Area Game.Chat
WHERE THE MESSAGE GOES. The client derives the chat channel from this value, so it decides whether the text appears as an ordinary line, an error, a popup, fight-log chatter, or speech from an entity.
TEXT_INFORMATION_POPUP is the one that opens a popup rather than writing a line; TEXT_INFORMATION_ERROR is the error styling.
EXPECT VALUES YOU DO NOT KNOW. The set has grown from nine to thirteen since the reference build and the four newer ones have no published names, so treat an unknown value as 'display it plainly' rather than switching exhaustively.
Not sent on its own — it is a member type of TextInformationEvent, never sent alone. proven
Used by
TextInformationEvent Values
ValueNumberMeaning TEXT_INFORMATION_MESSAGE0General information, shown as an ordinary message.
The name is the reference build's, matched by NUMBER. Beta 2.73.7.7 declares nine values 0-8 and every dumped 3.x build still declares all nine, adding 10-13 on top and skipping 9 - growth that is append-only, which is what makes the low numbers safe to carry. No dumped client distinguishes one value from another by name, so only the NUMBER is proven here. TEXT_INFORMATION_ERROR1An error, shown in the error style.
The name is the reference build's, matched by NUMBER. Beta 2.73.7.7 declares nine values 0-8 and every dumped 3.x build still declares all nine, adding 10-13 on top and skipping 9 - growth that is append-only, which is what makes the low numbers safe to carry. No dumped client distinguishes one value from another by name, so only the NUMBER is proven here. TEXT_INFORMATION_PVP2PvP information.
The name is the reference build's, matched by NUMBER. Beta 2.73.7.7 declares nine values 0-8 and every dumped 3.x build still declares all nine, adding 10-13 on top and skipping 9 - growth that is append-only, which is what makes the low numbers safe to carry. No dumped client distinguishes one value from another by name, so only the NUMBER is proven here. TEXT_INFORMATION_FIGHT_LOG3A line of the fight log.
The name is the reference build's, matched by NUMBER. Beta 2.73.7.7 declares nine values 0-8 and every dumped 3.x build still declares all nine, adding 10-13 on top and skipping 9 - growth that is append-only, which is what makes the low numbers safe to carry. No dumped client distinguishes one value from another by name, so only the NUMBER is proven here. TEXT_INFORMATION_POPUP4Shown as a popup rather than inline.
The name is the reference build's, matched by NUMBER. Beta 2.73.7.7 declares nine values 0-8 and every dumped 3.x build still declares all nine, adding 10-13 on top and skipping 9 - growth that is append-only, which is what makes the low numbers safe to carry. No dumped client distinguishes one value from another by name, so only the NUMBER is proven here. TEXT_LIVING_OBJECT5Text spoken by a living object (a pet or similar).
The name is the reference build's, matched by NUMBER. Beta 2.73.7.7 declares nine values 0-8 and every dumped 3.x build still declares all nine, adding 10-13 on top and skipping 9 - growth that is append-only, which is what makes the low numbers safe to carry. No dumped client distinguishes one value from another by name, so only the NUMBER is proven here. TEXT_ENTITY_TALK6Text spoken by an entity on the map.
The name is the reference build's, matched by NUMBER. Beta 2.73.7.7 declares nine values 0-8 and every dumped 3.x build still declares all nine, adding 10-13 on top and skipping 9 - growth that is append-only, which is what makes the low numbers safe to carry. No dumped client distinguishes one value from another by name, so only the NUMBER is proven here. TEXT_INFORMATION_FIGHT7Fight information.
The name is the reference build's, matched by NUMBER. Beta 2.73.7.7 declares nine values 0-8 and every dumped 3.x build still declares all nine, adding 10-13 on top and skipping 9 - growth that is append-only, which is what makes the low numbers safe to carry. No dumped client distinguishes one value from another by name, so only the NUMBER is proven here. TEXT_INFORMATION_EVENT8Event information.
The name is the reference build's, matched by NUMBER. Beta 2.73.7.7 declares nine values 0-8 and every dumped 3.x build still declares all nine, adding 10-13 on top and skipping 9 - growth that is append-only, which is what makes the low numbers safe to carry. No dumped client distinguishes one value from another by name, so only the NUMBER is proven here.
  • summary: Which channel a server text message is routed to.
  • area: Game.Chat
  • 69 vues
The server's wall-clock time and timezone offset, used to correct the client's own clock.
Kind event · Area Game.Basic
The server's clock. The client compares timestamp against its own UTC epoch milliseconds and stores two corrections: the raw skew, and the skew adjusted for timezone_offset.
USE IT INSTEAD OF YOUR OWN CLOCK FOR ANYTHING THE SERVER TIMES. Cooldowns, regrowth timers and scheduled events are all reckoned against the server's clock, and a script running on a machine whose clock drifts will be early or late by exactly that drift.
timestamp is in MILLISECONDS, not seconds - a value read as seconds lands about fifty thousand years in the future. timezone_offset is in MINUTES, not hours and not milliseconds; the client multiplies it up itself.
When you may send it
Requires authenticated observed Related messages
Unsolicited - nothing you send causes this the server states its clock; no request asks for it Fields
#FieldTypeMeaningYou set it 1timestampint64The server's current wall-clock time. (milliseconds since the unix epoch)
MILLISECONDS. Reading it as seconds is off by a factor of a thousand.never 2timezone_offsetint32The server's timezone offset from UTC. (minutes)
MINUTES. The client converts it to milliseconds itself.never
  • summary: The server's wall-clock time and timezone offset, used to correct the client's own clock.
  • area: Game.Basic
  • 61 vues
Whether the server considers this client session certified.
Kind event · Area Game.Connection
Pushed in the burst after a successful IdentificationRequest, carrying the server's own verdict on the client's integrity.
A false value is not an error you can answer - there is no reply. It is the server telling you it has not certified this session, and it is worth logging if you ever see it, because a real client normally reports certified.
When you may send it
Requires authenticated observed Related messages
Arrives after IdentificationRequest Fields
#FieldTypeMeaningYou set it 1certifiedboolWhether the server certifies this client session.never
  • summary: Whether the server considers this client session certified.
  • area: Game.Connection
  • 65 vues
Life regeneration has ended; the message also carries life values the current client ignores.
Kind event · Area Game.Character
Ends the life regeneration that LifePointsRegenBeginEvent started.
WHAT TO DO
1. Stop adding regenerated life: keep the life you have at this moment. 2. Nothing else: the client reads none of its values.
THE CURRENT CLIENT DOES NOT READ ITS VALUES. Beside life_points_gained (the one int32 with explicit presence, named from beta) the message declares two plain int32, which match beta's life_points and max_life_points, and from 3.7 a one-value enum. No client build reads any of them, so which plain int32 is the current life and which the maximum cannot be proven: they stay obfuscated and the generated proto marks them unread. Do not guess from their order.
FOR LIFE, USE THE CHARACTERISTICS. Current life is tracked in the character sheet (CharacterCharacteristicsEvent); between updates the client estimates regeneration locally from the rate it was given.
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 4life_points_gainedint32How much life was regained, when the server says so.
Explicit presence: absent is not the same as zero.
Named from its explicit presence, not from client behaviour: the current client never reads it.never
  • summary: Life regeneration has ended; the message also carries life values the current client ignores.
  • area: Game.Character
  • 71 vues
How long the account's subscription has run so far, pushed by the server and stored as-is.
Kind event · Area Game.Account
Carries the account's elapsed subscription duration. The client copies the value unchanged into its player-state service and does nothing else with it in the handler.
DO NOT CONFUSE IT WITH AccountInformationUpdateEvent, which carries the subscription END DATE as Unix seconds. Both are a single int64 in the same account file; this one is never converted to a date by the client.
ZERO IS THE PROTOBUF DEFAULT, so a zero cannot be told apart from an absent field.
The message may carry further members that no dumped build reads; they keep their obfuscated names.
When you may send it
Requires authenticated observed Related messages
Unsolicited - nothing you send causes this the server pushes account state; no request asks for it Fields
#FieldTypeMeaningYou set it 1subscription_elapsed_durationint64The account's elapsed subscription duration, as the server counts it.
The client stores it unchanged in its account state; no dumped build converts it, so its unit is not proven.never
  • summary: How long the account's subscription has run so far, pushed by the server and stored as-is.
  • area: Game.Account
  • 38 vues
One achievement the character has completed: which one, who completed it, the level it was finished at and its pioneer rank.
Kind struct · Area Game.Achievement
One achievement the character has completed: which achievement (AchievedAchievement.achievement_id), who completed it (AchievedAchievement.achieved_by), the level it was finished at (AchievedAchievement.finished_level) and its pioneer rank (AchievedAchievement.pioneer_rank).
A shared record, not a message anyone sends. AchievementsEvent carries the full list of them; two further achievement events carry exactly one each - the "you just finished an achievement" notice and the announcement of someone else's achievement - and have no signature here yet.
HOW THE CLIENT USES IT
- achievement_id is the key. The client looks the achievement up in its achievement data by this id, and matches a reward result against its records by it. - finished_level is read through the generated accessor, so an absent value reads as 0. The client treats a value above 0 as "reward not claimed yet": when the reward result for that achievement arrives, it checks the value is above 0 and sets it to 0. See AchievementRewardRequest for claiming. - pioneer_rank is copied into the client's record and read nowhere else on 3.6.12.16.
WIRE NUMBERS MOVE. The four members take different field numbers on every build, and builds pad the record with an unread string, a second int64 or a second int32. Match the members by the rules above, never by number.
Not sent on its own — it is a record embedded in the achievement events, never sent on its own. inferred
Used by
AchievementFinishedEvent AchievementsEvent Fields
#FieldTypeMeaningYou set it 1achievement_idint32Which achievement was completed; the key the client looks it up and matches reward results by. (achievement id)never 2achieved_byint64Who completed it: an id the client stores without interpreting it further.
The name says who achieved it; that it is a character id is inferred from the name and the int64 type, not from client behaviour.never 3finished_levelint32Optional. Above 0 while the reward is still unclaimed; the client sets it to 0 when the reward result arrives.
Explicit presence: absent is not the same as zero.
Read through the generated accessor, so an absent value reads as 0.never 4pioneer_rankint32The character's pioneer rank for this achievement; the client keeps it but reads it nowhere else on 3.6.12.16.never
  • summary: One achievement the character has completed: which one, who completed it, the level it was finished at and its pioneer rank.
  • area: Game.Achievement
  • 37 vues
The character just completed one achievement.
Kind event · Area Game.Achievement
One achievement was just completed. The payload is the same AchievedAchievement record that AchievementsEvent lists.
WHAT TO DO WHEN YOU RECEIVE IT
1. ADD the record to the completed achievements you hold, keyed by AchievedAchievement.achievement_id. It is one new entry, not a new list. 2. If AchievedAchievement.finished_level is above 0, the reward is waiting: claim it with AchievementRewardRequest when you want it. 3. SEND NOTHING BACK. The client only announces it: an "achievement unlocked" message, and dedicated popups for some Temporis and expedition rewards.
THE OTHER MEMBERS ARE PADDING. This build declares a bool and a SECOND AchievedAchievement beside the real one. The client reads only the one this record maps as achievement - do not read the other.
When you may send it
Requires character_loaded observed Related messages
Unsolicited - nothing you send causes this the server sends it when an achievement completes; no request asks for it Fields
#FieldTypeMeaningYou set it 3achievementAchievedAchievementThe achievement that was just completed.
An AchievedAchievement, the same record AchievementsEvent lists.never
  • summary: The character just completed one achievement.
  • area: Game.Achievement
  • 37 vues
The full list of achievements the character has completed. Replace what you hold with it; nothing is sent back.
Kind event · Area Game.Achievement
The full list of achievements the character has completed, one AchievedAchievement per entry.
WHAT TO DO WHEN YOU RECEIVE IT
1. REPLACE the list you hold with this one. It is the whole list, not a change: the client empties its own list and rebuilds it from the entries. 2. SEND NOTHING BACK. The handler builds no request. 3. An entry whose AchievedAchievement.finished_level is above 0 still has its reward to claim; AchievementRewardRequest claims it.
KEY ENTRIES BY AchievedAchievement.achievement_id. That is how the client finds an entry again, for example when the reward result for one achievement arrives.
Some builds declare a second, never-read list of the same record beside the real one. The real list is the one the client walks.
When you may send it
Requires character_loaded inferred Related messages
Unsolicited - nothing you send causes this no request in the achievement area asks for it; the requests there ask for one category's details, the almost-finished list or the pioneer ranks Fields
#FieldTypeMeaningYou set it 1achieved_achievementsrepeated AchievedAchievementEvery achievement the character has completed.
A list of AchievedAchievement; the whole list, which replaces the previous one.never
  • summary: The full list of achievements the character has completed. Replace what you hold with it; nothing is sent back.
  • area: Game.Achievement
  • 37 vues
What choosing an NPC dialog reply does: an action type and its arguments (a quest or quest step id for quest actions).
Kind struct · Area Game.Npc
One effect of an NPC dialog reply, inside VisibleReply.actions: what the server will do when you choose the reply.
id the action type. The client recognises the quest actions (it treats ids up to 34 and the ids 905 and 911 specially) and derives the reply's icon from them. parameters the action's arguments. For a quest action the first one is the quest id or the quest step id; the client looks it up in its quest data to decide whether the icon shows a main, event, repeatable or ordinary quest.
Nothing is sent because of an action: pick the reply with NpcDialogReplyRequest and the server performs it.
SCHEMA CHANGE IN 3.6. Up to 3.5 an action carried id and a bool is_repeatable instead of parameters; the client then took the icon's repeatability from that bool. From 3.6 it carries the arguments and the client reads repeatability from the quest data. This signature describes the current form only.
Not sent on its own — it only travels inside VisibleReply.actions. inferred
Used by
VisibleReply Fields
#FieldTypeMeaningYou set it 2idint32The action type. (NPC reply action id)
The client compares it with the quest action ids to choose the reply's icon.never 4parametersrepeated int32The action's arguments; for a quest action the first is a quest id or quest step id.
The client reads only the first one, and only to look the quest up for the icon.
Replaced is_repeatable (bool) in 3.6; name invented, no oracle names it.never
  • summary: What choosing an NPC dialog reply does: an action type and its arguments (a quest or quest step id for quest actions).
  • area: Game.Npc
  • 42 vues
What an anomaly destination offers: its XP and loot bonus, minutes left, and (3.7) which anomaly it is.
Kind struct · Area Game.Teleportation
The details of an anomaly destination, carried by TeleportDestination.anomaly when the destination's type is TELEPORTER_ANOMALY. It is never sent on its own.
HOW TO READ IT
- bonus_pourcentage: the anomaly's experience and loot bonus, in percent (120 means +120%). The client shows it as "Bonus: 120%". - remaining_time: how long the anomaly stays open, in MINUTES. The client shows it as "Time remaining: N minutes" and keeps a countdown. - anomaly_id (3.7.x and later): which anomaly this is. The client looks it up in its anomaly data to show the guardian monster's name.
Nothing here is sent back: to go there, use the destination's own map_id.
LIVE CAPTURE (3.7.4.4): four anomaly destinations, all with bonus 120, remaining times 12, 77, 22 and 13, anomaly ids 6, 10, 10 and 16.
Builds pad this record with an unread int32, or (3.7.4.4) an unread int32 and an unread nested {int32, bool}.
Not sent on its own — it is only ever the TeleportDestination.anomaly member. proven
Used by
TeleportDestination Fields
#FieldTypeMeaningYou set it 1anomaly_idint32Which anomaly this is; the client looks it up to show the guardian monster's name. 3.7.x and later. (anomaly data id)
Not in beta; absent from builds before 3.7.never 4remaining_timeint64How long the anomaly stays open, in minutes. (minutes)never 5bonus_pourcentageint32The anomaly's experience and loot bonus, in percent (120 = +120%). (percent)never
  • summary: What an anomaly destination offers: its XP and loot bonus, minutes left, and (3.7) which anomaly it is.
  • area: Game.Teleportation
  • 47 vues
The fight modifiers (spell pairs) in effect in the character's current area. An empty list means none.
Kind event · Area Game.Area
The list of fight modifiers that apply to fights in the area the character is in. Each modifier is a spell pair from the game data (SpellPairs).
REPLACE, DON'T MERGE. The list is the whole current set: keep it as the active modifiers and drop the previous ones. An EMPTY list is meaningful: no modifier applies here.
WHAT THE CLIENT DOES WITH IT
It stores the list as the current modifiers and, for each spell pair, prints a chat line naming it ("current fight modificator" / "new fight modificator"). Nothing is sent back.
When you may send it
Requires character_loaded inferred Related messages
Unsolicited - nothing you send causes this the server pushes the area's modifiers; no request asks for them. An empty list arrives where no modifier applies Fields
#FieldTypeMeaningYou set it 1spell_pairsrepeated int32The spell pairs that modify fights in this area. (spell pair ids (DataCenter SpellPairs))
The whole current set: an empty list means no modifier applies.never
  • summary: The fight modifiers (spell pairs) in effect in the character's current area. An empty list means none.
  • area: Game.Area
  • 39 vues
The character's Kolizeum league, rating, best results and fight counts in one arena mode.
Kind struct · Area Game.Arena
The character's standing in ONE Kolizeum mode (ArenaRank.arena_type): the current league and rating (ArenaRank.league_ranking, a LeagueRanking), the best ones reached, and today's and the season's fight and victory counts.
A record inside ArenaUpdatePlayerInformationEvent, never sent on its own. KEY IT BY arena_type: the client keeps exactly one per arena type and the newest one replaces the old.
The client turns each into its Kolizeum display record, looking both league ids up in its arena-league data for a name and an icon. Its seven counters share one wire type and move between field numbers on every build; they are named here from where the client copies each one, never from their numbers.
Not sent on its own — it is a record inside ArenaUpdatePlayerInformationEvent, never sent on its own. inferred
Used by
ArenaUpdatePlayerInformationEvent Fields
#FieldTypeMeaningYou set it 1best_league_idint32Id of the best league reached; the client looks the league up in its arena-league data.never 2daily_victory_countint32Kolizeum fights won today in this mode.never 3fight_needed_for_ladderint32Fights still needed before the character appears on the ladder.never 4arena_typeArenaTypeWhich Kolizeum mode this standing is for; the key the client files it under.
An ArenaType. Its values are not named: the client never distinguishes them in code that survives obfuscation.never 5season_fight_countint32Kolizeum fights fought this season in this mode.never 6daily_fight_countint32Kolizeum fights fought today in this mode.never 7season_victory_countint32Kolizeum fights won this season in this mode.never 8best_ratingint32Best rating reached in this arena mode.never 9league_rankingLeagueRankingThe current league, rating and ladder position in this mode.
A LeagueRanking.never
  • summary: The character's Kolizeum league, rating, best results and fight counts in one arena mode.
  • area: Game.Arena
  • 38 vues
Which Kolizeum mode a standing belongs to. The type is named; its values are not.
Kind enum · Area Game.Arena
The Kolizeum mode ArenaRank.arena_type refers to. The client uses the value only as a key, so you can do the same: keep one ArenaRank per value.
THE VALUES ARE NOT NAMED HERE. Beta declares three modes, ONE_VS_ONE = 0, TWO_VS_TWO = 1 and THREE_VS_THREE = 2, but enum numbers are not trusted across builds and nothing in the client's code separates the values. From 3.5 on the enum has FOUR values, and the client's own mirror of it has four too (plus -1 for none), so the fourth is a real mode rather than padding; which one is not visible in the client.
Not sent on its own — an enum is never sent on its own. inferred
Used by
ArenaRank No fields you may set.
  • summary: Which Kolizeum mode a standing belongs to. The type is named; its values are not.
  • area: Game.Arena
  • 41 vues
The character's Kolizeum standing for each arena mode, and the end of any Kolizeum ban. Store it; nothing is sent back.
Kind event · Area Game.Arena
The character's Kolizeum standing: one ArenaRank per arena mode in ArenaUpdatePlayerInformationEvent.arena_ranks, and the end of any Kolizeum ban in ArenaUpdatePlayerInformationEvent.ban_end_date.
WHAT TO DO WHEN YOU RECEIVE IT
1. For each entry, REPLACE what you hold for its ArenaRank.arena_type. The client files the entries in a table keyed by arena type, overwriting the previous entry for that type; types absent from the message keep their old entry. 2. Store the ban end date. 3. SEND NOTHING BACK. The handler builds no request; it hands the whole table to the Kolizeum window.
THE BAN DATE IS A STRING, NOT A NUMBER. The client parses it with DateTime.Parse(value, InvariantCulture, RoundtripKind) - an ISO 8601 style timestamp - and keeps its ticks. It parses unconditionally; what the server sends when there is no ban is not visible in the client.
Builds pad this message with a second, never-walked list of the same record, and with unread messages and strings. The real list is the one the client walks; the real date is the one string it parses.
When you may send it
Requires character_loaded inferred Related messages
Unsolicited - nothing you send causes this no request in the arena area asks for it; beta's arena requests register, unregister, answer a fight proposal or switch the reward mode Fields
#FieldTypeMeaningYou set it 1ban_end_datestringWhen the character's Kolizeum ban ends, as a date string.
Parsed with DateTime.Parse(value, InvariantCulture, RoundtripKind).never 2arena_ranksrepeated ArenaRankOne standing per arena mode; each replaces the one held for its arena type.
A list of ArenaRank.never
  • summary: The character's Kolizeum standing for each arena mode, and the end of any Kolizeum ban. Store it; nothing is sent back.
  • area: Game.Arena
  • 41 vues
Attacks a monster group on the current map, starting a fight against it. Carries the group's actor id.
Kind request · Area Game.Roleplay
Starts a fight against one monster group of the map you are on.
HOW TO SEND IT
1. BE IN ROLEPLAY, ON THE GROUP'S MAP. The group is named by its actor id, the ActorPositionInformation.actor_id it was announced with in GameRolePlayShowActorsEvent or in the map's contents. Monster groups have NEGATIVE actor ids. 2. WALK TO IT FIRST, THE WAY THE CLIENT DOES. The official client sends MapMovementRequest toward the group and remembers the group. It sends this message when the walk is over: - normally right after MapMovementConfirmRequest; - also when the server refuses the walk with MapMovementRefusedEvent: the client puts the character back on the cell the server gives and attacks anyway; - at once, with no walk, when the character already stands on the destination. 3. PUT THE GROUP'S ACTOR ID IN AttackMonsterRequest.monster_group_id. Nothing else. 4. WAIT FOR THE FIGHT. In a capture the first answer was EntitiesDispositionEvent with the attacker's cell and direction, about 30ms later, then two FightTeamUpdateEvent (one per team). Once the fight map was loaded and ContextReadyRequest sent, FightStartingEvent, FightJoinEvent and one FightFighterShowEvent per fighter followed.
THE ID IS AN ACTOR ID, NOT A MONSTER TEMPLATE ID. It is the group's contextual id on this map (for example -20002), the same id the fight then reports as its defender (FightStartingEvent.defender_id) and as the monster team's leader. A monster id from the game data is not accepted in its place.
PADDING. Builds add unread members beside the id (a nested record on 3.7, a second int64 on 3.6.12.16). Fill only the recovered member.
OBSERVED (one capture, 3.7.8.7): monster_group_id -20002, followed ~30ms later by EntitiesDispositionEvent carrying only the attacker, then by the fight set-up.
When you may send it
Requires roleplay_context inferred Raised by: a user action followed by a walk: the player clicks a monster group; the client walks toward it and attacks the group it remembered once the walk ends, also when the server refuses the walk with MapMovementRefusedEvent, and at once when the character already stands on the destination cell inferred Related messages
You will then receive EntitiesDispositionEvent observed — about 30ms later, the attacker's own disposition as the fight is set up, then the fighters' placement dispositions; 1 observation You will then receive FightTeamUpdateEvent observed — about 70ms later, two back to back, one per team of the new fight (yours led by you, the monsters' led by the group id); 1 observation You will then receive FightStartingEvent observed — about 640ms later, once the client had loaded the fight map and sent ContextReadyRequest; 1 observation Fields
#FieldTypeMeaningYou set it 2monster_group_idint64Actor id of the monster group to attack, as announced on the current map (negative for monster groups). (actor id (contextual, map-scoped))
Observed: -20002required
  • summary: Attacks a monster group on the current map, starting a fight against it. Carries the group's actor id.
  • area: Game.Roleplay
  • 46 vues
Adds one challenge to the current fight's challenge list, or replaces the one with the same id.
Kind event · Area Game.Challenge
One challenge of the current fight, as a full challenge record: its id, targets, state and bonuses.
WHAT TO DO WHEN YOU RECEIVE IT
1. Look the challenge up by the record's challenge id in the fight's challenge list. 2. INSERT OR REPLACE. The client removes an entry with the same id, then adds the new one, so the record is the challenge's whole current state, not a delta. 3. Resolve the challenge id in the game data (the challenge definition: name, description, icon) if you need to show or reason about it. 4. SEND NOTHING BACK.
IT IS ONE CHALLENGE. The whole list arrives in ChallengeListEvent; a later change of only the targets arrives in ChallengeTargetsEvent, and the outcome in ChallengeResultEvent.
PADDING. Builds pad this message with unread members (a bool, a repeated bool, a second record); the challenge record the client reads is the only member named.
When you may send it
Requires context_ready inferred Related messages
Unsolicited - nothing you send causes this the server announces a challenge when it becomes active in the fight; no request asks for it Fields
#FieldTypeMeaningYou set it 2challengeChallengeThe challenge to add, or to replace when one with the same id is already listed.never
  • summary: Adds one challenge to the current fight's challenge list, or replaces the one with the same id.
  • area: Game.Challenge
  • 41 vues
Which reward a fight's challenges give: an experience bonus or a drop bonus.
Kind enum · Area Game.Challenge
The bonus kind of a fight's challenges, carried by ChallengeBonusChoiceSelectedEvent.challenge_bonus and by the bonus-choice request.
HOW TO READ IT
1. CHALLENGE_EXPERIENCE_BONUS: the challenges raise the experience gained; each challenge's bonus is Challenge.xp_bonus. 2. CHALLENGE_DROP_BONUS: the challenges raise the drops; each challenge's bonus is Challenge.drop_bonus.
Not sent on its own — an enum is never sent on its own. inferred
Used by
ChallengeBonusChoiceRequest ChallengeBonusChoiceSelectedEvent Values
ValueNumberMeaning CHALLENGE_EXPERIENCE_BONUS0The challenges give an experience bonus.
The client shows it with the experience icon. CHALLENGE_DROP_BONUS1The challenges give a drop bonus.
The client shows it with the chest icon.
  • summary: Which reward a fight's challenges give: an experience bonus or a drop bonus.
  • area: Game.Challenge
  • 39 vues
Asks for the fight's challenges to reward a given bonus kind: experience or drops.
Kind request · Area Game.Challenge
Chooses which reward the fight's challenges give.
HOW TO SEND IT
1. From the challenge settings: the official client sends it when the bonus selector changes. 2. Put the wanted kind in ChallengeBonusChoiceRequest.challenge_bonus, a ChallengeBonus value. Its values are not named here: reuse a value you received in ChallengeBonusChoiceSelectedEvent rather than guessing a number. 3. Wait for ChallengeBonusChoiceSelectedEvent before relying on it.
When you may send it
Requires context_ready inferred Raised by: the player picks the bonus kind in the fight's challenge settings proven Related messages
You will then receive ChallengeBonusChoiceSelectedEvent inferred — the server announces the chosen bonus kind; the client updates its display from that event Fields
#FieldTypeMeaningYou set it 1challenge_bonusChallengeBonusThe bonus kind to choose.
Type ChallengeBonus; its values are not named.required
  • summary: Asks for the fight's challenges to reward a given bonus kind: experience or drops.
  • area: Game.Challenge
  • 45 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.