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
What one item costs in an NPC shop, who may buy it, and how many each character may buy per restock period.
Kind struct · Area Game.Common
The sale terms of one item on an NPC shop's shelf. The item itself (template and effects) is in the enclosing ItemMinimalInformation.
CHECK ItemToSellInNpcShop.buy_criterion AND THE PURCHASE ALLOWANCE BEFORE YOU BUY. The client treats an item whose allowance is used up as not buyable, and its "only show possible purchases" filter hides an item whose criterion the character fails.
The allowance:
- ItemToSellInNpcShop.total_buyable of zero or less means there is no limit. - Otherwise the character may still buy total_buyable - already_bought (never less than zero) until the allowance restocks; ItemToSellInNpcShop.restock_recurrence says when.
The price is per unit, in the shop's currency: kamas, unless ExchangeNpcShopStartedEvent.token_id names a token item.
Not sent on its own — it is only ever reached as ItemMinimalInformation.item_to_sell_in_npc_shop, inside ExchangeNpcShopStartedEvent.objects. proven
Used by
ItemMinimalInformation Fields
#FieldTypeMeaningYou set it 1priceint64The price of one unit. (kamas, or units of the token item when ExchangeNpcShopStartedEvent.token_id is non-zero)
Observed: 40never 2buy_criterionstringThe condition the character must meet to buy the item, in the game's item-criterion syntax.
The client parses it with its item-criterion parser. With the shop's "only show possible purchases" filter on, an item is shown only if the character meets it (and, in a token shop, holds at least the price in tokens).never 3total_buyableint32How many of this item one character may buy per restock period.
Range: <= 0 means unlimited
Observed: -1
Named after the client property that receives it (TradeStockItemData.totalBuyable).
The client shows 'remaining/total' beside the item only when this is positive.never 5already_boughtint32How many of this item the character has already bought in the current restock period.
Named after the client field that receives it (TradeStockItemData.alreadyBought).
Remaining allowance = max(total_buyable - already_bought, 0); it only matters when total_buyable is positive.never 6restock_recurrencetype not documented yetHow often the purchase allowance resets.
Named after the client property that receives it (TradeStockItemData.restockRecurrence).
1 resets daily: the client draws a one-day calendar beside the allowance. It draws a seven-day calendar for every other value, so 0 and 2 cannot be told apart from the client; 2 is probably weekly.never
  • summary: What one item costs in an NPC shop, who may buy it, and how many each character may buy per restock period.
  • area: Game.Common
  • 36 vues
A fighter is killed by the fighter that performs the action.
Kind struct · Area Game.Action
The kill branch of GameActionFightEvent: the action's source killed a fighter.
WHAT TO DO WHEN YOU RECEIVE IT
1. The killer is the enclosing event's source_id, not a member of this record. 2. Kill.target_id is the fighter that was killed. 3. Only the fight log changes: the fighter's actual death comes in its own Death action. 4. SEND NOTHING BACK.
WHAT THE CLIENT DOES. Writes "<killer> killed <target>" in the fight log (ui.fight.killed).
Not sent on its own — it travels inside GameActionFightEvent (kill). proven
Used by
GameActionFightEvent Fields
#FieldTypeMeaningYou set it 1target_idint64The fighter that was killed. (fighter (entity) id)
The killer is the enclosing event's source_id.never
  • summary: A fighter is killed by the fighter that performs the action.
  • area: Game.Action
  • 35 vues
A fighter is healed: which fighter and how many life points.
Kind struct · Area Game.Action
A heal: the payload of GameActionFightEvent.life_points_gain. The healer is GameActionFightEvent.source_id.
READ IT LIKE THIS
1. LifePointsGain.target_id is the healed fighter. 2. Raise its current life by LifePointsGain.delta (never above its maximum). 3. Ignore the record's other members: the client never reads them.
WHAT THE OFFICIAL CLIENT DOES. It queues the same life step it uses for damage, with +delta, no permanent damage and a neutral element (fight log: ui.fight.lifeGain).
Not sent on its own — it travels inside GameActionFightEvent.life_points_gain. proven
Used by
GameActionFightEvent Fields
#FieldTypeMeaningYou set it 2target_idint64The healed fighter. (fighter (entity) id)never 4deltaint32Life points gained (a positive number). (life points)
The client applies it as a positive change of current life.never
  • summary: A fighter is healed: which fighter and how many life points.
  • area: Game.Action
  • 40 vues
A fighter loses life points: the life lost, the part of it that is permanent, the damage element and the shield points absorbed.
Kind struct · Area Game.Action
Damage dealt to a fighter: the payload of GameActionFightEvent.life_points_lost. The attacker is GameActionFightEvent.source_id.
READ IT LIKE THIS
1. LifePointsLost.target_id is the fighter that is hit. 2. If LifePointsLost.shield_loss is present, the target's shield absorbed that many points first: lower its shield by that amount. 3. Lower the target's current life by LifePointsLost.loss. 4. Lower its maximum life by LifePointsLost.permanent_damages (erosion: damage the fighter can no longer heal). 5. LifePointsLost.element_id is the damage element (it only changes how the hit is shown). 6. Ignore the record's other members: the client never reads them.
WHAT THE OFFICIAL CLIENT DOES. When a shield loss is present it queues a shield step (fight log: ui.fight.lostShieldPoints), then a life step that applies -loss and -permanent_damages with the element (fight log: ui.fight.lifeLoss).
Not sent on its own — it travels inside GameActionFightEvent.life_points_lost. proven
Used by
GameActionFightEvent Fields
#FieldTypeMeaningYou set it 1permanent_damagesint32The part of the damage that also lowers the fighter's maximum life (erosion). (life points)
The client applies it as a negative change of maximum life.never 2shield_lossint32Shield points the hit removed before reaching life. Optional: absent when no shield was hit.
Explicit presence: absent is not the same as zero. (shield points)
When present the client plays a shield-loss step first (fight log: ui.fight.lostShieldPoints).never 4element_idint32The element of the damage.
The client converts it to its element enum; it changes how the hit is shown, not the amount.never 5target_idint64The fighter that loses life. (fighter (entity) id)never 6lossint32Life points lost (a positive number). (life points)
The client applies it as a negative change of current life.never
  • summary: A fighter loses life points: the life lost, the part of it that is permanent, the damage element and the shield points absorbed.
  • area: Game.Action
  • 38 vues
The anomaly complement of a map: present when the map is an anomaly.
Kind struct · Area Game.Gamemap
Set as the map complement when the map belongs to an open anomaly, in MapComplementaryInformationEvent.anomaly_information and FightMapInformationEvent.anomaly_information.
TREAT ITS PRESENCE AS THE SIGNAL. Its members are not recovered: the current client takes the anomaly level it shows from its own data, not from this record.
Not sent on its own — it travels inside MapComplementaryInformationEvent.anomaly_information and FightMapInformationEvent.anomaly_information. proven
Used by
FightMapInformationEvent MapComplementaryInformationEvent No fields you may set.
  • summary: The anomaly complement of a map: present when the map is an anomaly.
  • area: Game.Gamemap
  • 35 vues
A map's position on the world map: an x and a y.
Kind struct · Area Game.Common
The world-map position of a map, as the two numbers players see in square brackets ([x,y]). Several messages carry it: the fight map's position in FightMapInformationEvent.coordinates, the map's own position in MapComplementaryInformationEvent.coordinates, and compass, house and teleport destinations.
Read MapCoordinates.world_x first and MapCoordinates.world_y second, as the client does when it prints a map link. Do not assume their wire order: it changes from build to build.
Not sent on its own — it travels inside FightMapInformationEvent.coordinates, MapComplementaryInformationEvent.coordinates and other map-located records. proven
Used by
FightMapInformationEvent MapComplementaryInformationEvent MonsterGroup Fields
#FieldTypeMeaningYou set it 1world_yint32Vertical world-map coordinate. (world map row)
The second number of [x,y]; the client fills its map position's y and passes it as posY to map links.never 3world_xint32Horizontal world-map coordinate. (world map column)
The first number of [x,y]; the client fills its map position's x and passes it as posX to map links.never
  • summary: A map's position on the world map: an x and a y.
  • area: Game.Common
  • 41 vues
A glyph, trap, wall, portal or rune is laid on the fight map.
Kind struct · Area Game.Action
The GameActionFightEvent.mark_cells action: a new mark appears on the map.
READ IT LIKE THIS
1. MarkCells.mark is the whole mark (FightMark): its id, who laid it, its kind, the spell it comes from, its cells, and whether it is active. 2. Keep it by its mark id: later actions refer to it by that id (ActivateGlyphTrap, TriggerGlyphTrap, UnmarkCells).
WHAT THE CLIENT DOES. When the action belongs to a spell cast it copies the mark's kind, team and cells into the cast context, then converts the mark into its client mark object and queues a "mark cells" step that draws it.
Not sent on its own — it travels inside GameActionFightEvent.mark_cells. proven
Used by
GameActionFightEvent Fields
#FieldTypeMeaningYou set it 1markFightMarkThe mark that is laid - see FightMark.never
  • summary: A glyph, trap, wall, portal or rune is laid on the fight map.
  • area: Game.Action
  • 37 vues
The remaining duration of every effect on a fighter changes by some number of turns.
Kind struct · Area Game.Action
An effect-duration change: the payload of GameActionFightEvent.modify_effects_duration.
READ IT LIKE THIS
1. ModifyEffectsDuration.target_id is the fighter whose effects change. 2. Shift the end turn of each of its active effects (buffs) by ModifyEffectsDuration.delta turns (negative shortens, positive lengthens). 3. Ignore the record's other members: the client never reads them.
WHAT THE OFFICIAL CLIENT DOES. Its buff service walks the fighter's buffs and moves each end turn by delta; the fight log prints ui.fight.effectsModifyDuration.
Not sent on its own — it travels inside GameActionFightEvent.modify_effects_duration. proven
Used by
GameActionFightEvent Fields
#FieldTypeMeaningYou set it 2deltaint32Turns added to the remaining duration of each effect (negative shortens). (turns)never 3target_idint64The fighter whose effects change. (fighter (entity) id)never
  • summary: The remaining duration of every effect on a fighter changes by some number of turns.
  • area: Game.Action
  • 43 vues
Which monster a fighter is, at which grade and level.
Kind struct · Area Game.Common
The monster_fighter_information branch of AIFighterInformation.
monster_gid is the monster template (look it up in the monsters data), creature_grade the grade of that monster (1-based), and creature_level its level. They match the MonsterInGroupInformation of the group you attacked.
All three are int32 and their order changes between builds: read them by name.
Not sent on its own — it travels inside the fighter record of FightFighterShowEvent. inferred
Used by
AIFighterInformation Fields
#FieldTypeMeaningYou set it 1creature_gradeint32The monster's grade. (grade (1-based))never 2creature_levelint32The monster's level. (level)never 3monster_gidint32The monster template. (monster id)never
  • summary: Which monster a fighter is, at which grade and level.
  • area: Game.Common
  • 37 vues
A wandering monster group on the map: its creatures, loot share, alignment and waves.
Kind struct · Area Game.Context.Roleplay
The RolePlayActor.monster_group_actor branch.
identification lists the group's creatures - see MonsterGroupStaticInformation. Its main creature is the one the map shows. alignment is the group's side (Alignment); ordinary groups carry WITHOUT. wave_information describes extra waves and is empty for an ordinary group.
TO FIGHT THE GROUP, send AttackMonsterRequest with the ACTOR id from ActorPositionInformation.actor_id; nothing in this record is an id.
Each Dofus 3 build pads this record with one more wave-shaped record and one unrelated record; the client never touches either.
Not sent on its own — a nested record, only ever carried by its parent. inferred
Used by
RolePlayActor Fields
#FieldTypeMeaningYou set it 1loot_shareint32The group's loot share.
Observed: -1never 2wave_informationWaveInformationExtra waves the group fights in.
See WaveInformation.never 5alignmentAlignmentThe group's alignment side.
An Alignment value; ordinary groups carry WITHOUT.never 6identificationMonsterGroupStaticInformationThe group's creatures.
See MonsterGroupStaticInformation.never
  • summary: A wandering monster group on the map: its creatures, loot share, alignment and waves.
  • area: Game.Context.Roleplay
  • 40 vues
A monster group's main creature, its underlings, and alternative compositions by party size.
Kind struct · Area Game.Context.Roleplay
Who is in a monster group.
main_creature is the creature the map shows and the tooltip leads with. underlings are the others. Together they are the group you will fight - count both when estimating a fight.
alternatives are compositions the group switches to for larger parties; each says how many players it applies to. See MonstersInGroupAlternativeInformation.
Not sent on its own — a nested record, only ever carried by its parent. inferred
Used by
MonsterGroupActor WaveInformation Fields
#FieldTypeMeaningYou set it 1alternativesrepeated MonstersInGroupAlternativeInformationCompositions the group takes for larger parties.
See MonstersInGroupAlternativeInformation.never 3underlingsrepeated MonsterInGroupInformationThe group's other creatures.
MonsterInGroupInformation entries.never 4main_creatureMonsterInGroupInformationThe creature that represents the group on the map.
A MonsterInGroupInformation.never
  • summary: A monster group's main creature, its underlings, and alternative compositions by party size.
  • area: Game.Context.Roleplay
  • 42 vues
The creatures a monster group fields for a given party size.
Kind struct · Area Game.Context.Roleplay
One alternative composition of a MonsterGroupStaticInformation.
player_count is the party size it applies to; monsters is the full list of creatures for that size.
Not sent on its own — a nested record, only ever carried by its parent. inferred
Used by
MonsterGroupStaticInformation Fields
#FieldTypeMeaningYou set it 1monstersrepeated MonsterInGroupInformationThe creatures fielded for that party size.
MonsterInGroupInformation entries.never 2player_countint32The party size this composition applies to. (players)never
  • summary: The creatures a monster group fields for a given party size.
  • area: Game.Context.Roleplay
  • 38 vues
A fighter with a name: a player character or a mutant, with its status and arena league.
Kind struct · Area Game.Common
The named_fighter branch of FightFighterInformation.
name is the fighter's name and status its CharacterStatus. hidden_in_pre_fight hides the fighter during placement. league_id is the fighter's arena league (look it up in the arena leagues data); ladder_position is its rank in that league, shown beside the league ornament.
BRANCH ON fighter_information: character_information for a player character (level, breed, gender, alignment - see FightCharacterInformation), mutant_information for a mutant - see FightMutantInformation.
Not sent on its own — it travels inside the fighter record of FightFighterShowEvent. inferred
Used by
FightFighterInformation Fields
#FieldTypeMeaningYou set it 2ladder_positionint32The fighter's rank within its arena league. (rank)never 3statusCharacterStatusThe fighter's player status - see CharacterStatus.never 4namestringThe fighter's name.never 5hidden_in_pre_fightboolWhether the fighter is hidden during the placement phase.never 6league_idint32The fighter's arena league. (arena league id)never 1character_informationFightCharacterInformationSet for a player character - see FightCharacterInformation.never 8mutant_informationFightMutantInformationSet for a mutant - see FightMutantInformation.never
  • summary: A fighter with a name: a player character or a mutant, with its status and arena league.
  • area: Game.Common
  • 38 vues
One point of an item's market price history: an average price, how many sold, and when.
Kind struct · Area Game.Inventory
One point of an item's price history: the average price, the number of items sold and the date it covers. In ObjectAveragePricesHistoryEvent.daily_history an entry covers a calendar day; in ObjectAveragePricesHistoryEvent.last_day_history it carries an exact time.
The date is an ISO 8601 text with a time zone (for example 2026-10-14T14:11:45.478899596Z); parse it, the client does.
Each entry also repeats the item's id in a member the client never reads. It is left unnamed.
Not sent on its own — it is only ever reached inside ObjectAveragePricesHistoryEvent.daily_history and ObjectAveragePricesHistoryEvent.last_day_history. proven
Used by
ObjectAveragePricesHistoryEvent Fields
#FieldTypeMeaningYou set it 1average_priceint64The average price of the item over the entry's period. (kamas)
Observed: 74
Named after the client struct member it lands in (HistoryAveragePriceEntry.averagePrice).never 2object_gidint32Id of the item this entry is about: the object_gid you asked for in the history request.
Observed: 16504
The client never reads it; every entry repeats the item id of ObjectAveragePricesHistoryRequest (observed in captures).
Named as the record's only int32 besides quantity; left unnamed on a build that pads the record with another int32.never 3datestringWhen the entry applies, as ISO 8601 text with a time zone.
Observed: 2026-10-14T14:11:45.478899596Z
The client parses it with DateTimeOffset.Parse; for daily entries it keeps only the calendar day.never 4quantityint32How many of the item sold over the entry's period.
Observed: 29
Named after the client struct member it lands in (HistoryAveragePriceEntry.quantity); the window adds them up as 'sold items'.never
  • summary: One point of an item's market price history: an average price, how many sold, and when.
  • area: Game.Inventory
  • 32 vues
The market price history of one item: one entry per day for the last month, and the entries of the last 24 hours.
Kind event · Area Game.Inventory
The answer to ObjectAveragePricesHistoryRequest: what one item has been selling for. The client draws it in its market-price window (day, week and month tabs, an average and a median price, and the number of items sold).
WHAT TO DO WHEN YOU RECEIVE IT
1. FOR THE LAST MONTH, read ObjectAveragePricesHistoryEvent.daily_history: one entry per day. The client keeps only the calendar day of each date. 2. FOR THE LAST 24 HOURS, read ObjectAveragePricesHistoryEvent.last_day_history: entries with a full timestamp, which the client converts to local time. 3. Each entry is an ObjectAveragePriceHistory: an average price, a quantity sold and a date. 4. SEND NOTHING BACK.
The item is the one you asked about; each entry also repeats its id in a member the client never reads.
PADDING. 3.7.x adds a map of strings to bools that the client never reads.
When you may send it
Requires character_loaded inferred Related messages
Arrives after ObjectAveragePricesHistoryRequest Fields
#FieldTypeMeaningYou set it 1last_day_historyrepeated ObjectAveragePriceHistoryThe entries of the last 24 hours, each with a full timestamp.
Element type ObjectAveragePriceHistory. The client converts each date to local time and draws these in its day tab; they also feed its 'last buy' label.never 3daily_historyrepeated ObjectAveragePriceHistoryOne entry per day, for about the last month.
Element type ObjectAveragePriceHistory. The client keeps only the calendar day of each date and draws these in its week and month tabs.never
  • summary: The market price history of one item: one entry per day for the last month, and the entries of the last 24 hours.
  • area: Game.Inventory
  • 32 vues
Ask for the market price history of one item.
Kind request · Area Game.Inventory
Asks the server for what one item has been selling for. The answer is ObjectAveragePricesHistoryEvent.
HOW TO SEND IT
1. Put the item's template id in ObjectAveragePricesHistoryRequest.object_gid. 2. Send it, and wait for ObjectAveragePricesHistoryEvent.
THE NAME IS OURS. The client's type-name table does not list this request (it has no nested type) and no reference build has the feature; the name pairs it with the event Ankama did name.
When you may send it
Requires character_loaded inferred Raised by: a user action: the player opens the market-price window on an item inferred Related messages
You will then receive ObjectAveragePricesHistoryEvent observed — the history of the requested item, about 30 ms later; 1 of 1 capture Fields
#FieldTypeMeaningYou set it 1object_gidint32The template id of the item whose price history you want. (item template id)
Observed: 2474required
  • summary: Ask for the market price history of one item.
  • area: Game.Inventory
  • 36 vues
A fighter's action points (AP) or movement points (MP) change by some amount.
Kind struct · Area Game.Action
An AP/MP change: the payload of GameActionFightEvent.points_variation.
READ IT LIKE THIS
1. PointsVariation.target_id is the fighter whose points change. 2. GameActionFightEvent.action_id says which points and why: AP lost (101), AP used (102), AP won (120), MP won (78), MP lost (127), MP used (129). Any other id is ignored by the client (it logs "Points variation with unsupported action"). 3. Add PointsVariation.delta to those points (it is negative for a loss or a use). 4. Ignore the record's other members: the client never reads them.
WHAT THE OFFICIAL CLIENT DOES. It picks an AP step or an MP step from the action id and shows the signed amount ("+{0}" for a gain); the fight log prints ui.fight.lostAP, winAP, lostMP or winMP.
Not sent on its own — it travels inside GameActionFightEvent.points_variation. proven
Used by
GameActionFightEvent Fields
#FieldTypeMeaningYou set it 2deltaint32The signed change: negative for points lost or used, positive for points won. (action or movement points)
Which points (AP or MP) comes from GameActionFightEvent.action_id.never 3target_idint64The fighter whose AP or MP change. (fighter (entity) id)never
  • summary: A fighter's action points (AP) or movement points (MP) change by some amount.
  • area: Game.Action
  • 38 vues
A fighter reduced the damage it takes: which fighter and by how much.
Kind struct · Area Game.Action
Damage reduction: the payload of GameActionFightEvent.reduce_damages.
READ IT LIKE THIS
1. ReduceDamages.target_id is the fighter whose damage was reduced. 2. ReduceDamages.amount is the damage it avoided. It is information only: the actual loss arrives as LifePointsLost. 3. Ignore the record's other members: the client never reads them.
WHAT THE OFFICIAL CLIENT DOES. It queues a step whose fight-log line is ui.fight.reduceDamages.
Not sent on its own — it travels inside GameActionFightEvent.reduce_damages. proven
Used by
GameActionFightEvent Fields
#FieldTypeMeaningYou set it 1amountint32The damage that was avoided. (life points)never 2target_idint64The fighter whose incoming damage was reduced. (fighter (entity) id)never
  • summary: A fighter reduced the damage it takes: which fighter and by how much.
  • area: Game.Action
  • 36 vues
The fighter performing the action reflects damage back to its attacker.
Kind struct · Area Game.Action
The reflect_damages branch of GameActionFightEvent.
WHAT TO DO WHEN YOU RECEIVE IT
1. The reflecting fighter is the enclosing event's source_id. 2. The reflected damage itself arrives as its own LifePointsLost action. 3. SEND NOTHING BACK.
WHAT THE CLIENT DOES. Writes "<fighter> reflects damage" in the fight log (ui.fight.reflectDamages), using the enclosing event's source_id.
UNREAD MEMBER. Beta's record carries a target_id (int64). No build's client reads any member of this record, and several builds pad it with a second int64 (3.4.18.19, 3.6.10.10), so the member is left unnamed.
Not sent on its own — it travels inside GameActionFightEvent (reflect_damages). proven
Used by
GameActionFightEvent No fields you may set.
  • summary: The fighter performing the action reflects damage back to its attacker.
  • area: Game.Action
  • 36 vues
A fighter reflects a spell back to its caster.
Kind struct · Area Game.Action
The reflect_spell branch of GameActionFightEvent.
WHAT TO DO WHEN YOU RECEIVE IT
1. ReflectSpell.target_id is the fighter whose reflection triggered. 2. The effects of the reflected spell follow as their own actions in the same sequence. 3. SEND NOTHING BACK.
WHAT THE CLIENT DOES. Writes "<fighter> reflects the spell" in the fight log (ui.fight.reflectSpell).
Not sent on its own — it travels inside GameActionFightEvent (reflect_spell). proven
Used by
GameActionFightEvent Fields
#FieldTypeMeaningYou set it 1target_idint64The fighter that reflects the spell. (fighter (entity) id)never
  • summary: A fighter reflects a spell back to its caster.
  • area: Game.Action
  • 35 vues
The server's authoritative spell state for one fighter: spell cooldowns and spell cast counters. The client never computes these itself; it applies what this event says.
Kind event · Area Game.Fight
This name is not Ankama's. It was chosen for this documentation from proven client behaviour, and is a label rather than protocol documentation.
The complete spell-cast state of ONE fighter, as the server sees it: how many turns each spell still has to wait, and how many times each spell has been cast this turn (in total, on each target, and against the spell's global limit).
WHY IT EXISTS
Whether a spell may be cast depends on counters only the server keeps. The official client never counts turns down on a cooldown and never counts casts by itself: it stores and enforces exactly what the server last sent. Three things write these counters on the client: this event (the whole state of one fighter), the refresh carried by each spell cast (AbilityRefreshInfo inside GameActionFightEvent.targeted_ability), and the fight-resume data when the client joins or rejoins a fight. When a turn passes or an effect changes a cooldown or a counter, the server pushes this event with the fighter's new state.
WHEN IT ARRIVES
- Around a fighter's turn. In a 3.7.10.10 capture it arrived twice during the player's turn, before the first spell cast, with ONLY fighter_id set: no cooldown and no cast yet, so every cast counter of that fighter went back to 0 and its cooldowns stayed as they were. - During an action. If the client is playing a fight action sequence when it arrives, it does not apply it at once: it queues it as a step of that sequence, so the counters change in order with the action's other effects. Otherwise it applies it immediately.
WHAT TO DO WHEN YOU RECEIVE IT
1. TIMING: if you are replaying an action sequence (SequenceStartEvent ... SequenceEndEvent), apply it at its place in that sequence; otherwise apply it now. 2. FIGHTER: RefreshSpellCastStateEvent.fighter_id. Everything below concerns that fighter only. 3. COOLDOWNS: for each FightSpellCoolDown of RefreshSpellCastStateEvent.spell_cool_downs, set that spell's cooldown to its cool_down. A spell that is NOT listed keeps the cooldown you already have for it: the list is not a replacement and nothing counts down on your side. A cool_down of 63 is not a number of turns: the client treats it as "this spell can no longer be cast". 4. RESET every cast counter of the fighter to 0, for EVERY spell: the count this turn, the global count and all per-target counts. Then: 5. CAST COUNTS: for each FightSpellCast of RefreshSpellCastStateEvent.cast_counts, set the spell's count this turn to cast_count and its per-target counts to target_cast_counts (CastCountOneSomeone). 6. GLOBAL CAST COUNTS: for each FightSpellCast of RefreshSpellCastStateEvent.global_cast_counts, set the spell's global count to cast_count. Ignore that entry's per-target list. 7. SEND NOTHING BACK.
BEFORE CASTING, CHECK WHAT THE OFFICIAL CLIENT CHECKS (spell level data, after spell modifiers):
- cooldown > 0: refused (63: "can no longer be cast"; otherwise "cooldown"); - count this turn >= maxCastPerTurn (when that limit is > 0): refused; - global count >= maxGlobalCastPerTurn (when > 0): refused; - count on the chosen target >= maxCastPerTarget, or >= maxGlobalCastPerTarget (when > 0): refused.
When you may send it
Requires character_loaded inferred Raised by: a change of the fighter's spell state on the server: a turn passing (cooldowns go down, per-turn counters restart) or an effect that changes cooldowns or cast counts inferred Related messages
Unsolicited - nothing you send causes this pushed by the server around a fighter's turn (seen twice during the player's turn in a 3.7.10.10 capture); no request asks for it Fields
#FieldTypeMeaningYou set it 1cast_countsrepeated FightSpellCastThis turn's cast count of each spell, with its per-target counts.
Every counter is reset to 0 first: a spell not listed has been cast 0 times.
Checked against maxCastPerTurn and maxCastPerTarget.never 2fighter_idint64The fighter whose spell state this is. (fighter (entity) id)
Selects that fighter's spell manager; nothing here concerns another fighter.never 3global_cast_countsrepeated FightSpellCastEach spell's global cast count.
Only cast_count is used; the per-target list of these entries is ignored.
Reset to 0 first like the other counters; checked against maxGlobalCastPerTurn.never 4spell_cool_downsrepeated FightSpellCoolDownNew cooldown of each listed spell.
Spells not listed keep their previous cooldown (not a replacement list).
A cool down of 63 means the spell can no longer be cast.never
  • summary: The server's authoritative spell state for one fighter: spell cooldowns and spell cast counters. The client never computes these itself; it applies what this event says.
  • area: Game.Fight
  • 40 vues
A fighter's body stops covering a cell (its hit box changes).
Kind struct · Area Game.Action
One step of a fight action (GameActionFightEvent). Some fighters occupy more than one cell; their hit box is the set of cells they cover. This step removes a cell from the hit box of the action's GameActionFightEvent.source_id.
READ IT LIKE THIS
1. The fighter is the action's source. 2. Remove RemoveHitBox.cell from the set of cells it covers (targeting that cell targets the fighter no longer). The client ignores a cell id outside the map. 3. SEND NOTHING BACK.
Not sent on its own — it travels inside GameActionFightEvent.remove_hit_box. proven
Used by
GameActionFightEvent Fields
#FieldTypeMeaningYou set it 1cellint32The cell removed from the fighter's hit box. (map cell id)never
  • summary: A fighter's body stops covering a cell (its hit box changes).
  • area: Game.Action
  • 37 vues
What a roleplay actor on the map is: a named player, an NPC, a monster group, a prism, and so on.
Kind struct · Area Game.Context.Roleplay
The roleplay half of an actor's information, carried for every actor GameRolePlayShowActorsEvent shows.
HOW TO READ IT
1. Exactly one branch of actor is set: it is the actor's KIND. Never infer the kind from the actor id's sign (monster groups, NPCs, prisms and portals all use negative ids). 2. named_actor (NamedActor): a player character, with its name and, for a humanoid, its account, alignment, look options (guild, alliance, title, ornament...). 3. monster_group_actor (MonsterGroupActor): a wandering monster group; attack it with its actor id. 4. npc_actor: an NPC. treasure_hunt_npc_id: a treasure-hunt NPC, given only by its NPC id (the client looks it up in the NPC data, like an NPC's own id). 5. prism_actor: an alliance prism. portal_actor (PortalInformation): a dimension portal. tax_collector_actor (TaxCollectorActor): a tax collector.
Not sent on its own — a nested record, only ever carried by its parent. inferred
Used by
ActorInformation Fields
#FieldTypeMeaningYou set it 1treasure_hunt_npc_idint32Set when the actor is a treasure-hunt NPC: its NPC id.
An NPC id of the game data (the client resolves it like an NPC's own id).never 2portal_actorPortalInformationSet when the actor is a dimension portal.
See PortalInformation.never 3named_actorNamedActorSet when the actor is a player character.
See NamedActor.never 4npc_actortype not documented yetSet when the actor is an NPC.
Named only where Gender is recovered.never 5monster_group_actorMonsterGroupActorSet when the actor is a wandering monster group.
See MonsterGroupActor.never 6prism_actortype not documented yetSet when the actor is an alliance prism.
Same record as the prism carried by PrismAddOrUpdateEvent.never 7tax_collector_actorTaxCollectorActorSet when the actor is a tax collector.
See TaxCollectorActor.never
  • summary: What a roleplay actor on the map is: a named player, an NPC, a monster group, a prism, and so on.
  • area: Game.Context.Roleplay
  • 47 vues
A fighter slides in a straight line from one cell to another (pushed or pulled).
Kind struct · Area Game.Action
One step of a fight action (GameActionFightEvent): a fighter is moved along a line, by a push or a pull.
READ IT LIKE THIS
1. Slide.target_id is the fighter that moves. The action's GameActionFightEvent.source_id is the fighter whose spell caused it. 2. It leaves Slide.start_cell and stops on Slide.end_cell: put it on the end cell. 3. SEND NOTHING BACK; the next action of the sequence follows.
WHAT THE CLIENT DOES. It animates a slide from the start cell to the end cell. If the fighter is not on the start cell when the step plays, it jumps it to the end cell instead.
Not sent on its own — it travels inside GameActionFightEvent.slide. proven
Used by
GameActionFightEvent Fields
#FieldTypeMeaningYou set it 1target_idint64The fighter that slides. (fighter (entity) id)never 2start_cellint32The cell the fighter leaves. (map cell id)never 3end_cellint32The cell the fighter ends on. (map cell id)
Where the fighter stands after the step: update its position to this cell.never
  • summary: A fighter slides in a straight line from one cell to another (pushed or pulled).
  • area: Game.Action
  • 39 vues
A fighter's team, whether it is alive, and the position it was placed at.
Kind struct · Area Game.Common
The spawn_information of FightFighterInformation.
team is the fighter's side - see Team; the attacker's side is the challenger team. alive is false for a fighter that is dead but still listed. position is the fighter's ActorPositionInformation.
Not sent on its own — it travels inside the fighter record of FightFighterShowEvent. inferred
Used by
FightFighterInformation SummonContextInformation Fields
#FieldTypeMeaningYou set it 1aliveboolWhether the fighter is alive.never 2teamTeamThe fighter's side - see Team.never 3positionActorPositionInformationWhere the fighter stands - see ActorPositionInformation.never
  • summary: A fighter's team, whether it is alive, and the position it was placed at.
  • area: Game.Common
  • 40 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.