Joining a match
What passes between a client and a server from connection until play begins, in order.
Starting a client
A client learns where to connect from its command line. It takes three arguments it needs nothing in, which can be empty, and then a fourth holding four words separated by single spaces: the server’s IPv4 address, its UDP port, the key (see Transport), and the player id the client registers as. The client connects to that address and port, registers as that player, and enciphers its proof under that key.
In 1.0.0.25–1.0.0.96
A client finds each argument between a pair of double quotes, and reads nothing outside them.
Any whitespace separates the words of the fourth argument. A client whose
command line holds no double quote takes the command line it saved on an
earlier run instead, and one holding .rep anywhere plays a replay rather
than connecting.
Registering
A client’s first payload is Register, on the registration channel. The note
on Registered says what a server answers with: one answer for every seat.
A client knows the answer meant for it by the player id it registered as, not by the client id, and takes the client id that answer carries as its own. Every other answer tells it which client id stands for which player.
A client waits 30 seconds for the answer naming its own player id. Then it offers its player to wait another 30 seconds or to give up, and leaves on giving up.
In 1.0.0.58–1.0.0.129
Every answer for its own player id, the first included, has a client send
ReconnectedInMatch, saying whether play has yet begun.
Asking whether a server is ready
A client then sends QueryStatus over and over. A server MUST answer each one
with QueryStatusAnswer, at least until it has answered that it is ready.
While the answers say the server is not ready, a client stays on a black screen
and keeps asking. A server that needs time before a match can begin answers
that it is not ready until it is.
A client stops asking once an answer says the server is ready, and a query it sends after that answer needs none.
Stating a build
Once an answer says the server is ready, a client sends ClientVersion once. A
server answers with VersionSync, and a client loads only where its
agreement says the builds agree.
VersionSync names the map to load and everyone at the match.
Taking a seat
Straight after VersionSync, a client sends JoinSide on the roster channel.
A server answers with one Roster, then a SeatName and a SeatChampion for
each seat a player holds.
Loading
A client reports how far loading has got with LoadingProgress, repeatedly
through loading. A server answers each report with SeatLoadProgress on the
transient channel, carrying the report’s figures under the seat that reported.
A client goes on reporting after its progress reaches 100, until play begins.
A client waits on no other seat. SpawnStart, SpawnEnd and StartGame are
what move a client on, and StartGame alone ends its loading. A server that
means its players to begin together sends StartGame to none of them until
every client has sent ClientReady.
In 1.0.0.25–1.0.0.126
A client writes zero where its player id goes in
LoadingProgress.
In 1.0.0.58–1.0.0.60
The loading screen picks the card a
SeatLoadProgressupdates by the client id it carries, not by its player id.
In 1.0.0.96–1.0.0.129
A server MUST put the seat’s player id in
SeatLoadProgress: the loading screen shows a seat’s card from theVersionSyncseat with that id.
In 1.0.0.96–1.0.0.129
The loading screen
What a client draws while it loads comes from what it has been sent by then (see the spawn run below for what it takes before
CharacterSelected).A player’s card is built from several messages. Its place on the screen is that seat’s place in the
Roster, and its name is that player’sSeatName. The registration answers (Registered) pair each player with a client id, and the latestSeatLoadProgressfor that client gives the card its progress and, on the client’s own card only, its ping. The firstSeatLoadProgressafter the player’sSeatChampionsets the card up: its portrait and the champion’s name, from thatSeatChampion’s champion and skin, then everything else from theVersionSyncseat whose player id theSeatLoadProgressnames. A card with noSeatChampionyet shows a black portrait, and one with no registration or noSeatLoadProgressyet says it is not connected. A laterSeatChampiondoes not change a card already set up.
The spawn run
Once a character is settled, a client sends CharacterSelected, once.
In 1.0.0.25–1.0.0.60
A client drops nothing for arriving before
CharacterSelected.
In 1.0.0.96
Before
CharacterSelected, a client drops only what Units says it drops, and aGameEndedthat arrives while it loads has it show an error and end.
In 1.0.0.126
A client drops nothing for arriving before
CharacterSelected.
A server answers with SpawnStart, states everything on the field as play
opens, and closes the run with SpawnEnd. A run carries:
- for each seat,
CreateChampionfollowed byLoadout; - for each turret, a
CreateTurretand aReplicationbatch of its values; - for each inhibitor and nexus, an
EnterSight, and aReplicationbatch on a map whose buildings replicate (see Replication); - a
RegionAddedfor each region, and aMapPropfor each prop; - at a server’s choice, an
EnterLocalSightfor any of those units.
A client takes these in any order within the run.
A run MUST carry at least SpawnStart, the CreateChampion carrying the
client’s own client id, and SpawnEnd. Given only those, a client still enters play,
showing its champion’s portrait, health, resource and spells. It draws the
champion on the map only once an EnterSight places it there, with its name
and health bar over it.
In 1.0.0.58–1.0.0.60
A client’s shop does not wait for
Loadout.
A client answers each Replication batch with a TransientAck naming that
batch’s syncId. It sends one answer for each batch, in the order the batches
came, including a batch that repeats the syncId of the batch before it.
A client answers a batch as soon as it arrives, within the run or not, and never answers one naming a unit it does not hold.
Starting play
A client sends ClientReady after SpawnEnd and after its answers to the
run’s batches, while it is still reporting its loading. A server MUST answer
with StartGame, and later sends MatchStarted, with other messages free to
come between them; MatchStarted carries 0 (see Time).
A client sends ClientReady as soon as SpawnEnd arrives, and StartGame
alone moves it into play.
A client whose connection drops before play begins ends rather than connecting again.
Messages
Each message of this system in this book, with each layout it has across the book’s patches and every note its definition carries. A layout is the message’s body, after the header its channel’s family puts in front (see Messages).
Register
What a client sends first. It arrives before the connection has a cipher state, so the payload travels in the clear apart from the proof.
In 1.0.0.25–1.0.0.127
Command 0 on registration, sent by the client, reliable.
| Field | Type | What it is |
|---|---|---|
| leading | bytes, 3 | Arbitrary; it carries no meaning. |
| clientId | u32 | A client writes zero here. |
| playerId | i64 | Who the sender claims to be, as its launch line names the player. The proof is what settles the claim. |
| proof | i64 | The player id enciphered with the 16-byte key both ends already hold; a plain copy where the client has no key. |
Vectors (1)
In 1.0.0.128–1.0.0.129
Command 0 on registration, sent by the client, reliable.
| Field | Type | What it is |
|---|---|---|
| leading | bytes, 3 | Arbitrary; it carries no meaning. |
| clientId | u32 | A client writes zero here. |
| playerId | i64 | Who the sender claims to be. The proof is what settles the claim. |
| proof | i64 | The player id enciphered with the 16-byte key; a plain copy where the client has no key. |
Registered
What a server answers a registration with, naming a player in the match and the seat they occupy. It shares its command value with the request it answers, which travels the other way, and it is one fixed size.
In 1.0.0.25–1.0.0.127
Command 0 on registration, sent by the server, reliable.
| Field | Type | What it is |
|---|---|---|
| leading | bytes, 3 | Unused; a server writes zero. |
| clientId | u32 | The client id playerId holds. Where playerId is the client’s own, the client takes this client id as its own and goes on. |
| playerId | i64 | Who occupies that seat. A client keeps the pair of clientId and playerId from every answer, and takes the answer as its own only where this is its own player id; it reads nothing after it. |
Vectors (1)
In 1.0.0.128–1.0.0.129
Command 0 on registration, sent by the server, reliable.
| Field | Type | What it is |
|---|---|---|
| leading | bytes, 3 | Unused; a server writes zero. |
| clientId | u32 | The client id playerId holds. Where playerId is the client’s own, the client takes this client id as its own and goes on. A watching client takes the champion of the player holding this client id as its own, so a server answers one with a client id no player in the streamed match holds (see Watching a match). |
| playerId | i64 | The player the answer is for; a client takes it only where this is its own player id, and reads nothing after it. |
QueryStatus
What a client sends to ask a server for its state. It carries nothing of its own. The header names no object: it carries zero.
In every range of this book
Carried on requests, sent by the client, reliable, under these commands:
| Builds | Command |
|---|---|
| 1.0.0.25–1.0.0.109 | 3 |
| 1.0.0.110–1.0.0.129 | 23 |
No body.
Vectors (4)
one-on-1-0-0-75, one-on-1-0-0-109, padded-on-1-0-0-114, one-on-1-0-0-126
QueryStatusAnswer
What a server returns when asked whether it is ready. The header names no object: a server writes zero.
In 1.0.0.25–1.0.0.127
Carried on events, sent by the server, reliable, under these commands:
| Builds | Command |
|---|---|
| 1.0.0.25–1.0.0.109 | 4 |
| 1.0.0.110 | 133 |
| 1.0.0.111–1.0.0.116 | 134 |
| 1.0.0.117–1.0.0.118 | 135 |
| 1.0.0.119–1.0.0.123 | 136 |
| 1.0.0.124–1.0.0.125 | 140 |
| 1.0.0.126–1.0.0.127 | 141 |
| Field | Type | What it is |
|---|---|---|
| ready | u8 | Whether the server is ready; any value but zero ends the client’s wait. While answers say it is not, a client keeps asking and goes no further, which Joining a match sets out. Values: 0 no, 1 yes. |
In 1.0.0.128–1.0.0.129
Command 141 on events, sent by the server, reliable.
| Field | Type | What it is |
|---|---|---|
| ready | u8 | Whether the server is ready. While answers say it is not, a client keeps asking and goes no further, which Joining a match sets out. Values: 0 no, 1 yes. |
ClientVersion
What a client sends to state which build it is. The header names no object: it carries zero.
In 1.0.0.25–1.0.0.127
Carried on requests, sent by the client, reliable, under these commands:
| Builds | Command |
|---|---|
| 1.0.0.25–1.0.0.73 | 67 |
| 1.0.0.74–1.0.0.81 | 68 |
| 1.0.0.82–1.0.0.96 | 71 |
| 1.0.0.97–1.0.0.102 | 72 |
| 1.0.0.103–1.0.0.106 | 73 |
| 1.0.0.107–1.0.0.109 | 74 |
| 1.0.0.110 | 188 |
| 1.0.0.111–1.0.0.116 | 189 |
| 1.0.0.117–1.0.0.118 | 190 |
| 1.0.0.119–1.0.0.123 | 191 |
| 1.0.0.124 | 195 |
| 1.0.0.125 | 196 |
| 1.0.0.126–1.0.0.127 | 197 |
| Field | Type | What it is |
|---|---|---|
| clock | f32 | The client’s own clock as it sends this, in seconds. |
| clientId | u32 | The client id the sender holds: that of the client reporting. |
| text | text, 256 bytes | The build the client runs, as text ending at a zero byte; the bytes after that zero carry nothing. |
In 1.0.0.128–1.0.0.129
Command 197 on requests, sent by the client, reliable.
| Field | Type | What it is |
|---|---|---|
| clock | f32 | The client’s own clock as it sends this, in seconds. |
| clientId | u32 | The client id of the client reporting. |
| text | text, 256 bytes | The build, as text. The text ends at a zero byte. |
VersionSync
What a server sends once a client has said which build it runs, saying whether the two agree. The header names no object: it carries zero.
In 1.0.0.25–1.0.0.73
Command 68 on events, sent by the server, reliable.
It also says which map to load, who is at the match, and everything else settled before play.
| Field | Type | What it is |
|---|---|---|
| agreement | u8 | Nonzero where the builds agree, letting the client go on into the game. For 0 a client shows both versions, reports a build mismatch and leaves. |
| map | i32 | Which map to load. Space keys the path origins by the same maps. |
| seats | 12 × Seat | Every place at the match, held or empty. |
| build | text, 256 bytes | Which build the server serves, shown and not checked. Written out in full and padded with zero bytes to the width above; a client reads it up to the first zero byte. |
Vectors (1)
In 1.0.0.74–1.0.0.103
Carried on events, sent by the server, reliable, under these commands:
| Builds | Command |
|---|---|
| 1.0.0.74–1.0.0.81 | 69 |
| 1.0.0.82–1.0.0.96 | 72 |
| 1.0.0.97–1.0.0.102 | 73 |
| 1.0.0.103 | 74 |
It also says which map to load, who is at the match, and everything else settled before play.
| Field | Type | What it is |
|---|---|---|
| agreement | u8 | Must be 1: any other value has the client report a build mismatch and leave. For 0 it also shows both versions. |
| map | i32 | Which map to load. Space keys the path origins by the same maps. |
| seats | 12 × Seat | Every place at the match, held or empty. |
| build | text, 256 bytes | Which build the server serves, shown and not checked. Written out in full and padded with zero bytes to the width above; a client reads it up to the first zero byte. |
Vectors (5)
one-on-1-0-0-75, one-on-1-0-0-81, one-on-1-0-0-96, one-on-1-0-0-99, one-on-1-0-0-103
In 1.0.0.104–1.0.0.127
Carried on events, sent by the server, reliable, under these commands:
| Builds | Command |
|---|---|
| 1.0.0.104–1.0.0.106 | 74 |
| 1.0.0.107–1.0.0.109 | 75 |
| 1.0.0.110–1.0.0.116 | 83 |
| 1.0.0.117–1.0.0.118 | 84 |
| 1.0.0.119–1.0.0.123 | 85 |
| 1.0.0.124–1.0.0.127 | 87 |
It also says which map to load, who is at the match, and everything else settled before play.
| Field | Type | What it is |
|---|---|---|
| agreement | u8 | Must be 1: any other value has the client report a build mismatch and leave. For 0 it also shows both versions. |
| map | i32 | Which map to load. Space keys the path origins by the same maps. |
| seats | 12 × Seat | Every place at the match, held or empty. |
| build | text, 256 bytes | Which build the server serves, shown and not checked. Written out in full and padded with zero bytes to the width above; a client reads it up to the first zero byte. |
| mode | text, 128 bytes | Which way the match is played, written and padded as above. |
In 1.0.0.128
Command 87 on events, sent by the server, reliable.
It also says which map to load, who is at the match, and everything else settled before play.
| Field | Type | What it is |
|---|---|---|
| agreement | u8 | Nonzero where the build the client runs matches, which a client needs to load; zero has it show both versions and end. |
| map | i32 | Which map to load. Space keys the path origins by the same maps. |
| seats | 12 × Seat | Every place at the match, held or empty. |
| build | text, 256 bytes | Which build the server serves. Written out in full and padded with zero bytes to the width above. |
| mode | text, 128 bytes | Which way the match is played, written and padded as above. |
Vectors (1)
In 1.0.0.129
Command 87 on events, sent by the server, reliable.
It also says which map to load, who is at the match, and everything else settled before play.
| Field | Type | What it is |
|---|---|---|
| agreement | u8 | Nonzero where the build the client runs matches, which a client needs to load; zero has it show both versions and end. |
| map | i32 | Which map to load. Space keys the path origins by the same maps. |
| seats | 12 × Seat | Every place at the match, held or empty. |
| build | text, 256 bytes | Which build the server serves. Written out in full and padded with zero bytes to the width above. |
| mode | text, 128 bytes | Which way the match is played, written and padded as above. |
| teamName | text, 25 bytes | What one side is called where it plays as a standing team, written and padded as above. |
| teamTag | text, 7 bytes | The short form of that name, written and padded as above. |
| otherTeamName | text, 25 bytes | What the other side is called, under the same terms. |
| otherTeamTag | text, 7 bytes | The short form of that one. |
| metricsHost | text, 1024 bytes | Where a client reports figures about the match, written and padded as above. |
| metricsPath | text, 1024 bytes | What it asks for there, written and padded as above. |
| metricsPort | u16 | Which port it reaches that at. |
| reporting | 1-byte bits | |
| reporting.reportsToFile | bit 0 | Set to have a client also write its reports to a file of its own. |
| reporting.unused | bit 1 to 7 | Unused; a server writes zero. |
JoinSide
What a client sends to ask for a seat on one of the two sides while the match is being put together.
In 1.0.0.25–1.0.0.127
Command 100 on roster, sent by the client, reliable.
| Field | Type | What it is |
|---|---|---|
| padding | bytes, 3 | Arbitrary; it carries no meaning. |
| clientId | u32 | The client id the sender holds, that is, the id of the client asking. |
| side | u32 | The side it asks for; a client asks for 100. |
Vectors (1)
In 1.0.0.128–1.0.0.129
Command 100 on roster, sent by the client, reliable.
| Field | Type | What it is |
|---|---|---|
| padding | bytes, 3 | Never written by a client. |
| clientId | u32 | The client id of the client asking. |
| side | u32 | The side it asks for. |
Roster
What a server sends to lay out both sides and who is on them, while the match is being put together.
In 1.0.0.25–1.0.0.127
Command 103 on roster, sent by the server, reliable.
| Field | Type | What it is |
|---|---|---|
| padding | bytes, 3 | Unused; a client reads nothing here. |
| sideRoom | u32 | How many seats side 100 has room for. |
| otherSideRoom | u32 | How many side 200 has room for. |
| gap | bytes, 4 | Unused; a client reads nothing here. |
| side | 24 × i64 | The players on side 100, twenty four places of a player identifier’s width; the client copies as many as sideRoom says, so a server keeps sideRoom at 24 or less; a larger one has no defined effect. sideTaken says how many of the leading places carry a player, and the rest hold zero. |
| otherSide | 24 × i64 | The players on side 200, read the same way under otherSideRoom and otherSideTaken, with otherSideRoom kept at 24 or less. |
| sideTaken | u32 | How many of side 100’s places carry a player. |
| otherSideTaken | u32 | How many on side 200. |
Vectors (1)
In 1.0.0.128–1.0.0.129
Command 103 on roster, sent by the server, reliable.
| Field | Type | What it is |
|---|---|---|
| padding | bytes, 3 | Unused; a client reads nothing here. |
| sideRoom | u32 | How many seats the first side has room for, and so how many leading places of side a client copies. A server sends at most 24: a client refuses a count above 48 and keeps the one before, and for 25 to 48 copies on past the side’s places into the fields after them. |
| otherSideRoom | u32 | How many the other has room for, under the same terms. |
| gap | bytes, 4 | Unused; a client reads nothing here. |
| side | 24 × i64 | The players on one side, twenty four places. A client copies as many leading places as sideRoom gives; the rest hold zero. A place cannot be read on its own, because zero is an identifier a match gives out as well as what an unused place holds. It has a player identifier’s width. |
| otherSide | 24 × i64 | The players on the other, under the same reading, as many as otherSideRoom gives. |
| sideTaken | u32 | How many of the leading places on the first side carry a player. A client keeps it, and it limits nothing. |
| otherSideTaken | u32 | How many on the other, under the same terms. |
SeatName
What a server sends to say what a seat is called, while the match is being put together.
In 1.0.0.25–1.0.0.127
Command 102 on roster, sent by the server, reliable.
| Field | Type | What it is |
|---|---|---|
| padding | bytes, 7 | Unused; a client reads nothing here. |
| player | i64 | Whose name this is. It has a player identifier’s width. |
| skin | i32 | Which look the seat’s champion wears. A client reads nothing here. |
| nameLength | u32 | How many bytes the name below occupies, counting the byte that ends it. A client reads nothing here, and takes the name up to its first zero byte. |
| name | text, sized by nameLength minus 1 | What the seat is called. It is not padded. |
| terminator | bytes, 1 | A zero byte closing the text, which the length above counts. |
Vectors (1)
In 1.0.0.128–1.0.0.129
Command 102 on roster, sent by the server, reliable.
| Field | Type | What it is |
|---|---|---|
| padding | bytes, 7 | Unused; a client reads nothing here. |
| player | i64 | The player this is about. It has a player identifier’s width. |
| skin | i32 | Which look the seat’s champion wears. A client reads nothing here. |
| nameLength | u32 | How many bytes the name below occupies, counting the byte that ends it. A client reads nothing here: it reads the name up to its zero byte. |
| name | text, sized by nameLength minus 1 | What the seat is called. It is not padded. |
| terminator | bytes, 1 | A zero byte closing the text, which the length above counts. |
SeatChampion
What a server sends to say which champion a seat is playing, while the match is being put together.
In 1.0.0.25–1.0.0.127
Command 101 on roster, sent by the server, reliable.
| Field | Type | What it is |
|---|---|---|
| padding | bytes, 7 | Unused; a client reads nothing here. |
| player | i64 | Whose champion this is. It has a player identifier’s width. |
| skin | i32 | Which look the champion wears. |
| assetLength | u32 | How many bytes the name below occupies, counting the byte that ends it. A client reads nothing here, and takes the name up to its first zero byte. |
| asset | text, sized by assetLength minus 1 | The champion the seat plays, as the name the client loads the champion’s data under. It ends with a zero byte and is not padded. |
| terminator | bytes, 1 | A zero byte closing the text, which the length above counts. |
Vectors (1)
In 1.0.0.128–1.0.0.129
Command 101 on roster, sent by the server, reliable.
| Field | Type | What it is |
|---|---|---|
| padding | bytes, 7 | Unused; a client reads nothing here. |
| player | i64 | The player this is about. It has a player identifier’s width. |
| skin | i32 | Which look the champion wears. |
| assetLength | u32 | How many bytes the name below occupies, counting the byte that ends it. |
| asset | text, sized by assetLength minus 1 | The name the client loads the champion’s art and sound under. It is not padded. |
| terminator | bytes, 1 | A zero byte closing the text, which the length above counts. |
LoadingProgress
What a client sends while a match loads, saying how far it has got. The header names no object: it carries zero.
In 1.0.0.25–1.0.0.62
Command 113 on requests, sent by the client, unreliable.
| Field | Type | What it is |
|---|---|---|
| clientId | u32 | The client id the sender holds, that is, the id of the client reporting. |
| playerId | i64 | Zero. |
| percent | f32 | How far loading has got, from zero to one hundred. |
| eta | f32 | How many seconds the client expects loading still to take. |
| status | 4-byte bits | |
| status.count | bit 0 to 15 | It rises with each report, not always by one, until it wraps. |
| status.ping | bit 16 to 30 | The round trip time the client measures, in milliseconds. |
| status.unused | bit 31 | Never written by a client; it carries nothing. |
| done | 1-byte bits | |
| done.loaded | bit 0 | Set once loading is done. |
| done.unused | bit 1 to 7 | Carries nothing; a client never writes these bits. |
| text | text, ended by a zero byte | A text the client also keeps, at most 63 characters, ended by a zero byte. What it says is not recorded; a server ignores it. |
Vectors (1)
In 1.0.0.63–1.0.0.121
Carried on requests, sent by the client, unreliable, under these commands:
| Builds | Command |
|---|---|
| 1.0.0.63–1.0.0.73 | 116 |
| 1.0.0.74–1.0.0.81 | 117 |
| 1.0.0.82–1.0.0.96 | 121 |
| 1.0.0.97–1.0.0.102 | 122 |
| 1.0.0.103–1.0.0.106 | 124 |
| 1.0.0.107–1.0.0.108 | 125 |
| 1.0.0.109 | 126 |
| 1.0.0.110–1.0.0.121 | 25 |
| Field | Type | What it is |
|---|---|---|
| clientId | u32 | The client id the sender holds, that is, the id of the client reporting. |
| playerId | i64 | Zero. |
| percent | f32 | How far loading has got, from zero to one hundred. |
| eta | f32 | How many seconds the client expects loading still to take. |
| status | 4-byte bits | |
| status.count | bit 0 to 15 | It rises with each report, not always by one. |
| status.ping | bit 16 to 30 | The round trip time the client measures, in milliseconds. |
| status.unused | bit 31 | Never written by a client; it carries nothing. |
| done | 1-byte bits | |
| done.loaded | bit 0 | Set once loading is done. |
| done.unused | bit 1 to 7 | Carries nothing; a client never writes these bits. |
| text | text, ended by a zero byte | A text the client also keeps, at most 63 characters, ended by a zero byte. What it says is not recorded; a server ignores it. |
In 1.0.0.122–1.0.0.127
Command 25 on requests, sent by the client, unreliable.
| Field | Type | What it is |
|---|---|---|
| clientId | u32 | The client id the sender holds, that is, the id of the client reporting. |
| playerId | i64 | Zero. |
| percent | f32 | How far loading has got, from zero to one hundred. |
| eta | f32 | How many seconds the client expects loading still to take. |
| status | 4-byte bits | |
| status.count | bit 0 to 15 | It rises with each report, not always by one. |
| status.ping | bit 16 to 30 | The round trip time the client measures, in milliseconds. |
| status.unused | bit 31 | Never written by a client; it carries nothing. |
| done | 1-byte bits | |
| done.loaded | bit 0 | Set once loading is done. |
| done.unused | bit 1 to 7 | Carries nothing; a client never writes these bits. |
Vectors (1)
In 1.0.0.128–1.0.0.129
Command 25 on requests, sent by the client, unreliable.
| Field | Type | What it is |
|---|---|---|
| clientId | u32 | The client id of the client reporting. |
| playerId | i64 | Who is reporting. A client sends zero. |
| percent | f32 | How far loading has got, from zero to one hundred. |
| eta | f32 | How long the client expects still to take, in seconds. |
| status | 4-byte bits | |
| status.count | bit 0 to 15 | It rises with each report, not always by one. |
| status.ping | bit 16 to 30 | Round trip time the client measures, in milliseconds. |
| status.unused | bit 31 | Never written by a client. |
| done | 1-byte bits | |
| done.loaded | bit 0 | Set in every report whose progress stands at one hundred, and in no other. |
| done.unused | bit 1 to 7 | Never written by a client. |
SeatLoadProgress
What a server sends to tell everyone how far one seat has got through loading, and how it is holding up. A later report supersedes an earlier one, so losing one costs nothing. The header names no object: a server writes zero.
In 1.0.0.25–1.0.0.62
Command 114 on transient, sent by the server, unreliable.
| Field | Type | What it is |
|---|---|---|
| clientId | u32 | The client id this is about. |
| player | i64 | Who occupies it. |
| progress | f32 | How far through loading it is, from zero to one hundred. |
| secondsLeft | f32 | How much longer it is expected to take, in seconds. |
| status | 4-byte bits | Only ping is read. |
| status.unusedLow | bit 0 to 15 | Unused; a server writes zero. |
| status.ping | bit 16 to 30 | Drawn as the seat’s ping indicator. |
| status.unusedHigh | bit 31 | Unused; a server writes zero. |
| done | 1-byte bits | |
| done.loaded | bit 0 | Where set, a client shows secondsLeft as zero. |
| done.unused | bit 1 to 7 | Unused; a server writes zero. |
| statusText | text, 64 bytes | Read once done.loaded is set and the bar is nearly full: a client compares it, ignoring case, with a fixed phrase saying champions are being spawned, and shows a spawning label where it matches and a ready label otherwise. Padded with zero bytes. |
Vectors (1)
In 1.0.0.63–1.0.0.125
Carried on transient, sent by the server, unreliable, under these commands:
| Builds | Command |
|---|---|
| 1.0.0.63–1.0.0.73 | 117 |
| 1.0.0.74–1.0.0.81 | 118 |
| 1.0.0.82–1.0.0.96 | 122 |
| 1.0.0.97–1.0.0.102 | 123 |
| 1.0.0.103–1.0.0.106 | 125 |
| 1.0.0.107–1.0.0.108 | 126 |
| 1.0.0.109 | 127 |
| 1.0.0.110 | 149 |
| 1.0.0.111–1.0.0.116 | 150 |
| 1.0.0.117–1.0.0.118 | 151 |
| 1.0.0.119–1.0.0.123 | 152 |
| 1.0.0.124–1.0.0.125 | 156 |
| Field | Type | What it is |
|---|---|---|
| clientId | u32 | The client id this is about. |
| player | i64 | Who occupies it. |
| progress | f32 | How far through loading it is, from zero to one hundred. |
| secondsLeft | f32 | How much longer it is expected to take, in seconds. |
| status | 4-byte bits | Copied with the rest; no reader of it is known. |
| status.count | bit 0 to 15 | It rises with each report, not always by one. |
| status.ping | bit 16 to 30 | Round trip time the client measures, in milliseconds. |
| status.loaded | bit 31 | Set in every report whose progress stands at one hundred, and in no other. |
| done | 1-byte bits | |
| done.loaded | bit 0 | Set once loading is done. |
| done.unused | bit 1 to 7 | Carries nothing. |
In 1.0.0.126–1.0.0.127
Command 157 on transient, sent by the server, unreliable.
| Field | Type | What it is |
|---|---|---|
| clientId | u32 | The client id this is about. |
| player | i64 | Who occupies it. |
| progress | f32 | How far through loading it is, from zero to one hundred. |
| secondsLeft | f32 | How much longer it is expected to take, in seconds. |
| status | 4-byte bits | Copied with the rest; no reader of it is known. |
| status.count | bit 0 to 15 | It rises with each report, not always by one. |
| status.ping | bit 16 to 30 | Round trip time the client measures, in milliseconds. |
| status.loaded | bit 31 | It carries no defined value. |
| done | 1-byte bits | |
| done.loaded | bit 0 | Set once loading is done. |
| done.unused | bit 1 to 7 | Carries nothing. |
Vectors (1)
In 1.0.0.128–1.0.0.129
Command 157 on transient, sent by the server, unreliable.
| Field | Type | What it is |
|---|---|---|
| clientId | u32 | The client id this is about. |
| player | i64 | Who occupies it. |
| progress | f32 | How far through loading it is, from zero to one hundred. |
| secondsLeft | f32 | How much longer it is expected to take, in seconds. |
| status | 4-byte bits | Copied with the rest; no reader of it is known. |
| status.count | bit 0 to 15 | It rises with each report, not always by one. |
| status.ping | bit 16 to 30 | Round trip time the client measures, in milliseconds. |
| status.loaded | bit 31 | Set in every report whose progress stands at one hundred, and in no other. |
| done | 1-byte bits | |
| done.loaded | bit 0 | Set where the seat has loaded; a client then shows no time left. |
| done.unused | bit 1 to 7 | Unused; a server writes zero. |
SpawnStart
What a server sends to open the run of units a client is about to be told about. The header names no object: a server writes zero.
In 1.0.0.25–1.0.0.60
Command 5 on events, sent by the server, reliable.
| Field | Type | What it is |
|---|---|---|
| count | u8 | A client reads nothing here. A server writes zero. |
Vectors (1)
In 1.0.0.61–1.0.0.103
Command 5 on events, sent by the server, reliable.
| Field | Type | What it is |
|---|---|---|
| count | u8 | A single count the client keeps. What it carries is not recorded for this range; a server writes zero. |
Vectors (2)
In 1.0.0.104–1.0.0.129
Carried on events, sent by the server, reliable, under these commands:
| Builds | Command |
|---|---|
| 1.0.0.104–1.0.0.109 | 5 |
| 1.0.0.110–1.0.0.116 | 96 |
| 1.0.0.117–1.0.0.118 | 97 |
| 1.0.0.119–1.0.0.123 | 98 |
| 1.0.0.124–1.0.0.129 | 101 |
| Field | Type | What it is |
|---|---|---|
| botsOnOneSide | u8 | How many bots play on side 100. A client adds it to that side’s head count, which picks the set of spawn positions and facings it places champions by (CreateChampion’s spawnIndex). |
| botsOnTheOther | u8 | The other. It shares the reading above. |
Vectors (5)
one-on-1-0-0-109, one-on-1-0-0-116, one-on-1-0-0-117, one-on-1-0-0-123, one-on-1-0-0-126
SpawnEnd
What a server sends to close the run of units it opened with. The header names no object: a server writes zero.
In 1.0.0.25–1.0.0.109
Command 12 on events, sent by the server, reliable.
A client answers it at once with ClientReady.
No body.
Vectors (2)
StartGame
What a server sends to begin play. The header names no object: it carries zero.
In 1.0.0.25–1.0.0.110
Carried on events, sent by the server, reliable, under these commands:
| Builds | Command |
|---|---|
| 1.0.0.25–1.0.0.109 | 13 |
| 1.0.0.110 | 90 |
No body.
Vectors (3)
In 1.0.0.111–1.0.0.125
Carried on events, sent by the server, reliable, under these commands:
| Builds | Command |
|---|---|
| 1.0.0.111–1.0.0.116 | 90 |
| 1.0.0.117–1.0.0.118 | 91 |
| 1.0.0.119–1.0.0.123 | 92 |
| 1.0.0.124–1.0.0.125 | 95 |
A client past spawning ignores it.
No body.
Vectors (4)
one-on-1-0-0-116, one-on-1-0-0-117, one-on-1-0-0-123, one-on-1-0-0-125
In 1.0.0.126–1.0.0.129
Command 95 on events, sent by the server, reliable.
A client ignores it once the match has ended or while it is leaving, and acts on it again where it is repeated.
| Field | Type | What it is |
|---|---|---|
| rules | 1-byte bits | |
| rules.pausing | bit 0 | Where set, a client announces that pausing is allowed, except while playing a replay. It keeps nothing of it. |
| rules.unused | bit 1 to 7 | Unused; a server writes zero. |
Vectors (1)
ClientReady
What a client sends once it has loaded and is ready to play. The header names no object: it carries zero.
In 1.0.0.25–1.0.0.109
Command 16 on requests, sent by the client, reliable.
The message is the header alone. A client sends it at once on SpawnEnd.
No body.
Vectors (2)
In 1.0.0.110–1.0.0.129
Carried on requests, sent by the client, reliable, under these commands:
| Builds | Command |
|---|---|
| 1.0.0.110–1.0.0.116 | 81 |
| 1.0.0.117–1.0.0.118 | 82 |
| 1.0.0.119–1.0.0.123 | 83 |
| 1.0.0.124–1.0.0.129 | 85 |
No body.
Vectors (4)
one-on-1-0-0-116, one-on-1-0-0-117, one-on-1-0-0-123, one-on-1-0-0-126
CharacterSelected
What a client sends once a character is settled on. It carries nothing of its own. The header names no object: it carries zero.
In every range of this book
Carried on requests, sent by the client, reliable, under these commands:
| Builds | Command |
|---|---|
| 1.0.0.25–1.0.0.109 | 15 |
| 1.0.0.110 | 189 |
| 1.0.0.111–1.0.0.116 | 190 |
| 1.0.0.117–1.0.0.118 | 191 |
| 1.0.0.119–1.0.0.123 | 192 |
| 1.0.0.124 | 196 |
| 1.0.0.125 | 197 |
| 1.0.0.126–1.0.0.129 | 198 |
No body.
MatchIdentity
What a server sends to tell a client which match this is and what its player is called. The header carries zero.
In 1.0.0.25–1.0.0.127
Carried on events, sent by the server, reliable, under these commands:
| Builds | Command |
|---|---|
| 1.0.0.25–1.0.0.62 | 111 |
| 1.0.0.63–1.0.0.73 | 114 |
| 1.0.0.74–1.0.0.81 | 115 |
| 1.0.0.82–1.0.0.96 | 119 |
| 1.0.0.97–1.0.0.102 | 120 |
| 1.0.0.103–1.0.0.106 | 122 |
| 1.0.0.107–1.0.0.108 | 123 |
| 1.0.0.109 | 124 |
| 1.0.0.110 | 144 |
| 1.0.0.111–1.0.0.116 | 145 |
| 1.0.0.117–1.0.0.118 | 146 |
| 1.0.0.119–1.0.0.123 | 147 |
| 1.0.0.124–1.0.0.125 | 151 |
| 1.0.0.126–1.0.0.127 | 152 |
| Field | Type | What it is |
|---|---|---|
| game | i64 | The match’s identifier. A client only logs it. |
| name | text, 128 bytes | The player’s name, padded with zero bytes. A client reads nothing of it. |
In 1.0.0.128
Command 152 on events, sent by the server, reliable.
| Field | Type | What it is |
|---|---|---|
| game | i64 | The match’s identifier. |
| name | text, 128 bytes | The player’s name, padded with zero bytes. A client reads nothing of it. |
Vectors (1)
In 1.0.0.129
Command 152 on events, sent by the server, reliable.
| Field | Type | What it is |
|---|---|---|
| game | i64 | The match’s identifier. |
| name | text, 128 bytes | The player’s name, padded with zero bytes. |
MatchStarted
What a server sends to set when the match began. The header names no object: it carries zero.
In 1.0.0.124–1.0.0.127
Carried on events, sent by the server, reliable, under these commands:
| Builds | Command |
|---|---|
| 1.0.0.124 | 200 |
| 1.0.0.125 | 201 |
| 1.0.0.126–1.0.0.127 | 202 |
| Field | Type | What it is |
|---|---|---|
| startedAt | f32 | When the match began, as a moment on the match clock, in seconds; a client counts match time from it. |
Vectors (3)
In 1.0.0.128–1.0.0.129
Command 202 on events, sent by the server, reliable.
| Field | Type | What it is |
|---|---|---|
| startedAt | f32 | When the match began, as a moment on the match clock, in seconds. |
ModulePacket
What a client sends to carry data from a module of its own, often a message of its own that the module has taken over. A server need do nothing with it. The header carries zero.
In 1.0.0.113–1.0.0.125
Carried on requests, sent by the client, reliable, under these commands:
| Builds | Command |
|---|---|
| 1.0.0.113–1.0.0.116 | 223 |
| 1.0.0.117–1.0.0.118 | 224 |
| 1.0.0.119–1.0.0.122 | 225 |
| 1.0.0.123 | 226 |
| 1.0.0.124 | 235 |
| 1.0.0.125 | 236 |
| Field | Type | What it is |
|---|---|---|
| kind | u16 | 999 where the client passed the data through its own transform, 2 where it did not. A client sends kind 999 under command 237 and kind 2 under 238. |
| length | u16 | How many bytes of the data below carry anything, at most 1024. |
| data | bytes, 1024 | The data, in its first length bytes; a client leaves the rest unwritten. |
In 1.0.0.126–1.0.0.129
Command 237 on requests, sent by the client, reliable.
| Field | Type | What it is |
|---|---|---|
| kind | u16 | 999 where the client passed the data through its own transform, 2 where it did not. A client sends both under command 237; a second sender sends 999 under 236. Nothing is sent under 238. |
| length | u16 | How many bytes of the data below carry anything, at most 1024. |
| data | bytes, 1024 | The data, in its first length bytes; a client leaves the rest unwritten. |
ResyncEnded
What a server sends to end the resynchronising a client began on its own Reconnected, after which it takes spawns again as they come.
In every range of this book
Carried on events, sent by the server, reliable, under these commands:
| Builds | Command |
|---|---|
| 1.0.0.25–1.0.0.62 | 119 |
| 1.0.0.63–1.0.0.73 | 122 |
| 1.0.0.74–1.0.0.81 | 123 |
| 1.0.0.82–1.0.0.96 | 127 |
| 1.0.0.97–1.0.0.102 | 128 |
| 1.0.0.103–1.0.0.106 | 130 |
| 1.0.0.107–1.0.0.108 | 131 |
| 1.0.0.109 | 132 |
| 1.0.0.110–1.0.0.116 | 69 |
| 1.0.0.117–1.0.0.118 | 70 |
| 1.0.0.119–1.0.0.123 | 71 |
| 1.0.0.124–1.0.0.129 | 73 |
No body.
StatsRequest
What a client sends about itself. The header names the sender’s champion.
In 1.0.0.104–1.0.0.127
Carried on requests, sent by the client, reliable, under these commands:
| Builds | Command |
|---|---|
| 1.0.0.104–1.0.0.106 | 163 |
| 1.0.0.107–1.0.0.108 | 164 |
| 1.0.0.109 | 165 |
| 1.0.0.110–1.0.0.116 | 74 |
| 1.0.0.117–1.0.0.118 | 75 |
| 1.0.0.119–1.0.0.123 | 76 |
| 1.0.0.124–1.0.0.127 | 89 |
A client sends no body.
No body.