<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.bzflag.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Yosef</id>
	<title>BZFlagWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.bzflag.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Yosef"/>
	<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/Special:Contributions/Yosef"/>
	<updated>2026-04-28T12:48:01Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Laser&amp;diff=8169</id>
		<title>Laser</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Laser&amp;diff=8169"/>
		<updated>2011-12-25T06:10:22Z</updated>

		<summary type="html">&lt;p&gt;Yosef: eliminate some exclamation points, other grammar&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Laser.png|right|thumb|300px|A laser being fired and rebounding.]]&lt;br /&gt;
When carrying the Laser superflag, a tank will not shoot regular bullets, but instead a very long beam. Any tanks that come into contact with this beam will be destroyed, so it is useful for killing multiple tanks in one shot. The beam usually does not last for very long.&lt;br /&gt;
&lt;br /&gt;
The Laser superflag can be used in many different ways. Lasers can be:&lt;br /&gt;
* Rebounded off many surfaces. If ricochet is enabled, a laser can [http://farm4.static.flickr.com/3172/2343441015_18ca5509ee_o.png ricochet off many surfaces to create a very complex beam]. This can be very powerful and kill many tanks, as the more the laser ricochets, the more likely a tank will fall in its path. However, if these kinds of attacks are not planned very well, the laser could end up hitting a teammate or even the tank that fired it.&lt;br /&gt;
* Fired through a teleporter to catch unsuspecting players.&lt;br /&gt;
* Used to &amp;quot;snipe&amp;quot;. This involves using the binocular view (B on keyboard) and targeting unsuspecting players with laser.&lt;br /&gt;
* As a camping tool! Sitting in one spot and waiting for players to drive right where the laser will hit is possibly the most popular camping technique on BZFlag.&lt;br /&gt;
&lt;br /&gt;
Players with the [[Cloaking]] superflag are unaffected by lasers. Many Cloaking flags are often added by map makers into a certain area to prevent camping with lasers in the area. Grabbing a Cloaking flag before driving through an area vulnerable to laser attacks is also a wise idea.&lt;/div&gt;</summary>
		<author><name>Yosef</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Laser&amp;diff=8168</id>
		<title>Laser</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Laser&amp;diff=8168"/>
		<updated>2011-12-25T06:08:28Z</updated>

		<summary type="html">&lt;p&gt;Yosef: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Laser.png|right|thumb|300px|A laser being fired and rebounding.]]&lt;br /&gt;
When carrying the Laser superflag, a tank will not shoot regular bullets, but instead a very long beam. Any tanks that come into contact with this beam will be destroyed, so it is useful for killing multiple tanks in one shot. The beam usually does not last for very long.&lt;br /&gt;
&lt;br /&gt;
The Laser superflag can be used in many different ways. Lasers can be:&lt;br /&gt;
* Rebounded off many surfaces. If ricochet is enabled, a laser can [http://farm4.static.flickr.com/3172/2343441015_18ca5509ee_o.png ricochet off many surfaces to create a very complex beam]. This can be very powerful and kill many tanks, as the more the laser ricochets, the more likely a tank will fall in it&#039;s path. However, if these kinds of attacks aren&#039;t planned very well, the laser could end up hitting a teammate or even the tank that fired it!&lt;br /&gt;
* Fired through a teleporter to catch unsuspecting players.&lt;br /&gt;
* Used to &amp;quot;snipe&amp;quot;. Using the binocular view (B on keyboard) and targeting unsuspecting players with laser is a powerful way to snipe.&lt;br /&gt;
* As a camping tool! Sitting in one spot and waiting for players to drive right where the laser will hit is possibly the most popular camping technique on BZFlag.&lt;br /&gt;
&lt;br /&gt;
Players with the [[Cloaking]] superflag are unaffected by lasers! Many Cloaking flags are often added by map makers into a certain area to prevent camping with lasers in the area. Grabbing a Cloaking flag before driving through an area vulnerable to laser attacks is also a wise idea.&lt;/div&gt;</summary>
		<author><name>Yosef</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Single_Player_Mode&amp;diff=8145</id>
		<title>Single Player Mode</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Single_Player_Mode&amp;diff=8145"/>
		<updated>2011-12-14T16:35:28Z</updated>

		<summary type="html">&lt;p&gt;Yosef: a few grammar edits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Single Player Mode is a term (misnomer) often used to describe the act of playing BZFlag on a local server using the computer-controlled player (bots) of a client. BZFlag itself is designed to be a multiplayer game.&lt;br /&gt;
&lt;br /&gt;
=Overview=&lt;br /&gt;
Using bots on a local server is a way to play the game without an internet connection, or to gain experience in playing without the need for other human players. Bots are currently only run by the game client and can be run on any server. The term &amp;quot;Single Player Mode&amp;quot; is most commonly used to describe a single client that is logged in to a local server with a number of bots. It is mostly used to test maps, as the simple robots do not offer any real gameplay challenge.&lt;br /&gt;
&lt;br /&gt;
Bots can be used on remote servers, but many of the owners of public servers do not allow bots to join with players. Use of bots on public servers is not recommended and can lead to being banned from the server.&lt;br /&gt;
&lt;br /&gt;
=Starting a Single Player Session=&lt;br /&gt;
The basic idea behind starting a single player session is the following.&lt;br /&gt;
#Start a local server, ether by using the in-game menu, or via the command line.&lt;br /&gt;
#Start the game client using the &#039;&#039;&#039;-solo&#039;&#039; [[BZFS Command Line Options| command line option]].&lt;br /&gt;
#Join the local server using the client and begin play.&lt;br /&gt;
&lt;br /&gt;
==Starting a local server==&lt;br /&gt;
The simplest way to start a local server is to use the in-game &#039;&#039;&#039;Start Server&#039;&#039;&#039; menu. This menu is found on the [[Join Game Menu]] at the very bottom. This menu gives a number of settings for the server, including shot counts, and world options such as [[jumping]] and [[ricochet]]. Specific flags or more advanced options can not be set via the &#039;&#039;&#039;Start Server&#039;&#039;&#039; menu.&lt;br /&gt;
&lt;br /&gt;
To set additional options one must run [[BZFS]] manually and enter in a number of [[BZFS Command Line Options| command line options]]. See [[Creating A Server|creating a server]] for more options. To keep the server local, do not use the &#039;&#039;&#039;-public&#039;&#039;&#039; option.&lt;br /&gt;
&lt;br /&gt;
==Starting the client with bots==&lt;br /&gt;
The game client must be started with a command-line option to enable bots. Bots can not be enabled from within the game menus.&lt;br /&gt;
&lt;br /&gt;
===Linux and Unix===&lt;br /&gt;
On Linux or other Unix-like systems the game client can be started with command line options directly from the terminal.&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
 bzflag -solo ##&lt;br /&gt;
|}&lt;br /&gt;
Where &amp;lt;nowiki&amp;gt;##&amp;lt;/nowiki&amp;gt; is the number of bots you want to run.&lt;br /&gt;
&lt;br /&gt;
===Microsoft Windows===&lt;br /&gt;
Microsoft Windows users can follow the following steps to create a shortcut that starts the game client with bots.&lt;br /&gt;
# Locate the BZFlag shortcut installed in the programs section of the start menu.&lt;br /&gt;
# Drag the BZFlag shortcut with the right mouse button on to the desktop.&lt;br /&gt;
# Pick the &amp;quot;Copy here&amp;quot; item from the context menu that pops up when the drag is complete.&lt;br /&gt;
# Click on the Copied shortcut with the right mouse button and pick the &amp;quot;properties&amp;quot; item.&lt;br /&gt;
# Find the &amp;quot;Target&amp;quot; field in the shortcut properties window that is opened, and click in it.&lt;br /&gt;
# Use the right arrow key to find the end of the text in the target field. It will end in bzflag.exe&amp;quot;.&lt;br /&gt;
# After the last quote(&amp;quot;) add a space and then &#039;&#039;&#039;-solo&#039;&#039;&#039; &amp;lt;nowiki&amp;gt;##&amp;lt;/nowiki&amp;gt;. Where &amp;lt;nowiki&amp;gt;##&amp;lt;/nowiki&amp;gt; is the number of bots you wish to have.&lt;br /&gt;
# Save the changes by hitting the OK button at the bottom.&lt;br /&gt;
&lt;br /&gt;
Running this shortcut will now start the server with bot support.&lt;br /&gt;
&lt;br /&gt;
===Mac OS X===&lt;br /&gt;
The Mac OS X method for starting the game with bot support is the same as the Linux method, but the path to the bzflag client is required. If you installed BZFlag in your applications folder, then the command that needs to be typed into terminal will be along the lines of:&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
 /Applications/BZFlag.app/Contents/MacOS/bzflag -solo &amp;lt;nowiki&amp;gt;##&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Where &amp;lt;nowiki&amp;gt;##&amp;lt;/nowiki&amp;gt; is the number of bots you want to run.&lt;br /&gt;
&lt;br /&gt;
==Joining the Local Server==&lt;br /&gt;
Once the client is started with bot support you must do the following to join the local server&lt;br /&gt;
# Go to the Join Game menu.&lt;br /&gt;
# Enter &amp;quot;127.0.0.1&amp;quot; in the server name field. This is called &amp;quot;localhost&amp;quot;.&lt;br /&gt;
# Enter &amp;quot;5154&amp;quot; in the port field.&lt;br /&gt;
# Choose the &amp;quot;Connect&amp;quot; item to join the server.&lt;br /&gt;
&lt;br /&gt;
This will connect to the local server with the number of bots specified to with the &#039;&#039;&#039;-solo&#039;&#039;&#039; option.&lt;br /&gt;
&lt;br /&gt;
=Autopilot=&lt;br /&gt;
The aforementioned bot method creates what may be called &#039;simple&#039; bots, which simply shoot and attempt to dodge bullets.&lt;br /&gt;
A feature called autopilot, is activated when you press the &amp;quot;9&amp;quot; key on your keyboard while in-game, although as stated earlier, many servers do not allow this.&lt;br /&gt;
Some players may decide they want to open up 5 or 10 clients and place them on autopilot. When they do, it allows them to be able to jump, grab flags, and are slightly smarter than the &#039;simple&#039; bots.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
[[Creating A Server]]&lt;br /&gt;
&lt;br /&gt;
[[BZFS Command Line Options]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Concepts]]&lt;br /&gt;
[[Category:Client]]&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Yosef</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Tank&amp;diff=8144</id>
		<title>Tank</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Tank&amp;diff=8144"/>
		<updated>2011-12-14T16:30:57Z</updated>

		<summary type="html">&lt;p&gt;Yosef: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The tank is the primary avatar of the player in BZFlag.[[image:Blue_tank_small.png|right]]&lt;br /&gt;
&lt;br /&gt;
==2.0.10 and earlier==&lt;br /&gt;
This Classic BZFlag tank model has been in the game since its inception, and is an integral part of game play.  This tank model has received few graphical upgrades over the years, and looks today much the same as it has since the first version of the game. &lt;br /&gt;
&lt;br /&gt;
The classic tank model is [http://en.wikipedia.org/wiki/Hardcoded hard coded] as a series of [http://en.wikipedia.org/wiki/OpenGL OpenGL] instructions in the [[BZFlag Source]] code. The model may not be changed externally without modifications to the game client itself.&lt;br /&gt;
&lt;br /&gt;
The 2.0.10 tank model has been exported from the code, and can be found as a wavefront obj file at http://my.bzflag.org/resources/models/Tank.obj This model is licensed under the LGPL as it is pulled from the bzflag sources.&lt;br /&gt;
This can be imported into most 3d modeling packages.&lt;br /&gt;
&lt;br /&gt;
===Appearance===&lt;br /&gt;
The tank model has 7 different colors, or &amp;quot;skins&amp;quot;, that it can appear in. The color of the tank results from the team in which the tank is playing, or some other game logic (such as Hunters and Rabbits in [[Rabbit Hunt]]) &lt;br /&gt;
The 7 tank colors are as follows:&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
image:Red_tank.png‎|Red Team Tank&lt;br /&gt;
image:Blue_tank.png‎|Blue Team Tank&lt;br /&gt;
image:Green_tank.png‎|Green Team Tank&lt;br /&gt;
image:Purple_tank.png‎|Purple Team Tank&lt;br /&gt;
image:Black_tank.png‎|Rogue (black) Team Tank&lt;br /&gt;
image:Orange_tank.png‎|Hunter Team Tank&lt;br /&gt;
image:White_tank.png‎|Rabbit Team Tank&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Depending on an individual client&#039;s graphical settings, the tank may have animated treads and spinning wheels. The tanks shown are the most basic version of the tank.&lt;br /&gt;
&lt;br /&gt;
===Dimensions===&lt;br /&gt;
[[image:Tank_sizes.png|frame|right|Tank dimensions in [[world units]]]]&lt;br /&gt;
The Tank&#039;s visible model is 8.04 [[world units]] long, 2.8 [[World units|units]] wide, and 2.05 [[World units|units]] tall as shown in the image. If one assumes that one [[World units|world unit]] is equivalent to one real world meter, then the tank would be 26 feet 4.5 inches long, 9 feet 2 inches wide, and 6 feet 10 inches tall.&lt;br /&gt;
&lt;br /&gt;
The tank bounding box (used in collisions with world objects) is 6 [[world units]] long, 2.8 [[World units|units]] wide, and 2.05 [[World units|units]] tall, and does not include the barrel forward of the tip of the treads. The muzzle of the barrel is 1.57 [[World units|world units]] from the ground, meaning that a tank can shoot over a box 1.5 [[World units|units]] high.&lt;br /&gt;
&lt;br /&gt;
===History===&lt;br /&gt;
The tank model was originally created by [[Tamar Cohen]] for the first versions of BZFlag and has since been extended and modified by the BZFlag developers.&lt;br /&gt;
&lt;br /&gt;
==Future Versions==&lt;br /&gt;
The tank model will most likely be redone for a future version. [[Image:3 0 tank test render.png]]&lt;br /&gt;
&lt;br /&gt;
It will be an external loaded model and have the same basic dimensions as the older tank.&lt;br /&gt;
&lt;br /&gt;
[[Category:Concepts]]&lt;br /&gt;
[[Category:Map Making]]&lt;/div&gt;</summary>
		<author><name>Yosef</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Network_Protocol&amp;diff=8116</id>
		<title>Network Protocol</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Network_Protocol&amp;diff=8116"/>
		<updated>2011-11-06T16:12:58Z</updated>

		<summary type="html">&lt;p&gt;Yosef: minor edits - changed email to motto&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Inaccurate}}&lt;br /&gt;
{{DesignDocument}}&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
BZFlag uses standard IP (Internet) networking protocols. The code is written to the BSD socket interface, with adjustments for winsock on win32 platforms. Future revisions may centralize the network code into one file, behind a single class interface, to simplify porting to platforms without the BSD socket API.&lt;br /&gt;
Most communication is non-blocking. That is, reads and sends return immediately instead of waiting for data to become available or to be sent. That&#039;s important since BZFlag is a real-time game. It can&#039;t afford to get stuck waiting for a packet to come in. (The one exception to this is when BZFlag connects to a server, and this should get fixed someday.)&lt;br /&gt;
Communication is multiplexed using the select() call, which notifies the caller which sockets have data pending for read and/or are ready for sends. Instead of checking for incoming data by trying to read every socket and testing for success, we simply ask the system which sockets have data and read on those only. This also means that we use just a single thread for network communication.&lt;br /&gt;
BZFlag uses two distinct transport protocols to communicate with the server. Server communication uses TCP/IP for reliability. Live game data communication uses UDP for speed and efficiency. See the other pages for more details.&lt;br /&gt;
&lt;br /&gt;
= Client/Server Communication =&lt;br /&gt;
The BZFlag server manages games. It is the judge and arbiter between clients. It manages game-global resources and information, such as flags and scores. It does not enforce game rules. Clients are trusted to follow the rules, saving the server the trouble of validating kills and client maneuvering.&lt;br /&gt;
For example, the server is not told of changes to a client&#039;s position on the game board. Therefore the server cannot enforce the rule that players can&#039;t drive through walls (without the OO or PH flags). This allows each client to run freely. If it had to wait for the server to okay each movement, it would be impossible to play BZFlag except on fast or dedicated networks.&lt;br /&gt;
Furthermore, clients inform the server when they&#039;ve killed another client player. The server doesn&#039;t verify the kill was legal beyond checking to see if someone has already claimed a kill on the same player. If more than one player claims a kill or tries to grab a particular flag, the server decides which player gets the kill or the flag.&lt;br /&gt;
Client/server communication is mostly limited to those messages that must be successfully delivered. These include, among others, notifications of players coming alive or being killed, notifications of shots being fired, flags coming or going or being grabbed or dropped.&lt;br /&gt;
Client/server communication in BZFlag is through TCP. TCP has the advantages of being bidirectional, reliable, and sequential. Bidirectional means each side of the connection can send to the other. Reliable means that each message will be delivered to the destination. Sequential means that messages (on a particular connection) will be received in the order they were sent.&lt;br /&gt;
The main disadvantage of TCP is that it&#039;s slow. Reliability may require a given message to be sent several times, until the receiver acknowledges its receipt. While delays can cause problems, there really isn&#039;t a way around it. Messages between the client and server are specifically those messages that must not be lost. If we didn&#039;t use TCP we&#039;d simply have to implement something that did the same thing, and which would necessarily suffer from the same drawbacks.&lt;br /&gt;
There are some instances where client/server communication doesn&#039;t use TCP. One example is client attempts to locate servers on the network. Clients send broadcast `pings&#039; which the servers listen for and respond to in kind. These messages are not part of normal game communication.&lt;br /&gt;
&lt;br /&gt;
= Client/Client Communication =&lt;br /&gt;
BZFlag clients send certain information to other clients during a game. This information includes: status, position, orientation, and linear and angular velocity. This state can change quickly and getting it late is no better than not getting it at all. So client-to-client packets are sent using UDP, a datagram protocol.&lt;br /&gt;
UDP is unreliable, meaning that packets are not guaranteed to be delivered. It&#039;s also connectionless, meaning we don&#039;t even know if anybody is listening for the message. However, it&#039;s also fast because it&#039;s so simple. UDP suits our needs because: we need fast delivery; we don&#039;t care if a message is lost because another will arrive shortly afterwards; and we don&#039;t care if the receiver isn&#039;t listening.&lt;br /&gt;
BZFlag clients need to send their information to all the other clients. There are several ways to do this. First, each client can send each message to all the other clients. If there are N clients then each message is sent N-1 times. Traffic grows as the square of clients. This is slow and wasteful.&lt;br /&gt;
Alternatively, each client can send all messages to one special computer (for example, the server) and that computer can forward the messages to all the other players. This makes life easier on the clients and much harder on the server. It also delays the delivery of each message. And traffic from the server still grows as N squared (though traffic to the server grows linearly).&lt;br /&gt;
Another possibility is to broadcast messages. A broadcast message is sent once and received by all computers on a subnet. This scales linearly and minimizes network traffic but broadcast traffic is never routed outside the subnet, so it means only clients on the same subnet of the same local area network could play together.&lt;br /&gt;
BZFlag uses the second technique, using the server as a relay system. The server uses the TCP client/server connection to send client traffic that must be reliable and UDP for information that must be timely but does not need to be reliable.&lt;br /&gt;
&lt;br /&gt;
= Protocol =&lt;br /&gt;
  --&amp;gt; means from client to server&lt;br /&gt;
  &amp;lt;-- means from server to client&lt;br /&gt;
&lt;br /&gt;
All multi-byte data is in network byte order (aka big endian); that is, the most significant byte comes first followed by successively less significant bytes.&lt;br /&gt;
All numbers are integers unless otherwise specified. Integers can be 8, 16, or 32 bit signed 2&#039;s compliment or unsigned (encoding is the same in regardless of signed status). Values in this document in byte boxes are given in hexadecimal. Values in the text are given in decimal unless otherwise noted.&lt;br /&gt;
Bit fields are encoded as unsigned integers. All floating point numbers are in standard IEEE-754 single precision format. Multi-byte values are *not* necessarily aligned on 2 or 4 byte boundaries.&lt;br /&gt;
A client normally follows the following sequence during game play: connect to server get the world database join the game send/receive game messages leave game disconnect from server&lt;br /&gt;
common message structures ------------------------- Most messages begin with the length of the message in bytes followed by a 16 bit code. The length is 16 bits and excludes itself and the code, so it&#039;s the actual length of the message minus 4.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Player identifiers are 1 byte and are used in many messages.&lt;br /&gt;
&lt;br /&gt;
          0 - 243 : Regular Players&lt;br /&gt;
        244 - 250 : Special Team Ids&lt;br /&gt;
        251 - 252 : Unused IDs&lt;br /&gt;
              253 : ServerPlayer (World weapons, etc)&lt;br /&gt;
              254 : All Players&lt;br /&gt;
              255 : No Player (Invalid Player)&lt;br /&gt;
&lt;br /&gt;
Flag status is common to a few message types:&lt;br /&gt;
&lt;br /&gt;
	u16	flag id&lt;br /&gt;
	u16	status&lt;br /&gt;
	u16	type&lt;br /&gt;
	u8	owner id&lt;br /&gt;
	float	position (x)&lt;br /&gt;
	float	position (y)&lt;br /&gt;
	float	position (z)&lt;br /&gt;
	float	launch (x)&lt;br /&gt;
	float	launch (y)&lt;br /&gt;
	float	launch (z)&lt;br /&gt;
	float	landing (x)&lt;br /&gt;
	float	landing (y)&lt;br /&gt;
	float	landing (z)&lt;br /&gt;
	float	flight time&lt;br /&gt;
	float	flight end time&lt;br /&gt;
	float	initial velocity&lt;br /&gt;
&lt;br /&gt;
`Position,&#039; `launch,&#039; `landing,&#039; `flight time,&#039; `flight end,&#039; and `initial velocity&#039; are all floating point numbers. `Flag id&#039; is the type of flag,enumerated in FlagId.&lt;br /&gt;
&lt;br /&gt;
`Status&#039; gives the current location of the flag:&lt;br /&gt;
  FlagNoExist  -- the flag is not active (i.e. not in the game)&lt;br /&gt;
  FlagOnGround -- the flag is sitting on the ground ready to get picked up&lt;br /&gt;
  FlagOnTank   -- the flag is on a player&#039;s tank&lt;br /&gt;
  FlagInAir    -- the flag is in the air and will fall back down&lt;br /&gt;
  FlagComing   -- the flag just appeared and is falling to the ground&lt;br /&gt;
  FlagGoing    -- the flag was thrown in the air and is disappearing&lt;br /&gt;
&lt;br /&gt;
`Type&#039; indicates the behavior of the flag: FlagNormal means the flag is permanent and can be dropped normally (e.g. a team flag); FlagUnstable means the flag may disappear after use (e.g. a good super flag); FlagSticky means the flag cannot be dropped normally (e.g. a bad super flag).&lt;br /&gt;
`Player id&#039; indicates which player has the flag when `status&#039; is FlagOnTank. It isn&#039;t used for any other status.&lt;br /&gt;
`Position&#039; is the location of the flag on the ground. It only has meaning when `status&#039; is FlagOnGround. The position of a flag when on a tank is the position of the tank (centered on and at the top of the tank)&lt;br /&gt;
`Launch&#039; is the location of the flag where it was thrown in the air. `Landing&#039; is the location where the flag will/would touch ground. These are used when `status&#039; is FlagInAir, FlagComing, and FlagGoing. The client should make the flag follow a reasonable flight path (e.g. a parabolic arc) from `launch&#039; to `landing.&#039;&lt;br /&gt;
`Flight time&#039; is the time elapsed since the flag was thrown into the air. `Flight end&#039; the time when the flag will reach the ground. `Initial velocity&#039; gives the vertical (z) velocity of the flag when launched. The vertical position of the flag at time t (ranging from 0 to `flight end&#039;) is: z = z0 + v * t + 0.5 * g * t * t. z0 = `launch z;&#039; v = `initial velocity;&#039; g = acceleration due to gravity.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Connecting to a server ==&lt;br /&gt;
The [http://bzflag.svn.sourceforge.net/viewvc/*checkout*/bzflag/trunk/bzflag/misc/bzfquery.php bzfquery.php script] is a nice example of how to connect to a server.&lt;br /&gt;
&lt;br /&gt;
At the beginning you need to open a socket. Beginning with protocol 0048 you need to send &amp;quot;BZFLAG\r\n\r\n&amp;quot; in order to get any reply. At that time you unfortunately don&#039;t know the protocol, so send it by default or your client will probably freeze.&lt;br /&gt;
&lt;br /&gt;
  --&amp;gt;   connect(server port)&lt;br /&gt;
  --&amp;gt;    +----+----+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 42 | 5a | 46 | 4C | 41 | 47 | 0D | 0A | 0D | 0A |     BZFLAG\r\n\r\n&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+----+----+&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+----+&lt;br /&gt;
  	| 42 | 5a | 46 | 53 | 31 | 39 | 31 | 30 | FF |           BZFS1910        FF&lt;br /&gt;
  	+----+----+----+----+----+----+----+----+----+&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Client should verify the version. In old versions the first four bytes indicates a BZFlag server, the next byte indicates the major version number (as an ASCII digit), the two bytes after that are the minor version number (as ASCII digits), and the 7th byte is the revision. Major and minor version number changes indicate incompatible protocol changes. Different revisions of a given version are compatible and usually just indicate client user interface changes. A following FF ends the packet. In new versions the protocol is just a number increased by 1 when the protocol changes.&lt;br /&gt;
&lt;br /&gt;
If the reply was a protocol older than 0048 then bzfs will kick the client connecting to it. In this case we recommend a fallback, not sending BZFLAG\r\n\r\n during connection try:&lt;br /&gt;
&lt;br /&gt;
  --&amp;gt;   connect(server port)&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+----+&lt;br /&gt;
  	| 42 | 5a | 46 | 53 | 31 | 39 | 31 | 30 | FF |           BZFS1910        FF&lt;br /&gt;
  	+----+----+----+----+----+----+----+----+----+&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Server owners will see something like the following in the logs if their server(s) use a protocol older than 0048:&lt;br /&gt;
  Player [0] sent huge packet length (len=16986), possible attack&lt;br /&gt;
  Player  [0] removed at 2007-04-11 15:52:55: large packet recvd&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Message types ==&lt;br /&gt;
Read this with caution, as it is very old information not reflecting the current status.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Negotiating world flags ===&lt;br /&gt;
&lt;br /&gt;
  --&amp;gt;    +----+----+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| length  | 6E | 66 | FlagID1 | FlagID2 | ....... |     MsgNegotiateFlags&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+----+----+     (List of client flag ids)&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| length  | 6E | 66 | FlagID1 | FlagID2 | ....... |     MsgNegotiateFlags&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+----+----+     (List of server flag ids, that client doesn&#039;t know)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Client sends to the server the two byte representation of all flags known to the client. In the case that a flag is only one letter, (N) for instance, the second byte is null. Otherwise, the null byte is implied at position 3. The server upon receipt of this list, finds all flags that are used by the server, but not known by the client, and sends this list to the client. The client upon receipt of the list, either disallows play, if flags exist, or continues if the list is empty.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== getting the world hash ===&lt;br /&gt;
  --&amp;gt;    +----+----+----+----+&lt;br /&gt;
 	| 00 | 00 | 77 | 68 |                         MsgWantWHash&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| length  | 77 | 68 | world hash data... |     MsgWantWHash&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
&lt;br /&gt;
To improve performance World (bzc) files are cached on the client. The name of the cache file is an md5 hash of the file that is computed on the server. this hash is sent to the client, and the client looks for a file by that name in the bz world cache directory. If the hash starts with a &#039;t&#039;, the world is a random world. If the hash starts with a &#039;p&#039; the world is from a world file. If the client can find the file locally, it does not sent the following MsgGetWorld packet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== getting the world database ===&lt;br /&gt;
  --&amp;gt;    +----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 02 | 67 | 77 | offset  |                 MsgGetWorld&lt;br /&gt;
 	+----+----+----+----+----+----+&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| length  | 67 | 77 |remaining| data... |       MsgGetWorld&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	or&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
 	| 00 | 00 | 73 | 6b |                           MsgSuperKill&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Client sends MsgGetWorld requests until it has read the entire world database. Clients should send an `offset&#039; of 0 for the first request and increase `offset&#039; by however much data was sent in reply. Each MsgGetWorld reply includes the number of bytes left after the returned block of data in `remaining&#039;. The server returns 0 in `remaining&#039; when there is no more data left to read. In no event will the server return more than MaxPacketLen - 6 bytes of data in one reply (see protocol.h for the definition of MaxPacketLen). The server may return MsgSuperKill at any time during the download of the world database. The client should immediately close the connection to the server. No other messages should be returned by the server as long as the client sends only MsgGetWorld requests.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The `data&#039; has the following encoding:&lt;br /&gt;
&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
 	| 00 | 1E | 73 | 74 |        length of data, WorldCodeStyle&lt;br /&gt;
 	+----+----+----+----+----+----+&lt;br /&gt;
 	| version |      worldsize    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|  style  | mxPlyrs | mxShots | mxFlags |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|linear acceleration|angulr acceleration|&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| shake t | shake w |    epoch offset   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
&lt;br /&gt;
Values are:&lt;br /&gt;
  version:      version of the bzw format&lt;br /&gt;
  worldsize:    size in meters of world&lt;br /&gt;
  style:        bitfield of game style&lt;br /&gt;
  maxPlayrs:    maximum number of players&lt;br /&gt;
  maxShots:     maximum number of shots at once per player&lt;br /&gt;
  maxFlags:     maximum number of flags that may exist at once&lt;br /&gt;
  linear acc.:  linear acceleration limit (float)&lt;br /&gt;
  angulr acc.:  angular acceleration limit (float)&lt;br /&gt;
  shake t:      time to shake a bad flag (1/10ths of seconds)&lt;br /&gt;
  shake w:      number of wins to shake a bad flag&lt;br /&gt;
  epoch offset: seconds since midnight Jan 1, 1970 GMT on the server, used when&lt;br /&gt;
		synchronizing times across clients&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The rest of the world database is encoded in individual blocks describing each object. Only permanent immovable objects are included. The encodings for each type of object are:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
team base:&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
 	| 00 | 2A | 62 | 61 | length of base data, team code&lt;br /&gt;
 	+----+----+----+----+----+----+&lt;br /&gt;
 	| team id |     center (x)    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|     center (y)    |     center (z)    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|       angle       |      size (x)     |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|      size (y)     |      size (z)     |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    safety (x)     |    safety (y)     |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    safety (z)     |&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
&lt;br /&gt;
wall:&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
 	| 00 | 18 | 77 | 6C | length of wall data, wall code&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    center (x)     |    center (y)     |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    center (z)     |    angle...       |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|       width       |       height      |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
pyramid:&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
 	| 00 | 1D | 70 | 79 | length of pyramid data, pyramid code&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    center (x)     |    center (y)     |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    center (z)     |     angle         |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|       width       |     depth         |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|      height       | sdf|&lt;br /&gt;
 	+----+----+----+----+----+&lt;br /&gt;
&lt;br /&gt;
box:&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
 	| 00 | 1D | 62 | 78 | length of box data, box code&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    center (x)     |    center (y)     |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    center (z)     |     angle         |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|       width       |     depth         |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|      height       | sdf|&lt;br /&gt;
 	+----+----+----+----+----+&lt;br /&gt;
&lt;br /&gt;
teleporter:&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
 	| 00 | 21 | 74 | 65 | length of teleporter data, teleporter code&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    center (x)     |    center (y)     |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    center (z)     |       angle       |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|       width       |       depth       |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|      height       |       border      |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| sdf|&lt;br /&gt;
 	+----+&lt;br /&gt;
&lt;br /&gt;
teleporter link:&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
 	| 00 | 04 | 6C | 6E | length of link data, link code&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
 	|  from   |   to    |&lt;br /&gt;
  	+----+----+----+----+&lt;br /&gt;
end of data:&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
 	| 00 | 00 | 65 | 64 | length of worldcodeend data, worldcodeend code&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
&lt;br /&gt;
The above values are interpreted as follows:&lt;br /&gt;
&lt;br /&gt;
  angle (float):        in radians from the x-axis in the xy plane&lt;br /&gt;
  width (float):        half width (in xy) measured from center&lt;br /&gt;
  depth (float):        half depth (in xy) measured from center&lt;br /&gt;
  height (float):       full height (in z) measured from bottom&lt;br /&gt;
  border (float):       full size of the square cross section teleporter border&lt;br /&gt;
  center (float):       center in xy, bottom in z&lt;br /&gt;
  safety (float):       safety position for team flags, used when team A drops team B&#039;s&lt;br /&gt;
			flag on team C&#039;s base.&lt;br /&gt;
  from &amp;amp; to:            index of teleporter face starting from zero;  the N&#039;th teleporter&lt;br /&gt;
			in the world data has face indices 2*N and 2*N+1.  teleporter&lt;br /&gt;
			links indicate which face teleports to which face;  faces may&lt;br /&gt;
			teleport to themselves.&lt;br /&gt;
  sdf (byte):           bit mask:&lt;br /&gt;
                              drive through is bitmask 0x01&lt;br /&gt;
                              shoot through is bitmask 0x02&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== join game ==&lt;br /&gt;
Once connected a player normally requests to join the game.  The server replies with&lt;br /&gt;
MsgSuperKill, MsgReject, or MsgAccept.&lt;br /&gt;
&lt;br /&gt;
  --&amp;gt;    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| length  | 65 | 6e |  player id...             MsgEnter&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |  type   |  team   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| call sign (CallSignLen bytes)...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 						|&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| email address (EmailLen bytes)...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 						|&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+&lt;br /&gt;
 	| 00 | 00 | 61 | 63 |                           MsgAccept&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
 	or&lt;br /&gt;
 	+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 02 | 72 | 6a |  code   |                 MsgReject&lt;br /&gt;
 	+----+----+----+----+----+----+&lt;br /&gt;
 	or&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
 	| 00 | 00 | 73 | 6b |                           MsgSuperKill&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
&lt;br /&gt;
`Type&#039; is one of the enumerations in PlayerType and `team&#039; is one from TeamColor.&lt;br /&gt;
The call sign is the player&#039;s `handle&#039; during the game;  the call sign is used&lt;br /&gt;
to identify the player.  No attempt is made by the server to prevent the&lt;br /&gt;
duplication of call signs during a game.  The motto can be anything,&lt;br /&gt;
including the email address for human players (e.g. username@hostname).&lt;br /&gt;
BZFlag players can choose `anonymous&#039; instead of their motto.  The call&lt;br /&gt;
sign and email address should be NUL terminated ASCII strings, padded with&lt;br /&gt;
NUL&#039;s to the required length.  `Length&#039; is 12 + CallSignLen + EmailLen.&lt;br /&gt;
&lt;br /&gt;
If the server responds with MsgSuperKill the client should close the connection&lt;br /&gt;
immediately.  If the server responds with MsgReject, the client has not joined the&lt;br /&gt;
game but may keep the server connection open and try again.  The reason for rejection&lt;br /&gt;
is included with the MsgReject message:&lt;br /&gt;
&lt;br /&gt;
	RejectBadRequest        -- bogus data in MsgEnter&lt;br /&gt;
	RejectBadTeam           -- invalid team id&lt;br /&gt;
	RejectBadType           -- invalid client type&lt;br /&gt;
	RejectTeamFull          -- no more players allowed on team&lt;br /&gt;
	RejectServerFull        -- no more players allowed on any team&lt;br /&gt;
&lt;br /&gt;
If the server responds with MsgAccept, the player has successfully joined the game.&lt;br /&gt;
The server then automatically sends updates about each flag, team, and player.  The&lt;br /&gt;
client should be prepared to accept these updates in any order.  The flag and team&lt;br /&gt;
updates are sent as MsgFlagUpdate and MsgTeamUpdate messages, respectively.  Player&lt;br /&gt;
updates are sent as MsgAddPlayer messages.  The client will receive a MsgAddPlayer&lt;br /&gt;
for the player it just added, but only after it has received a MsgAddPlayer for each&lt;br /&gt;
of the players already joined.&lt;br /&gt;
&lt;br /&gt;
Until it receives the MsgAddPlayer for the player it just added, the client will&lt;br /&gt;
only receive the following kinds of messages:&lt;br /&gt;
&lt;br /&gt;
	MsgSuperKill&lt;br /&gt;
	MsgFlagUpdate&lt;br /&gt;
	MsgTeamUpdate&lt;br /&gt;
	MsgAddPlayer&lt;br /&gt;
&lt;br /&gt;
Players of type ComputerPlayer are not sent team or flag updates and only get the&lt;br /&gt;
MsgAddPlayer for themselves.  This probably wasn&#039;t a good idea, but there it is.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Leave game ==&lt;br /&gt;
Once entered, a player can leave the game at any time.  This should be done by sending&lt;br /&gt;
the following message, then closing the connection:&lt;br /&gt;
&lt;br /&gt;
  --&amp;gt;    +----+----+----+----+&lt;br /&gt;
 	| 00 | 00 | 65 | 78 |                           MsgExit&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
&lt;br /&gt;
There is no reply.  Clients can also leave by simply closing the connection, but&lt;br /&gt;
sending MsgExit first is recommended.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== During a game ==&lt;br /&gt;
There are several types of messages that are delivered at any time after a player&lt;br /&gt;
enters a game.  Clients must be prepared to handle them in any order.&lt;br /&gt;
&lt;br /&gt;
MsgSuperKill&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+&lt;br /&gt;
 	| 00 | 00 | 73 | 6b |&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
Client must immediately disconnect from the server.&lt;br /&gt;
&lt;br /&gt;
MsgTimeLeft&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 02 | 74 | 6f |time left|&lt;br /&gt;
 	+----+----+----+----+----+----+&lt;br /&gt;
Gives the time remaining in the game.  This message is only sent when the&lt;br /&gt;
server has time limit configured.  If the time remaining is zero, the client&lt;br /&gt;
should indicate to the player that the game is over.&lt;br /&gt;
`Time left&#039; is in seconds.  It is not sent every second so clients will need&lt;br /&gt;
to do their own count down between messages.&lt;br /&gt;
&lt;br /&gt;
MsgScoreOver&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 0a | 73 | 6f |     player id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    | team id |&lt;br /&gt;
 	+----+----+----+----+----+----+&lt;br /&gt;
Gives the player or team that won the game by reaching the target score.&lt;br /&gt;
This message is only sent when the server has a target score configured.&lt;br /&gt;
The client should indicate which team or player won and that the game is&lt;br /&gt;
over.&lt;br /&gt;
&lt;br /&gt;
If `team id&#039; is NoTeam then `player id&#039; indicates which player has won.&lt;br /&gt;
Otherwise `team id&#039; indicates which team won.&lt;br /&gt;
&lt;br /&gt;
MsgAddPlayer&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| length  | 61 | 70 |     player id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |  type   |  team   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|  wins   |  losses | call sign...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 		... (CallSignLen bytes)...      |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| email address...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 		 ... (EmailLen bytes)...        |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
Sent when another player enters the game and when joining a game if other&lt;br /&gt;
players are already joined.  `Type&#039; is enumerated in PlayerType, `team&#039;&lt;br /&gt;
is enumerated in TeamColor.  `Wins&#039; and `losses&#039; give the player&#039;s score.&lt;br /&gt;
They are unsigned integers;  the player&#039;s score equals wins minus losses.&lt;br /&gt;
`Call sign&#039; and `email address&#039; are NUL terminated ASCII strings.  `Length&#039;&lt;br /&gt;
is 16 + CallSignLen + EmailLen.&lt;br /&gt;
&lt;br /&gt;
MsgRemovePlayer&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 08 | 72 | 70 |     player id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
Sent when another player leaves the game.&lt;br /&gt;
&lt;br /&gt;
MsgFlagUpdate&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 40 | 66 | 75 |flag num | flag id |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| status  |  type   |     player id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |    position (x)   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    position (y)   |    position (z)   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|     launch (x)    |     launch (y)    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|     launch (z)    |    landing (x)    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    landing (y)    |    landing (z)    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    flight time    |    flight end     |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| initial velocity  |&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
Sent when a flag&#039;s state changes.  Also sent to a client when it enters&lt;br /&gt;
a game.  `Flag num&#039; is the index of the flag.  Flags are indexed from&lt;br /&gt;
zero up to the maximum number of flags minus one.&lt;br /&gt;
&lt;br /&gt;
Clients must update the flag positions while the flag is in flight (i.e.&lt;br /&gt;
`status&#039; is FlagInAir, FlagComing, or FlagGoing.  If FlagInAir or&lt;br /&gt;
FlagComing then the client should change the flag&#039;s status to&lt;br /&gt;
FlagOnGround when the flag&#039;s flight time equals or exceeds `flight end.&#039;&lt;br /&gt;
The position should be set exactly to `landing.&#039;  If FlagGoing, the&lt;br /&gt;
client should change the flag&#039;s status to FlagNoExist when the flight&lt;br /&gt;
time equals or exceeds `flight end.&#039;&lt;br /&gt;
&lt;br /&gt;
BZFlag uses the first half of the flight time for FlagComing and the&lt;br /&gt;
last half of the flight time for FlagGoing to make the flag appear or&lt;br /&gt;
disappear from/to nothing.  This allows players to adjust to the&lt;br /&gt;
appearance/disappearance of a flag.&lt;br /&gt;
&lt;br /&gt;
MsgTeamUpdate&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 0a | 74 | 6f |  team   |  size   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| active  |  wins   | losses  |&lt;br /&gt;
 	+----+----+----+----+----+----+&lt;br /&gt;
Gives the current state of team `team.&#039;  `Size&#039; is the number of&lt;br /&gt;
players on the team.  `Active&#039; is the number of active players on the&lt;br /&gt;
team.  An active player is one that can participate in the game (e.g.&lt;br /&gt;
grab flags, shoot opponents, etc.);  a non-active player can only&lt;br /&gt;
observe the game.  Only active players are considered when deciding&lt;br /&gt;
if there are any players on a team (to decide if the team flag should&lt;br /&gt;
be inserted or withdrawn from the game).  `Wins&#039; and `losses&#039; give the&lt;br /&gt;
team&#039;s score (wins minus losses).&lt;br /&gt;
&lt;br /&gt;
MsgAlive&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 20 | 61 | 6c |     player id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |    position (x)   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    position (y)   |    position (z)   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    forward (x)    |    forward (y)    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    forward (z)    |&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
Sent when a player comes alive.  A player that has joined is not on the&lt;br /&gt;
game board until it sends this message, which declares that it is in&lt;br /&gt;
game and gives the starting position and orientation.  Players are removed&lt;br /&gt;
from the game board when killed and do not reappear until sending this&lt;br /&gt;
message again.&lt;br /&gt;
&lt;br /&gt;
  --&amp;gt;    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 18 | 61 | 6c |    position (x)   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    position (y)   |    position (z)   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    forward (x)    |    forward (y)    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    forward (z)    |&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
A player sends this message to enter the game board.  Note that this&lt;br /&gt;
version of the message differs from the one sent by the server in that&lt;br /&gt;
it lacks the player id (which is implicit in the server connection).&lt;br /&gt;
Players must send this message to change their state from dead to alive.&lt;br /&gt;
Players should not send MsgAlive for a certain penalty period after&lt;br /&gt;
being killed (but the server does not enforce a minimum time).  The&lt;br /&gt;
currently penalty is ExplodeTime.&lt;br /&gt;
&lt;br /&gt;
`Position&#039; gives the location of the player and `forward&#039; gives the&lt;br /&gt;
player&#039;s forward direction vector.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MsgKilled&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 12 | 6b | 6c |     victim id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |     killer id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    | shot id |&lt;br /&gt;
 	+----+----+----+----+----+----+&lt;br /&gt;
Sent by the server when a player is killed by itself or another player.&lt;br /&gt;
The victim id is the player that was destroyed and the killer id is the&lt;br /&gt;
player credited with the kill.  Shot id identifies which of the killer&#039;s&lt;br /&gt;
shots hit the victim;  if the shot isn&#039;t a laser or shockwave, other&lt;br /&gt;
players may assume the shot has stopped and needn&#039;t check themselves&lt;br /&gt;
against the shot (or they can wait until the MsgShotEnd message arrives).&lt;br /&gt;
&lt;br /&gt;
  --&amp;gt;    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 0a | 6b | 6c |     killer id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    | shot id |&lt;br /&gt;
 	+----+----+----+----+----+----+&lt;br /&gt;
Sent by the victim when it detects that it&#039;s been hit, naming the killer&lt;br /&gt;
and which of the killer&#039;s shots was the one that hit.  Note that the&lt;br /&gt;
server does not verify kills in any way so it&#039;s trivial to `cheat&#039; by&lt;br /&gt;
claiming you&#039;ve been killed;  this is generally unproductive.  It&#039;s&lt;br /&gt;
also easy to cheat by never sending MsgKilled, making you almost&lt;br /&gt;
immortal.  Don&#039;t do this.&lt;br /&gt;
&lt;br /&gt;
MsgGrabFlag&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 48 | 67 | 66 |     grabber id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |flag num | flag id |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| status  |  type   |      owner id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |    position (x)   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    position (y)   |    position (z)   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|     launch (x)    |     launch (y)    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|     launch (z)    |    landing (x)    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    landing (y)    |    landing (z)    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    flight time    |    flight end     |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| initial velocity  |&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
Sent by the server when a player is allowed to grab a flag.  This is&lt;br /&gt;
both the notice to the player trying to grab the flag that it succeeded&lt;br /&gt;
and the notice to all other players that the flag was grabbed.  Note&lt;br /&gt;
that `grabber id&#039; is redundant;  it&#039;s always equal to `owner id.&#039;&lt;br /&gt;
&lt;br /&gt;
`Flag num&#039; is the index of the flag.  Flags are indexed from zero up to&lt;br /&gt;
the maximum number of flags minus one.&lt;br /&gt;
&lt;br /&gt;
  --&amp;gt;    +----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 02 | 67 | 66 |flag num |&lt;br /&gt;
 	+----+----+----+----+----+----+&lt;br /&gt;
Sent by a player when it wants to grab a flag.  Players should only&lt;br /&gt;
send this message when their tank is within FlagRadius of a flag (that&#039;s&lt;br /&gt;
any part of the tank, not simply the center) and on the ground.  The&lt;br /&gt;
server will not verify this, but it will verify some other stuff.  The&lt;br /&gt;
player must not assume it will be able to grab the flag.  Instead it has&lt;br /&gt;
to wait for a MsgGrabFlag reply.&lt;br /&gt;
&lt;br /&gt;
MsgDropFlag&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 48 | 64 | 66 |     dropper id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |flag num | flag id |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| status  |  type   |      owner id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |    position (x)   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    position (y)   |    position (z)   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|     launch (x)    |     launch (y)    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|     launch (z)    |    landing (x)    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    landing (y)    |    landing (z)    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    flight time    |    flight end     |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| initial velocity  |&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
Sent by the server when a player is allowed to drop a flag.  This is&lt;br /&gt;
both the notice to the player trying to drop the flag that it succeeded&lt;br /&gt;
and the notice to all other players that the flag was dropped.  `Owner&lt;br /&gt;
id&#039; is meaningless in this message.&lt;br /&gt;
&lt;br /&gt;
`Flag num&#039; is the index of the flag.  Flags are indexed from zero up to&lt;br /&gt;
the maximum number of flags minus one.&lt;br /&gt;
&lt;br /&gt;
  --&amp;gt;    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 0c | 64 | 66 |    position (x)   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    position (y)   |    position (z)   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
Sent by a player when it wants to drop a flag.  Players should only&lt;br /&gt;
send this message when they have a flag and only when the flag dropping&lt;br /&gt;
constraints have been met (i.e. the flag can be dropped at any time, or&lt;br /&gt;
the player got the antidote flag, etc.)  The player must not assume it&lt;br /&gt;
has dropped the flag until it receives a MsgDropFlag in response.&lt;br /&gt;
&lt;br /&gt;
`Position&#039; is in floating point and is the position of the tank that&lt;br /&gt;
dropped the flag when it was dropped.&lt;br /&gt;
&lt;br /&gt;
MsgCaptureFlag&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 0c | 63 | 66 |    capturer id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |flag num | team id |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
Sent by the server when a team&#039;s flag has been captured.  `Capturer id&#039;&lt;br /&gt;
is the player who captured the flag.  `Flag num&#039; is the index of the&lt;br /&gt;
captured flag.  Flags are indexed from zero up to the maximum number of&lt;br /&gt;
flags minus one.  `Team id&#039; is the id of the team who&#039;s flag was&lt;br /&gt;
captured.  Note that the player who captures the flag may be on the team&lt;br /&gt;
that was captured.&lt;br /&gt;
&lt;br /&gt;
The server makes all players on the captured team dead.  This message is&lt;br /&gt;
the only notice that the players are now dead so clients should act&lt;br /&gt;
accordingly.  This is also the only notice that the capturer is no longer&lt;br /&gt;
carrying a flag.&lt;br /&gt;
&lt;br /&gt;
  --&amp;gt;    +----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 02 | 63 | 66 | team id |&lt;br /&gt;
 	+----+----+----+----+----+----+&lt;br /&gt;
Sent by a player when it captures a team flag.  `Team id&#039; is the id of&lt;br /&gt;
the team who&#039;s flag was captured.  The player should wait until the&lt;br /&gt;
server sends back the MsgCaptureFlag response before assuming the&lt;br /&gt;
capture was successful.  A player should send this message only when&lt;br /&gt;
1) its tank is at least halfway inside a team base, 2) the tank is on&lt;br /&gt;
the ground, and 3) the player has its own team flag in an enemy base&lt;br /&gt;
or the player has another team&#039;s flag in its own base.  Note that the&lt;br /&gt;
server will not enforce any of these requirements.&lt;br /&gt;
&lt;br /&gt;
MsgShotBegin&lt;br /&gt;
  &amp;lt;-- &lt;br /&gt;
  --&amp;gt;    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 2c | 73 | 62 |    shooter id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    | shot id | position&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	    (x)   |    position (y)   | position&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	    (z)   |    velocity (x)   | velocity&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	    (y)   |    velocity (z)   |  time&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 		  |flag type|     lifetime      |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
Sent by the server when a player has fired a shot.  The identical message&lt;br /&gt;
is send by a player when it fires a shot.  The server does not verify&lt;br /&gt;
that the player is allowed to fire a shot.&lt;br /&gt;
&lt;br /&gt;
`Shooter id&#039; identifies the player that did the shooting.  `Shot id&#039; is&lt;br /&gt;
a number that uniquely identifies to the shooter which shot this is.&lt;br /&gt;
`Position,&#039; `velocity,&#039; `time,&#039; and `lifetime&#039; are floating point&lt;br /&gt;
numbers.  `Position&#039; is the starting position of the shot.  `Velocity&#039;&lt;br /&gt;
is the starting velocity of the shot.  `Time&#039; is the time the shot has&lt;br /&gt;
existed (probably 0.0).  `Lifetime&#039; is how long the shot exists.  `Flag&lt;br /&gt;
type&#039; is a FlagId and is the type of flag the shooter had when the shot&lt;br /&gt;
was fired.&lt;br /&gt;
&lt;br /&gt;
Clients are expected to compute the flight path of shots (except Guided&lt;br /&gt;
Missiles) given the information in MsgShotBegin.  That includes handling&lt;br /&gt;
ricochets, building impacts, and teleportation, but not tank impacts.&lt;br /&gt;
Each player decides if it itself has been hit by a shot at each time step&lt;br /&gt;
based on this flight path.  Since the path of a guided missile cannot be&lt;br /&gt;
predicted, updates to a guided missile&#039;s path is sent throughout its&lt;br /&gt;
flight by the shooter via MsgGMUpdate messages.&lt;br /&gt;
&lt;br /&gt;
A player should test itself against a shot using whatever algorithm it&lt;br /&gt;
likes, but at a minimum should test the line segments the shot moves&lt;br /&gt;
along during the time step against a tank aligned bounding box.&lt;br /&gt;
Accounting for the linear motion of the tank over the time step is&lt;br /&gt;
better and accounting for both the linear and angular motion is better&lt;br /&gt;
still.  Note that the shot has a certain radius that should be taking&lt;br /&gt;
into account during intersection testing.  This is particularly&lt;br /&gt;
important when testing against a tank with the narrow flag.  Ideally,&lt;br /&gt;
the shot would be exactly tested against the tank geometry.  However,&lt;br /&gt;
that&#039;s more work than realistically necessary.&lt;br /&gt;
&lt;br /&gt;
MsgShotEnd&lt;br /&gt;
  &amp;lt;-- &lt;br /&gt;
  --&amp;gt;    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 0c | 73 | 65 |    shooter id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    | shot id | reason  |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
Sent by the server when a shot has been terminated before its lifetime&lt;br /&gt;
has expired.  The identical message is sent by the player that&lt;br /&gt;
terminates the shot.  This is normally the player that has just been&lt;br /&gt;
hit by the shot.  The server does not verify that the player has or&lt;br /&gt;
has not been hit.  This message is also sent by the player that fired&lt;br /&gt;
a guided missile when the shot hits the ground or a building (note that&lt;br /&gt;
guided missiles don&#039;t ricochet).&lt;br /&gt;
&lt;br /&gt;
`Shooter id&#039; identifies the player that fired the shot and `shot id&#039;&lt;br /&gt;
is the same as in the MsgShotBegin message for the shot.  `Reason&#039; is&lt;br /&gt;
one if the other players should show an explosion for the shot and&lt;br /&gt;
zero otherwise.&lt;br /&gt;
&lt;br /&gt;
MsgScore&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 0c | 73 | 63 |     player id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |  wins   | losses  |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
Sent by the server when a player&#039;s score changes.  `Player id&#039; is the&lt;br /&gt;
player with the new score, and `wins&#039; and `losses&#039; are the new scores.&lt;br /&gt;
&lt;br /&gt;
  --&amp;gt;    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 04 | 73 | 63 |  wins   | losses  |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
Sent by a player when its score changes.&lt;br /&gt;
&lt;br /&gt;
MsgTeleport&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 0c | 73 | 63 |     player id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |  from   |   to    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
Sent by the server when a player teleports.  `From&#039; is the index of the&lt;br /&gt;
teleporter face the player entered and `to&#039; is the index of the face&lt;br /&gt;
the player exited.&lt;br /&gt;
&lt;br /&gt;
  --&amp;gt;    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 04 | 73 | 63 |  from   |   to    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
Sent by a player when it passes through a teleporter.&lt;br /&gt;
&lt;br /&gt;
MsgMessage&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| length  | 6d | 67 |  from player id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |   to player id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |  team   |message...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	...(MessageLen bytes)...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 						|&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
Sent by the server when one player sends a message to others.  `Length&#039;&lt;br /&gt;
is the length of the message (18 + MessageLen bytes).  `From player id&#039;&lt;br /&gt;
is the player sending the message, `to player id&#039; is the player to&lt;br /&gt;
receive the message, and `team&#039; is the team to receive the message.&lt;br /&gt;
If `to player id&#039; is all zeros then the message is being sent to&lt;br /&gt;
everyone on `team&#039;.  If `to player id&#039; is all zeros and `team&#039; is&lt;br /&gt;
RogueTeam then the message is being sent to all players.  If `to player&lt;br /&gt;
id&#039; is not all zeros then `team&#039; is ignored and the message is only for&lt;br /&gt;
the identified player.&lt;br /&gt;
&lt;br /&gt;
  --&amp;gt;    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| length  | 6d | 67 |    player id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |  team   |message...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	...(MessageLen bytes)...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 						|&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
Sent by player to send a message to other players.  `Length&#039; is is the&lt;br /&gt;
length of the message (10 + MessageLen bytes).  `Player id&#039; is the&lt;br /&gt;
player to receive the message (or all zeros for all players on the&lt;br /&gt;
given team) and `team&#039; is the team to receive the message (or&lt;br /&gt;
RogueTeam for all teams).&lt;br /&gt;
&lt;br /&gt;
MsgPlayerUpdate&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 2a | 70 | 75 |    player id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    | status  | position&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	    (x)   |    position (y)   | position&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	    (z)   |    velocity (x)   | velocity&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	    (y)   |    velocity (z)   | azimuth&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 		  | angular velocity  |&lt;br /&gt;
 	+----+----+----+----+----+----+&lt;br /&gt;
Sent by players to notify other players of changes in its status,&lt;br /&gt;
position, or velocity.&lt;br /&gt;
&lt;br /&gt;
`Status&#039; is the tank&#039;s current status.  See PlayerStatus for the&lt;br /&gt;
meaning of the bit field&#039;s bits.  The FlagActive bit indicates whether&lt;br /&gt;
the player&#039;s flag&#039;s special powers are active or not.  The Phantom&lt;br /&gt;
Zone flag is an example of a flag that&#039;s active only some of the time.&lt;br /&gt;
The CrossingWall bit indicates if the player&#039;s tank is intersected by&lt;br /&gt;
a wall or teleporter;  other players can use this to draw the player&lt;br /&gt;
in some special way.  CrossingWall could be computed by each player&lt;br /&gt;
from other information;  it&#039;s only provided to save the other players&lt;br /&gt;
the trouble.&lt;br /&gt;
&lt;br /&gt;
`Position,&#039; `velocity,&#039; `azimuth,&#039; and `angular velocity&#039; are floating&lt;br /&gt;
point numbers.  `Azimuth&#039; is the orientation of the tank in radians&lt;br /&gt;
(the +x axis is 0.0, +y is pi/2).  `Angular velocity&#039; is the change in&lt;br /&gt;
azimuth per second.  `Position&#039; is the tank position and `velocity&#039; is&lt;br /&gt;
the change in tank position per second.&lt;br /&gt;
&lt;br /&gt;
A player normally only sends an update when its position or orientation&lt;br /&gt;
as could be predicted by other players differs from its true position&lt;br /&gt;
or orientation by a certain tolerance.  Other players are expected to&lt;br /&gt;
use the last known player data to extrapolate the current position and&lt;br /&gt;
orientation.  This technique is known as dead reckoning and has two&lt;br /&gt;
primary benefits:  network traffic is decreased since updates needn&#039;t&lt;br /&gt;
be sent continuously and players on systems with slower frame rates&lt;br /&gt;
appear to move smoothly to players on systems with faster frame rates.&lt;br /&gt;
&lt;br /&gt;
Players that fail to send updates often enough should be considered&lt;br /&gt;
to be not responding.  Unresponsive players should be ignored until&lt;br /&gt;
they start responding again.&lt;br /&gt;
&lt;br /&gt;
MsgGMUpdate&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 2e | 67 | 6d |    shooter id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    | shot id | position&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	    (x)   |    position (y)   | position&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	    (z)   |    velocity (x)   | velocity&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	    (y)   |    velocity (z)   |  time&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 		  |    target id....&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 		  |&lt;br /&gt;
 	+----+----+&lt;br /&gt;
Sent by players with active guided missiles to notify other players&lt;br /&gt;
of changes to the motion of the guided missile.&lt;br /&gt;
&lt;br /&gt;
See MsgShotBegin for the meaning of most items.  `Time&#039; is the current&lt;br /&gt;
age of the shot (the time since being fired).  `Target id&#039; is the&lt;br /&gt;
current target of the guided missile or all zeros if there is no target.&lt;br /&gt;
&lt;br /&gt;
Players are expected to use dead reckoning to update the position and&lt;br /&gt;
velocity of guided missiles between MsgGMUpdate messages.  Since&lt;br /&gt;
guided missiles deviate from their predicted course only when the&lt;br /&gt;
target changes, these message will be fairly rare.  Note that different&lt;br /&gt;
players may have different ideas of where the target is and that that&lt;br /&gt;
may cause slightly different courses.  This is generally not a problem.&lt;br /&gt;
&lt;br /&gt;
MsgLagPing&lt;br /&gt;
 	+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 02 | 70 | 69 | seq. no.|&lt;br /&gt;
 	+----+----+----+----+----+----+&lt;br /&gt;
Sent by the server to active players every 10s to measure lag. The&lt;br /&gt;
client just echoes the message back to the server. The time&lt;br /&gt;
between sending and receiving the message in the server is&lt;br /&gt;
considered to be the current lag of the respective player.&lt;br /&gt;
&lt;br /&gt;
The two byte sequence number is included to be able to deal with&lt;br /&gt;
lost or severely delayed messages. On each ping sent by the server,&lt;br /&gt;
the sequence number is incremented (modulo 10000). The server&lt;br /&gt;
manages this number on a per player basis.&lt;br /&gt;
&lt;br /&gt;
MsgReplayReset&lt;br /&gt;
 	+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 01 | 72 | 72 | lp |&lt;br /&gt;
 	+----+----+----+----+----+&lt;br /&gt;
Sent by the server to active replay observers to remove state&lt;br /&gt;
information that they might have regarding players and flags.&lt;br /&gt;
The &#039;lp&#039; value is the last player to be removed. PlayerId&#039;s above&lt;br /&gt;
&#039;lp&#039; are replay observers, and are not removed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UDP negotiation ==&lt;br /&gt;
&lt;br /&gt;
*solo bots don&#039;t do this, they should use the existing player&#039;s connection&lt;br /&gt;
&lt;br /&gt;
*MsgUDPLinkRequest = 0x6f66;		// &#039;of&#039;&lt;br /&gt;
&lt;br /&gt;
*MsgUDPLinkEstablished = 0x6f67;	// &#039;og&#039;&lt;br /&gt;
&lt;br /&gt;
*if client has udp enabled player sends MsgUDPLinkRequest with player number over udp&lt;br /&gt;
&lt;br /&gt;
*if request has valid player number and is from same address server sends MsgUDPLinkEstablished over tcp to confirm inbound server sends MsgUDPLinkRequest back over udp to test outbound&lt;br /&gt;
&lt;br /&gt;
*player gets MsgUDPLinkEstablished and starts sending udp&lt;br /&gt;
&lt;br /&gt;
*player gets MsgUDPLinkRequest and sends MsgUDPLinkEstablished over udp&lt;br /&gt;
&lt;br /&gt;
*server gets MsgUDPLinkEstablished&lt;br /&gt;
server can now send over udp&lt;br /&gt;
&lt;br /&gt;
[[Category:Concepts]]&lt;/div&gt;</summary>
		<author><name>Yosef</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Network_Protocol&amp;diff=8115</id>
		<title>Network Protocol</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Network_Protocol&amp;diff=8115"/>
		<updated>2011-11-06T16:05:35Z</updated>

		<summary type="html">&lt;p&gt;Yosef: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Inaccurate}}&lt;br /&gt;
{{DesignDocument}}&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
BZFlag uses standard IP (Internet) networking protocols. The code is written to the BSD socket interface, with adjustments for winsock on win32 platforms. Future revisions may centralize the network code into one file, behind a single class interface, to simplify porting to platforms without the BSD socket API.&lt;br /&gt;
Most communication is non-blocking. That is, reads and sends return immediately instead of waiting for data to become available or to be sent. That&#039;s important since BZFlag is a real-time game. It can&#039;t afford to get stuck waiting for a packet to come in. (The one exception to this is when BZFlag connects to a server, and this should get fixed someday.)&lt;br /&gt;
Communication is multiplexed using the select() call, which notifies the caller which sockets have data pending for read and/or are ready for sends. Instead of checking for incoming data by trying to read every socket and testing for success, we simply ask the system which sockets have data and read on those only. This also means that we use just a single thread for network communication.&lt;br /&gt;
BZFlag uses two distinct transport protocols to communicate with the server. Server communication uses TCP/IP for reliability. Live game data communication uses UDP for speed and efficiency. See the other pages for more details.&lt;br /&gt;
&lt;br /&gt;
= Client/Server Communication =&lt;br /&gt;
The BZFlag server manages games. It is the judge and arbiter between clients. It manages game-global resources and information, such as flags and scores. It does not enforce game rules. Clients are trusted to follow the rules, saving the server the trouble of validating kills and client maneuvering.&lt;br /&gt;
For example, the server is not told of changes to a client&#039;s position on the game board. Therefore the server cannot enforce the rule that players can&#039;t drive through walls (without the OO or PH flags). This allows each client to run freely. If it had to wait for the server to okay each movement, it would be impossible to play BZFlag except on fast or dedicated networks.&lt;br /&gt;
Furthermore, clients inform the server when they&#039;ve killed another client player. The server doesn&#039;t verify the kill was legal beyond checking to see if someone has already claimed a kill on the same player. If more than one player claims a kill or tries to grab a particular flag, the server decides which player gets the kill or the flag.&lt;br /&gt;
Client/server communication is mostly limited to those messages that must be successfully delivered. These include, among others, notifications of players coming alive or being killed, notifications of shots being fired, flags coming or going or being grabbed or dropped.&lt;br /&gt;
Client/server communication in BZFlag is through TCP. TCP has the advantages of being bidirectional, reliable, and sequential. Bidirectional means each side of the connection can send to the other. Reliable means that each message will be delivered to the destination. Sequential means that messages (on a particular connection) will be received in the order they were sent.&lt;br /&gt;
The main disadvantage of TCP is that it&#039;s slow. Reliability may require a given message to be sent several times, until the receiver acknowledges its receipt. While delays can cause problems, there really isn&#039;t a way around it. Messages between the client and server are specifically those messages that must not be lost. If we didn&#039;t use TCP we&#039;d simply have to implement something that did the same thing, and which would necessarily suffer from the same drawbacks.&lt;br /&gt;
There are some instances where client/server communication doesn&#039;t use TCP. One example is client attempts to locate servers on the network. Clients send broadcast `pings&#039; which the servers listen for and respond to in kind. These messages are not part of normal game communication.&lt;br /&gt;
&lt;br /&gt;
= Client/Client Communication =&lt;br /&gt;
BZFlag clients send certain information to other clients during a game. This information includes: status, position, orientation, and linear and angular velocity. This state can change quickly and getting it late is no better than not getting it at all. So client to client packets are sent using UDP, a datagram protocol.&lt;br /&gt;
UDP is unreliable, meaning that packets are not guaranteed to be delivered. It&#039;s also connectionless, meaning we don&#039;t even know if anybody is listening for the message. However, it&#039;s also fast because it&#039;s so simple. UDP suits our needs because: we need fast delivery; we don&#039;t care if a message is lost because another will arrive shortly afterwards; and we don&#039;t care if the receiver isn&#039;t listening.&lt;br /&gt;
BZFlag clients need to send their information to all the other clients. There are several ways to do this. First, each client can send each message to all the other clients. If there are N clients then each message is sent N-1 times. Traffic grows as the square of clients. This is slow and wasteful.&lt;br /&gt;
Alternatively, each client can send all messages to one special computer (for example, the server) and that computer can forward the messages to all the other players. This makes life easier on the clients and much harder on the server. It also delays the delivery of each message. And traffic from the server still grows as N squared (though traffic to the server grows linearly).&lt;br /&gt;
Another possibility is to broadcast messages. A broadcast message is sent once and received by all computers on a subnet. This scales linearly and minimizes network traffic but broadcast traffic is never routed outside the subnet, so it means only clients on the same subnet of the same local area network could play together.&lt;br /&gt;
BZFlag uses the second technique, using the server as a relay system. The server uses the TCP client/server connection to send client traffic that must be reliable and UDP for information that must be timely but does not need to be reliable.&lt;br /&gt;
&lt;br /&gt;
= Protocol =&lt;br /&gt;
  --&amp;gt; means from client to server&lt;br /&gt;
  &amp;lt;-- means from server to client&lt;br /&gt;
&lt;br /&gt;
All multi-byte data is in network byte order (aka big endian); that is, the most significant byte comes first followed by successively less significant bytes.&lt;br /&gt;
All numbers are integers unless otherwise specified. Integers can be 8, 16, or 32 bit signed 2&#039;s compliment or unsigned (encoding is the same in regardless of signed status). Values in this document in byte boxes are given in hexadecimal. Values in the text are given in decimal unless otherwise noted.&lt;br /&gt;
Bit fields are encoded as unsigned integers. All floating point numbers are in standard IEEE-754 single precision format. Multi-byte values are *not* necessarily aligned on 2 or 4 byte boundaries.&lt;br /&gt;
A client normally follows the following sequence during game play: connect to server get the world database join the game send/receive game messages leave game disconnect from server&lt;br /&gt;
common message structures ------------------------- Most messages begin with the length of the message in bytes followed by a 16 bit code. The length is 16 bits and excludes itself and the code, so it&#039;s the actual length of the message minus 4.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Player identifiers are 1 byte and are used in many messages.&lt;br /&gt;
&lt;br /&gt;
          0 - 243 : Regular Players&lt;br /&gt;
        244 - 250 : Special Team Ids&lt;br /&gt;
        251 - 252 : Unused IDs&lt;br /&gt;
              253 : ServerPlayer (World weapons, etc)&lt;br /&gt;
              254 : All Players&lt;br /&gt;
              255 : No Player (Invalid Player)&lt;br /&gt;
&lt;br /&gt;
Flag status is common to a few message types:&lt;br /&gt;
&lt;br /&gt;
	u16	flag id&lt;br /&gt;
	u16	status&lt;br /&gt;
	u16	type&lt;br /&gt;
	u8	owner id&lt;br /&gt;
	float	position (x)&lt;br /&gt;
	float	position (y)&lt;br /&gt;
	float	position (z)&lt;br /&gt;
	float	launch (x)&lt;br /&gt;
	float	launch (y)&lt;br /&gt;
	float	launch (z)&lt;br /&gt;
	float	landing (x)&lt;br /&gt;
	float	landing (y)&lt;br /&gt;
	float	landing (z)&lt;br /&gt;
	float	flight time&lt;br /&gt;
	float	flight end time&lt;br /&gt;
	float	initial velocity&lt;br /&gt;
&lt;br /&gt;
`Position,&#039; `launch,&#039; `landing,&#039; `flight time,&#039; `flight end,&#039; and `initial velocity&#039; are all floating point numbers. `Flag id&#039; is the type of flag,enumerated in FlagId.&lt;br /&gt;
&lt;br /&gt;
`Status&#039; gives the current location of the flag:&lt;br /&gt;
  FlagNoExist  -- the flag is not active (i.e. not in the game)&lt;br /&gt;
  FlagOnGround -- the flag is sitting on the ground ready to get picked up&lt;br /&gt;
  FlagOnTank   -- the flag is on a player&#039;s tank&lt;br /&gt;
  FlagInAir    -- the flag is in the air and will fall back down&lt;br /&gt;
  FlagComing   -- the flag just appeared and is falling to the ground&lt;br /&gt;
  FlagGoing    -- the flag was thrown in the air and is disappearing&lt;br /&gt;
&lt;br /&gt;
`Type&#039; indicates the behavior of the flag: FlagNormal means the flag is permanent and can be dropped normally (e.g. a team flag); FlagUnstable means the flag may disappear after use (e.g. a good super flag); FlagSticky means the flag cannot be dropped normally (e.g. a bad super flag).&lt;br /&gt;
`Player id&#039; indicates which player has the flag when `status&#039; is FlagOnTank. It isn&#039;t used for any other status.&lt;br /&gt;
`Position&#039; is the location of the flag on the ground. It only has meaning when `status&#039; is FlagOnGround. The position of a flag when on a tank is the position of the tank (centered on and at the top of the tank)&lt;br /&gt;
`Launch&#039; is the location of the flag where it was thrown in the air. `Landing&#039; is the location where the flag will/would touch ground. These are used when `status&#039; is FlagInAir, FlagComing, and FlagGoing. The client should make the flag follow a reasonable flight path (e.g. a parabolic arc) from `launch&#039; to `landing.&#039;&lt;br /&gt;
`Flight time&#039; is the time elapsed since the flag was thrown into the air. `Flight end&#039; the time when the flag will reach the ground. `Initial velocity&#039; gives the vertical (z) velocity of the flag when launched. The vertical position of the flag at time t (ranging from 0 to `flight end&#039;) is: z = z0 + v * t + 0.5 * g * t * t. z0 = `launch z;&#039; v = `initial velocity;&#039; g = acceleration due to gravity.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Connecting to a server ==&lt;br /&gt;
The [http://bzflag.svn.sourceforge.net/viewvc/*checkout*/bzflag/trunk/bzflag/misc/bzfquery.php bzfquery.php script] is a nice example of how to connect to a server.&lt;br /&gt;
&lt;br /&gt;
At the beginning you need to open a socket. Beginning with protocol 0048 you need to send &amp;quot;BZFLAG\r\n\r\n&amp;quot; in order to get any reply. At that time you unfortunately don&#039;t know the protocol, so send it by default or your client will probably freeze.&lt;br /&gt;
&lt;br /&gt;
  --&amp;gt;   connect(server port)&lt;br /&gt;
  --&amp;gt;    +----+----+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 42 | 5a | 46 | 4C | 41 | 47 | 0D | 0A | 0D | 0A |     BZFLAG\r\n\r\n&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+----+----+&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+----+&lt;br /&gt;
  	| 42 | 5a | 46 | 53 | 31 | 39 | 31 | 30 | FF |           BZFS1910        FF&lt;br /&gt;
  	+----+----+----+----+----+----+----+----+----+&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Client should verify the version. In old versions the first four bytes indicates a BZFlag server, the next byte indicates the major version number (as an ASCII digit), the two bytes after that are the minor version number (as ASCII digits), and the 7th byte is the revision. Major and minor version number changes indicate incompatible protocol changes. Different revisions of a given version are compatible and usually just indicate client user interface changes. A following FF ends the packet. In new versions the protocol is just a number increased by 1 when the protocol changes.&lt;br /&gt;
&lt;br /&gt;
If the reply was a protocol older than 0048 then bzfs will kick the client connecting to it. In this case we recommend a fallback, not sending BZFLAG\r\n\r\n during connection try:&lt;br /&gt;
&lt;br /&gt;
  --&amp;gt;   connect(server port)&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+----+&lt;br /&gt;
  	| 42 | 5a | 46 | 53 | 31 | 39 | 31 | 30 | FF |           BZFS1910        FF&lt;br /&gt;
  	+----+----+----+----+----+----+----+----+----+&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Server owners will see something like the following in the logs if their server(s) use a protocol older than 0048:&lt;br /&gt;
  Player [0] sent huge packet length (len=16986), possible attack&lt;br /&gt;
  Player  [0] removed at 2007-04-11 15:52:55: large packet recvd&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Message types ==&lt;br /&gt;
Read this with caution, as it is very old information not reflecting the current status.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Negotiating world flags ===&lt;br /&gt;
&lt;br /&gt;
  --&amp;gt;    +----+----+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| length  | 6E | 66 | FlagID1 | FlagID2 | ....... |     MsgNegotiateFlags&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+----+----+     (List of client flag ids)&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| length  | 6E | 66 | FlagID1 | FlagID2 | ....... |     MsgNegotiateFlags&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+----+----+     (List of server flag ids, that client doesn&#039;t know)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Client sends to the server the two byte representation of all flags known to the client. In the case that a flag is only one letter, (N) for instance, the second byte is null. Otherwise, the null byte is implied at position 3. The server upon receipt of this list, finds all flags that are used by the server, but not known by the client, and sends this list to the client. The client upon receipt of the list, either disallows play, if flags exist, or continues if the list is empty.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== getting the world hash ===&lt;br /&gt;
  --&amp;gt;    +----+----+----+----+&lt;br /&gt;
 	| 00 | 00 | 77 | 68 |                         MsgWantWHash&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| length  | 77 | 68 | world hash data... |     MsgWantWHash&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
&lt;br /&gt;
To improve performance World (bzc) files are cached on the client. The name of the cache file is an md5 hash of the file that is computed on the server. this hash is sent to the client, and the client looks for a file by that name in the bz world cache directory. If the hash starts with a &#039;t&#039;, the world is a random world. If the hash starts with a &#039;p&#039; the world is from a world file. If the client can find the file locally, it does not sent the following MsgGetWorld packet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== getting the world database ===&lt;br /&gt;
  --&amp;gt;    +----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 02 | 67 | 77 | offset  |                 MsgGetWorld&lt;br /&gt;
 	+----+----+----+----+----+----+&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| length  | 67 | 77 |remaining| data... |       MsgGetWorld&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	or&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
 	| 00 | 00 | 73 | 6b |                           MsgSuperKill&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Client sends MsgGetWorld requests until it has read the entire world database. Clients should send an `offset&#039; of 0 for the first request and increase `offset&#039; by however much data was sent in reply. Each MsgGetWorld reply includes the number of bytes left after the returned block of data in `remaining&#039;. The server returns 0 in `remaining&#039; when there is no more data left to read. In no event will the server return more than MaxPacketLen - 6 bytes of data in one reply (see protocol.h for the definition of MaxPacketLen). The server may return MsgSuperKill at any time during the download of the world database. The client should immediately close the connection to the server. No other messages should be returned by the server as long as the client sends only MsgGetWorld requests.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The `data&#039; has the following encoding:&lt;br /&gt;
&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
 	| 00 | 1E | 73 | 74 |        length of data, WorldCodeStyle&lt;br /&gt;
 	+----+----+----+----+----+----+&lt;br /&gt;
 	| version |      worldsize    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|  style  | mxPlyrs | mxShots | mxFlags |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|linear acceleration|angulr acceleration|&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| shake t | shake w |    epoch offset   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
&lt;br /&gt;
Values are:&lt;br /&gt;
  version:      version of the bzw format&lt;br /&gt;
  worldsize:    size in meters of world&lt;br /&gt;
  style:        bitfield of game style&lt;br /&gt;
  maxPlayrs:    maximum number of players&lt;br /&gt;
  maxShots:     maximum number of shots at once per player&lt;br /&gt;
  maxFlags:     maximum number of flags that may exist at once&lt;br /&gt;
  linear acc.:  linear acceleration limit (float)&lt;br /&gt;
  angulr acc.:  angular acceleration limit (float)&lt;br /&gt;
  shake t:      time to shake a bad flag (1/10ths of seconds)&lt;br /&gt;
  shake w:      number of wins to shake a bad flag&lt;br /&gt;
  epoch offset: seconds since midnight Jan 1, 1970 GMT on the server, used when&lt;br /&gt;
		synchronizing times across clients&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The rest of the world database is encoded in individual blocks describing each object. Only permanent immovable objects are included. The encodings for each type of object are:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
team base:&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
 	| 00 | 2A | 62 | 61 | length of base data, team code&lt;br /&gt;
 	+----+----+----+----+----+----+&lt;br /&gt;
 	| team id |     center (x)    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|     center (y)    |     center (z)    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|       angle       |      size (x)     |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|      size (y)     |      size (z)     |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    safety (x)     |    safety (y)     |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    safety (z)     |&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
&lt;br /&gt;
wall:&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
 	| 00 | 18 | 77 | 6C | length of wall data, wall code&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    center (x)     |    center (y)     |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    center (z)     |    angle...       |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|       width       |       height      |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
pyramid:&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
 	| 00 | 1D | 70 | 79 | length of pyramid data, pyramid code&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    center (x)     |    center (y)     |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    center (z)     |     angle         |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|       width       |     depth         |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|      height       | sdf|&lt;br /&gt;
 	+----+----+----+----+----+&lt;br /&gt;
&lt;br /&gt;
box:&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
 	| 00 | 1D | 62 | 78 | length of box data, box code&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    center (x)     |    center (y)     |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    center (z)     |     angle         |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|       width       |     depth         |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|      height       | sdf|&lt;br /&gt;
 	+----+----+----+----+----+&lt;br /&gt;
&lt;br /&gt;
teleporter:&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
 	| 00 | 21 | 74 | 65 | length of teleporter data, teleporter code&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    center (x)     |    center (y)     |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    center (z)     |       angle       |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|       width       |       depth       |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|      height       |       border      |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| sdf|&lt;br /&gt;
 	+----+&lt;br /&gt;
&lt;br /&gt;
teleporter link:&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
 	| 00 | 04 | 6C | 6E | length of link data, link code&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
 	|  from   |   to    |&lt;br /&gt;
  	+----+----+----+----+&lt;br /&gt;
end of data:&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
 	| 00 | 00 | 65 | 64 | length of worldcodeend data, worldcodeend code&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
&lt;br /&gt;
The above values are interpreted as follows:&lt;br /&gt;
&lt;br /&gt;
  angle (float):        in radians from the x-axis in the xy plane&lt;br /&gt;
  width (float):        half width (in xy) measured from center&lt;br /&gt;
  depth (float):        half depth (in xy) measured from center&lt;br /&gt;
  height (float):       full height (in z) measured from bottom&lt;br /&gt;
  border (float):       full size of the square cross section teleporter border&lt;br /&gt;
  center (float):       center in xy, bottom in z&lt;br /&gt;
  safety (float):       safety position for team flags, used when team A drops team B&#039;s&lt;br /&gt;
			flag on team C&#039;s base.&lt;br /&gt;
  from &amp;amp; to:            index of teleporter face starting from zero;  the N&#039;th teleporter&lt;br /&gt;
			in the world data has face indices 2*N and 2*N+1.  teleporter&lt;br /&gt;
			links indicate which face teleports to which face;  faces may&lt;br /&gt;
			teleport to themselves.&lt;br /&gt;
  sdf (byte):           bit mask:&lt;br /&gt;
                              drive through is bitmask 0x01&lt;br /&gt;
                              shoot through is bitmask 0x02&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== join game ==&lt;br /&gt;
Once connected a player normally requests to join the game.  The server replies with&lt;br /&gt;
MsgSuperKill, MsgReject, or MsgAccept.&lt;br /&gt;
&lt;br /&gt;
  --&amp;gt;    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| length  | 65 | 6e |  player id...             MsgEnter&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |  type   |  team   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| call sign (CallSignLen bytes)...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 						|&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| email address (EmailLen bytes)...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 						|&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+&lt;br /&gt;
 	| 00 | 00 | 61 | 63 |                           MsgAccept&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
 	or&lt;br /&gt;
 	+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 02 | 72 | 6a |  code   |                 MsgReject&lt;br /&gt;
 	+----+----+----+----+----+----+&lt;br /&gt;
 	or&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
 	| 00 | 00 | 73 | 6b |                           MsgSuperKill&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
&lt;br /&gt;
`Type&#039; is one of the enumerations in PlayerType and `team&#039; is one from TeamColor.&lt;br /&gt;
The call sign is the player&#039;s `handle&#039; during the game;  the call sign is used&lt;br /&gt;
to identify the player.  No attempt is made by the server to prevent the&lt;br /&gt;
duplication of call signs during a game.  The email address can be anything,&lt;br /&gt;
but should be the email address for human players (e.g. username@hostname).&lt;br /&gt;
BZFlag players can choose `anonymous&#039; instead of their email address.  The call&lt;br /&gt;
sign and email address should be NUL terminated ASCII strings, padded with&lt;br /&gt;
NUL&#039;s to the required length.  `Length&#039; is 12 + CallSignLen + EmailLen.&lt;br /&gt;
&lt;br /&gt;
If the server responds with MsgSuperKill the client should close the connection&lt;br /&gt;
immediately.  If the server responds with MsgReject, the client has not joined the&lt;br /&gt;
game but may keep the server connection open and try again.  The reason for rejection&lt;br /&gt;
is included with the MsgReject message:&lt;br /&gt;
&lt;br /&gt;
	RejectBadRequest        -- bogus data in MsgEnter&lt;br /&gt;
	RejectBadTeam           -- invalid team id&lt;br /&gt;
	RejectBadType           -- invalid client type&lt;br /&gt;
	RejectTeamFull          -- no more players allowed on team&lt;br /&gt;
	RejectServerFull        -- no more players allowed on any team&lt;br /&gt;
&lt;br /&gt;
If the server responds with MsgAccept, the player has successfully joined the game.&lt;br /&gt;
The server then automatically sends updates about each flag, team, and player.  The&lt;br /&gt;
client should be prepared to accept these updates in any order.  The flag and team&lt;br /&gt;
updates are sent as MsgFlagUpdate and MsgTeamUpdate messages, respectively.  Player&lt;br /&gt;
updates are sent as MsgAddPlayer messages.  The client will receive a MsgAddPlayer&lt;br /&gt;
for the player it just added, but only after it has received a MsgAddPlayer for each&lt;br /&gt;
of the players already joined.&lt;br /&gt;
&lt;br /&gt;
Until it receives the MsgAddPlayer for the player it just added, the client will&lt;br /&gt;
only receive the following kinds of messages:&lt;br /&gt;
&lt;br /&gt;
	MsgSuperKill&lt;br /&gt;
	MsgFlagUpdate&lt;br /&gt;
	MsgTeamUpdate&lt;br /&gt;
	MsgAddPlayer&lt;br /&gt;
&lt;br /&gt;
Players of type ComputerPlayer are not sent team or flag updates and only get the&lt;br /&gt;
MsgAddPlayer for themselves.  This probably wasn&#039;t a good idea, but there it is.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== leave game ==&lt;br /&gt;
Once entered, a player can leave the game at any time.  This should be done by sending&lt;br /&gt;
the following message then closing the connection:&lt;br /&gt;
&lt;br /&gt;
  --&amp;gt;    +----+----+----+----+&lt;br /&gt;
 	| 00 | 00 | 65 | 78 |                           MsgExit&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
&lt;br /&gt;
There is no reply.  Clients can also leave by simply closing the connection, but&lt;br /&gt;
sending MsgExit first is recommended.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== during a game ==&lt;br /&gt;
There are several types of messages that are delivered at any time after a player&lt;br /&gt;
enters a game.  Clients must be prepared to handle them in any order.&lt;br /&gt;
&lt;br /&gt;
MsgSuperKill&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+&lt;br /&gt;
 	| 00 | 00 | 73 | 6b |&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
Client must immediately disconnect from the server.&lt;br /&gt;
&lt;br /&gt;
MsgTimeLeft&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 02 | 74 | 6f |time left|&lt;br /&gt;
 	+----+----+----+----+----+----+&lt;br /&gt;
Gives the time remaining in the game.  This message is only sent when the&lt;br /&gt;
server has time limit configured.  If the time remaining is zero, the client&lt;br /&gt;
should indicate to the player that the game is over.&lt;br /&gt;
`Time left&#039; is in seconds.  It is not sent every second so clients will need&lt;br /&gt;
to do their own count down between messages.&lt;br /&gt;
&lt;br /&gt;
MsgScoreOver&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 0a | 73 | 6f |     player id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    | team id |&lt;br /&gt;
 	+----+----+----+----+----+----+&lt;br /&gt;
Gives the player or team that won the game by reaching the target score.&lt;br /&gt;
This message is only sent when the server has a target score configured.&lt;br /&gt;
The client should indicate which team or player won and that the game is&lt;br /&gt;
over.&lt;br /&gt;
&lt;br /&gt;
If `team id&#039; is NoTeam then `player id&#039; indicates which player has won.&lt;br /&gt;
Otherwise `team id&#039; indicates which team won.&lt;br /&gt;
&lt;br /&gt;
MsgAddPlayer&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| length  | 61 | 70 |     player id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |  type   |  team   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|  wins   |  losses | call sign...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 		... (CallSignLen bytes)...      |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| email address...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 		 ... (EmailLen bytes)...        |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
Sent when another player enters the game and when joining a game if other&lt;br /&gt;
players are already joined.  `Type&#039; is enumerated in PlayerType, `team&#039;&lt;br /&gt;
is enumerated in TeamColor.  `Wins&#039; and `losses&#039; give the player&#039;s score.&lt;br /&gt;
They are unsigned integers;  the player&#039;s score equals wins minus losses.&lt;br /&gt;
`Call sign&#039; and `email address&#039; are NUL terminated ASCII strings.  `Length&#039;&lt;br /&gt;
is 16 + CallSignLen + EmailLen.&lt;br /&gt;
&lt;br /&gt;
MsgRemovePlayer&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 08 | 72 | 70 |     player id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
Sent when another player leaves the game.&lt;br /&gt;
&lt;br /&gt;
MsgFlagUpdate&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 40 | 66 | 75 |flag num | flag id |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| status  |  type   |     player id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |    position (x)   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    position (y)   |    position (z)   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|     launch (x)    |     launch (y)    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|     launch (z)    |    landing (x)    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    landing (y)    |    landing (z)    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    flight time    |    flight end     |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| initial velocity  |&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
Sent when a flag&#039;s state changes.  Also sent to a client when it enters&lt;br /&gt;
a game.  `Flag num&#039; is the index of the flag.  Flags are indexed from&lt;br /&gt;
zero up to the maximum number of flags minus one.&lt;br /&gt;
&lt;br /&gt;
Clients must update the flag positions while the flag is in flight (i.e.&lt;br /&gt;
`status&#039; is FlagInAir, FlagComing, or FlagGoing.  If FlagInAir or&lt;br /&gt;
FlagComing then the client should change the flag&#039;s status to&lt;br /&gt;
FlagOnGround when the flag&#039;s flight time equals or exceeds `flight end.&#039;&lt;br /&gt;
The position should be set exactly to `landing.&#039;  If FlagGoing, the&lt;br /&gt;
client should change the flag&#039;s status to FlagNoExist when the flight&lt;br /&gt;
time equals or exceeds `flight end.&#039;&lt;br /&gt;
&lt;br /&gt;
BZFlag uses the first half of the flight time for FlagComing and the&lt;br /&gt;
last half of the flight time for FlagGoing to make the flag appear or&lt;br /&gt;
disappear from/to nothing.  This allows players to adjust to the&lt;br /&gt;
appearance/disappearance of a flag.&lt;br /&gt;
&lt;br /&gt;
MsgTeamUpdate&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 0a | 74 | 6f |  team   |  size   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| active  |  wins   | losses  |&lt;br /&gt;
 	+----+----+----+----+----+----+&lt;br /&gt;
Gives the current state of team `team.&#039;  `Size&#039; is the number of&lt;br /&gt;
players on the team.  `Active&#039; is the number of active players on the&lt;br /&gt;
team.  An active player is one that can participate in the game (e.g.&lt;br /&gt;
grab flags, shoot opponents, etc.);  a non-active player can only&lt;br /&gt;
observe the game.  Only active players are considered when deciding&lt;br /&gt;
if there are any players on a team (to decide if the team flag should&lt;br /&gt;
be inserted or withdrawn from the game).  `Wins&#039; and `losses&#039; give the&lt;br /&gt;
team&#039;s score (wins minus losses).&lt;br /&gt;
&lt;br /&gt;
MsgAlive&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 20 | 61 | 6c |     player id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |    position (x)   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    position (y)   |    position (z)   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    forward (x)    |    forward (y)    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    forward (z)    |&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
Sent when a player comes alive.  A player that has joined is not on the&lt;br /&gt;
game board until it sends this message, which declares that it is in&lt;br /&gt;
game and gives the starting position and orientation.  Players are removed&lt;br /&gt;
from the game board when killed and do not reappear until sending this&lt;br /&gt;
message again.&lt;br /&gt;
&lt;br /&gt;
  --&amp;gt;    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 18 | 61 | 6c |    position (x)   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    position (y)   |    position (z)   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    forward (x)    |    forward (y)    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    forward (z)    |&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
A player sends this message to enter the game board.  Note that this&lt;br /&gt;
version of the message differs from the one sent by the server in that&lt;br /&gt;
it lacks the player id (which is implicit in the server connection).&lt;br /&gt;
Players must send this message to change their state from dead to alive.&lt;br /&gt;
Players should not send MsgAlive for a certain penalty period after&lt;br /&gt;
being killed (but the server does not enforce a minimum time).  The&lt;br /&gt;
currently penalty is ExplodeTime.&lt;br /&gt;
&lt;br /&gt;
`Position&#039; gives the location of the player and `forward&#039; gives the&lt;br /&gt;
player&#039;s forward direction vector.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
MsgKilled&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 12 | 6b | 6c |     victim id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |     killer id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    | shot id |&lt;br /&gt;
 	+----+----+----+----+----+----+&lt;br /&gt;
Sent by the server when a player is killed by itself or another player.&lt;br /&gt;
The victim id is the player that was destroyed and the killer id is the&lt;br /&gt;
player credited with the kill.  Shot id identifies which of the killer&#039;s&lt;br /&gt;
shots hit the victim;  if the shot isn&#039;t a laser or shockwave, other&lt;br /&gt;
players may assume the shot has stopped and needn&#039;t check themselves&lt;br /&gt;
against the shot (or they can wait until the MsgShotEnd message arrives).&lt;br /&gt;
&lt;br /&gt;
  --&amp;gt;    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 0a | 6b | 6c |     killer id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    | shot id |&lt;br /&gt;
 	+----+----+----+----+----+----+&lt;br /&gt;
Sent by the victim when it detects that it&#039;s been hit, naming the killer&lt;br /&gt;
and which of the killer&#039;s shots was the one that hit.  Note that the&lt;br /&gt;
server does not verify kills in any way so it&#039;s trivial to `cheat&#039; by&lt;br /&gt;
claiming you&#039;ve been killed;  this is generally unproductive.  It&#039;s&lt;br /&gt;
also easy to cheat by never sending MsgKilled, making you almost&lt;br /&gt;
immortal.  Don&#039;t do this.&lt;br /&gt;
&lt;br /&gt;
MsgGrabFlag&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 48 | 67 | 66 |     grabber id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |flag num | flag id |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| status  |  type   |      owner id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |    position (x)   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    position (y)   |    position (z)   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|     launch (x)    |     launch (y)    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|     launch (z)    |    landing (x)    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    landing (y)    |    landing (z)    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    flight time    |    flight end     |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| initial velocity  |&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
Sent by the server when a player is allowed to grab a flag.  This is&lt;br /&gt;
both the notice to the player trying to grab the flag that it succeeded&lt;br /&gt;
and the notice to all other players that the flag was grabbed.  Note&lt;br /&gt;
that `grabber id&#039; is redundant;  it&#039;s always equal to `owner id.&#039;&lt;br /&gt;
&lt;br /&gt;
`Flag num&#039; is the index of the flag.  Flags are indexed from zero up to&lt;br /&gt;
the maximum number of flags minus one.&lt;br /&gt;
&lt;br /&gt;
  --&amp;gt;    +----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 02 | 67 | 66 |flag num |&lt;br /&gt;
 	+----+----+----+----+----+----+&lt;br /&gt;
Sent by a player when it wants to grab a flag.  Players should only&lt;br /&gt;
send this message when their tank is within FlagRadius of a flag (that&#039;s&lt;br /&gt;
any part of the tank, not simply the center) and on the ground.  The&lt;br /&gt;
server will not verify this, but it will verify some other stuff.  The&lt;br /&gt;
player must not assume it will be able to grab the flag.  Instead it has&lt;br /&gt;
to wait for a MsgGrabFlag reply.&lt;br /&gt;
&lt;br /&gt;
MsgDropFlag&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 48 | 64 | 66 |     dropper id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |flag num | flag id |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| status  |  type   |      owner id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |    position (x)   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    position (y)   |    position (z)   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|     launch (x)    |     launch (y)    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|     launch (z)    |    landing (x)    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    landing (y)    |    landing (z)    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    flight time    |    flight end     |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| initial velocity  |&lt;br /&gt;
 	+----+----+----+----+&lt;br /&gt;
Sent by the server when a player is allowed to drop a flag.  This is&lt;br /&gt;
both the notice to the player trying to drop the flag that it succeeded&lt;br /&gt;
and the notice to all other players that the flag was dropped.  `Owner&lt;br /&gt;
id&#039; is meaningless in this message.&lt;br /&gt;
&lt;br /&gt;
`Flag num&#039; is the index of the flag.  Flags are indexed from zero up to&lt;br /&gt;
the maximum number of flags minus one.&lt;br /&gt;
&lt;br /&gt;
  --&amp;gt;    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 0c | 64 | 66 |    position (x)   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	|    position (y)   |    position (z)   |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
Sent by a player when it wants to drop a flag.  Players should only&lt;br /&gt;
send this message when they have a flag and only when the flag dropping&lt;br /&gt;
constraints have been met (i.e. the flag can be dropped at any time, or&lt;br /&gt;
the player got the antidote flag, etc.)  The player must not assume it&lt;br /&gt;
has dropped the flag until it receives a MsgDropFlag in response.&lt;br /&gt;
&lt;br /&gt;
`Position&#039; is in floating point and is the position of the tank that&lt;br /&gt;
dropped the flag when it was dropped.&lt;br /&gt;
&lt;br /&gt;
MsgCaptureFlag&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 0c | 63 | 66 |    capturer id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |flag num | team id |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
Sent by the server when a team&#039;s flag has been captured.  `Capturer id&#039;&lt;br /&gt;
is the player who captured the flag.  `Flag num&#039; is the index of the&lt;br /&gt;
captured flag.  Flags are indexed from zero up to the maximum number of&lt;br /&gt;
flags minus one.  `Team id&#039; is the id of the team who&#039;s flag was&lt;br /&gt;
captured.  Note that the player who captures the flag may be on the team&lt;br /&gt;
that was captured.&lt;br /&gt;
&lt;br /&gt;
The server makes all players on the captured team dead.  This message is&lt;br /&gt;
the only notice that the players are now dead so clients should act&lt;br /&gt;
accordingly.  This is also the only notice that the capturer is no longer&lt;br /&gt;
carrying a flag.&lt;br /&gt;
&lt;br /&gt;
  --&amp;gt;    +----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 02 | 63 | 66 | team id |&lt;br /&gt;
 	+----+----+----+----+----+----+&lt;br /&gt;
Sent by a player when it captures a team flag.  `Team id&#039; is the id of&lt;br /&gt;
the team who&#039;s flag was captured.  The player should wait until the&lt;br /&gt;
server sends back the MsgCaptureFlag response before assuming the&lt;br /&gt;
capture was successful.  A player should send this message only when&lt;br /&gt;
1) its tank is at least halfway inside a team base, 2) the tank is on&lt;br /&gt;
the ground, and 3) the player has its own team flag in an enemy base&lt;br /&gt;
or the player has another team&#039;s flag in its own base.  Note that the&lt;br /&gt;
server will not enforce any of these requirements.&lt;br /&gt;
&lt;br /&gt;
MsgShotBegin&lt;br /&gt;
  &amp;lt;-- &lt;br /&gt;
  --&amp;gt;    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 2c | 73 | 62 |    shooter id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    | shot id | position&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	    (x)   |    position (y)   | position&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	    (z)   |    velocity (x)   | velocity&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	    (y)   |    velocity (z)   |  time&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 		  |flag type|     lifetime      |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
Sent by the server when a player has fired a shot.  The identical message&lt;br /&gt;
is send by a player when it fires a shot.  The server does not verify&lt;br /&gt;
that the player is allowed to fire a shot.&lt;br /&gt;
&lt;br /&gt;
`Shooter id&#039; identifies the player that did the shooting.  `Shot id&#039; is&lt;br /&gt;
a number that uniquely identifies to the shooter which shot this is.&lt;br /&gt;
`Position,&#039; `velocity,&#039; `time,&#039; and `lifetime&#039; are floating point&lt;br /&gt;
numbers.  `Position&#039; is the starting position of the shot.  `Velocity&#039;&lt;br /&gt;
is the starting velocity of the shot.  `Time&#039; is the time the shot has&lt;br /&gt;
existed (probably 0.0).  `Lifetime&#039; is how long the shot exists.  `Flag&lt;br /&gt;
type&#039; is a FlagId and is the type of flag the shooter had when the shot&lt;br /&gt;
was fired.&lt;br /&gt;
&lt;br /&gt;
Clients are expected to compute the flight path of shots (except Guided&lt;br /&gt;
Missiles) given the information in MsgShotBegin.  That includes handling&lt;br /&gt;
ricochets, building impacts, and teleportation, but not tank impacts.&lt;br /&gt;
Each player decides if it itself has been hit by a shot at each time step&lt;br /&gt;
based on this flight path.  Since the path of a guided missile cannot be&lt;br /&gt;
predicted, updates to a guided missile&#039;s path is sent throughout its&lt;br /&gt;
flight by the shooter via MsgGMUpdate messages.&lt;br /&gt;
&lt;br /&gt;
A player should test itself against a shot using whatever algorithm it&lt;br /&gt;
likes, but at a minimum should test the line segments the shot moves&lt;br /&gt;
along during the time step against a tank aligned bounding box.&lt;br /&gt;
Accounting for the linear motion of the tank over the time step is&lt;br /&gt;
better and accounting for both the linear and angular motion is better&lt;br /&gt;
still.  Note that the shot has a certain radius that should be taking&lt;br /&gt;
into account during intersection testing.  This is particularly&lt;br /&gt;
important when testing against a tank with the narrow flag.  Ideally,&lt;br /&gt;
the shot would be exactly tested against the tank geometry.  However,&lt;br /&gt;
that&#039;s more work than realistically necessary.&lt;br /&gt;
&lt;br /&gt;
MsgShotEnd&lt;br /&gt;
  &amp;lt;-- &lt;br /&gt;
  --&amp;gt;    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 0c | 73 | 65 |    shooter id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    | shot id | reason  |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
Sent by the server when a shot has been terminated before its lifetime&lt;br /&gt;
has expired.  The identical message is sent by the player that&lt;br /&gt;
terminates the shot.  This is normally the player that has just been&lt;br /&gt;
hit by the shot.  The server does not verify that the player has or&lt;br /&gt;
has not been hit.  This message is also sent by the player that fired&lt;br /&gt;
a guided missile when the shot hits the ground or a building (note that&lt;br /&gt;
guided missiles don&#039;t ricochet).&lt;br /&gt;
&lt;br /&gt;
`Shooter id&#039; identifies the player that fired the shot and `shot id&#039;&lt;br /&gt;
is the same as in the MsgShotBegin message for the shot.  `Reason&#039; is&lt;br /&gt;
one if the other players should show an explosion for the shot and&lt;br /&gt;
zero otherwise.&lt;br /&gt;
&lt;br /&gt;
MsgScore&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 0c | 73 | 63 |     player id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |  wins   | losses  |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
Sent by the server when a player&#039;s score changes.  `Player id&#039; is the&lt;br /&gt;
player with the new score, and `wins&#039; and `losses&#039; are the new scores.&lt;br /&gt;
&lt;br /&gt;
  --&amp;gt;    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 04 | 73 | 63 |  wins   | losses  |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
Sent by a player when its score changes.&lt;br /&gt;
&lt;br /&gt;
MsgTeleport&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 0c | 73 | 63 |     player id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |  from   |   to    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
Sent by the server when a player teleports.  `From&#039; is the index of the&lt;br /&gt;
teleporter face the player entered and `to&#039; is the index of the face&lt;br /&gt;
the player exited.&lt;br /&gt;
&lt;br /&gt;
  --&amp;gt;    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 04 | 73 | 63 |  from   |   to    |&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
Sent by a player when it passes through a teleporter.&lt;br /&gt;
&lt;br /&gt;
MsgMessage&lt;br /&gt;
  &amp;lt;--    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| length  | 6d | 67 |  from player id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |   to player id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |  team   |message...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	...(MessageLen bytes)...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 						|&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
Sent by the server when one player sends a message to others.  `Length&#039;&lt;br /&gt;
is the length of the message (18 + MessageLen bytes).  `From player id&#039;&lt;br /&gt;
is the player sending the message, `to player id&#039; is the player to&lt;br /&gt;
receive the message, and `team&#039; is the team to receive the message.&lt;br /&gt;
If `to player id&#039; is all zeros then the message is being sent to&lt;br /&gt;
everyone on `team&#039;.  If `to player id&#039; is all zeros and `team&#039; is&lt;br /&gt;
RogueTeam then the message is being sent to all players.  If `to player&lt;br /&gt;
id&#039; is not all zeros then `team&#039; is ignored and the message is only for&lt;br /&gt;
the identified player.&lt;br /&gt;
&lt;br /&gt;
  --&amp;gt;    +----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| length  | 6d | 67 |    player id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    |  team   |message...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	...(MessageLen bytes)...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 						|&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
Sent by player to send a message to other players.  `Length&#039; is is the&lt;br /&gt;
length of the message (10 + MessageLen bytes).  `Player id&#039; is the&lt;br /&gt;
player to receive the message (or all zeros for all players on the&lt;br /&gt;
given team) and `team&#039; is the team to receive the message (or&lt;br /&gt;
RogueTeam for all teams).&lt;br /&gt;
&lt;br /&gt;
MsgPlayerUpdate&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 2a | 70 | 75 |    player id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    | status  | position&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	    (x)   |    position (y)   | position&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	    (z)   |    velocity (x)   | velocity&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	    (y)   |    velocity (z)   | azimuth&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 		  | angular velocity  |&lt;br /&gt;
 	+----+----+----+----+----+----+&lt;br /&gt;
Sent by players to notify other players of changes in its status,&lt;br /&gt;
position, or velocity.&lt;br /&gt;
&lt;br /&gt;
`Status&#039; is the tank&#039;s current status.  See PlayerStatus for the&lt;br /&gt;
meaning of the bit field&#039;s bits.  The FlagActive bit indicates whether&lt;br /&gt;
the player&#039;s flag&#039;s special powers are active or not.  The Phantom&lt;br /&gt;
Zone flag is an example of a flag that&#039;s active only some of the time.&lt;br /&gt;
The CrossingWall bit indicates if the player&#039;s tank is intersected by&lt;br /&gt;
a wall or teleporter;  other players can use this to draw the player&lt;br /&gt;
in some special way.  CrossingWall could be computed by each player&lt;br /&gt;
from other information;  it&#039;s only provided to save the other players&lt;br /&gt;
the trouble.&lt;br /&gt;
&lt;br /&gt;
`Position,&#039; `velocity,&#039; `azimuth,&#039; and `angular velocity&#039; are floating&lt;br /&gt;
point numbers.  `Azimuth&#039; is the orientation of the tank in radians&lt;br /&gt;
(the +x axis is 0.0, +y is pi/2).  `Angular velocity&#039; is the change in&lt;br /&gt;
azimuth per second.  `Position&#039; is the tank position and `velocity&#039; is&lt;br /&gt;
the change in tank position per second.&lt;br /&gt;
&lt;br /&gt;
A player normally only sends an update when its position or orientation&lt;br /&gt;
as could be predicted by other players differs from its true position&lt;br /&gt;
or orientation by a certain tolerance.  Other players are expected to&lt;br /&gt;
use the last known player data to extrapolate the current position and&lt;br /&gt;
orientation.  This technique is known as dead reckoning and has two&lt;br /&gt;
primary benefits:  network traffic is decreased since updates needn&#039;t&lt;br /&gt;
be sent continuously and players on systems with slower frame rates&lt;br /&gt;
appear to move smoothly to players on systems with faster frame rates.&lt;br /&gt;
&lt;br /&gt;
Players that fail to send updates often enough should be considered&lt;br /&gt;
to be not responding.  Unresponsive players should be ignored until&lt;br /&gt;
they start responding again.&lt;br /&gt;
&lt;br /&gt;
MsgGMUpdate&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 2e | 67 | 6d |    shooter id...&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 			    | shot id | position&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	    (x)   |    position (y)   | position&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	    (z)   |    velocity (x)   | velocity&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 	    (y)   |    velocity (z)   |  time&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 		  |    target id....&lt;br /&gt;
 	+----+----+----+----+----+----+----+----+&lt;br /&gt;
 		  |&lt;br /&gt;
 	+----+----+&lt;br /&gt;
Sent by players with active guided missiles to notify other players&lt;br /&gt;
of changes to the motion of the guided missile.&lt;br /&gt;
&lt;br /&gt;
See MsgShotBegin for the meaning of most items.  `Time&#039; is the current&lt;br /&gt;
age of the shot (the time since being fired).  `Target id&#039; is the&lt;br /&gt;
current target of the guided missile or all zeros if there is no target.&lt;br /&gt;
&lt;br /&gt;
Players are expected to use dead reckoning to update the position and&lt;br /&gt;
velocity of guided missiles between MsgGMUpdate messages.  Since&lt;br /&gt;
guided missiles deviate from their predicted course only when the&lt;br /&gt;
target changes, these message will be fairly rare.  Note that different&lt;br /&gt;
players may have different ideas of where the target is and that that&lt;br /&gt;
may cause slightly different courses.  This is generally not a problem.&lt;br /&gt;
&lt;br /&gt;
MsgLagPing&lt;br /&gt;
 	+----+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 02 | 70 | 69 | seq. no.|&lt;br /&gt;
 	+----+----+----+----+----+----+&lt;br /&gt;
Sent by the server to active players every 10s to measure lag. The&lt;br /&gt;
client just echoes the message back to the server. The time&lt;br /&gt;
between sending and receiving the message in the server is&lt;br /&gt;
considered to be the current lag of the respective player.&lt;br /&gt;
&lt;br /&gt;
The two byte sequence number is included to be able to deal with&lt;br /&gt;
lost or severely delayed messages. On each ping sent by the server,&lt;br /&gt;
the sequence number is incremented (modulo 10000). The server&lt;br /&gt;
manages this number on a per player basis.&lt;br /&gt;
&lt;br /&gt;
MsgReplayReset&lt;br /&gt;
 	+----+----+----+----+----+&lt;br /&gt;
 	| 00 | 01 | 72 | 72 | lp |&lt;br /&gt;
 	+----+----+----+----+----+&lt;br /&gt;
Sent by the server to active replay observers to remove state&lt;br /&gt;
information that they might have regarding players and flags.&lt;br /&gt;
The &#039;lp&#039; value is the last player to be removed. PlayerId&#039;s above&lt;br /&gt;
&#039;lp&#039; are replay observers, and are not removed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UDP negotiation ==&lt;br /&gt;
&lt;br /&gt;
*solo bots don&#039;t do this, they should use the existing player&#039;s connection&lt;br /&gt;
&lt;br /&gt;
*MsgUDPLinkRequest = 0x6f66;		// &#039;of&#039;&lt;br /&gt;
&lt;br /&gt;
*MsgUDPLinkEstablished = 0x6f67;	// &#039;og&#039;&lt;br /&gt;
&lt;br /&gt;
*if client has udp enabled player sends MsgUDPLinkRequest with player number over udp&lt;br /&gt;
&lt;br /&gt;
*if request has valid player number and is from same address server sends MsgUDPLinkEstablished over tcp to confirm inbound server sends MsgUDPLinkRequest back over udp to test outbound&lt;br /&gt;
&lt;br /&gt;
*player gets MsgUDPLinkEstablished and starts sending udp&lt;br /&gt;
&lt;br /&gt;
*player gets MsgUDPLinkRequest and sends MsgUDPLinkEstablished over udp&lt;br /&gt;
&lt;br /&gt;
*server gets MsgUDPLinkEstablished&lt;br /&gt;
server can now send over udp&lt;br /&gt;
&lt;br /&gt;
[[Category:Concepts]]&lt;/div&gt;</summary>
		<author><name>Yosef</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=BZFlag_2.4.0&amp;diff=8114</id>
		<title>BZFlag 2.4.0</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=BZFlag_2.4.0&amp;diff=8114"/>
		<updated>2011-11-06T15:56:23Z</updated>

		<summary type="html">&lt;p&gt;Yosef: spare me - this is just a minor grammar edit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;BZFlag version 2.4.0 &#039;&#039;&#039;&amp;quot;Wake the Dead&amp;quot;&#039;&#039;&#039;, is the current maintenance version of the BZFlag game for Windows, Apple OSX, and Linux. It was released on 07/03/2011 after a long period of development inactivity.&lt;br /&gt;
&lt;br /&gt;
This new version is incompatible with previous versions of the game. The primary goals of the release were to fix a number of bugs that required changes to the gaming protocol and clients as well as to get development moving again. It should be noted that this is the first version of BZFlag that had a development plan and release schedule.&lt;br /&gt;
&lt;br /&gt;
The version contains a number of new features.&lt;br /&gt;
&lt;br /&gt;
==Change Log==&lt;br /&gt;
Some of the major features include:&lt;br /&gt;
&lt;br /&gt;
*The ability to turn off teamkilling on the server&lt;br /&gt;
*The OpenFFA game mode which is a teamless FFA, meaning you can shoot anyone regardless of color&lt;br /&gt;
*Per-object ricochet, which lets map authors selectively enable ricochet for individual objects&lt;br /&gt;
*Removal of local authentication&lt;br /&gt;
*Ability for the server to force flags to be hidden on the radar&lt;br /&gt;
*Fog can not be turned off&lt;br /&gt;
*The screenshot code does not lag the client badly anymore&lt;br /&gt;
*The ID flag identification was moved to the server&lt;br /&gt;
*Public servers must have a -publickey&lt;br /&gt;
*Polls only count users that are able to vote&lt;br /&gt;
&lt;br /&gt;
The full changelog can be found at https://bzflag.svn.sourceforge.net/svnroot/bzflag/tags/v2_4_0/ChangeLog&lt;br /&gt;
&lt;br /&gt;
==Upgrades==&lt;br /&gt;
2.4 has requires server owners to take note of a few upgrade steps in order to move from 2.0.x to 2.4&lt;br /&gt;
&lt;br /&gt;
A general overview of the upgrade procedure can be found on the [[BZFS 2.4 Upgrade]] page.&lt;br /&gt;
&lt;br /&gt;
===API===&lt;br /&gt;
The [[BZFS API]] received a major overhaul in 2.4 and is incompatible with older plug-ins, upgrade information can be found on the [[BZFS API 2.4 Upgrade]] page.&lt;br /&gt;
&lt;br /&gt;
[[Category:Versions]]&lt;br /&gt;
[[Category:Releases]]&lt;/div&gt;</summary>
		<author><name>Yosef</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Master_Ban&amp;diff=8113</id>
		<title>Master Ban</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Master_Ban&amp;diff=8113"/>
		<updated>2011-11-06T15:53:07Z</updated>

		<summary type="html">&lt;p&gt;Yosef: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Master Ban list is an administrative tool used to prevent abuse of the BZFlag server network.&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
The master ban list is an opt-out system for all public game servers that downloads an additional ban file. This ban file contains the static IPs of a small number of players who have been disruptive to the gaming network as a whole.&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
A public server does not have to do anything to use the Master Ban list, it is loaded automatically at server start for any server that uses the &#039;&#039;&#039;-public&#039;&#039;&#039; command line option. Servers that do not wish to use the Master Ban list can add the &#039;&#039;&#039;-noMasterBanlist&#039;&#039;&#039; option and [[BZFS]] will not attempt to load the list.&lt;br /&gt;
&lt;br /&gt;
==Players on the Master Ban List==&lt;br /&gt;
The players on the Master Ban list were added because they engaged in disruptive behavior across a large number of servers, or attempted to disrupt the global network services (such as the [[Global Registration]] System, [[List Server]], or [http://my.bzflag.org/bb Forums]). All members of the Master Ban list have static IP addresses. No user with a dynamic IP address will be added to the Master Ban list, as the possibility of banning an innocent user is too great.  An exception to this rule for single addresses in dynamic ranges may be made temporarily during periods of severe disruption at the discretion of the developers.&lt;br /&gt;
&lt;br /&gt;
===Behavior for which you can be Masterbanned (i.e. &amp;quot;Disruptive Behavior&amp;quot; above)===&lt;br /&gt;
* Cheating on multiple game servers&lt;br /&gt;
* Spamming inappropriate (including, but not exclusively, commercial advertisement, hateful, vulgar, or racist) messages on multiple game servers&lt;br /&gt;
* Cracking attempts, denial of service attacks, or exploitation of vulnerabilities against multiple game servers&lt;br /&gt;
* Cracking attempts, denial of service attacks, or exploitation of vulnerabilities against network resources (i.e. List server, Bulletin boards, IRC channel, Global authentication servers, Wiki)&lt;br /&gt;
&lt;br /&gt;
===Behavior for which you cannot be Masterbanned===&lt;br /&gt;
* Cheating on, attacking, or exploiting a single game server.&lt;br /&gt;
** Rationale: fabrication of evidence is too easy (and therefore, possibility of being &amp;quot;framed&amp;quot; or &amp;quot;set up&amp;quot; is too high)&lt;br /&gt;
* Violating server rules other than cheating or spamming on game servers (e.g. language violations).&lt;br /&gt;
** Rationale: it is not the purpose of the master ban list to enforce local server rules.  Bans for this behavior should be handled at the server level&lt;br /&gt;
* Violating rules on network resources (i.e. spamming, engaging in personal attacks, or using foul language on the bulletin boards or IRC channels)&lt;br /&gt;
** Rationale: if the violations you committed are not related to playing and you do not pose a hazard to the servers, you should be allowed to continue to play.  Note, however, that you will still be banned from whatever resources you have abused and potentially others that we feel you are likely to abuse.&lt;br /&gt;
&lt;br /&gt;
==Master Ban List Management==&lt;br /&gt;
Write access to the Master Ban list is limited to developers and community members with [[BZFlag SVN|SVN]] commit access. The list is stored in SVN for history tracking. All additions to the list are handled via the SVN system, so they are logged for review. The Master Ban list can be viewed at http://www.bzflag.org/master-bans.txt . All changes to the list can be viewed at http://bzflag.cvs.sourceforge.net/bzflag/admin/master-bans.txt?view=log .&lt;br /&gt;
&lt;br /&gt;
===Getting Off the Master Ban List===&lt;br /&gt;
Users who are on the list and feel they should not be, or would like to be removed, should attempt to contact the project administrators as soon as possible. They should be willing to discuss how they got on the list and what they can do to get off the list. If they are guilty of the actions that got them on the list, they should be ready to explain why the administration staff should remove them from the list. They should also remember that playing is a privilege and not a right. The administration staff is willing to discuss Master Ban issues with anyone who is willing to discuss the matter in a civil manner.&lt;br /&gt;
&lt;br /&gt;
===Getting Someone On the Master Ban List===&lt;br /&gt;
The list is only intended for network wide abusers with static IP addresses. In all other cases local server bans will take care of the abuser. Comments from server owners are generally the only ones considered when reporting a master ban candidate. Players that feel a user should be master banned should take the issue up with the owners of the servers on which the disruptive behavior has been observed.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
[[BZFS Command Line Options]]&lt;br /&gt;
&lt;br /&gt;
==External links==&lt;br /&gt;
[http://www.bzflag.org/master-bans.txt Master Ban List]&lt;br /&gt;
&lt;br /&gt;
[http://bzflag.cvs.sourceforge.net/bzflag/admin/master-bans.txt?view=log Master Ban Change Log]&lt;br /&gt;
&lt;br /&gt;
[[Category:Server Security]]&lt;/div&gt;</summary>
		<author><name>Yosef</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Bloodbath&amp;diff=8112</id>
		<title>Bloodbath</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Bloodbath&amp;diff=8112"/>
		<updated>2011-11-06T15:51:34Z</updated>

		<summary type="html">&lt;p&gt;Yosef: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bloodbath is an elongated Capture the Flag map by R3lax.  It features extremely powerful flags and frequent team-domination, suiting it to the title &amp;quot;Bloodbath&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
Bloodbath has a limited radar view, custom textures, and interesting yet simple 2.0 objects including cones, arcs, and meshes. &lt;br /&gt;
Some specific areas of the map include:&lt;br /&gt;
*The stealth hole - can be referred to as &amp;quot;the hole,&amp;quot; or simply &amp;quot;in,&amp;quot; as in &amp;quot;r ST in&amp;quot; (red stealth)   this contains Stealth, Cloaking, Seer, and Masquerade flags&lt;br /&gt;
*The tower - sometimes referred to as the &amp;quot;base&amp;quot; or the &amp;quot;castle,&amp;quot;  as in &amp;quot;bSW is in our base!&amp;quot;(blue Shockwave is in the tower)  It is placed in the center behind the team-base and hold Guided Missile, Super-Bullet, and Shockwave flags.  &lt;br /&gt;
*The tracks - also &amp;quot;transporters&amp;quot; or &amp;quot;highways.&amp;quot;&lt;br /&gt;
*The middle -or &amp;quot;mid&amp;quot; In the middle is where the Geno flag is found, as well as Narrow, Tiny, Shockwave, and Super-Bullet.  &lt;br /&gt;
*The crack - This is where the team flag is usually placed since it requires the Narrow flag to retrieve.  It is immediately behind the team-base.&lt;br /&gt;
&lt;br /&gt;
==Tactics==&lt;br /&gt;
Tactics rely heavily on team support.  One player can not be successful alone and it is almost impossible to capture the flag without team coordination.&lt;br /&gt;
*Control the middle - the two most important flags are in the middle: Geno and Narrow.  The team that dominates the middle usually dominates the map.  Because it is usually impossible to capture the flag without the Narrow flag, the action is centered around the middle.&lt;br /&gt;
*Sniping is a common tactic, especially to those new to the game.  Grab the laser flag, hit the binocular key and support those who are fighting for the middle.&lt;br /&gt;
*Beware of the Geno! It is important that everyone on a team is careful not to get hit by a Genocide bullet.  Chat is useful here, pay attention when someone says &amp;quot;geno mid&amp;quot; (enemy with Genocide is in the middle).  &amp;quot;Hunt&amp;quot; the player with the genocide flag and avoid them. Conversely, allow a teammate carrying the geno flag to shoot an enemy.&lt;br /&gt;
*Camping (laser camping, spawn-camping, base-camping) is a part of the game.  Although it may be looked on as a lame way to rack up points, direct your energy toward eliminating the camper rather than complaining about them.  Again, teamwork is crucial.&lt;br /&gt;
&lt;br /&gt;
==Map History and Information ==&lt;br /&gt;
Created by R3laX, the original style of play has changed little in its revisions.   The location of the crack and the shape of the stealth hole have been the important changes.  The current version is 2.3 featuring a rounded stealth hole and additional Tiny and Masquerade flags.&lt;br /&gt;
&lt;br /&gt;
[[Category:Maps]]&lt;br /&gt;
[[Category:CTF_Maps]]&lt;/div&gt;</summary>
		<author><name>Yosef</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Color(BZW)&amp;diff=8106</id>
		<title>Color(BZW)</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Color(BZW)&amp;diff=8106"/>
		<updated>2011-11-04T22:29:20Z</updated>

		<summary type="html">&lt;p&gt;Yosef: spelling&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A color is used in a BZFlag world ([[BZW]]) as a sub parameter for many parameters, such as [[Material|materials]] and [[DynamicColor|dynamic colors]]. When defining color in materials, it is synonymous with &#039;diffuse&#039;.&lt;br /&gt;
&lt;br /&gt;
==Format==&lt;br /&gt;
===RGBA===&lt;br /&gt;
[[Image:RedBox.png|right|frame|300px|Material- color 1 0 0 0.5]]&lt;br /&gt;
The basic format of a color is to define the Red Green Blue and Alpha components of a color in the format&lt;br /&gt;
   Red Green Blue Alpha&lt;br /&gt;
&lt;br /&gt;
As an example to define pure red, the color would be defined as follows:&lt;br /&gt;
   1 0 0 1&lt;br /&gt;
This would define a color of 100% pure red and 100% opacity.&lt;br /&gt;
&lt;br /&gt;
The numeric values for color can range from 0 to 1 and represent the fraction of 100% for each color channel.&lt;br /&gt;
&lt;br /&gt;
===HTML Color format===&lt;br /&gt;
Colors can be defined in the HTML RGB format as well using Hex codes. Again pure red would be&lt;br /&gt;
   #FF0000&lt;br /&gt;
&lt;br /&gt;
===Pre-defined colors===&lt;br /&gt;
BZFlag supports a number of pre-defined color names including:&lt;br /&gt;
  &#039;&#039;&#039;ColorName       RGB Values&#039;&#039;&#039;&lt;br /&gt;
  snow     1.000000f, 0.980392f, 0.980392f&lt;br /&gt;
  ghost_white     0.972549f, 0.972549f, 1.000000f&lt;br /&gt;
  GhostWhite     0.972549f, 0.972549f, 1.000000f&lt;br /&gt;
  white_smoke     0.960784f, 0.960784f, 0.960784f&lt;br /&gt;
  WhiteSmoke     0.960784f, 0.960784f, 0.960784f&lt;br /&gt;
  gainsboro     0.862745f, 0.862745f, 0.862745f&lt;br /&gt;
  floral_white     1.000000f, 0.980392f, 0.941176f&lt;br /&gt;
  FloralWhite     1.000000f, 0.980392f, 0.941176f&lt;br /&gt;
  old_lace     0.992157f, 0.960784f, 0.901961f&lt;br /&gt;
  OldLace     0.992157f, 0.960784f, 0.901961f&lt;br /&gt;
  linen     0.980392f, 0.941176f, 0.901961f&lt;br /&gt;
  antique_white     0.980392f, 0.921569f, 0.843137f&lt;br /&gt;
  AntiqueWhite     0.980392f, 0.921569f, 0.843137f&lt;br /&gt;
  papaya_whip     1.000000f, 0.937255f, 0.835294f&lt;br /&gt;
  PapayaWhip     1.000000f, 0.937255f, 0.835294f&lt;br /&gt;
  blanched_almond     1.000000f, 0.921569f, 0.803922f&lt;br /&gt;
  BlanchedAlmond     1.000000f, 0.921569f, 0.803922f&lt;br /&gt;
  bisque     1.000000f, 0.894118f, 0.768627f&lt;br /&gt;
  peach_puff     1.000000f, 0.854902f, 0.725490f&lt;br /&gt;
  PeachPuff     1.000000f, 0.854902f, 0.725490f&lt;br /&gt;
  navajo_white     1.000000f, 0.870588f, 0.678431f&lt;br /&gt;
  NavajoWhite     1.000000f, 0.870588f, 0.678431f&lt;br /&gt;
  moccasin     1.000000f, 0.894118f, 0.709804f&lt;br /&gt;
  cornsilk     1.000000f, 0.972549f, 0.862745f&lt;br /&gt;
  ivory     1.000000f, 1.000000f, 0.941176f&lt;br /&gt;
  lemon_chiffon     1.000000f, 0.980392f, 0.803922f&lt;br /&gt;
  LemonChiffon     1.000000f, 0.980392f, 0.803922f&lt;br /&gt;
  seashell     1.000000f, 0.960784f, 0.933333f&lt;br /&gt;
  honeydew     0.941176f, 1.000000f, 0.941176f&lt;br /&gt;
  mint_cream     0.960784f, 1.000000f, 0.980392f&lt;br /&gt;
  MintCream     0.960784f, 1.000000f, 0.980392f&lt;br /&gt;
  azure     0.941176f, 1.000000f, 1.000000f&lt;br /&gt;
  alice_blue     0.941176f, 0.972549f, 1.000000f&lt;br /&gt;
  AliceBlue     0.941176f, 0.972549f, 1.000000f&lt;br /&gt;
  lavender     0.901961f, 0.901961f, 0.980392f&lt;br /&gt;
  lavender_blush     1.000000f, 0.941176f, 0.960784f&lt;br /&gt;
  LavenderBlush     1.000000f, 0.941176f, 0.960784f&lt;br /&gt;
  misty_rose     1.000000f, 0.894118f, 0.882353f&lt;br /&gt;
  MistyRose     1.000000f, 0.894118f, 0.882353f&lt;br /&gt;
  white     1.000000f, 1.000000f, 1.000000f&lt;br /&gt;
  black     0.000000f, 0.000000f, 0.000000f&lt;br /&gt;
  dark_slate_gray     0.184314f, 0.309804f, 0.309804f&lt;br /&gt;
  DarkSlateGray     0.184314f, 0.309804f, 0.309804f&lt;br /&gt;
  dark_slate_grey     0.184314f, 0.309804f, 0.309804f&lt;br /&gt;
  DarkSlateGrey     0.184314f, 0.309804f, 0.309804f&lt;br /&gt;
  dim_gray     0.411765f, 0.411765f, 0.411765f&lt;br /&gt;
  DimGray     0.411765f, 0.411765f, 0.411765f&lt;br /&gt;
  dim_grey     0.411765f, 0.411765f, 0.411765f&lt;br /&gt;
  DimGrey     0.411765f, 0.411765f, 0.411765f&lt;br /&gt;
  slate_gray     0.439216f, 0.501961f, 0.564706f&lt;br /&gt;
  SlateGray     0.439216f, 0.501961f, 0.564706f&lt;br /&gt;
  slate_grey     0.439216f, 0.501961f, 0.564706f&lt;br /&gt;
  SlateGrey     0.439216f, 0.501961f, 0.564706f&lt;br /&gt;
  light_slate_gray     0.466667f, 0.533333f, 0.600000f&lt;br /&gt;
  LightSlateGray     0.466667f, 0.533333f, 0.600000f&lt;br /&gt;
  light_slate_grey     0.466667f, 0.533333f, 0.600000f&lt;br /&gt;
  LightSlateGrey     0.466667f, 0.533333f, 0.600000f&lt;br /&gt;
  gray     0.745098f, 0.745098f, 0.745098f&lt;br /&gt;
  grey     0.745098f, 0.745098f, 0.745098f&lt;br /&gt;
  light_grey     0.827451f, 0.827451f, 0.827451f&lt;br /&gt;
  LightGrey     0.827451f, 0.827451f, 0.827451f&lt;br /&gt;
  light_gray     0.827451f, 0.827451f, 0.827451f&lt;br /&gt;
  LightGray     0.827451f, 0.827451f, 0.827451f&lt;br /&gt;
  midnight_blue     0.098039f, 0.098039f, 0.439216f&lt;br /&gt;
  MidnightBlue     0.098039f, 0.098039f, 0.439216f&lt;br /&gt;
  navy     0.000000f, 0.000000f, 0.501961f&lt;br /&gt;
  navy_blue     0.000000f, 0.000000f, 0.501961f&lt;br /&gt;
  NavyBlue     0.000000f, 0.000000f, 0.501961f&lt;br /&gt;
  cornflower_blue     0.392157f, 0.584314f, 0.929412f&lt;br /&gt;
  CornflowerBlue     0.392157f, 0.584314f, 0.929412f&lt;br /&gt;
  dark_slate_blue     0.282353f, 0.239216f, 0.545098f&lt;br /&gt;
  DarkSlateBlue     0.282353f, 0.239216f, 0.545098f&lt;br /&gt;
  slate_blue     0.415686f, 0.352941f, 0.803922f&lt;br /&gt;
  SlateBlue     0.415686f, 0.352941f, 0.803922f&lt;br /&gt;
  medium_slate_blue     0.482353f, 0.407843f, 0.933333f&lt;br /&gt;
  MediumSlateBlue     0.482353f, 0.407843f, 0.933333f&lt;br /&gt;
  light_slate_blue     0.517647f, 0.439216f, 1.000000f&lt;br /&gt;
  LightSlateBlue     0.517647f, 0.439216f, 1.000000f&lt;br /&gt;
  medium_blue     0.000000f, 0.000000f, 0.803922f&lt;br /&gt;
  MediumBlue     0.000000f, 0.000000f, 0.803922f&lt;br /&gt;
  royal_blue     0.254902f, 0.411765f, 0.882353f&lt;br /&gt;
  RoyalBlue     0.254902f, 0.411765f, 0.882353f&lt;br /&gt;
  blue     0.000000f, 0.000000f, 1.000000f&lt;br /&gt;
  dodger_blue     0.117647f, 0.564706f, 1.000000f&lt;br /&gt;
  DodgerBlue     0.117647f, 0.564706f, 1.000000f&lt;br /&gt;
  deep_sky_blue     0.000000f, 0.749020f, 1.000000f&lt;br /&gt;
  DeepSkyBlue     0.000000f, 0.749020f, 1.000000f&lt;br /&gt;
  sky_blue     0.529412f, 0.807843f, 0.921569f&lt;br /&gt;
  SkyBlue     0.529412f, 0.807843f, 0.921569f&lt;br /&gt;
  light_sky_blue     0.529412f, 0.807843f, 0.980392f&lt;br /&gt;
  LightSkyBlue     0.529412f, 0.807843f, 0.980392f&lt;br /&gt;
  steel_blue     0.274510f, 0.509804f, 0.705882f&lt;br /&gt;
  SteelBlue     0.274510f, 0.509804f, 0.705882f&lt;br /&gt;
  light_steel_blue     0.690196f, 0.768627f, 0.870588f&lt;br /&gt;
  LightSteelBlue     0.690196f, 0.768627f, 0.870588f&lt;br /&gt;
  light_blue     0.678431f, 0.847059f, 0.901961f&lt;br /&gt;
  LightBlue     0.678431f, 0.847059f, 0.901961f&lt;br /&gt;
  powder_blue     0.690196f, 0.878431f, 0.901961f&lt;br /&gt;
  PowderBlue     0.690196f, 0.878431f, 0.901961f&lt;br /&gt;
  pale_turquoise     0.686275f, 0.933333f, 0.933333f&lt;br /&gt;
  PaleTurquoise     0.686275f, 0.933333f, 0.933333f&lt;br /&gt;
  dark_turquoise     0.000000f, 0.807843f, 0.819608f&lt;br /&gt;
  DarkTurquoise     0.000000f, 0.807843f, 0.819608f&lt;br /&gt;
  medium_turquoise     0.282353f, 0.819608f, 0.800000f&lt;br /&gt;
  MediumTurquoise     0.282353f, 0.819608f, 0.800000f&lt;br /&gt;
  turquoise     0.250980f, 0.878431f, 0.815686f&lt;br /&gt;
  cyan     0.000000f, 1.000000f, 1.000000f&lt;br /&gt;
  light_cyan     0.878431f, 1.000000f, 1.000000f&lt;br /&gt;
  LightCyan     0.878431f, 1.000000f, 1.000000f&lt;br /&gt;
  cadet_blue     0.372549f, 0.619608f, 0.627451f&lt;br /&gt;
  CadetBlue     0.372549f, 0.619608f, 0.627451f&lt;br /&gt;
  medium_aquamarine     0.400000f, 0.803922f, 0.666667f&lt;br /&gt;
  MediumAquamarine     0.400000f, 0.803922f, 0.666667f&lt;br /&gt;
  aquamarine     0.498039f, 1.000000f, 0.831373f&lt;br /&gt;
  dark_green     0.000000f, 0.392157f, 0.000000f&lt;br /&gt;
  DarkGreen     0.000000f, 0.392157f, 0.000000f&lt;br /&gt;
  dark_olive_green     0.333333f, 0.419608f, 0.184314f&lt;br /&gt;
  DarkOliveGreen     0.333333f, 0.419608f, 0.184314f&lt;br /&gt;
  dark_sea_green     0.560784f, 0.737255f, 0.560784f&lt;br /&gt;
  DarkSeaGreen     0.560784f, 0.737255f, 0.560784f&lt;br /&gt;
  sea_green     0.180392f, 0.545098f, 0.341176f&lt;br /&gt;
  SeaGreen     0.180392f, 0.545098f, 0.341176f&lt;br /&gt;
  medium_sea_green     0.235294f, 0.701961f, 0.443137f&lt;br /&gt;
  MediumSeaGreen     0.235294f, 0.701961f, 0.443137f&lt;br /&gt;
  light_sea_green     0.125490f, 0.698039f, 0.666667f&lt;br /&gt;
  LightSeaGreen     0.125490f, 0.698039f, 0.666667f&lt;br /&gt;
  pale_green     0.596078f, 0.984314f, 0.596078f&lt;br /&gt;
  PaleGreen     0.596078f, 0.984314f, 0.596078f&lt;br /&gt;
  spring_green     0.000000f, 1.000000f, 0.498039f&lt;br /&gt;
  SpringGreen     0.000000f, 1.000000f, 0.498039f&lt;br /&gt;
  lawn_green     0.486275f, 0.988235f, 0.000000f&lt;br /&gt;
  LawnGreen     0.486275f, 0.988235f, 0.000000f&lt;br /&gt;
  green     0.000000f, 1.000000f, 0.000000f&lt;br /&gt;
  chartreuse     0.498039f, 1.000000f, 0.000000f&lt;br /&gt;
  medium_spring_green     0.000000f, 0.980392f, 0.603922f&lt;br /&gt;
  MediumSpringGreen     0.000000f, 0.980392f, 0.603922f&lt;br /&gt;
  green_yellow     0.678431f, 1.000000f, 0.184314f&lt;br /&gt;
  GreenYellow     0.678431f, 1.000000f, 0.184314f&lt;br /&gt;
  lime_green     0.196078f, 0.803922f, 0.196078f&lt;br /&gt;
  LimeGreen     0.196078f, 0.803922f, 0.196078f&lt;br /&gt;
  yellow_green     0.603922f, 0.803922f, 0.196078f&lt;br /&gt;
  YellowGreen     0.603922f, 0.803922f, 0.196078f&lt;br /&gt;
  forest_green     0.133333f, 0.545098f, 0.133333f&lt;br /&gt;
  ForestGreen     0.133333f, 0.545098f, 0.133333f&lt;br /&gt;
  olive_drab     0.419608f, 0.556863f, 0.137255f&lt;br /&gt;
  OliveDrab     0.419608f, 0.556863f, 0.137255f&lt;br /&gt;
  dark_khaki     0.741176f, 0.717647f, 0.419608f&lt;br /&gt;
  DarkKhaki     0.741176f, 0.717647f, 0.419608f&lt;br /&gt;
  khaki     0.941176f, 0.901961f, 0.549020f&lt;br /&gt;
  pale_goldenrod     0.933333f, 0.909804f, 0.666667f&lt;br /&gt;
  PaleGoldenrod     0.933333f, 0.909804f, 0.666667f&lt;br /&gt;
  light_goldenrod_yellow     0.980392f, 0.980392f, 0.823529f&lt;br /&gt;
  LightGoldenrodYellow     0.980392f, 0.980392f, 0.823529f&lt;br /&gt;
  light_yellow     1.000000f, 1.000000f, 0.878431f&lt;br /&gt;
  LightYellow     1.000000f, 1.000000f, 0.878431f&lt;br /&gt;
  yellow     1.000000f, 1.000000f, 0.000000f&lt;br /&gt;
  gold     1.000000f, 0.843137f, 0.000000f&lt;br /&gt;
  light_goldenrod     0.933333f, 0.866667f, 0.509804f&lt;br /&gt;
  LightGoldenrod     0.933333f, 0.866667f, 0.509804f&lt;br /&gt;
  goldenrod     0.854902f, 0.647059f, 0.125490f&lt;br /&gt;
  dark_goldenrod     0.721569f, 0.525490f, 0.043137f&lt;br /&gt;
  DarkGoldenrod     0.721569f, 0.525490f, 0.043137f&lt;br /&gt;
  rosy_brown     0.737255f, 0.560784f, 0.560784f&lt;br /&gt;
  RosyBrown     0.737255f, 0.560784f, 0.560784f&lt;br /&gt;
  indian_red     0.803922f, 0.360784f, 0.360784f&lt;br /&gt;
  IndianRed     0.803922f, 0.360784f, 0.360784f&lt;br /&gt;
  saddle_brown     0.545098f, 0.270588f, 0.074510f&lt;br /&gt;
  SaddleBrown     0.545098f, 0.270588f, 0.074510f&lt;br /&gt;
  sienna     0.627451f, 0.321569f, 0.176471f&lt;br /&gt;
  peru     0.803922f, 0.521569f, 0.247059f&lt;br /&gt;
  burlywood     0.870588f, 0.721569f, 0.529412f&lt;br /&gt;
  beige     0.960784f, 0.960784f, 0.862745f&lt;br /&gt;
  wheat     0.960784f, 0.870588f, 0.701961f&lt;br /&gt;
  sandy_brown     0.956863f, 0.643137f, 0.376471f&lt;br /&gt;
  SandyBrown     0.956863f, 0.643137f, 0.376471f&lt;br /&gt;
  tan     0.823529f, 0.705882f, 0.549020f&lt;br /&gt;
  chocolate     0.823529f, 0.411765f, 0.117647f&lt;br /&gt;
  firebrick     0.698039f, 0.133333f, 0.133333f&lt;br /&gt;
  brown     0.647059f, 0.164706f, 0.164706f&lt;br /&gt;
  dark_salmon     0.913725f, 0.588235f, 0.478431f&lt;br /&gt;
  DarkSalmon     0.913725f, 0.588235f, 0.478431f&lt;br /&gt;
  salmon     0.980392f, 0.501961f, 0.447059f&lt;br /&gt;
  light_salmon     1.000000f, 0.627451f, 0.478431f&lt;br /&gt;
  LightSalmon     1.000000f, 0.627451f, 0.478431f&lt;br /&gt;
  orange     1.000000f, 0.647059f, 0.000000f&lt;br /&gt;
  dark_orange     1.000000f, 0.549020f, 0.000000f&lt;br /&gt;
  DarkOrange     1.000000f, 0.549020f, 0.000000f&lt;br /&gt;
  coral     1.000000f, 0.498039f, 0.313726f&lt;br /&gt;
  light_coral     0.941176f, 0.501961f, 0.501961f&lt;br /&gt;
  LightCoral     0.941176f, 0.501961f, 0.501961f&lt;br /&gt;
  tomato     1.000000f, 0.388235f, 0.278431f&lt;br /&gt;
  orange_red     1.000000f, 0.270588f, 0.000000f&lt;br /&gt;
  OrangeRed     1.000000f, 0.270588f, 0.000000f&lt;br /&gt;
  red     1.000000f, 0.000000f, 0.000000f&lt;br /&gt;
  hot_pink     1.000000f, 0.411765f, 0.705882f&lt;br /&gt;
  HotPink     1.000000f, 0.411765f, 0.705882f&lt;br /&gt;
  deep_pink     1.000000f, 0.078431f, 0.576471f&lt;br /&gt;
  DeepPink     1.000000f, 0.078431f, 0.576471f&lt;br /&gt;
  pink     1.000000f, 0.752941f, 0.796078f&lt;br /&gt;
  light_pink     1.000000f, 0.713726f, 0.756863f&lt;br /&gt;
  LightPink     1.000000f, 0.713726f, 0.756863f&lt;br /&gt;
  pale_violet_red     0.858824f, 0.439216f, 0.576471f&lt;br /&gt;
  PaleVioletRed     0.858824f, 0.439216f, 0.576471f&lt;br /&gt;
  maroon     0.690196f, 0.188235f, 0.376471f&lt;br /&gt;
  medium_violet_red     0.780392f, 0.082353f, 0.521569f&lt;br /&gt;
  MediumVioletRed     0.780392f, 0.082353f, 0.521569f&lt;br /&gt;
  violet_red     0.815686f, 0.125490f, 0.564706f&lt;br /&gt;
  VioletRed     0.815686f, 0.125490f, 0.564706f&lt;br /&gt;
  magenta     1.000000f, 0.000000f, 1.000000f&lt;br /&gt;
  violet     0.933333f, 0.509804f, 0.933333f&lt;br /&gt;
  plum     0.866667f, 0.627451f, 0.866667f&lt;br /&gt;
  orchid     0.854902f, 0.439216f, 0.839216f&lt;br /&gt;
  medium_orchid     0.729412f, 0.333333f, 0.827451f&lt;br /&gt;
  MediumOrchid     0.729412f, 0.333333f, 0.827451f&lt;br /&gt;
  dark_orchid     0.600000f, 0.196078f, 0.800000f&lt;br /&gt;
  DarkOrchid     0.600000f, 0.196078f, 0.800000f&lt;br /&gt;
  dark_violet     0.580392f, 0.000000f, 0.827451f&lt;br /&gt;
  DarkViolet     0.580392f, 0.000000f, 0.827451f&lt;br /&gt;
  blue_violet     0.541176f, 0.168627f, 0.886275f&lt;br /&gt;
  BlueViolet     0.541176f, 0.168627f, 0.886275f&lt;br /&gt;
  purple     0.627451f, 0.125490f, 0.941176f&lt;br /&gt;
  medium_purple     0.576471f, 0.439216f, 0.858824f&lt;br /&gt;
  MediumPurple     0.576471f, 0.439216f, 0.858824f&lt;br /&gt;
  thistle     0.847059f, 0.749020f, 0.847059f&lt;br /&gt;
  snow1     1.000000f, 0.980392f, 0.980392f&lt;br /&gt;
  snow2     0.933333f, 0.913725f, 0.913725f&lt;br /&gt;
  snow3     0.803922f, 0.788235f, 0.788235f&lt;br /&gt;
  snow4     0.545098f, 0.537255f, 0.537255f&lt;br /&gt;
  seashell1     1.000000f, 0.960784f, 0.933333f&lt;br /&gt;
  seashell2     0.933333f, 0.898039f, 0.870588f&lt;br /&gt;
  seashell3     0.803922f, 0.772549f, 0.749020f&lt;br /&gt;
  seashell4     0.545098f, 0.525490f, 0.509804f&lt;br /&gt;
  AntiqueWhite1     1.000000f, 0.937255f, 0.858824f&lt;br /&gt;
  AntiqueWhite2     0.933333f, 0.874510f, 0.800000f&lt;br /&gt;
  AntiqueWhite3     0.803922f, 0.752941f, 0.690196f&lt;br /&gt;
  AntiqueWhite4     0.545098f, 0.513726f, 0.470588f&lt;br /&gt;
  bisque1     1.000000f, 0.894118f, 0.768627f&lt;br /&gt;
  bisque2     0.933333f, 0.835294f, 0.717647f&lt;br /&gt;
  bisque3     0.803922f, 0.717647f, 0.619608f&lt;br /&gt;
  bisque4     0.545098f, 0.490196f, 0.419608f&lt;br /&gt;
  PeachPuff1     1.000000f, 0.854902f, 0.725490f&lt;br /&gt;
  PeachPuff2     0.933333f, 0.796078f, 0.678431f&lt;br /&gt;
  PeachPuff3     0.803922f, 0.686275f, 0.584314f&lt;br /&gt;
  PeachPuff4     0.545098f, 0.466667f, 0.396078f&lt;br /&gt;
  NavajoWhite1     1.000000f, 0.870588f, 0.678431f&lt;br /&gt;
  NavajoWhite2     0.933333f, 0.811765f, 0.631373f&lt;br /&gt;
  NavajoWhite3     0.803922f, 0.701961f, 0.545098f&lt;br /&gt;
  NavajoWhite4     0.545098f, 0.474510f, 0.368627f&lt;br /&gt;
  LemonChiffon1     1.000000f, 0.980392f, 0.803922f&lt;br /&gt;
  LemonChiffon2     0.933333f, 0.913725f, 0.749020f&lt;br /&gt;
  LemonChiffon3     0.803922f, 0.788235f, 0.647059f&lt;br /&gt;
  LemonChiffon4     0.545098f, 0.537255f, 0.439216f&lt;br /&gt;
  cornsilk1     1.000000f, 0.972549f, 0.862745f&lt;br /&gt;
  cornsilk2     0.933333f, 0.909804f, 0.803922f&lt;br /&gt;
  cornsilk3     0.803922f, 0.784314f, 0.694118f&lt;br /&gt;
  cornsilk4     0.545098f, 0.533333f, 0.470588f&lt;br /&gt;
  ivory1     1.000000f, 1.000000f, 0.941176f&lt;br /&gt;
  ivory2     0.933333f, 0.933333f, 0.878431f&lt;br /&gt;
  ivory3     0.803922f, 0.803922f, 0.756863f&lt;br /&gt;
  ivory4     0.545098f, 0.545098f, 0.513726f&lt;br /&gt;
  honeydew1     0.941176f, 1.000000f, 0.941176f&lt;br /&gt;
  honeydew2     0.878431f, 0.933333f, 0.878431f&lt;br /&gt;
  honeydew3     0.756863f, 0.803922f, 0.756863f&lt;br /&gt;
  honeydew4     0.513726f, 0.545098f, 0.513726f&lt;br /&gt;
  LavenderBlush1     1.000000f, 0.941176f, 0.960784f&lt;br /&gt;
  LavenderBlush2     0.933333f, 0.878431f, 0.898039f&lt;br /&gt;
  LavenderBlush3     0.803922f, 0.756863f, 0.772549f&lt;br /&gt;
  LavenderBlush4     0.545098f, 0.513726f, 0.525490f&lt;br /&gt;
  MistyRose1     1.000000f, 0.894118f, 0.882353f&lt;br /&gt;
  MistyRose2     0.933333f, 0.835294f, 0.823529f&lt;br /&gt;
  MistyRose3     0.803922f, 0.717647f, 0.709804f&lt;br /&gt;
  MistyRose4     0.545098f, 0.490196f, 0.482353f&lt;br /&gt;
  azure1     0.941176f, 1.000000f, 1.000000f&lt;br /&gt;
  azure2     0.878431f, 0.933333f, 0.933333f&lt;br /&gt;
  azure3     0.756863f, 0.803922f, 0.803922f&lt;br /&gt;
  azure4     0.513726f, 0.545098f, 0.545098f&lt;br /&gt;
  SlateBlue1     0.513726f, 0.435294f, 1.000000f&lt;br /&gt;
  SlateBlue2     0.478431f, 0.403922f, 0.933333f&lt;br /&gt;
  SlateBlue3     0.411765f, 0.349020f, 0.803922f&lt;br /&gt;
  SlateBlue4     0.278431f, 0.235294f, 0.545098f&lt;br /&gt;
  RoyalBlue1     0.282353f, 0.462745f, 1.000000f&lt;br /&gt;
  RoyalBlue2     0.262745f, 0.431373f, 0.933333f&lt;br /&gt;
  RoyalBlue3     0.227451f, 0.372549f, 0.803922f&lt;br /&gt;
  RoyalBlue4     0.152941f, 0.250980f, 0.545098f&lt;br /&gt;
  blue1     0.000000f, 0.000000f, 1.000000f&lt;br /&gt;
  blue2     0.000000f, 0.000000f, 0.933333f&lt;br /&gt;
  blue3     0.000000f, 0.000000f, 0.803922f&lt;br /&gt;
  blue4     0.000000f, 0.000000f, 0.545098f&lt;br /&gt;
  DodgerBlue1     0.117647f, 0.564706f, 1.000000f&lt;br /&gt;
  DodgerBlue2     0.109804f, 0.525490f, 0.933333f&lt;br /&gt;
  DodgerBlue3     0.094118f, 0.454902f, 0.803922f&lt;br /&gt;
  DodgerBlue4     0.062745f, 0.305882f, 0.545098f&lt;br /&gt;
  SteelBlue1     0.388235f, 0.721569f, 1.000000f&lt;br /&gt;
  SteelBlue2     0.360784f, 0.674510f, 0.933333f&lt;br /&gt;
  SteelBlue3     0.309804f, 0.580392f, 0.803922f&lt;br /&gt;
  SteelBlue4     0.211765f, 0.392157f, 0.545098f&lt;br /&gt;
  DeepSkyBlue1     0.000000f, 0.749020f, 1.000000f&lt;br /&gt;
  DeepSkyBlue2     0.000000f, 0.698039f, 0.933333f&lt;br /&gt;
  DeepSkyBlue3     0.000000f, 0.603922f, 0.803922f&lt;br /&gt;
  DeepSkyBlue4     0.000000f, 0.407843f, 0.545098f&lt;br /&gt;
  SkyBlue1     0.529412f, 0.807843f, 1.000000f&lt;br /&gt;
  SkyBlue2     0.494118f, 0.752941f, 0.933333f&lt;br /&gt;
  SkyBlue3     0.423529f, 0.650980f, 0.803922f&lt;br /&gt;
  SkyBlue4     0.290196f, 0.439216f, 0.545098f&lt;br /&gt;
  LightSkyBlue1     0.690196f, 0.886275f, 1.000000f&lt;br /&gt;
  LightSkyBlue2     0.643137f, 0.827451f, 0.933333f&lt;br /&gt;
  LightSkyBlue3     0.552941f, 0.713726f, 0.803922f&lt;br /&gt;
  LightSkyBlue4     0.376471f, 0.482353f, 0.545098f&lt;br /&gt;
  SlateGray1     0.776471f, 0.886275f, 1.000000f&lt;br /&gt;
  SlateGray2     0.725490f, 0.827451f, 0.933333f&lt;br /&gt;
  SlateGray3     0.623529f, 0.713726f, 0.803922f&lt;br /&gt;
  SlateGray4     0.423529f, 0.482353f, 0.545098f&lt;br /&gt;
  LightSteelBlue1     0.792157f, 0.882353f, 1.000000f&lt;br /&gt;
  LightSteelBlue2     0.737255f, 0.823529f, 0.933333f&lt;br /&gt;
  LightSteelBlue3     0.635294f, 0.709804f, 0.803922f&lt;br /&gt;
  LightSteelBlue4     0.431373f, 0.482353f, 0.545098f&lt;br /&gt;
  LightBlue1     0.749020f, 0.937255f, 1.000000f&lt;br /&gt;
  LightBlue2     0.698039f, 0.874510f, 0.933333f&lt;br /&gt;
  LightBlue3     0.603922f, 0.752941f, 0.803922f&lt;br /&gt;
  LightBlue4     0.407843f, 0.513726f, 0.545098f&lt;br /&gt;
  LightCyan1     0.878431f, 1.000000f, 1.000000f&lt;br /&gt;
  LightCyan2     0.819608f, 0.933333f, 0.933333f&lt;br /&gt;
  LightCyan3     0.705882f, 0.803922f, 0.803922f&lt;br /&gt;
  LightCyan4     0.478431f, 0.545098f, 0.545098f&lt;br /&gt;
  PaleTurquoise1     0.733333f, 1.000000f, 1.000000f&lt;br /&gt;
  PaleTurquoise2     0.682353f, 0.933333f, 0.933333f&lt;br /&gt;
  PaleTurquoise3     0.588235f, 0.803922f, 0.803922f&lt;br /&gt;
  PaleTurquoise4     0.400000f, 0.545098f, 0.545098f&lt;br /&gt;
  CadetBlue1     0.596078f, 0.960784f, 1.000000f&lt;br /&gt;
  CadetBlue2     0.556863f, 0.898039f, 0.933333f&lt;br /&gt;
  CadetBlue3     0.478431f, 0.772549f, 0.803922f&lt;br /&gt;
  CadetBlue4     0.325490f, 0.525490f, 0.545098f&lt;br /&gt;
  turquoise1     0.000000f, 0.960784f, 1.000000f&lt;br /&gt;
  turquoise2     0.000000f, 0.898039f, 0.933333f&lt;br /&gt;
  turquoise3     0.000000f, 0.772549f, 0.803922f&lt;br /&gt;
  turquoise4     0.000000f, 0.525490f, 0.545098f&lt;br /&gt;
  cyan1     0.000000f, 1.000000f, 1.000000f&lt;br /&gt;
  cyan2     0.000000f, 0.933333f, 0.933333f&lt;br /&gt;
  cyan3     0.000000f, 0.803922f, 0.803922f&lt;br /&gt;
  cyan4     0.000000f, 0.545098f, 0.545098f&lt;br /&gt;
  DarkSlateGray1     0.592157f, 1.000000f, 1.000000f&lt;br /&gt;
  DarkSlateGray2     0.552941f, 0.933333f, 0.933333f&lt;br /&gt;
  DarkSlateGray3     0.474510f, 0.803922f, 0.803922f&lt;br /&gt;
  DarkSlateGray4     0.321569f, 0.545098f, 0.545098f&lt;br /&gt;
  aquamarine1     0.498039f, 1.000000f, 0.831373f&lt;br /&gt;
  aquamarine2     0.462745f, 0.933333f, 0.776471f&lt;br /&gt;
  aquamarine3     0.400000f, 0.803922f, 0.666667f&lt;br /&gt;
  aquamarine4     0.270588f, 0.545098f, 0.454902f&lt;br /&gt;
  DarkSeaGreen1     0.756863f, 1.000000f, 0.756863f&lt;br /&gt;
  DarkSeaGreen2     0.705882f, 0.933333f, 0.705882f&lt;br /&gt;
  DarkSeaGreen3     0.607843f, 0.803922f, 0.607843f&lt;br /&gt;
  DarkSeaGreen4     0.411765f, 0.545098f, 0.411765f&lt;br /&gt;
  SeaGreen1     0.329412f, 1.000000f, 0.623529f&lt;br /&gt;
  SeaGreen2     0.305882f, 0.933333f, 0.580392f&lt;br /&gt;
  SeaGreen3     0.262745f, 0.803922f, 0.501961f&lt;br /&gt;
  SeaGreen4     0.180392f, 0.545098f, 0.341176f&lt;br /&gt;
  PaleGreen1     0.603922f, 1.000000f, 0.603922f&lt;br /&gt;
  PaleGreen2     0.564706f, 0.933333f, 0.564706f&lt;br /&gt;
  PaleGreen3     0.486275f, 0.803922f, 0.486275f&lt;br /&gt;
  PaleGreen4     0.329412f, 0.545098f, 0.329412f&lt;br /&gt;
  SpringGreen1     0.000000f, 1.000000f, 0.498039f&lt;br /&gt;
  SpringGreen2     0.000000f, 0.933333f, 0.462745f&lt;br /&gt;
  SpringGreen3     0.000000f, 0.803922f, 0.400000f&lt;br /&gt;
  SpringGreen4     0.000000f, 0.545098f, 0.270588f&lt;br /&gt;
  green1     0.000000f, 1.000000f, 0.000000f&lt;br /&gt;
  green2     0.000000f, 0.933333f, 0.000000f&lt;br /&gt;
  green3     0.000000f, 0.803922f, 0.000000f&lt;br /&gt;
  green4     0.000000f, 0.545098f, 0.000000f&lt;br /&gt;
  chartreuse1     0.498039f, 1.000000f, 0.000000f&lt;br /&gt;
  chartreuse2     0.462745f, 0.933333f, 0.000000f&lt;br /&gt;
  chartreuse3     0.400000f, 0.803922f, 0.000000f&lt;br /&gt;
  chartreuse4     0.270588f, 0.545098f, 0.000000f&lt;br /&gt;
  OliveDrab1     0.752941f, 1.000000f, 0.243137f&lt;br /&gt;
  OliveDrab2     0.701961f, 0.933333f, 0.227451f&lt;br /&gt;
  OliveDrab3     0.603922f, 0.803922f, 0.196078f&lt;br /&gt;
  OliveDrab4     0.411765f, 0.545098f, 0.133333f&lt;br /&gt;
  DarkOliveGreen1     0.792157f, 1.000000f, 0.439216f&lt;br /&gt;
  DarkOliveGreen2     0.737255f, 0.933333f, 0.407843f&lt;br /&gt;
  DarkOliveGreen3     0.635294f, 0.803922f, 0.352941f&lt;br /&gt;
  DarkOliveGreen4     0.431373f, 0.545098f, 0.239216f&lt;br /&gt;
  khaki1     1.000000f, 0.964706f, 0.560784f&lt;br /&gt;
  khaki2     0.933333f, 0.901961f, 0.521569f&lt;br /&gt;
  khaki3     0.803922f, 0.776471f, 0.450980f&lt;br /&gt;
  khaki4     0.545098f, 0.525490f, 0.305882f&lt;br /&gt;
  LightGoldenrod1     1.000000f, 0.925490f, 0.545098f&lt;br /&gt;
  LightGoldenrod2     0.933333f, 0.862745f, 0.509804f&lt;br /&gt;
  LightGoldenrod3     0.803922f, 0.745098f, 0.439216f&lt;br /&gt;
  LightGoldenrod4     0.545098f, 0.505882f, 0.298039f&lt;br /&gt;
  LightYellow1     1.000000f, 1.000000f, 0.878431f&lt;br /&gt;
  LightYellow2     0.933333f, 0.933333f, 0.819608f&lt;br /&gt;
  LightYellow3     0.803922f, 0.803922f, 0.705882f&lt;br /&gt;
  LightYellow4     0.545098f, 0.545098f, 0.478431f&lt;br /&gt;
  yellow1     1.000000f, 1.000000f, 0.000000f&lt;br /&gt;
  yellow2     0.933333f, 0.933333f, 0.000000f&lt;br /&gt;
  yellow3     0.803922f, 0.803922f, 0.000000f&lt;br /&gt;
  yellow4     0.545098f, 0.545098f, 0.000000f&lt;br /&gt;
  gold1     1.000000f, 0.843137f, 0.000000f&lt;br /&gt;
  gold2     0.933333f, 0.788235f, 0.000000f&lt;br /&gt;
  gold3     0.803922f, 0.678431f, 0.000000f&lt;br /&gt;
  gold4     0.545098f, 0.458824f, 0.000000f&lt;br /&gt;
  goldenrod1     1.000000f, 0.756863f, 0.145098f&lt;br /&gt;
  goldenrod2     0.933333f, 0.705882f, 0.133333f&lt;br /&gt;
  goldenrod3     0.803922f, 0.607843f, 0.113725f&lt;br /&gt;
  goldenrod4     0.545098f, 0.411765f, 0.078431f&lt;br /&gt;
  DarkGoldenrod1     1.000000f, 0.725490f, 0.058824f&lt;br /&gt;
  DarkGoldenrod2     0.933333f, 0.678431f, 0.054902f&lt;br /&gt;
  DarkGoldenrod3     0.803922f, 0.584314f, 0.047059f&lt;br /&gt;
  DarkGoldenrod4     0.545098f, 0.396078f, 0.031373f&lt;br /&gt;
  RosyBrown1     1.000000f, 0.756863f, 0.756863f&lt;br /&gt;
  RosyBrown2     0.933333f, 0.705882f, 0.705882f&lt;br /&gt;
  RosyBrown3     0.803922f, 0.607843f, 0.607843f&lt;br /&gt;
  RosyBrown4     0.545098f, 0.411765f, 0.411765f&lt;br /&gt;
  IndianRed1     1.000000f, 0.415686f, 0.415686f&lt;br /&gt;
  IndianRed2     0.933333f, 0.388235f, 0.388235f&lt;br /&gt;
  IndianRed3     0.803922f, 0.333333f, 0.333333f&lt;br /&gt;
  IndianRed4     0.545098f, 0.227451f, 0.227451f&lt;br /&gt;
  sienna1     1.000000f, 0.509804f, 0.278431f&lt;br /&gt;
  sienna2     0.933333f, 0.474510f, 0.258824f&lt;br /&gt;
  sienna3     0.803922f, 0.407843f, 0.223529f&lt;br /&gt;
  sienna4     0.545098f, 0.278431f, 0.149020f&lt;br /&gt;
  burlywood1     1.000000f, 0.827451f, 0.607843f&lt;br /&gt;
  burlywood2     0.933333f, 0.772549f, 0.568627f&lt;br /&gt;
  burlywood3     0.803922f, 0.666667f, 0.490196f&lt;br /&gt;
  burlywood4     0.545098f, 0.450980f, 0.333333f&lt;br /&gt;
  wheat1     1.000000f, 0.905882f, 0.729412f&lt;br /&gt;
  wheat2     0.933333f, 0.847059f, 0.682353f&lt;br /&gt;
  wheat3     0.803922f, 0.729412f, 0.588235f&lt;br /&gt;
  wheat4     0.545098f, 0.494118f, 0.400000f&lt;br /&gt;
  tan1     1.000000f, 0.647059f, 0.309804f&lt;br /&gt;
  tan2     0.933333f, 0.603922f, 0.286275f&lt;br /&gt;
  tan3     0.803922f, 0.521569f, 0.247059f&lt;br /&gt;
  tan4     0.545098f, 0.352941f, 0.168627f&lt;br /&gt;
  chocolate1     1.000000f, 0.498039f, 0.141176f&lt;br /&gt;
  chocolate2     0.933333f, 0.462745f, 0.129412f&lt;br /&gt;
  chocolate3     0.803922f, 0.400000f, 0.113725f&lt;br /&gt;
  chocolate4     0.545098f, 0.270588f, 0.074510f&lt;br /&gt;
  firebrick1     1.000000f, 0.188235f, 0.188235f&lt;br /&gt;
  firebrick2     0.933333f, 0.172549f, 0.172549f&lt;br /&gt;
  firebrick3     0.803922f, 0.149020f, 0.149020f&lt;br /&gt;
  firebrick4     0.545098f, 0.101961f, 0.101961f&lt;br /&gt;
  brown1     1.000000f, 0.250980f, 0.250980f&lt;br /&gt;
  brown2     0.933333f, 0.231373f, 0.231373f&lt;br /&gt;
  brown3     0.803922f, 0.200000f, 0.200000f&lt;br /&gt;
  brown4     0.545098f, 0.137255f, 0.137255f&lt;br /&gt;
  salmon1     1.000000f, 0.549020f, 0.411765f&lt;br /&gt;
  salmon2     0.933333f, 0.509804f, 0.384314f&lt;br /&gt;
  salmon3     0.803922f, 0.439216f, 0.329412f&lt;br /&gt;
  salmon4     0.545098f, 0.298039f, 0.223529f&lt;br /&gt;
  LightSalmon1     1.000000f, 0.627451f, 0.478431f&lt;br /&gt;
  LightSalmon2     0.933333f, 0.584314f, 0.447059f&lt;br /&gt;
  LightSalmon3     0.803922f, 0.505882f, 0.384314f&lt;br /&gt;
  LightSalmon4     0.545098f, 0.341176f, 0.258824f&lt;br /&gt;
  orange1     1.000000f, 0.647059f, 0.000000f&lt;br /&gt;
  orange2     0.933333f, 0.603922f, 0.000000f&lt;br /&gt;
  orange3     0.803922f, 0.521569f, 0.000000f&lt;br /&gt;
  orange4     0.545098f, 0.352941f, 0.000000f&lt;br /&gt;
  DarkOrange1     1.000000f, 0.498039f, 0.000000f&lt;br /&gt;
  DarkOrange2     0.933333f, 0.462745f, 0.000000f&lt;br /&gt;
  DarkOrange3     0.803922f, 0.400000f, 0.000000f&lt;br /&gt;
  DarkOrange4     0.545098f, 0.270588f, 0.000000f&lt;br /&gt;
  coral1     1.000000f, 0.447059f, 0.337255f&lt;br /&gt;
  coral2     0.933333f, 0.415686f, 0.313726f&lt;br /&gt;
  coral3     0.803922f, 0.356863f, 0.270588f&lt;br /&gt;
  coral4     0.545098f, 0.243137f, 0.184314f&lt;br /&gt;
  tomato1     1.000000f, 0.388235f, 0.278431f&lt;br /&gt;
  tomato2     0.933333f, 0.360784f, 0.258824f&lt;br /&gt;
  tomato3     0.803922f, 0.309804f, 0.223529f&lt;br /&gt;
  tomato4     0.545098f, 0.211765f, 0.149020f&lt;br /&gt;
  OrangeRed1     1.000000f, 0.270588f, 0.000000f&lt;br /&gt;
  OrangeRed2     0.933333f, 0.250980f, 0.000000f&lt;br /&gt;
  OrangeRed3     0.803922f, 0.215686f, 0.000000f&lt;br /&gt;
  OrangeRed4     0.545098f, 0.145098f, 0.000000f&lt;br /&gt;
  red1     1.000000f, 0.000000f, 0.000000f&lt;br /&gt;
  red2     0.933333f, 0.000000f, 0.000000f&lt;br /&gt;
  red3     0.803922f, 0.000000f, 0.000000f&lt;br /&gt;
  red4     0.545098f, 0.000000f, 0.000000f&lt;br /&gt;
  DeepPink1     1.000000f, 0.078431f, 0.576471f&lt;br /&gt;
  DeepPink2     0.933333f, 0.070588f, 0.537255f&lt;br /&gt;
  DeepPink3     0.803922f, 0.062745f, 0.462745f&lt;br /&gt;
  DeepPink4     0.545098f, 0.039216f, 0.313726f&lt;br /&gt;
  HotPink1     1.000000f, 0.431373f, 0.705882f&lt;br /&gt;
  HotPink2     0.933333f, 0.415686f, 0.654902f&lt;br /&gt;
  HotPink3     0.803922f, 0.376471f, 0.564706f&lt;br /&gt;
  HotPink4     0.545098f, 0.227451f, 0.384314f&lt;br /&gt;
  pink1     1.000000f, 0.709804f, 0.772549f&lt;br /&gt;
  pink2     0.933333f, 0.662745f, 0.721569f&lt;br /&gt;
  pink3     0.803922f, 0.568627f, 0.619608f&lt;br /&gt;
  pink4     0.545098f, 0.388235f, 0.423529f&lt;br /&gt;
  LightPink1     1.000000f, 0.682353f, 0.725490f&lt;br /&gt;
  LightPink2     0.933333f, 0.635294f, 0.678431f&lt;br /&gt;
  LightPink3     0.803922f, 0.549020f, 0.584314f&lt;br /&gt;
  LightPink4     0.545098f, 0.372549f, 0.396078f&lt;br /&gt;
  PaleVioletRed1     1.000000f, 0.509804f, 0.670588f&lt;br /&gt;
  PaleVioletRed2     0.933333f, 0.474510f, 0.623529f&lt;br /&gt;
  PaleVioletRed3     0.803922f, 0.407843f, 0.537255f&lt;br /&gt;
  PaleVioletRed4     0.545098f, 0.278431f, 0.364706f&lt;br /&gt;
  maroon1     1.000000f, 0.203922f, 0.701961f&lt;br /&gt;
  maroon2     0.933333f, 0.188235f, 0.654902f&lt;br /&gt;
  maroon3     0.803922f, 0.160784f, 0.564706f&lt;br /&gt;
  maroon4     0.545098f, 0.109804f, 0.384314f&lt;br /&gt;
  VioletRed1     1.000000f, 0.243137f, 0.588235f&lt;br /&gt;
  VioletRed2     0.933333f, 0.227451f, 0.549020f&lt;br /&gt;
  VioletRed3     0.803922f, 0.196078f, 0.470588f&lt;br /&gt;
  VioletRed4     0.545098f, 0.133333f, 0.321569f&lt;br /&gt;
  magenta1     1.000000f, 0.000000f, 1.000000f&lt;br /&gt;
  magenta2     0.933333f, 0.000000f, 0.933333f&lt;br /&gt;
  magenta3     0.803922f, 0.000000f, 0.803922f&lt;br /&gt;
  magenta4     0.545098f, 0.000000f, 0.545098f&lt;br /&gt;
  orchid1     1.000000f, 0.513726f, 0.980392f&lt;br /&gt;
  orchid2     0.933333f, 0.478431f, 0.913725f&lt;br /&gt;
  orchid3     0.803922f, 0.411765f, 0.788235f&lt;br /&gt;
  orchid4     0.545098f, 0.278431f, 0.537255f&lt;br /&gt;
  plum1     1.000000f, 0.733333f, 1.000000f&lt;br /&gt;
  plum2     0.933333f, 0.682353f, 0.933333f&lt;br /&gt;
  plum3     0.803922f, 0.588235f, 0.803922f&lt;br /&gt;
  plum4     0.545098f, 0.400000f, 0.545098f&lt;br /&gt;
  MediumOrchid1     0.878431f, 0.400000f, 1.000000f&lt;br /&gt;
  MediumOrchid2     0.819608f, 0.372549f, 0.933333f&lt;br /&gt;
  MediumOrchid3     0.705882f, 0.321569f, 0.803922f&lt;br /&gt;
  MediumOrchid4     0.478431f, 0.215686f, 0.545098f&lt;br /&gt;
  DarkOrchid1     0.749020f, 0.243137f, 1.000000f&lt;br /&gt;
  DarkOrchid2     0.698039f, 0.227451f, 0.933333f&lt;br /&gt;
  DarkOrchid3     0.603922f, 0.196078f, 0.803922f&lt;br /&gt;
  DarkOrchid4     0.407843f, 0.133333f, 0.545098f&lt;br /&gt;
  purple1     0.607843f, 0.188235f, 1.000000f&lt;br /&gt;
  purple2     0.568627f, 0.172549f, 0.933333f&lt;br /&gt;
  purple3     0.490196f, 0.149020f, 0.803922f&lt;br /&gt;
  purple4     0.333333f, 0.101961f, 0.545098f&lt;br /&gt;
  MediumPurple1     0.670588f, 0.509804f, 1.000000f&lt;br /&gt;
  MediumPurple2     0.623529f, 0.474510f, 0.933333f&lt;br /&gt;
  MediumPurple3     0.537255f, 0.407843f, 0.803922f&lt;br /&gt;
  MediumPurple4     0.364706f, 0.278431f, 0.545098f&lt;br /&gt;
  thistle1     1.000000f, 0.882353f, 1.000000f&lt;br /&gt;
  thistle2     0.933333f, 0.823529f, 0.933333f&lt;br /&gt;
  thistle3     0.803922f, 0.709804f, 0.803922f&lt;br /&gt;
  thistle4     0.545098f, 0.482353f, 0.545098f&lt;br /&gt;
  gray0     0.000000f, 0.000000f, 0.000000f&lt;br /&gt;
  grey0     0.000000f, 0.000000f, 0.000000f&lt;br /&gt;
  gray1     0.011765f, 0.011765f, 0.011765f&lt;br /&gt;
  grey1     0.011765f, 0.011765f, 0.011765f&lt;br /&gt;
  gray2     0.019608f, 0.019608f, 0.019608f&lt;br /&gt;
  grey2     0.019608f, 0.019608f, 0.019608f&lt;br /&gt;
  gray3     0.031373f, 0.031373f, 0.031373f&lt;br /&gt;
  grey3     0.031373f, 0.031373f, 0.031373f&lt;br /&gt;
  gray4     0.039216f, 0.039216f, 0.039216f&lt;br /&gt;
  grey4     0.039216f, 0.039216f, 0.039216f&lt;br /&gt;
  gray5     0.050980f, 0.050980f, 0.050980f&lt;br /&gt;
  grey5     0.050980f, 0.050980f, 0.050980f&lt;br /&gt;
  gray6     0.058824f, 0.058824f, 0.058824f&lt;br /&gt;
  grey6     0.058824f, 0.058824f, 0.058824f&lt;br /&gt;
  gray7     0.070588f, 0.070588f, 0.070588f&lt;br /&gt;
  grey7     0.070588f, 0.070588f, 0.070588f&lt;br /&gt;
  gray8     0.078431f, 0.078431f, 0.078431f&lt;br /&gt;
  grey8     0.078431f, 0.078431f, 0.078431f&lt;br /&gt;
  gray9     0.090196f, 0.090196f, 0.090196f&lt;br /&gt;
  grey9     0.090196f, 0.090196f, 0.090196f&lt;br /&gt;
  gray10     0.101961f, 0.101961f, 0.101961f&lt;br /&gt;
  grey10     0.101961f, 0.101961f, 0.101961f&lt;br /&gt;
  gray11     0.109804f, 0.109804f, 0.109804f&lt;br /&gt;
  grey11     0.109804f, 0.109804f, 0.109804f&lt;br /&gt;
  gray12     0.121569f, 0.121569f, 0.121569f&lt;br /&gt;
  grey12     0.121569f, 0.121569f, 0.121569f&lt;br /&gt;
  gray13     0.129412f, 0.129412f, 0.129412f&lt;br /&gt;
  grey13     0.129412f, 0.129412f, 0.129412f&lt;br /&gt;
  gray14     0.141176f, 0.141176f, 0.141176f&lt;br /&gt;
  grey14     0.141176f, 0.141176f, 0.141176f&lt;br /&gt;
  gray15     0.149020f, 0.149020f, 0.149020f&lt;br /&gt;
  grey15     0.149020f, 0.149020f, 0.149020f&lt;br /&gt;
  gray16     0.160784f, 0.160784f, 0.160784f&lt;br /&gt;
  grey16     0.160784f, 0.160784f, 0.160784f&lt;br /&gt;
  gray17     0.168627f, 0.168627f, 0.168627f&lt;br /&gt;
  grey17     0.168627f, 0.168627f, 0.168627f&lt;br /&gt;
  gray18     0.180392f, 0.180392f, 0.180392f&lt;br /&gt;
  grey18     0.180392f, 0.180392f, 0.180392f&lt;br /&gt;
  gray19     0.188235f, 0.188235f, 0.188235f&lt;br /&gt;
  grey19     0.188235f, 0.188235f, 0.188235f&lt;br /&gt;
  gray20     0.200000f, 0.200000f, 0.200000f&lt;br /&gt;
  grey20     0.200000f, 0.200000f, 0.200000f&lt;br /&gt;
  gray21     0.211765f, 0.211765f, 0.211765f&lt;br /&gt;
  grey21     0.211765f, 0.211765f, 0.211765f&lt;br /&gt;
  gray22     0.219608f, 0.219608f, 0.219608f&lt;br /&gt;
  grey22     0.219608f, 0.219608f, 0.219608f&lt;br /&gt;
  gray23     0.231373f, 0.231373f, 0.231373f&lt;br /&gt;
  grey23     0.231373f, 0.231373f, 0.231373f&lt;br /&gt;
  gray24     0.239216f, 0.239216f, 0.239216f&lt;br /&gt;
  grey24     0.239216f, 0.239216f, 0.239216f&lt;br /&gt;
  gray25     0.250980f, 0.250980f, 0.250980f&lt;br /&gt;
  grey25     0.250980f, 0.250980f, 0.250980f&lt;br /&gt;
  gray26     0.258824f, 0.258824f, 0.258824f&lt;br /&gt;
  grey26     0.258824f, 0.258824f, 0.258824f&lt;br /&gt;
  gray27     0.270588f, 0.270588f, 0.270588f&lt;br /&gt;
  grey27     0.270588f, 0.270588f, 0.270588f&lt;br /&gt;
  gray28     0.278431f, 0.278431f, 0.278431f&lt;br /&gt;
  grey28     0.278431f, 0.278431f, 0.278431f&lt;br /&gt;
  gray29     0.290196f, 0.290196f, 0.290196f&lt;br /&gt;
  grey29     0.290196f, 0.290196f, 0.290196f&lt;br /&gt;
  gray30     0.301961f, 0.301961f, 0.301961f&lt;br /&gt;
  grey30     0.301961f, 0.301961f, 0.301961f&lt;br /&gt;
  gray31     0.309804f, 0.309804f, 0.309804f&lt;br /&gt;
  grey31     0.309804f, 0.309804f, 0.309804f&lt;br /&gt;
  gray32     0.321569f, 0.321569f, 0.321569f&lt;br /&gt;
  grey32     0.321569f, 0.321569f, 0.321569f&lt;br /&gt;
  gray33     0.329412f, 0.329412f, 0.329412f&lt;br /&gt;
  grey33     0.329412f, 0.329412f, 0.329412f&lt;br /&gt;
  gray34     0.341176f, 0.341176f, 0.341176f&lt;br /&gt;
  grey34     0.341176f, 0.341176f, 0.341176f&lt;br /&gt;
  gray35     0.349020f, 0.349020f, 0.349020f&lt;br /&gt;
  grey35     0.349020f, 0.349020f, 0.349020f&lt;br /&gt;
  gray36     0.360784f, 0.360784f, 0.360784f&lt;br /&gt;
  grey36     0.360784f, 0.360784f, 0.360784f&lt;br /&gt;
  gray37     0.368627f, 0.368627f, 0.368627f&lt;br /&gt;
  grey37     0.368627f, 0.368627f, 0.368627f&lt;br /&gt;
  gray38     0.380392f, 0.380392f, 0.380392f&lt;br /&gt;
  grey38     0.380392f, 0.380392f, 0.380392f&lt;br /&gt;
  gray39     0.388235f, 0.388235f, 0.388235f&lt;br /&gt;
  grey39     0.388235f, 0.388235f, 0.388235f&lt;br /&gt;
  gray40     0.400000f, 0.400000f, 0.400000f&lt;br /&gt;
  grey40     0.400000f, 0.400000f, 0.400000f&lt;br /&gt;
  gray41     0.411765f, 0.411765f, 0.411765f&lt;br /&gt;
  grey41     0.411765f, 0.411765f, 0.411765f&lt;br /&gt;
  gray42     0.419608f, 0.419608f, 0.419608f&lt;br /&gt;
  grey42     0.419608f, 0.419608f, 0.419608f&lt;br /&gt;
  gray43     0.431373f, 0.431373f, 0.431373f&lt;br /&gt;
  grey43     0.431373f, 0.431373f, 0.431373f&lt;br /&gt;
  gray44     0.439216f, 0.439216f, 0.439216f&lt;br /&gt;
  grey44     0.439216f, 0.439216f, 0.439216f&lt;br /&gt;
  gray45     0.450980f, 0.450980f, 0.450980f&lt;br /&gt;
  grey45     0.450980f, 0.450980f, 0.450980f&lt;br /&gt;
  gray46     0.458824f, 0.458824f, 0.458824f&lt;br /&gt;
  grey46     0.458824f, 0.458824f, 0.458824f&lt;br /&gt;
  gray47     0.470588f, 0.470588f, 0.470588f&lt;br /&gt;
  grey47     0.470588f, 0.470588f, 0.470588f&lt;br /&gt;
  gray48     0.478431f, 0.478431f, 0.478431f&lt;br /&gt;
  grey48     0.478431f, 0.478431f, 0.478431f&lt;br /&gt;
  gray49     0.490196f, 0.490196f, 0.490196f&lt;br /&gt;
  grey49     0.490196f, 0.490196f, 0.490196f&lt;br /&gt;
  gray50     0.498039f, 0.498039f, 0.498039f&lt;br /&gt;
  grey50     0.498039f, 0.498039f, 0.498039f&lt;br /&gt;
  gray51     0.509804f, 0.509804f, 0.509804f&lt;br /&gt;
  grey51     0.509804f, 0.509804f, 0.509804f&lt;br /&gt;
  gray52     0.521569f, 0.521569f, 0.521569f&lt;br /&gt;
  grey52     0.521569f, 0.521569f, 0.521569f&lt;br /&gt;
  gray53     0.529412f, 0.529412f, 0.529412f&lt;br /&gt;
  grey53     0.529412f, 0.529412f, 0.529412f&lt;br /&gt;
  gray54     0.541176f, 0.541176f, 0.541176f&lt;br /&gt;
  grey54     0.541176f, 0.541176f, 0.541176f&lt;br /&gt;
  gray55     0.549020f, 0.549020f, 0.549020f&lt;br /&gt;
  grey55     0.549020f, 0.549020f, 0.549020f&lt;br /&gt;
  gray56     0.560784f, 0.560784f, 0.560784f&lt;br /&gt;
  grey56     0.560784f, 0.560784f, 0.560784f&lt;br /&gt;
  gray57     0.568627f, 0.568627f, 0.568627f&lt;br /&gt;
  grey57     0.568627f, 0.568627f, 0.568627f&lt;br /&gt;
  gray58     0.580392f, 0.580392f, 0.580392f&lt;br /&gt;
  grey58     0.580392f, 0.580392f, 0.580392f&lt;br /&gt;
  gray59     0.588235f, 0.588235f, 0.588235f&lt;br /&gt;
  grey59     0.588235f, 0.588235f, 0.588235f&lt;br /&gt;
  gray60     0.600000f, 0.600000f, 0.600000f&lt;br /&gt;
  grey60     0.600000f, 0.600000f, 0.600000f&lt;br /&gt;
  gray61     0.611765f, 0.611765f, 0.611765f&lt;br /&gt;
  grey61     0.611765f, 0.611765f, 0.611765f&lt;br /&gt;
  gray62     0.619608f, 0.619608f, 0.619608f&lt;br /&gt;
  grey62     0.619608f, 0.619608f, 0.619608f&lt;br /&gt;
  gray63     0.631373f, 0.631373f, 0.631373f&lt;br /&gt;
  grey63     0.631373f, 0.631373f, 0.631373f&lt;br /&gt;
  gray64     0.639216f, 0.639216f, 0.639216f&lt;br /&gt;
  grey64     0.639216f, 0.639216f, 0.639216f&lt;br /&gt;
  gray65     0.650980f, 0.650980f, 0.650980f&lt;br /&gt;
  grey65     0.650980f, 0.650980f, 0.650980f&lt;br /&gt;
  gray66     0.658824f, 0.658824f, 0.658824f&lt;br /&gt;
  grey66     0.658824f, 0.658824f, 0.658824f&lt;br /&gt;
  gray67     0.670588f, 0.670588f, 0.670588f&lt;br /&gt;
  grey67     0.670588f, 0.670588f, 0.670588f&lt;br /&gt;
  gray68     0.678431f, 0.678431f, 0.678431f&lt;br /&gt;
  grey68     0.678431f, 0.678431f, 0.678431f&lt;br /&gt;
  gray69     0.690196f, 0.690196f, 0.690196f&lt;br /&gt;
  grey69     0.690196f, 0.690196f, 0.690196f&lt;br /&gt;
  gray70     0.701961f, 0.701961f, 0.701961f&lt;br /&gt;
  grey70     0.701961f, 0.701961f, 0.701961f&lt;br /&gt;
  gray71     0.709804f, 0.709804f, 0.709804f&lt;br /&gt;
  grey71     0.709804f, 0.709804f, 0.709804f&lt;br /&gt;
  gray72     0.721569f, 0.721569f, 0.721569f&lt;br /&gt;
  grey72     0.721569f, 0.721569f, 0.721569f&lt;br /&gt;
  gray73     0.729412f, 0.729412f, 0.729412f&lt;br /&gt;
  grey73     0.729412f, 0.729412f, 0.729412f&lt;br /&gt;
  gray74     0.741176f, 0.741176f, 0.741176f&lt;br /&gt;
  grey74     0.741176f, 0.741176f, 0.741176f&lt;br /&gt;
  gray75     0.749020f, 0.749020f, 0.749020f&lt;br /&gt;
  grey75     0.749020f, 0.749020f, 0.749020f&lt;br /&gt;
  gray76     0.760784f, 0.760784f, 0.760784f&lt;br /&gt;
  grey76     0.760784f, 0.760784f, 0.760784f&lt;br /&gt;
  gray77     0.768627f, 0.768627f, 0.768627f&lt;br /&gt;
  grey77     0.768627f, 0.768627f, 0.768627f&lt;br /&gt;
  gray78     0.780392f, 0.780392f, 0.780392f&lt;br /&gt;
  grey78     0.780392f, 0.780392f, 0.780392f&lt;br /&gt;
  gray79     0.788235f, 0.788235f, 0.788235f&lt;br /&gt;
  grey79     0.788235f, 0.788235f, 0.788235f&lt;br /&gt;
  gray80     0.800000f, 0.800000f, 0.800000f&lt;br /&gt;
  grey80     0.800000f, 0.800000f, 0.800000f&lt;br /&gt;
  gray81     0.811765f, 0.811765f, 0.811765f&lt;br /&gt;
  grey81     0.811765f, 0.811765f, 0.811765f&lt;br /&gt;
  gray82     0.819608f, 0.819608f, 0.819608f&lt;br /&gt;
  grey82     0.819608f, 0.819608f, 0.819608f&lt;br /&gt;
  gray83     0.831373f, 0.831373f, 0.831373f&lt;br /&gt;
  grey83     0.831373f, 0.831373f, 0.831373f&lt;br /&gt;
  gray84     0.839216f, 0.839216f, 0.839216f&lt;br /&gt;
  grey84     0.839216f, 0.839216f, 0.839216f&lt;br /&gt;
  gray85     0.850980f, 0.850980f, 0.850980f&lt;br /&gt;
  grey85     0.850980f, 0.850980f, 0.850980f&lt;br /&gt;
  gray86     0.858824f, 0.858824f, 0.858824f&lt;br /&gt;
  grey86     0.858824f, 0.858824f, 0.858824f&lt;br /&gt;
  gray87     0.870588f, 0.870588f, 0.870588f&lt;br /&gt;
  grey87     0.870588f, 0.870588f, 0.870588f&lt;br /&gt;
  gray88     0.878431f, 0.878431f, 0.878431f&lt;br /&gt;
  grey88     0.878431f, 0.878431f, 0.878431f&lt;br /&gt;
  gray89     0.890196f, 0.890196f, 0.890196f&lt;br /&gt;
  grey89     0.890196f, 0.890196f, 0.890196f&lt;br /&gt;
  gray90     0.898039f, 0.898039f, 0.898039f&lt;br /&gt;
  grey90     0.898039f, 0.898039f, 0.898039f&lt;br /&gt;
  gray91     0.909804f, 0.909804f, 0.909804f&lt;br /&gt;
  grey91     0.909804f, 0.909804f, 0.909804f&lt;br /&gt;
  gray92     0.921569f, 0.921569f, 0.921569f&lt;br /&gt;
  grey92     0.921569f, 0.921569f, 0.921569f&lt;br /&gt;
  gray93     0.929412f, 0.929412f, 0.929412f&lt;br /&gt;
  grey93     0.929412f, 0.929412f, 0.929412f&lt;br /&gt;
  gray94     0.941176f, 0.941176f, 0.941176f&lt;br /&gt;
  grey94     0.941176f, 0.941176f, 0.941176f&lt;br /&gt;
  gray95     0.949020f, 0.949020f, 0.949020f&lt;br /&gt;
  grey95     0.949020f, 0.949020f, 0.949020f&lt;br /&gt;
  gray96     0.960784f, 0.960784f, 0.960784f&lt;br /&gt;
  grey96     0.960784f, 0.960784f, 0.960784f&lt;br /&gt;
  gray97     0.968627f, 0.968627f, 0.968627f&lt;br /&gt;
  grey97     0.968627f, 0.968627f, 0.968627f&lt;br /&gt;
  gray98     0.980392f, 0.980392f, 0.980392f&lt;br /&gt;
  grey98     0.980392f, 0.980392f, 0.980392f&lt;br /&gt;
  gray99     0.988235f, 0.988235f, 0.988235f&lt;br /&gt;
  grey99     0.988235f, 0.988235f, 0.988235f&lt;br /&gt;
  gray100     1.000000f, 1.000000f, 1.000000f&lt;br /&gt;
  grey100     1.000000f, 1.000000f, 1.000000f&lt;br /&gt;
  dark_grey     0.662745f, 0.662745f, 0.662745f&lt;br /&gt;
  DarkGrey     0.662745f, 0.662745f, 0.662745f&lt;br /&gt;
  dark_gray     0.662745f, 0.662745f, 0.662745f&lt;br /&gt;
  DarkGray     0.662745f, 0.662745f, 0.662745f&lt;br /&gt;
  dark_blue     0.000000f, 0.000000f, 0.545098f&lt;br /&gt;
  DarkBlue     0.000000f, 0.000000f, 0.545098f&lt;br /&gt;
  dark_cyan     0.000000f, 0.545098f, 0.545098f&lt;br /&gt;
  DarkCyan     0.000000f, 0.545098f, 0.545098f&lt;br /&gt;
  dark_magenta     0.545098f, 0.000000f, 0.545098f&lt;br /&gt;
  DarkMagenta     0.545098f, 0.000000f, 0.545098f&lt;br /&gt;
  dark_red     0.545098f, 0.000000f, 0.000000f&lt;br /&gt;
  DarkRed     0.545098f, 0.000000f, 0.000000f&lt;br /&gt;
  light_green     0.564706f, 0.933333f, 0.564706f&lt;br /&gt;
  LightGreen     0.564706f, 0.933333f, 0.564706f&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
Colors were added with Materials in [[BZFlag 2.0.0]].&lt;br /&gt;
&lt;br /&gt;
==Editor Support==&lt;br /&gt;
Color support is dependent on the support for the containing features in any specific editor.&lt;br /&gt;
&lt;br /&gt;
==External links==&lt;br /&gt;
Wikipedia article on RGB colorspace http://en.wikipedia.org/wiki/RGB&amp;lt;br&amp;gt;&lt;br /&gt;
A Page with samples of these colors. http://web.njit.edu/~walsh/rgb.html&lt;br /&gt;
[[category:Map_Objects]]&lt;br /&gt;
[[category:Map Making]]&lt;/div&gt;</summary>
		<author><name>Yosef</name></author>
	</entry>
</feed>