Smooth
Administrateurs
-
Adhésion
-
Dernière visite
-
Actuellement
Affichage de Informations dans la catégorie Guide Français : Suivre un bot
Tout ce qui a été publié par Smooth
-
PrepareCharacterDeletionRequest
Opens the character-deletion flow and asks what the server needs to confirm it. Deletes nothing. Kind requestArea Game.CharacterNamed by beta, gamemapping STEP 1 OF 3. IT DELETES NOTHING. It asks the server what confirming the deletion will require. 1. PrepareCharacterDeletionRequest you ask 2. CharacterDeletionPrepareEvent the server states the terms 3. CharacterDeletionRequest the deletion actually happens Do not send step 3 without reading step 2: whether a secret answer is required is decided there, per character. Padding varies between builds; the id is the member named here. When you may send it Requires authenticated observed Raised by: the player chooses to delete a character on the selection screen proven Related messages You will then receive CharacterDeletionPrepareEvent inferred — the server answers with the character's name and whether a secret answer is required Sequence Step character_deletion.1 inferred — of 3 steps; the flow is a fixed ask / terms / confirm exchange Fields #FieldTypeMeaningYou set it 4character_idint64The character the player asked to delete. (character id)required 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: 1 of 4.
-
PlayerStatusUpdateRequest
Sets the character's own availability, with an optional free-text message. Kind requestArea Game.SocialNamed by beta, gamemapping Sets your own availability - see Status for what the values mean. DO NOT APPLY IT LOCALLY AND ASSUME IT TOOK. The server echoes the change back as PlayerStatusUpdatedEvent; that echo is what makes it real. There is a sibling error event in the naming oracles for a rejected change, declared empty and not recovered here. status carries both the state and the optional free text; see CharacterStatus. STATUS_IDLE IS THE CLIENT'S TO SET, NOT YOURS. The real client sets idle when it notices inactivity. Announcing AFK is a deliberate player action; announcing idle while actively playing is a claim the real client does not make. When you may send it Requires character_loaded observed Raised by: the player picks an availability from the status control inferred Related messages You will then receive PlayerStatusUpdatedEvent inferred — the server broadcasts the new status, echoing it back to the sender as well Fields #FieldTypeMeaningYou set it 1statusCharacterStatusThe availability state to adopt, plus its optional free text. A CharacterStatus.required Recovered with score 185, confidence 0.81, margin 185 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.
-
PingRequest
Latency probe. Its automatic sender only fires when the player has touched an input device, so it is not a heartbeat. Kind requestArea Game.ConnectionNamed by beta, gamemapping Measures round-trip time to the game server: send it, wait for PongEvent, keep the delta. TWO SENDERS, AND ONLY ONE OF THEM IS A TIMER. THE AUTOMATIC PROBE sends quiet = true. A timer re-arms itself every INTERVAL ms, but a tick only sends if the player touched an input device since the previous tick: every INTERVAL ms: if input_seen_since_last_tick: input_seen_since_last_tick = false send PingRequest(quiet = true) re-arm INTERVAL is 5 seconds when the client's fast-ping option is on and 10 minutes when it is off. There is no third value, no jitter and no back-off. THE CHAT CONSOLE COMMAND 'ping' sends quiet = false, once, immediately, with no gate at all. Its sibling 'aping' prints the stored average and sends nothing. THREE PROPERTIES OF THE INPUT GATE DECIDE WHAT YOUR TRAFFIC LOOKS LIKE. It is a LATCH, not a counter - ten thousand input events between two ticks produce one ping, not ten thousand. It is CONSUMED by the tick, so two consecutive pings need input in two separate intervals. And it is read BEFORE the send, so the first tick after an idle stretch is silent. WHAT COUNTS AS INPUT IS NARROWER THAN IT LOOKS. The latch is set only while a keyboard key or a mouse button is held, or a movement axis is off centre. Moving the mouse without pressing anything does not set it, and neither does giving the window focus back. Gameplay does not set it either: a character walking a route under script control produces no input at all. A CLEAN PERIODIC PING STREAM IS A STRONGER ANOMALY THAN SILENCE. A real client cannot produce one - with the input devices untouched it sends almost never. A capture of an active session shows pings roughly ten seconds apart while the player was moving: irregular, not clockwork. If your script never touches an input device, the faithful behaviour is to send this rarely, or not at all. The gate is a traffic-shape rule, not a legality rule - the server answers a ping sent at any moment. ONE PING AT A TIME. The client keeps a single outstanding send timestamp: stamped on send, cleared by the reply. A reply that arrives with no outstanding send is discarded and produces no sample, so pipelining pings gets you fewer measurements, not more. WHAT HAPPENS IF NOTHING COMES BACK. One second after each send the client raises its lag indicator, and lowers it again when the reply lands. Nothing is retransmitted and nothing is torn down - the exchange simply stays unanswered. THE SAMPLES ARE NOT DECORATIVE. Each round trip is appended to a rolling buffer of the last 50, and the average of that buffer is the number a real client reports when the server polls with BasicLatencyStatsEvent. A script that never pings has no honest value to put in BasicLatencyStatsRequest. When you may send it Requires authenticated observed Raised by: two independent senders. A timer that re-arms itself every 5s (fast ping on) or 10min (off) and sends ONLY if raw input arrived since the previous tick, clearing that latch as it fires; and the chat console command 'ping', which sends once, immediately, with no gate inferred Related messages You will then receive PongEvent observed — the reply that closes the measurement; answered ~30ms later, 2 of 2 observations in one session Fields #FieldTypeMeaningYou set it 2quietboolWhether the measurement stays silent. The server echoes it back unchanged in the reply. The automatic probe sends true; the chat console command sends false. The difference is not server-side - the flag comes back in PongEvent.quiet, and a client that receives false PRINTS the measured round-trip into the chat window. Send false only if you mean to imitate a player who typed the command.required Recovered with score 115, confidence 0.99, 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: 1 of 2.
-
ObjectDeleteRequest
Destroys a quantity of one inventory item. The item is gone; there is no undo and no confirmation step on the wire. Kind requestArea Game.InventoryNamed by beta DESTRUCTIVE AND IRREVERSIBLE. This is the destroy-item action, not a move and not a drop. The items are consumed by the server with no confirmation exchange: by the time you could change your mind the message is already sent. IT HAS A TWIN THAT DROPS THE ITEM ON THE GROUND INSTEAD. A sibling request in the same file wraps the identical ObjectUidWithQuantity payload and means something completely different. Their wire shapes are indistinguishable, so verify you are constructing THIS message by name; a mistake here is not caught by any type checker. Address the stack by ObjectItem.uid, never by ObjectItem.gid. A gid either names no stack or names a different one, and the request is not rejected for being nonsense. quantity is how many to destroy, not how many to leave. Sending the stack's full quantity destroys the stack. When you may send it Requires character_loaded inferred Raised by: the player confirms the destroy prompt on an inventory item proven Related messages Reply not yet recovered: the server acknowledges with an inventory update naming the new quantity. That message has no signature yet, so treat the destroy as unconfirmed until the next InventoryContentEvent or quantity update you can read. Fields #FieldTypeMeaningYou set it 2objectObjectUidWithQuantityWhich stack to destroy and how many units of it. The current build declares this type twice in the record; only this member is ever populated.required Recovered with score 185, confidence 0.93, margin 185 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.
-
ObjectAveragePricesRequest
Asks for the market average price of every tradeable item. Empty payload, and the answer is the whole catalogue. Kind requestArea Game.ExchangeNamed by beta, gamemapping Carries nothing. One request fetches the average price of EVERY tradeable item - the protocol offers no per-item form. SEND IT ON A SCHEDULE, NOT ON DEMAND. The client runs it from a background loop that fires once at start and then hourly, gated on a persisted timestamp. The staleness test is a CALENDAR-DAY comparison, not an elapsed-hours one: the client stores the last refresh as a UTC tick count and considers the cache stale when the stored date differs from today in year, month or day. A cache written at 23:59 is therefore stale one minute later, and a bot that re-asks on every login regardless is producing a traffic pattern the real client does not. EXPECT A VERY LARGE ANSWER. The observed reply carried 9711 (gid, price) pairs - effectively the whole catalogue. Asking in a loop is expensive at both ends and unmistakable in a capture. DO NOT SET A CORRELATION ID. The client sends this uncorrelated, leaving the envelope id at -1, and the answer comes back as an EVENT rather than a response - so there is nothing to correlate against. Match ObjectAveragePricesEvent by arrival. There is a failure event in the naming oracles that would answer this instead, but it is not recovered and has no signature here. Watch for an unexpectedly empty reply after asking. When you may send it Requires character_loaded inferred Raised by: a background loop that fires at start and then hourly, gated on a persisted timestamp compared by CALENDAR DAY - a cache written at 23:59 is stale a minute later inferred Related messages You will then receive ObjectAveragePricesEvent observed — the answer to this request; the observed reply carried 9711 price pairs No fields you may set. Recovered with score 150, confidence 0.89, margin 150 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 1.
-
NpcGenericActionRequest
Ask an NPC on the current map to run one of its actions. Kind requestArea Game.NpcNamed by gamemapping, beta WHEN TO SEND IT Send it when the player picks one of the actions an NPC offers - talk, open its shop, and so on. You need three things, and all three must agree: the NPC's id the contextual id of the NPC ON THIS MAP, not a data id. It is the id the map sent you for that actor, and it is routinely NEGATIVE. Do not invent it and do not carry it across maps. the action id which of that NPC's actions you want. Small integer. the map id the map you are on RIGHT NOW. Sending it before the map is loaded, with an NPC that is not on that map, or with an action that NPC does not offer, is refused. WHAT COMES BACK Nothing, when it works - the action itself answers. Opening a dialogue answers with the dialogue's own messages; opening a shop answers with the shop's. On refusal the server sends a failure event that carries no payload, so it tells you THAT it failed and never why. SO DO NOT WAIT ON A REPLY TO THIS MESSAGE. Wait on the action you asked for, and treat the empty failure as your only negative. WHY THE MAP ID IS IN HERE It is the server's guard against a stale click: the NPC id alone is ambiguous once you have changed map, and this pins the request to the map the player was actually looking at. When you may send it Requires context_ready observed Requires character_loaded inferred Related messages You will then receive NpcGenericActionFailureEvent inferred — the ONLY answer this request gets, and only on refusal; success is answered by the action itself Fields #FieldTypeMeaningYou set it 1npc_map_idint64The map the player is on. Guards against a stale click.required 2npc_action_idint32Which of that NPC's actions to run. Small integer.required 3npc_idint32The NPC's contextual id on the current map. Usually negative.required Recovered with score 310, confidence 0.88, margin 240 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.
-
NpcDialogReplyRequest
Answers an NPC by picking one of the replies it offered. Kind requestArea Game.NpcNamed by beta, gamemapping ANSWERS THE QUESTION THE NPC JUST ASKED. One id: the reply you picked. WHEN TO SEND IT ONLY WHILE A DIALOGUE QUESTION IS OPEN, and only with a reply id that question actually offered. The reply ids are not global constants you can hardcode - each question arrives carrying its own list, and the client never invents one. Sending an id the current question did not offer is not a different answer, it is an invalid one. THREE WAYS IN, ONE MESSAGE. The real client sends this from a reply button, from confirming the highlighted reply, and from taking the first reply when the dialogue validates itself. All three raise the same intent with the same single value, so a script only needs one path: decide which reply, send its id. ONE ANSWER PER QUESTION. The dialogue is a turn-taking exchange - answer, wait for what comes back, answer again. Do not queue several replies ahead; the ids of the next question do not exist yet when you send this one. WHAT COMES BACK EITHER THE NEXT QUESTION OR THE DIALOG CLOSING - and which one you get is the NPC's decision, not yours. A reply that ends the conversation produces a dialog close rather than another question, so treat "no new question" as a normal outcome and watch for DialogLeaveEvent with the dialogue type, which is how the client learns the exchange is over. Nothing here is correlated: the envelope uid goes out as -1 and there is no response to match against. THE SECOND DECLARED MEMBER IS PADDING. No dumped client has ever written it. When you may send it Requires context_ready observed Raised by: a client-side state change: the player choosing one of the replies the NPC dialogue is showing - by clicking a reply button, by confirming the highlighted one, or by taking the first reply when the UI validates itself. All three raise one intent carrying the reply id inferred Related messages Reply not yet recovered: either the next dialogue question or the dialog closing. Those messages are recovered but not documented yet. Fields #FieldTypeMeaningYou set it 1reply_idint32The reply you picked, by the id the question offered.required Recovered with score 230, confidence 0.90, margin 230 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.
-
MapMovementRequest
Asks the server to walk the character along a path of map cells. Kind requestArea Game.GamemapNamed by beta, gamemapping Asks to move. YOU ARE ASKING, NOT MOVING - the server decides what actually happens and answers with MapMovementEvent. WALK THE PATH THE SERVER SENDS BACK, NOT THE ONE YOU ASKED FOR. The granted path can be shorter than the requested one, and applying your own path optimistically desynchronises your position from the server's. Everything else you do on the map - reading interactives, attacking, using a zaap - is validated against the server's idea of where you stand. key_cells is the path as map cell ids, in order, starting from the cell ADJACENT to where you are, not from your current cell. Cell ids are single grid indexes, not coordinate pairs. map_id must be the map you are actually on. The client reads it from live map state at send time rather than from a cache, and so should you: after a teleport, a stale map id is the difference between a move and a rejected one. cautious is the careful-walking mode the client derives from its own movement options. It is not a speed setting. When the walk finishes, close the handshake with MapMovementConfirmRequest. When you may send it Requires context_ready inferred Raised by: the player choosing a destination. Two producers build it: the roleplay movement service (four sites, working from EntityPhysics and a validated MapPoint path) and the fight movement service (two sites, built around FightTurn) proven Related messages You will then receive MapMovementEvent inferred — the client's handler treats that event as the grant for this request Fields #FieldTypeMeaningYou set it 1key_cellsrepeated int32The requested path, as an ordered list of map cell ids. (map cell ids) A cell id is a single grid index, not an x/y pair. The client derives these from an already-validated path, so it never asks for a route it believes is impassable.required 2cautiousboolWhether to move in the client's cautious walking mode. Derived from the player's movement and input options, not from the path.required 3map_idint64The map the movement is requested on. (map id) Read from live map state at send time, not from a cached current map.required Recovered with score 110, confidence 0.96, margin 110 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.
-
MapMovementConfirmRequest
Tells the server the character has finished walking the path it was granted. Empty payload. Kind requestArea Game.GamemapNamed by gamemapping Closes the movement handshake: the walk you were granted is done. CARRIES NOTHING - SEND IT EMPTY. Four of the dumped builds declare it with no fields at all; the current one pads it with a nine-value enum that NO writer in any dumped build populates. The client constructs this message, sets nothing, and submits it. Watch that padding rather than dismissing it. If a later build starts populating that enum, this message stops being a bare acknowledgement and becomes a "why did the move end" report - and a script that has hardcoded an empty payload will be sending the wrong thing rather than nothing. The name comes from one oracle only: Ankama's own type map in an early 3.x build. This message postdates the unobfuscated reference build, so unlike most of this catalogue there is no second source to cross-check the spelling. When you may send it Requires context_ready inferred Related messages Answers MapMovementEvent You will then receive MapMovementConfirmResponse inferred — the server acknowledges and the handshake closes Recovered with score 180, confidence 0.76, margin 180 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 0.
-
MapMovementCancelRequest
Stops a walk in progress and tells the server where you actually ended up. Kind requestArea Game.RoleplayNamed by beta, gamemapping STOPS A WALK AND SAYS WHERE YOU ACTUALLY ARE. It is not "cancel my request" - by the time you send it you have already moved partway, and the one value it carries is where you came to rest. WHEN TO SEND IT WHEN A WALK YOU ALREADY STARTED IS INTERRUPTED BEFORE IT FINISHES. You send MapMovementRequest with a path, the server accepts it, and then something stops you early - the player clicked elsewhere, a fight started, an obstacle appeared, the player pressed the stop control. That is this message. DO NOT SEND IT FOR A WALK THAT COMPLETED. A finished walk needs nothing; the server already knows the destination it approved. SEND THE CELL YOU ARE ACTUALLY ON, NOT THE ONE YOU AIMED AT. This is the whole point of the message and the easiest thing to get wrong. The real client does not send the destination from the path it requested, nor the cell it last announced - it asks the moving entity's own physics for its current position and sends that. If you send the intended destination you are telling the server you completed a walk you interrupted, and your position and its position diverge from that moment on. A script that walks by sending a path and then aborts must therefore track where it stopped. If you cannot compute that, do not send this message at all - diverging silently is worse than not cancelling. WHAT COMES BACK NOTHING DEDICATED. No dumped client waits for a reply. The server reconciles your position through the ordinary actor traffic that follows, so watch your own actor's position rather than expecting an acknowledgement. BE HONEST ABOUT THE CELL and the correction will be invisible; be optimistic about it and the server will move you back, visibly, later. When you may send it Requires context_ready observed Raised by: a client-side state change: a walk being interrupted before it reaches its destination. The client stops the moving entity, asks its physics where it actually is, and reports that cell inferred Related messages Nothing answers it - send it and move on no dumped client waits for a reply; the server corrects the position through ordinary actor traffic Fields #FieldTypeMeaningYou set it 1cell_idint32The cell you stopped on.required Recovered with score 235, confidence 0.88, margin 235 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.
-
MapInformationRequest
Asks the server what is standing on a map. Without it the map loads empty. Kind requestArea Game.GamemapNamed by beta, gamemapping Turns a loaded map into a playable one. A script that never sends this sees an empty world: no actors, no interactive elements, nothing to walk to. SEND IT ON EVERY MAP LOAD, ONCE PER MAP - NOT ONCE PER SESSION. The client raises it from its internal map-loaded notification, so it fires again on every teleport, zaap, map change and fight exit. SEND IT TOGETHER WITH ContextReadyRequest. They live in different protocol areas but the client raises both from the SAME notification, and in a capture they leave back to back carrying the same map id. Sending only one is not something the real client ever does. TAKE THE MAP ID FROM THE LOAD EVENT, NOT FROM YOUR OWN STATE. The client copies it straight out of the notification and never consults a cached current map. Note the type mismatch with its sibling: map_id is int32 here and the same value travels as an int64 in ContextReadyRequest. A capture shows both leaving in the same millisecond with 153356290 in each. A width difference is not a different map. DO NOT SET A CORRELATION ID. The client dispatches this uncorrelated, leaving the envelope id at -1. When you may send it Requires character_loaded observed Raised by: the client's map-loaded notification, which fires on every teleport, zaap, map change and fight exit - the writer copies that notification's id straight into the request proven Related messages You will then receive MapComplementaryInformationEvent inferred — the client asks for a map's contents with this request, and the contents arrive as that event; it is an Event, so match it by arrival rather than by correlation id Reply not yet recovered: on an unknown map id the area declares MapErrorNotFoundRequest, also not recovered. Fields #FieldTypeMeaningYou set it 1map_idint32The map whose contents are being asked for. (map id) Range: int32 here; the same id is int64 in ContextReadyRequest Observed: 153356290 Copied from the client's map-loaded notification, not from cached state.required Recovered with score 220, confidence 0.88, 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.
-
MapChangeOrientationRequest
Asks the server to turn the played character to face a new direction, without moving it. Kind requestArea Game.GamemapNamed by beta, gamemapping Turning is a first-class action in DOFUS, separate from moving: a character can turn on the spot without changing cell. Facing decides which way the sprite looks and which animation set plays, and it matters mechanically - backstab bonuses depend on the relative facing of attacker and target. DO NOT APPLY THE TURN OPTIMISTICALLY. The server validates it and broadcasts the result to everyone on the map INCLUDING BACK TO YOU, as MapChangeOrientationEvent. The real client waits for that echo, and your world model should too. IT CARRIES NO ACTOR ID, AND THAT IS DELIBERATE. The server knows who is asking from the connection. You cannot turn anyone but yourself with this message - which is why the outbound half has one member where the inbound half has two. In the client the action hangs off the right-click menu on your own character (the localisation key is ui.orientCharacter) and off the action-bar banner menu. The equivalent menus for other players and for NPCs do not offer it. When you may send it Requires context_ready inferred Raised by: the player picks a facing from the right-click menu on their own character proven Related messages You will then receive MapChangeOrientationEvent inferred — the server validates and broadcasts the turn to everyone on the map, including back to the requester Fields #FieldTypeMeaningYou set it 1directionDirectionThe facing to turn to. A Direction value.required Recovered with score 150, confidence 0.93, margin 150 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.
-
IdentificationRequest
Presents an authentication ticket on a freshly opened game-server socket; always the first frame written on that connection. Kind requestArea Game.ConnectionNamed by beta, gamemapping THE FIRST FRAME ON EVERY GAME-SERVER SOCKET. Nothing else is accepted until it is answered, and the client does not wait for the socket to finish opening before writing it: the message is built inside the connect routine and handed to the connection object while the TCP handshake is still in flight. The connection queues it and flushes it the instant the channel goes live. WHEN TO SEND IT There are exactly two moments, and both are the opening of a NEW socket. 1. ENTERING A SERVER. The trigger is NOT the login server's server-selection reply. That reply only hands you three things - a ticket, a host, and a LIST of candidate ports - which the client stores. The client then lets the LOGIN connection close, and only once that socket is gone does it dial the game host and send this message. A capture of a full sign-in therefore shows two connections that do not overlap. 2. TRANSFERRING TO A FIGHT SERVER. A second game connection, opened ALONGSIDE the first, which stays up. The server sends a transfer message carrying its own host, its own ticket and its own port list; the client opens a second socket, sends this message on it, and from then on drives both connections at once. The destination is a dedicated arena server - see ServerType.KOLIZEUM. THE PORT LIST IS A CANDIDATE LIST, NOT A CHOICE. You are given several ports for one host. The client takes its configured port when that port is in the list and the first one otherwise; on a failed connect it drops that port and retries the next, until the list is empty. The identification request is NOT rebuilt per attempt - it is queued once, on the connection object, and written on whichever attempt succeeds. The number of TCP attempts and the number of identification requests are not the same number. THE TICKET IS NOT SOMETHING YOU CAN INVENT. It comes from an exchange on an earlier, separate connection, and the two moments above use two DIFFERENT tickets: entering a server uses the one from the server-selection reply, the fight transfer uses the one carried by the transfer message. They are not interchangeable. ONE SESSION, TWO SOCKETS. Because the fight transfer identifies on a second socket while the first one is still authenticated, "already authenticated" does not mean "must not send this". What is illegal is sending it TWICE ON ONE SOCKET. Scope the rule to the connection, not to the session. BEWARE THE NAME COLLISION. A message called IdentificationRequest exists in BOTH protocols: one in the Connection protocol (login server) and this one in the Game protocol. They are different messages with different payloads, and a single sign-in sends both. DO NOT COPY FIELD NUMBERS FROM AN OLDER SCHEMA. This message has been renumbered - the reference build carries the ticket and the locale as fields 1 and 2, the current build does not. Read the numbers off this page. Acceptance is followed immediately by a burst of state events in the same millisecond - server settings, optional features, account capabilities and rights, trust status - ending with ServerSessionReadyEvent. When you may send it Requires transport_established observed Raised by: a client-side state change - one of the two connect routines opening a game-server socket, either entering a server (after the login connection has closed) or transferring to a fight server (a second socket beside the first). The message is built inside that routine and queued on the connection before the TCP handshake finishes, so it leaves as the first frame the moment the socket goes live proven State it changes Establishes authenticated observed — acceptance opens the session; every later message is gated on it Related messages You will then receive ServerSessionReadyEvent observed — the session value the challenge exchange is built on; 1 of 1 login capture You will then receive ServerSettingsEvent observed — server identity and settings, in the same inbound burst You will then receive OptionalFeaturesEvent observed — which optional features this server enables You will then receive TrustStatusEvent observed — whether the server considers the client trusted You will receive one of AuthenticationTicketAcceptedEvent observed — the ticket was accepted You will receive one of AuthenticationTicketRefusedEvent observed — the ticket was rejected Fields #FieldTypeMeaningYou set it 1ticket_keystringThe authentication ticket for THIS connection, issued by the exchange that sent you here. Two different tickets are in play. Entering a server uses the one carried by the login server's server-selection reply; transferring to a fight server uses the one carried by the transfer message. They are not interchangeable, and neither can be derived from anything you already hold.required 2language_codestringThe client's current locale, e.g. fr or en. The server uses it to localise the text it sends back. Observed: fr Read from the client's one global locale at the moment of connecting, so every connection of a session carries the same value.required Recovered with score 135, confidence 0.92, 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: 2 of 2.
-
GuildWeeklyNextResetRequest
Asks when the guild's current mission week ends. Empty payload. Kind requestArea Game.GuildNamed by gamemapping Guild missions run on a weekly cycle and THE CLIENT DOES NOT COMPUTE THE BOUNDARY LOCALLY - it asks the server and caches the answer. Progress bars, countdowns and the save affordances in the mission windows all depend on it. Carries nothing. Do the same: ask once and cache. Recomputing the week boundary from your own clock will disagree with the server across timezone and daylight-saving boundaries, which is exactly when it matters. When you may send it Requires character_loaded observed Raised by: opening a guild-mission window (tier, or ranks-and-categories). The send is GUARDED on a service state enum, so in practice it fetches once per session proven Related messages You will then receive GuildWeeklyNextResetResponse observed — observed on the wire as a Response, matching a direct reply rather than a push 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: 0 of 0.
-
GuildMemberWarnOnConnectionStopRequest
Asks the server to stop notifying this character when a guild member comes online. Empty payload. Kind requestArea Game.GuildNamed by gamemapping The unsubscribe half of a mutually exclusive pair with GuildMemberWarnOnConnectionStartRequest. Both carry nothing; WHICH MESSAGE YOU SEND IS THE ENTIRE PAYLOAD. THE SERVER HOLDS THE SUBSCRIPTION STATE, NOT YOU. The client keeps its own copy of the checkbox as a persisted option, but that copy is a UI convenience and IS NEVER REPLAYED TO THE SERVER - it is not sent at login and not sent on reconnect. So the server's idea of your subscription survives your client restarting, and sending nothing means "leave it as it was". Send one of the pair only when the setting actually changes. When you may send it Requires character_loaded observed Raised by: the player ticks or unticks the guild-member connection warning in the guild members panel proven Related messages Nothing answers it - send it and move on the server holds the subscription; no dumped build has an acknowledgement message for it No fields you may set. Recovered with score 160, confidence 0.90, 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: 0 of 1.
-
GuildMemberWarnOnConnectionStartRequest
Asks the server to start notifying this character when a guild member comes online. Empty payload. Kind requestArea Game.GuildNamed by gamemapping The subscribe half of a mutually exclusive pair with GuildMemberWarnOnConnectionStopRequest. Both carry nothing; WHICH MESSAGE YOU SEND IS THE ENTIRE PAYLOAD. THE SERVER HOLDS THE SUBSCRIPTION STATE, NOT YOU. The client keeps its own copy of the checkbox as a persisted option, but that copy is a UI convenience and IS NEVER REPLAYED TO THE SERVER - it is not sent at login and not sent on reconnect. So the server's idea of your subscription survives your client restarting, and sending nothing means "leave it as it was". Send one of the pair only when the setting actually changes. When you may send it Requires character_loaded observed Raised by: the player ticks or unticks the guild-member connection warning in the guild members panel proven Related messages Nothing answers it - send it and move on the server holds the subscription; no dumped build has an acknowledgement message for it No fields you may set. Recovered with score 145, confidence 0.92, margin 145 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 1.
-
GuildInformationRequest
Asks for one section of the player's guild data - general, members, boosts, houses, recruitment or logbook. Kind requestArea Game.GuildNamed by beta, gamemapping THE GUILD WINDOW DOES NOT GET EVERYTHING AT ONCE. Each tab asks for the section it needs and the server answers with the matching event. This request carries nothing but the section selector, so it is a pure "give me X". ASK FOR THE SECTION YOU ACTUALLY WANT. The sections are separate round trips; asking for all six because you might need one is traffic the real client does not produce - it asks on tab navigation. information_type IS RENUMBERED RELATIVE TO THE REFERENCE BUILD AND THIS IS THE TRAP. See InformationType: three of the six values moved, so code carried across from an older schema asks for the wrong section without any error. The client also sends this once at world entry, as the last of the four-request burst that follows ContextCreationRequest - see FriendListRequest for the whole burst. When you may send it Requires character_loaded observed Raised by: the player opens the guild window or switches one of its tabs proven Related messages Reply not yet recovered: each section is answered by its own event - general information, member list, boosts, houses, recruitment settings, logbook. None of those has a signature here yet, so match them by arrival. Sequence Step post_character_load.4 observed — of 4 requests; a capture shows it three milliseconds after the first three Fields #FieldTypeMeaningYou set it 1information_typeInformationTypeWhich section of the guild data is wanted. An InformationType value. RENUMBERED since the reference build - read the enum page before hardcoding a number.required Recovered with score 100, confidence 0.94, 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: 1 of 1.
-
FriendSetWarnOnLevelGainRequest
Turns on or off the notification shown when a friend, guild member or nearby character gains a level. Kind requestArea Game.SocialNamed by beta, gamemapping One of the social "warn me when..." toggles the client mirrors to the server. THE SERVER HAS TO BE TOLD because it is the side that decides whether to push the notification; the client cannot honour the setting locally. IT IS SENT IMMEDIATELY ON EVERY FLIP, WITH NO DEBOUNCE. The option lives in Options -> General, in the Social block. Flipping it publishes a one-boolean event that a writer turns straight into this message. A script that toggles this in a loop produces a burst of requests that no human interaction could. SEND IT ONLY WHEN THE SETTING ACTUALLY CHANGES. It is a persisted client option replayed verbatim, not a query and not a subscription. When you may send it Requires character_loaded observed Raised by: the player flips the toggle in Options -> General, Social block proven Related messages Nothing answers it - send it and move on it mirrors a stored client option to the server; no dumped build has a matching acknowledgement message Fields #FieldTypeMeaningYou set it 2enableboolTrue to be notified when a friend, guild member or character on the current map levels up; false to suppress it. The persisted client option, replayed verbatim.required Recovered with score 100, confidence 0.95, 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: 1 of 2.
-
FriendSetWarnOnConnectionRequest
Turns on or off the notification shown when a mutual contact logs in. Kind requestArea Game.SocialNamed by beta, gamemapping One of the social "warn me when..." toggles the client mirrors to the server. THE SERVER HAS TO BE TOLD because it is the side that decides whether to push the notification; the client cannot honour the setting locally. IT IS SENT IMMEDIATELY ON EVERY FLIP, WITH NO DEBOUNCE. The option lives in Options -> General, in the Social block. Flipping it publishes a one-boolean event that a writer turns straight into this message. A script that toggles this in a loop produces a burst of requests that no human interaction could. SEND IT ONLY WHEN THE SETTING ACTUALLY CHANGES. It is a persisted client option replayed verbatim, not a query and not a subscription. When you may send it Requires character_loaded observed Raised by: the player flips the toggle in Options -> General, Social block proven Related messages Nothing answers it - send it and move on it mirrors a stored client option to the server; no dumped build has a matching acknowledgement message Fields #FieldTypeMeaningYou set it 1enableboolTrue to be notified when a mutual contact comes online; false to suppress it. The persisted client option, replayed verbatim.required Recovered with score 100, confidence 0.95, 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: 1 of 1.
-
FriendSetStatusShareRequest
Turns on or off sharing your online status and activity with your contacts. Kind requestArea Game.SocialNamed by beta, gamemapping The wire half of the client's "share my status" setting. With sharing on, your contacts see that you are connected and what you are doing; with it off you appear as not sharing. THE SERVER HAS TO BE TOLD because it is the side that answers other players' contact-list queries - the client cannot honour this locally. It travels the same machinery as the four warn-toggles and is sent immediately on every flip, with no debounce. Send it only when the setting actually changes. When you may send it Requires character_loaded observed Raised by: the player flips the status-sharing control proven Related messages Nothing answers it - send it and move on it mirrors a stored client option to the server; no dumped build has a matching acknowledgement message Fields #FieldTypeMeaningYou set it 1shareboolTrue to share your online status and activity with your contacts; false to withhold it. The stored client option, copied straight through.required Recovered with score 100, confidence 0.95, 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: 1 of 2.
-
FriendListRequest
Asks for the character's friend list. Empty payload - the server knows who is asking. Kind requestArea Game.SocialNamed by beta, gamemapping It is one of a FIXED FOUR-REQUEST BURST the client fires once per entry into the world, straight after asking for the game context. The client's own name for the routine survives obfuscation: SendRequestAfterCharacterLoaded. The order is constant: ContextCreationRequest (the context first) 1. FriendListRequest 2. AcquaintanceListRequest 3. SpouseInformationRequest 4. GuildInformationRequest That order is not guessed from traffic: it is the order the routine allocates the four objects in, and a live capture reproduces it exactly - the first three land inside the same millisecond, the guild request three milliseconds later. SEND IT ONCE, AT THAT POINT. NEVER POLL IT. The trigger is "the character finished loading", not a timer. THERE IS A SECOND TRIGGER, AND IT IS A UI ONE. The client also sends this every time the friends panel is shown - the panel's OnEnable refreshes its data, which the contact service turns into this request. A script with no friends panel has no reason to reproduce that one. Carries nothing. There is a name collision worth knowing about: a DIFFERENT FriendListRequest exists in the Connection protocol. This is the Game one. When you may send it Requires character_loaded observed Related messages Reply not yet recovered: the friend list arrives as an event that has no signature here yet. Sequence Step post_character_load.1 observed — of 4 requests, in the order the client's own routine allocates them Recovered with score 270, confidence 0.90, margin 270 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 0.
-
FileCheckRequest
The measurement of the file the server asked about, returned with the algorithm it asked for. Kind requestArea Game.Client.VerificationNamed by beta, gamemapping The answer to FileCheckEvent. It carries the measurement as a STRING - a decimal byte count or a checksum, depending on which CheckType the challenge selected - and the same check type echoed back. COPY THE CHECK TYPE THROUGH UNCHANGED. The client does exactly that: the value from the event is written into the reply without transformation. The current build declares a SECOND field of the same CheckType type that no writer ever populates. It is a decoy; leave it at its default. The live one is the field named here. When you may send it Requires authenticated observed Related messages Answers FileCheckEvent Fields #FieldTypeMeaningYou set it 1valuestringThe measurement, as a string: a decimal byte length or a checksum. Which of the two it is depends on the CheckType the challenge selected.required 3check_typeCheckTypeThe check type from the challenge, copied through unchanged. A CheckType value. The record declares a second field of this type that is never populated - leave it default.required Recovered with score 200, confidence 0.99, margin 200 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.
-
DialogLeaveRequest
Closes whatever dialog you are in. No payload - the server knows which one. Kind requestArea Game.DialogNamed by beta, gamemapping CARRIES NOTHING, AND DOES NOT NEED TO. There is one dialog open at a time and the server knows which; you are saying "I am done with it", not naming it. WHEN TO SEND IT WHEN THE DIALOG WINDOW GOES AWAY - and that is a wider condition than "the player clicked close". In the real client most of these windows raise the leave intent from Unity's OnDisable hook, which runs however the window disappeared: the bank, the exchange, the NPC shop, the auction house and the craft window all do exactly that. A few add explicit paths on top - the zaap picker also raises it from its close button AND its Esc shortcut, the house window from its own CloseWindow, the NPC dialogue from its close handler and from the reply that ends the conversation rather than continuing it. So the honest rule for a script is not "send it when I press close", it is SEND IT WHEN YOU STOP BEING IN THE DIALOG, whatever ended it on your side. ONE PER CLOSE. Fourteen different windows raise the same intent and several services listen for it, but only the service of the feature you are actually in is subscribed at the time, so exactly one request goes out. Do not send one per window you think might be open. NOTHING GATES IT. The handlers do no checking at all - they construct the empty message and hand it to the connection. If you reach the condition, it goes. WHEN NOT TO SEND IT DO NOT ANSWER DialogLeaveEvent WITH THIS. This is the one that will bite you. When the SERVER closes the dialog - you walked away, the NPC ended it, it timed out - it announces the close, and the natural-looking reaction is to confirm with a leave request. The real client cannot do that, and it is not an accident: on that event the feature's service disables itself FIRST and only then asks the UI to close, so by the time the window's OnDisable fires there is nobody subscribed to raise the intent. The close the server caused produces no request. Echoing it means asking the server to close a dialog that is already gone. DO NOT SEND IT WHEN NO DIALOG IS OPEN. Nothing in the client does, and there is nothing to close. WHAT COMES BACK DialogLeaveEvent, carrying the DialogType that closed - but read that record before you rely on it. It is a broadcast, not a receipt: the same message arrives when the server closes a dialog on its own, so a script that blocks waiting for "my" answer can be woken by someone else's. IT IS UNCORRELATED. Envelope uid -1, nothing to match. If you need to know your dialog is gone, key on the TYPE in the event, not on the timing. THE DECLARED MEMBER IS PADDING. Some builds give this message a field. No client has ever written it, and neither should you. When you may send it Requires context_ready observed Raised by: a client-side state change: the dialog's window going away. For most windows the intent is raised from Unity's OnDisable hook, so it fires however the window disappeared; the zaap picker adds an explicit close button and an Esc shortcut, and the NPC dialogue adds its close path and the reply that ends the conversation. Only the active feature's service is subscribed, so one close produces exactly one request inferred Related messages You will then receive DialogLeaveEvent observed — the server answers by announcing which dialog closed Recovered with score 195, confidence 0.86, margin 195 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 0.
-
ContextReadyRequest
Tells the server the client has finished loading a map and is ready to play in it. Once per map, every map. Kind requestArea Game.ContextNamed by beta, gamemapping THE SERVER GATES THE WORLD ON THIS. Until it arrives your character is loaded but not live: actors do not move for you, interactive elements do not respond, and the map's contents are not sent. It is the second half of being on a map, and the half you have to do yourself. WHEN TO SEND IT ONCE PER MAP LOAD, EVERY MAP LOAD. This is not a session handshake and it is not the same kind of thing as ContextCreationRequest, which you send once for the whole session. This one fires again on every teleport, every zaap, every map change and every fight transition, for as long as you are connected. THE CUE IS YOUR OWN LOADING, NOT THE SERVER'S MESSAGE. The client does not send this when the map data arrives on the wire; it sends it when its map renderer picks up the loaded map asset and announces it internally. Everything that cares about "a new map is here" hangs off that one announcement - the grid generator, the interactive-cell manager, several gameplay services, and two outbound requests: map asset finished loading -> ContextReadyRequest (this message) -> MapInformationRequest -> the client's own map-dependent services wake up That is why MapInformationRequest and this message go out together, in the same millisecond in a capture. They are two subscribers to one event, not a sequence. For a script the practical translation is: whatever you treat as "I have the map now", send both from that same point. WHAT TO PUT IN IT SEND THE ID YOU WERE JUST GIVEN, NOT ONE YOU REMEMBER. The client copies the map id off the notification that carries the freshly loaded map and writes it unmodified. It never consults a cached "current map", and that matters: during a transition your idea of the current map and the map that just finished loading are different for a while. WHAT COMES BACK The map's contents: actors, interactive elements, stated elements. There is no Response and nothing acknowledges the request itself - the traffic that follows IS the answer. The envelope is uncorrelated, so its uid goes out as -1; do not allocate one and do not wait to match anything against it. IF YOU NEVER SEND IT you stay connected, the connection looks healthy, and nothing arrives. That silence is the symptom. When you may send it Requires context_ready observed Raised by: a client-side state change: the client's own map-loaded notification, published by the map renderer the moment it starts handling a freshly loaded map asset. It fires once per map load - every teleport, zaap, map change and fight transition - and the writer copies the id straight off that notification proven Related messages Reply not yet recovered: the map's contents arrive immediately: actors, interactive elements and stated elements. Those messages are recovered but not documented yet. Fields #FieldTypeMeaningYou set it 1map_idint64The map that just finished loading on the client. (map id) Take it from the load you are reporting, not from a cached "current map" - the client copies it unmodified off its own map-loaded notification, and during a transition the two are not the same value.required Recovered with score 170, confidence 0.86, margin 170 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.
-
ContextCreationRequest
Asks the server to create the character's game context. Sent once per game entry, not once per map. Kind requestArea Game.ContextNamed by beta, gamemapping THIS IS THE STEP THAT PUTS YOU IN THE WORLD. Before it, the server knows who you are and which character you picked, but you have no map, no entities and no context. After it, everything gated on a game context becomes legal. It carries no payload - the message IS the ask. WHEN TO SEND IT ONCE PER GAME ENTRY. NOT ONCE PER MAP. This is the single most expensive mistake you can make with this message. Map changes, teleports, zaaps and fight transitions do NOT re-create the context and the real client does not re-send this - what it re-sends on every map is ContextReadyRequest and MapInformationRequest. The client has exactly two places that build this message, and neither of them is on the map-change path. PATH 1 - ENTERING THE GAME. The chain starts at a successful CharacterSelectionEvent and runs entirely inside the client: CharacterSelectionEvent (success) -> the client starts its enter-game routine -> it shows the loading screen and WAITS ONE FULL SECOND -> it loads the character-selection-to-game data set -> it waits for the account options to be loaded -> it switches on the first batch of gameplay services -> ContextCreationRequest <-- here -> it switches on the rest of the gameplay services So the honest rule is: send it after the selection succeeded, and after a delay. A capture shows it about 1.4 seconds behind the character finishing loading, and the one-second wait above is a literal constant in the client, not jitter. Firing it in the same millisecond as the selection result is a timing no real client produces. CharacterLoadingCompleteEvent arrives during that window, which is why a capture makes it look like the cue. On this path it is not: the client does not key on it. It is still a good practical checkpoint, because it always lands before the request does. PATH 2 - ARRIVING ON A FIGHT SERVER. When the client is handed over to an arena server it opens a SECOND game connection beside the first (see IdentificationRequest), and on that connection the rule is different: the moment CharacterLoadingCompleteEvent arrives there, the client sends this request immediately, with no delay and no gate. The check is on which socket the event arrived on - the same event on the ordinary game connection does nothing. So: once when you enter the world, and once more per fight-server hand-over, on the new socket. WHAT COMES BACK About 30ms later the server pushes a context-creation event carrying the context kind (roleplay or fight), followed by the map and character state. Only then is anything gated on a game context legal. Nothing about this exchange is correlated: the request goes out on the plain send path, so its envelope uid is -1 and there is no response to match against it. Watch for the inbound burst, not for a reply. THE CONTEXT IS NOT PERMANENT. The server tears it down and rebuilds it during the session - entering and leaving a fight is the obvious case - and it does so on its own initiative, by pushing destroy and create events. Treat the context as a state the server owns and announces, not as a latch you set once. What you must not do is try to drive those rebuilds yourself by re-sending this request. When you may send it Requires character_loaded observed Raised by: a client-side state change: the enter-game routine reaching its network step. That routine is started by a successful CharacterSelectionEvent, then waits a fixed one second, loads the character-selection-to-game data set, and only sends once the account options are loaded - so it lands roughly 1-1.5s after the selection result, never immediately. The fight-server transfer has its own second path inferred State it changes Establishes context_ready observed — the server answers with the map and character state that world messages depend on Related messages Reply not yet recovered: about 30ms later the server sends a burst carrying map and character state. Those messages are recovered but not documented yet, so no ref is given here. Recovered with score 150, confidence 0.92, margin 150 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 0.