1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315
|
/* bzflag
* Copyright (c) 1993-2025 Tim Riker
*
* This package is free software; you can redistribute it and/or
* modify it under the terms of the license found in the file
* named COPYING that should have accompanied this file.
*
* THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
/*
* Communication protocol constants
*/
#ifndef BZF_PROTOCOL_H
#define BZF_PROTOCOL_H
#include "common.h"
// magic to identify a bzflag server. first four characters are the
// bzflag magic. the last four give the version number. the first
// digit is the major release, the second and third digits are the
// minor release, and the last character is the revision. The major
// number should increment when there've been sweeping changes in the
// whole program. The minor release should increment for smaller
// changes that make the new version incompatible with older servers
// or clients. The revision should be incremented for minor changes
// that don't cause incompatibility.
// adding new flags or changing the communication protocol requires
// minor release number changes. adding new graphics effects normally
// only requires incrementing the revision number.
// well known service port number for bzflag server
const int ServerPort = 5154;
// port for udp broadcasts used to find servers on local lan
const int BroadcastPort = 5154;
// URL for default list server
const char* const DefaultListServerURL = "https://my.bzflag.org/db/";
const char* const DefaultMasterBanURL = "https://www.bzflag.org/master-bans.txt";
const char* const DefaultMOTDServer = "https://www.bzflag.org/motd.php";
// maximum size of any message (including header and length fields)
const int MaxPacketLen = 1024;
const int MaxUDPPacketLen = 68;
// the banned tag
const char* const BanRefusalString = "REFUSED:";
// player attributes for the MsgPlayerInfo message
enum PlayerAttribute
{
IsRegistered = 1 << 0,
IsVerified = 1 << 1,
IsAdmin = 1 << 2
};
// null message code -- should never be sent
const uint16_t MsgNull = 0x0000;
// server message codes
const uint16_t MsgAccept = 0x6163; // 'ac'
const uint16_t MsgAdminInfo = 0x6169; // 'ai'
const uint16_t MsgAlive = 0x616c; // 'al'
const uint16_t MsgAddPlayer = 0x6170; // 'ap'
const uint16_t MsgAutoPilot = 0x6175; // 'au'
const uint16_t MsgCaptureFlag = 0x6366; // 'cf'
const uint16_t MsgCustomSound = 0x6373; // 'cs'
const uint16_t MsgCacheURL = 0x6375; // 'cu'
const uint16_t MsgDropFlag = 0x6466; // 'df'
const uint16_t MsgEnter = 0x656e; // 'en'
const uint16_t MsgExit = 0x6578; // 'ex'
const uint16_t MsgFlagType = 0x6674; // 'ft'
const uint16_t MsgFlagUpdate = 0x6675; // 'fu'
const uint16_t MsgFetchResources = 0x6672; // 'fr'
const uint16_t MsgGrabFlag = 0x6766; // 'gf'
const uint16_t MsgGMUpdate = 0x676d; // 'gm'
const uint16_t MsgGetWorld = 0x6777; // 'gw'
const uint16_t MsgGameSettings = 0x6773; // 'gs'
const uint16_t MsgGameTime = 0x6774; // 'gt'
const uint16_t MsgHandicap = 0x6863; // 'hc'
const uint16_t MsgKilled = 0x6b6c; // 'kl'
const uint16_t MsgLagState = 0x6c73; // 'ls'
const uint16_t MsgMessage = 0x6d67; // 'mg'
const uint16_t MsgNearFlag = 0x4e66; // 'Nf'
const uint16_t MsgNewRabbit = 0x6e52; // 'nR'
const uint16_t MsgNegotiateFlags = 0x6e66; // 'nf'
const uint16_t MsgPause = 0x7061; // 'pa'
const uint16_t MsgPlayerInfo = 0x7062; // 'pb'
const uint16_t MsgPlayerUpdate = 0x7075; // 'pu'
const uint16_t MsgPlayerUpdateSmall = 0x7073; // 'ps'
const uint16_t MsgQueryGame = 0x7167; // 'qg'
const uint16_t MsgQueryPlayers = 0x7170; // 'qp'
const uint16_t MsgReject = 0x726a; // 'rj'
const uint16_t MsgRemovePlayer = 0x7270; // 'rp'
const uint16_t MsgReplayReset = 0x7272; // 'rr'
const uint16_t MsgShotBegin = 0x7362; // 'sb'
const uint16_t MsgScore = 0x7363; // 'sc'
const uint16_t MsgScoreOver = 0x736f; // 'so'
const uint16_t MsgShotEnd = 0x7365; // 'se'
const uint16_t MsgSuperKill = 0x736b; // 'sk'
const uint16_t MsgSetVar = 0x7376; // 'sv'
const uint16_t MsgTimeUpdate = 0x746f; // 'to'
const uint16_t MsgTeleport = 0x7470; // 'tp'
const uint16_t MsgTransferFlag = 0x7466; // 'tf'
const uint16_t MsgTeamUpdate = 0x7475; // 'tu'
const uint16_t MsgWantWHash = 0x7768; // 'wh'
const uint16_t MsgWantSettings = 0x7773; // 'ws'
const uint16_t MsgPortalAdd = 0x5061; // 'Pa'
const uint16_t MsgPortalRemove = 0x5072; // 'Pr'
const uint16_t MsgPortalUpdate = 0x5075; // 'Pu'
// world database codes
const uint16_t WorldCodeHeader = 0x6865; // 'he'
const uint16_t WorldCodeBase = 0x6261; // 'ba'
const uint16_t WorldCodeBox = 0x6278; // 'bx'
const uint16_t WorldCodeEnd = 0x6564; // 'ed'
const uint16_t WorldCodeLink = 0x6c6e; // 'ln'
const uint16_t WorldCodePyramid = 0x7079; // 'py'
const uint16_t WorldCodeMesh = 0x6D65; // 'me'
const uint16_t WorldCodeArc = 0x6172; // 'ar'
const uint16_t WorldCodeCone = 0x636e; // 'cn'
const uint16_t WorldCodeSphere = 0x7370; // 'sp'
const uint16_t WorldCodeTetra = 0x7468; // 'th'
const uint16_t WorldCodeTeleporter = 0x7465; // 'te'
const uint16_t WorldCodeWall = 0x776c; // 'wl'
const uint16_t WorldCodeWeapon = 0x7765; // 'we'
const uint16_t WorldCodeZone = 0x7A6e; // 'zn'
const uint16_t WorldCodeGroup = 0x6772; // 'gr'
const uint16_t WorldCodeGroupDefStart = 0x6473; // 'ds'
const uint16_t WorldCodeGroupDefEnd = 0x6465; // 'de'
// world database sizes
const uint16_t WorldSettingsSize = 30;
const uint16_t WorldCodeHeaderSize = 10;
const uint16_t WorldCodeBaseSize = 31;
const uint16_t WorldCodeWallSize = 24;
const uint16_t WorldCodeBoxSize = 29;
const uint16_t WorldCodeEndSize = 0;
const uint16_t WorldCodePyramidSize = 29;
const uint16_t WorldCodeMeshSize = 0xA5; // dummy value, sizes are variable
const uint16_t WorldCodeArcSize = 85;
const uint16_t WorldCodeConeSize = 65;
const uint16_t WorldCodeSphereSize = 53;
const uint16_t WorldCodeTetraSize = 66;
const uint16_t WorldCodeTeleporterSize = 34;
const uint16_t WorldCodeLinkSize = 4;
const uint16_t WorldCodeWeaponSize = 24; // basic size, not including lists
const uint16_t WorldCodeZoneSize = 34; // basic size, not including lists
// ping packet sizes, codes and structure
const uint16_t MsgPingCodeReply = 0x0303;
const uint16_t MsgPingCodeRequest = 0x0404;
// rejection codes
const uint16_t RejectBadRequest = 0x0000;
const uint16_t RejectBadTeam = 0x0001;
const uint16_t RejectBadType = 0x0002;
const uint16_t RejectBadMotto = 0x0003;
const uint16_t RejectTeamFull = 0x0004;
const uint16_t RejectServerFull = 0x0005;
const uint16_t RejectBadCallsign = 0x0006;
const uint16_t RejectRepeatCallsign = 0x0007;
const uint16_t RejectRejoinWaitTime = 0x0008;
const uint16_t RejectIPBanned = 0x0009;
const uint16_t RejectHostBanned = 0x000A;
const uint16_t RejectIDBanned = 0x000B;
// sound type codes
const uint16_t LocalCustomSound = 0x0001;
// death by obstacle
// FIXME: really a killed reason, NOT a message type.
// should not be here at all, should be in BlowedUpReason
const uint16_t PhysicsDriverDeath = 0x7064; // 'pd'
// request for additional UDP link
const uint16_t MsgUDPLinkRequest = 0x6f66; // 'of'
const uint16_t MsgUDPLinkEstablished = 0x6f67; // 'og'
// lag ping sent by server to client and reply from client
const uint16_t MsgLagPing = 0x7069; // 'pi'
/* server communication protocol:
--> incoming messages (to server)
<-- outgoing messages to single player
<== outgoing messages to all players
player to server messages:
MsgEnter player is joining game
--> id, type, team, name, motto
<-- MsgReject (if rejected)
<-- MsgAccept (if accepted)
if accepted, new player is sent (following MsgAccept):
<-- MsgTeamUpdate (one per team)
<-- MsgFlagUpdate (one per existing flag)
<-- MsgAddPlayer (one per already joined player)
add, finally, sent to all:
<== MsgAddPlayer (player being accepted)
MsgExit player is signing off
--> /id/
<== MsgRemovePlayer
MsgGetWorld request for playing field database
--> bytes read so far
<-- MsgGetWorld
MsgQueryGame request for game state
<-- MsgQueryGame
MsgQueryPlayers request for player list
<-- MsgQueryPlayers
MsgAlive player says he's coming alive
--> /id,
<== MsgAlive
MsgKilled player says he's been killed
--> /id,/ killer-id, reason, killer-shot-id
<== MsgKilled
MsgNewRabbit player is relinquishing rabbitship
MsgGrabFlag player wants to grab flag
--> /id,/ flag
<== MsgGrabFlag
MsgDropFlag player wants to drop flag
--> /id,/ position
<== MsgDropFlag
<== MsgFlagUpdate
MsgCaptureFlag player captured flag
--> /id,/ team (team flag was taken to)
<== MsgCaptureFlag
<== MsgFlagUpdate
MsgSetVar <== count/[name/value]*
MsgShotBegin player has fired a shot
--> FiringInfo
<== MsgShotBegin
MsgShotEnd shot has terminated
--> shooter id, shot number, reason
<== MsgShotEnd
MsgTeleport player has teleported
--> /id,/ from-teleporter, to-teleporter
<== MsgTeleport
MsgMessage player is sending a message
--> /id,/ target-id/team-id, message string
<== MsgMessage
MsgWantWHash (player wants md5 of world file
-->
MsgNegotiateFlags -->flagCount/[flagabbv]
MsgPause -->true or false
server to player messages:
MsgSuperKill player must disconnect from server
<== <none>
MsgTimeUpdate game time left, if == 0 player is dead and can't restart
<== time (left, in seconds)
MsgScoreOver score limit reached, player is dead and can't restart
<== id (winner), team (winner)
MsgAccept player request is accepted
<== <none>
MsgReject player request is rejected
<== <none>
MsgAddPlayer notification of new tank in game
<== id, type, team, name, motto
MsgRemovePlayer player has exited the server
<== id
MsgAdminInfo update of players' IP addresses
only sent to players with the PLAYERLIST permission.
<-- count, [chunklen, id, bitfield, address]*
MsgPlayerInfo update of players status
<-- count, [id, bitfield]*
MsgFlagUpdate update of flag info
<== count, [flag, flag-info]*
MsgTeamUpdate update of team info
<== teamcount, [team, team-info]
MsgGetWorld chunk of world database
<-- bytes left, next 256 byte chunk of world database
MsgAlive player is alive
<== id, position, forward-vector
MsgKilled player is dead
<== id (victim id), killer-id, reason, killer-shot-id
MsgGrabFlag notification that flag is grabbed
<== id (grabber), flag, flag-info
MsgDropFlag notification that flag is in air
<== id (dropper), flag, flag-info
MsgCaptureFlag notification that flag has been captured
<== id (capturer), flag, team
MsgShotBegin some player has fired a shot
<== FiringInfo
MsgShotEnd shot has expired
<== id (shooter id), shot number, reason
MsgScore player score has changed
<== num-scores [id (player id), wins, losses, tks]*n
MsgTeleport player has teleported
<== id, from-teleporter, to-teleporter
MsgMessage message to players
<== from-id, to-id/team-id, message string
MsgQueryGame game status
MsgQueryPlayers list of players
MsgWantWHash md5 digest of world file
<== temp|perm, digest
MsgNegotiateFlags <== flagCount/[flagabbv]
MsgNewRabbit a new rabbit has been anointed
<== id
MsgPause <== id/true or false
*/
#endif // BZF_PROTOCOL_H
// Local Variables: ***
// mode: C++ ***
// tab-width: 4 ***
// c-basic-offset: 4 ***
// indent-tabs-mode: nil ***
// End: ***
// ex: shiftwidth=4 tabstop=4
|