uncategorized protocols - wxyz-abcd/node-haxball GitHub Wiki
Protocols
Here are all of the streaming protocols used in Haxball.
1. Basic Data Types
1.1. uint8
Index |
Length |
Type |
0 |
1 |
uint8 |
1.2. int16
Index |
Length |
Type |
0 |
2 |
int16 |
1.3. uint16
Index |
Length |
Type |
0 |
2 |
uint16 |
1.4. int32
Index |
Length |
Type |
0 |
4 |
int32 |
1.5. uint32
Index |
Length |
Type |
0 |
4 |
uint32 |
1.6. float32
Index |
Length |
Type |
0 |
4 |
float32 |
1.7. float64
Index |
Length |
Type |
0 |
8 |
float64 |
1.8. uint8array
Index |
Length |
Type |
0 |
end |
uint8(loop) |
1.9. shortstring
Index |
Length |
Type |
Description |
0 |
1 |
uint8 |
# of chars in the string |
1 |
end |
utf8char(loop) |
all chars in the string |
1.10. string
Index |
Length |
Type |
Description |
0 |
L |
utf8char |
# of chars in the string |
L |
end |
utf8char(loop) |
all chars in the string |
1.11. nullable_string
Index |
Length |
Type |
Description |
0 |
L |
utf8char |
null => 0, otherwise => (1+# of chars in the string) |
L |
end |
utf8char(loop) |
all chars in the string |
1.12. json
Index |
Length |
Type |
Description |
0 |
end |
string |
stringified version of the json |
2. Game Structures
2.1. spawn_point
Index |
Length |
Type |
Description |
0 |
8 |
float64 |
x coordinate |
8 |
8 |
float64 |
y coordinate |
2.2. vertex
Index |
Length |
Type |
Description |
0 |
8 |
float64 |
x coordinate |
8 |
8 |
float64 |
y coordinate |
16 |
8 |
float64 |
bouncing coefficient |
24 |
4 |
int32 |
collision mask |
28 |
4 |
int32 |
collision group |
2.3. segment
Index |
Length |
Type |
Description |
0 |
1 |
uint8 |
flags(*) |
1 |
1 |
uint8 |
id of 1st vertex |
2 |
1 |
uint8 |
id of 2nd vertex |
3 |
8 |
float64 |
bias(*) |
11 |
8 |
float64 |
curve(*) |
19 |
4 |
int32 |
color(*) |
23 |
8 |
float64 |
bouncing coefficient |
31 |
4 |
int32 |
collision mask |
35 |
4 |
int32 |
collision group |
NOTE: "flags" contain whether bias(default=0, flag value=1), curve(default=Infinity, flag value=2), color(default=0, flag value=4) or visibility(default=false, flag value=8) is different from its default value. Only the values that are different from its default value are written to/read from stream.
2.4. goal
Index |
Length |
Type |
Description |
0 |
8 |
float64 |
x coordinate of first point |
8 |
8 |
float64 |
y coordinate of first point |
16 |
8 |
float64 |
x coordinate of second point |
24 |
8 |
float64 |
y coordinate of second point |
32 |
1 |
uint8 |
team id |
2.5. disc
Index |
Length |
Type |
Description |
0 |
8 |
float64 |
x coordinate of position |
8 |
8 |
float64 |
y coordinate of position |
16 |
8 |
float64 |
x component of speed |
24 |
8 |
float64 |
y component of speed |
32 |
8 |
float64 |
x component of gravity |
40 |
8 |
float64 |
y component of gravity |
48 |
8 |
float64 |
radius |
56 |
8 |
float64 |
bouncing coefficient |
64 |
8 |
float64 |
inverse mass |
72 |
8 |
float64 |
damping |
80 |
4 |
uint32 |
color |
84 |
4 |
int32 |
collision mask |
88 |
4 |
int32 |
collision group |
2.6. joint
Index |
Length |
Type |
Description |
0 |
1 |
uint8 |
index of the first disc |
1 |
1 |
uint8 |
index of the second disc |
2 |
8 |
float64 |
minimum length |
10 |
8 |
float64 |
maximum length |
18 |
8 |
float64 |
strength |
26 |
4 |
int32 |
color |
2.7. game_state
Index |
Length |
Type |
Description |
0 |
1 |
uint8 |
number of discs in the game |
1 |
L |
disc(loop) |
every disc in the array |
L+1 |
4 |
int32 |
goal tick counter |
L+5 |
4 |
int32 |
state |
L+9 |
4 |
int32 |
red score |
L+13 |
4 |
int32 |
blue score |
L+17 |
8 |
float64 |
elapsed time |
L+25 |
4 |
int32 |
pause game tick counter |
L+29 |
1 |
uint8 |
id of the last team that conceded a goal |
2.8. team_colors
Index |
Length |
Type |
Description |
0 |
1 |
uint8 |
angle of stripes |
1 |
5 |
int32 |
text color |
5 |
6 |
uint8 |
number of stripe colors(<=3) |
6 |
end |
int32(loop) |
every stripe color in the array |
2.9. player_physics
Index |
Length |
Type |
Description |
0 |
8 |
float64 |
bouncing coefficient |
8 |
8 |
float64 |
inverse mass |
16 |
8 |
float64 |
damping |
24 |
8 |
float64 |
acceleration |
32 |
8 |
float64 |
acceleration while kicking |
40 |
8 |
float64 |
damping while kicking |
48 |
8 |
float64 |
kick strength |
56 |
8 |
float64 |
x component of gravity |
64 |
8 |
float64 |
y component of gravity |
72 |
4 |
int32 |
collision group |
76 |
8 |
float64 |
radius |
84 |
8 |
float64 |
kickback |
2.10. stadium
Index |
Length |
Type |
Description |
0 |
1 |
uint8 |
default stadium id(255 = custom) |
1 |
4 |
int32 |
background type |
5 |
8 |
float64 |
background width |
13 |
8 |
float64 |
background height |
21 |
8 |
float64 |
background kickoff radius |
29 |
8 |
float64 |
background corner radius |
37 |
8 |
float64 |
background goal line |
45 |
4 |
int32 |
background color |
49 |
8 |
float64 |
width |
57 |
8 |
float64 |
height |
65 |
8 |
float64 |
spawn distance |
73 |
L1 |
player_physics |
player physics data |
73+L1 |
2 |
uint16 |
max view width |
75+L1 |
1 |
uint8 |
camera follow |
76+L1 |
1 |
uint8 |
storeable(1) or not(0) |
77+L1 |
1 |
uint8 |
full reset on kick off(1) or not(0) |
78+L1 |
1 |
uint8 |
length of vertices array |
79+L1 |
L2 |
vertex(loop) |
vertices array |
79+L1+L2 |
1 |
uint8 |
length of segments array |
80+L1+L2 |
L3 |
segment(loop) |
segments array |
80+L1+L2+L3 |
1 |
uint8 |
length of planes array |
81+L1+L2+L3 |
L4 |
plane(loop) |
planes array |
81+L1+L2+L3+L4 |
1 |
uint8 |
length of goals array |
82+L1+L2+L3+L4 |
L5 |
goal(loop) |
goals array |
82+L1+L2+L3+L4+L5 |
1 |
uint8 |
length of discs array |
83+L1+L2+L3+L4+L5 |
L6 |
disc(loop) |
discs array |
83+L1+L2+L3+L4+L5+L6 |
1 |
uint8 |
length of joints array |
84+L1+L2+L3+L4+L5+L6 |
L7 |
joint(loop) |
joints array |
84+L1+L2+L3+L4+L5+L6+L7 |
1 |
uint8 |
length of red spawn points array |
85+L1+L2+L3+L4+L5+L6+L7 |
L8 |
spawn_point(loop) |
red spawn points array |
85+L1+L2+L3+L4+L5+L6+L7+L8 |
1 |
uint8 |
length of blue spawn points array |
86+L1+L2+L3+L4+L5+L6+L7+L8 |
end |
spawn_point(loop) |
blue spawn points array |
2.11. player
Index |
Length |
Type |
Description |
0 |
1 |
uint8 |
admin(1) or not(0) |
1 |
4 |
int32 |
number on avatar |
5 |
L1 |
nullable_string |
avatar |
5+L1 |
L2 |
nullable_string |
headless avatar |
5+L1+L2 |
1 |
uint8 |
synced(1) or not(0) |
6+L1+L2 |
L3 |
nullable_string |
flag |
6+L1+L2+L3 |
4 |
int32 |
unknown |
10+L1+L2+L3 |
L4 |
nullable_string |
name |
10+L1+L2+L3+L4 |
4 |
int32 |
input |
14+L1+L2+L3+L4 |
L5 |
utf8char |
id |
14+L1+L2+L3+L4+L5 |
1 |
uint8 |
kicking(1) or not(0) |
15+L1+L2+L3+L4+L5 |
2 |
int16 |
kick rate tick counter max |
17+L1+L2+L3+L4+L5 |
1 |
uint8 |
kick rate tick counter min |
18+L1+L2+L3+L4+L5 |
1 |
uint8 |
team id |
19+L1+L2+L3+L4+L5 |
2 |
int16 |
disc index if playing, -1 otherwise |
2.12. room_state
Index |
Length |
Type |
Description |
0 |
L1 |
nullable_string |
name |
L1 |
1 |
uint8 |
teams locked(1) or not(0) |
1+L1 |
4 |
int32 |
score limit |
5+L1 |
4 |
int32 |
time limit |
9+L1 |
2 |
int16 |
kick rate(max) |
11+L1 |
1 |
uint8 |
kick rate(rate) |
12+L1 |
1 |
uint8 |
kick rate(min) |
13+L1 |
L2 |
stadium |
stadium |
13+L1+L2 |
1 |
uint8 |
game active(1) or not(0) |
14+L1+L2 |
L3 |
game_state* |
game state |
14+L1+L2+L3 |
1 |
uint8 |
length of players array |
15+L1+L2+L3 |
L4 |
player(loop) |
players array |
15+L1+L2+L3+L4 |
L5 |
team_colors |
red team colors |
15+L1+L2+L3+L4+L5 |
L5 |
team_colors |
blue team colors |
NOTE: Game state is not read/written if game is not active.
3. Events
3.1. event
Index |
Length |
Type |
Description |
0 |
1 |
uint8 |
event type |
1 |
end |
event_contents |
event-dependent information(check below) |
3.2. binary_custom_event_contents
Index |
Length |
Type |
Description |
0 |
4 |
uint32 |
packed_contents length |
4 |
end |
packed_contents |
first unpack using pako |
3.2.1. packed_contents
Index |
Length |
Type |
Description |
0 |
4 |
uint32 |
type |
4 |
end |
uint8array |
data |
3.3. check_consistency_event_contents
Index |
Length |
Type |
Description |
0 |
4 |
utf8char |
length of consistency data |
4 |
end |
uint8array |
consistency data |
3.4. custom_event_contents
Index |
Length |
Type |
Description |
0 |
4 |
uint32 |
type of the custom event |
4 |
end |
json |
custom event information |
3.5. identity_event_contents
Index |
Length |
Type |
Description |
0 |
4 |
uint32 |
player id |
4 |
end |
json |
identity data |
3.6. join_room_event_contents
Index |
Length |
Type |
Description |
0 |
4 |
int32 |
player id |
4 |
len1 |
nullable_string |
player name |
4+len1 |
len2 |
nullable_string |
player flag |
4+len1+len2 |
end |
nullable_string |
player avatar |
3.7. kick_ban_player_event_contents
Index |
Length |
Type |
Description |
0 |
4 |
int32 |
player id |
4 |
len |
nullable_string |
reason(len<=100) |
4+len |
1 |
uint8 |
kick(0) or ban(1) |
3.8. pause_resume_game_event_contents
Index |
Length |
Type |
Description |
0 |
1 |
uint8 |
resume(0) or pause(1) |
3.9. ping_event_contents
Index |
Length |
Type |
Description |
0 |
L |
utf8char |
length of pings array |
L+1 |
end |
utf8char(loop) |
every ping in array |
3.10. reorder_players_event_contents
Index |
Length |
Type |
Description |
0 |
1 |
uint8 |
move to top(1) or bottom(2) |
1 |
1 |
uint8 |
length of player id array |
2 |
end |
int32(loop) |
every player id in array |
3.11. send_announcement_event_contents
Index |
Length |
Type |
Description |
0 |
L |
string |
announcement message(length<=1000) |
L |
4 |
int32 |
color of announcement |
L+4 |
1 |
uint8 |
style of announcement |
L+5 |
1 |
uint8 |
sound of announcement |
3.12. send_chat_event_contents
Index |
Length |
Type |
Description |
0 |
L |
string |
chat message(length<=140) |
3.13. send_chat_indicator_event_contents
Index |
Length |
Type |
Description |
0 |
1 |
uint8 |
indicator active(1) or passive(0) |
3.14. send_input_event_contents
Index |
Length |
Type |
Description |
0 |
4 |
uint32 |
player input |
3.15. set_avatar_event_contents
Index |
Length |
Type |
Description |
0 |
end |
nullable_string |
player avatar |
3.16. set_disc_properties_event_contents
Index |
Length |
Type |
Description |
0 |
4 |
int32 |
player/disc id |
4 |
1 |
uint8 |
type: player(1) or disc(0) |
5 |
2 |
uint16 |
flags(*) |
7 |
L |
float32(loop) |
all changed float properties(*) |
L+7 |
end |
int32(loop) |
all changed int32 properties(*) |
NOTE: "flags" contain the information about which properties of the disc are being changed. The order of variables written are as follows:
float: [x, y, xspeed, yspeed, xgravity, ygravity, radius, bCoeff, invMass, damping], int: [color, cMask, cGroup].
3.17. set_gameplay_limit_event_contents
Index |
Length |
Type |
Description |
0 |
4 |
int32 |
type: scorelimit(0) or timelimit(1) |
4 |
4 |
int32 |
value |
3.18. set_headless_avatar_event_contents
Index |
Length |
Type |
Description |
0 |
L |
nullable_string |
new avatar value |
L |
end |
int32 |
player id |
3.19. set_kickrate_limit_event_contents
Index |
Length |
Type |
Description |
0 |
4 |
int32 |
"min" value |
4 |
4 |
int32 |
"rate" value |
8 |
4 |
int32 |
"burst" value |
3.20. set_player_admin_event_contents
Index |
Length |
Type |
Description |
0 |
4 |
int32 |
player id |
4 |
1 |
uint8 |
admin(1) or not(0) |
3.21. set_player_sync_event_contents
Index |
Length |
Type |
Description |
0 |
1 |
uint8 |
sync(1) or not(0) |
3.22. set_player_team_event_contents
Index |
Length |
Type |
Description |
0 |
4 |
int32 |
player id |
4 |
1 |
uint8 |
team id |
3.23. set_stadium_event_contents
Index |
Length |
Type |
Description |
0 |
2 |
uint16 |
length of packed_contents |
2 |
end |
uint8array |
packed_contents(first unpack using pako) |
3.23.1. packed_contents
Index |
Length |
Type |
Description |
0 |
end |
stadium |
contents of the stadium |
3.24. set_team_colors_event_contents
Index |
Length |
Type |
Description |
0 |
1 |
uint8 |
team id |
1 |
end |
team_colors |
contents of team colors |
3.25. set_teams_lock_event_contents
Index |
Length |
Type |
Description |
0 |
1 |
uint8 |
locked(1) or not(0) |
4. Replay File Structure
Index |
Length |
Type |
Description |
0 |
4 |
utf8char x 4 |
replay file signature ("HBR2") |
4 |
4 |
uint32 |
version |
8 |
4 |
uint32 |
number of frames |
12 |
end |
uint8array |
packed_contents(first unpack using pako) |
4.1. goal_marker
Index |
Length |
Type |
Description |
0 |
L |
utf8char |
number of frames passed from the goal before this one |
L |
1 |
uint8 |
team id |
4.2. replay_event
Index |
Length |
Type |
Description |
0 |
L |
utf8char |
number of frames passed from the event before this one |
L |
2 |
uint16 |
id of the player who initiated this event |
2+L |
end |
event |
the event's internal data |
4.3. packed_contents
Index |
Length |
Type |
Description |
0 |
2 |
uint16 |
length of goal markers array |
2 |
L1 |
goal_marker(loop) |
goal markers array |
2+L1 |
L2 |
room_state |
room state at the beginning |
2+L1+L2 |
end |
replay_event(loop) |
events array |