<?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=Flash</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=Flash"/>
	<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/Special:Contributions/Flash"/>
	<updated>2026-05-10T13:22:33Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Talk:Quick_keys&amp;diff=8259</id>
		<title>Talk:Quick keys</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Talk:Quick_keys&amp;diff=8259"/>
		<updated>2012-03-22T06:05:14Z</updated>

		<summary type="html">&lt;p&gt;Flash: Talk is good, but this page is questionable&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I question the value of &lt;br /&gt;
&lt;br /&gt;
# default mappings. Because they are easily customizable, players who use quick keys are most likely to set them in a way that works for their style of play. Since there are as many styles as there are players (or more) it will be very hard to come up with the &amp;quot;right&amp;quot; set of defaults.&lt;br /&gt;
# these mappings. These messages seem more appropriate to individual players than to team or all. Why would you tell the world &amp;quot;Thanks&amp;quot; or &amp;quot;Geno gone&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Flash</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Other_Links&amp;diff=5066</id>
		<title>Other Links</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Other_Links&amp;diff=5066"/>
		<updated>2008-11-30T22:13:36Z</updated>

		<summary type="html">&lt;p&gt;Flash: updated league URL&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&#039;&#039;Feel free to edit this page and add more BZFlag related links.&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
TimRiker adds: All distributed BZFlag binaries &#039;&#039;&#039;must&#039;&#039;&#039; comply with the BZFlag license and release the source code as well as the patches. Any changes are allowed including &amp;quot;cheat&amp;quot; clients, as long as they comply with the license. Please refrain from running &amp;quot;cheat&amp;quot; clients on servers where it is not explicitly allowed. Changing the base BZFlag protocol version number will let your modified client only work with others of its kind.&lt;br /&gt;
&lt;br /&gt;
== *.BZFlag.org sites ==&lt;br /&gt;
* [http://my.BZFlag.org/bb/ my.BZFlag.org/bb/] bzflag forum (&#039;centrum&#039;)&lt;br /&gt;
* [http://my.BZFlag.org/ my.BZFlag.org] - stats etc&lt;br /&gt;
* [http://list.BZFlag.org/ list.BZFlag.org] stats on some of the BZFlag servers&lt;br /&gt;
* [http://league.bzflag.net/ league.bzflag.net/] bzflag Ducati-style league&lt;br /&gt;
&lt;br /&gt;
== Other BZFlag-related sites ==&lt;br /&gt;
* [http://wtwrp.doenemeier.de/ WTWRP] German BZFlag Community&lt;br /&gt;
* [http://macmapping.synthasite.com For mapmaker:]A Forum for mapmaking on macs&lt;br /&gt;
* [http://coam.servegame.com Community of American Mapmakers] (CoAM) website&lt;br /&gt;
* [http://mybzflag.net MyBZFlag.net] Map Development Group :: Giving you even more BZW.&lt;br /&gt;
* [http://bzfmaps.net Bzfmaps.net] BZFlags Map Hosting site&lt;br /&gt;
* [http://s14.invisionfree.com/Alex_Universe/index.php? Alex_Universe Forum] Another Bzflag Forum   other things.&lt;br /&gt;
* [http://www.cruzan.info/comp/comp.html BZRAND 6.3X random map maker for 1.x style]&lt;br /&gt;
* [http://www.cruzan.info/comp/comp.html BZCHECKER 1.X a map checker/validator ]can handle some 2.X stuff&lt;br /&gt;
* [http://bzflag.at BZFlag Homepage in Austria]&lt;br /&gt;
* [http://bzbb.bzflag.at BZFlag Forum for Austria]&lt;br /&gt;
* [http://bzflag.de bzflag.de] - German bzflag Homepage with loads of information.&lt;br /&gt;
* [http://shellshock.bzflag.bz/ Shell Shock] - News, The Map Factory, Guides, Cool Bits and 2 rotating game servers.&lt;br /&gt;
* [http://linux.oreillynet.com/pub/a/linux/2003/11/20/bzflag.html O&#039;Reilly Network review]&lt;br /&gt;
* [http://www.cafeshops.com/hellonwheels/ Hell On Wheels Official Store] Get your official HoW Thongs and Tees here&lt;br /&gt;
* [http://www-swiss.ai.mit.edu/~bentz/bzflag/bzflag.html Purple Panzer&#039;s BZFlag Page]&lt;br /&gt;
* [http://www.planet-mofo.com/ Planet-Mofo] - website, league, blogs, stuff.&lt;br /&gt;
* [http://www.cafeshops.com/bzflag T-Shirts and more?] Now with Noodleman&#039;s O&#039;REALLY shirt. More designs wanted.&lt;br /&gt;
* [http://www.sourceforge.net/projects/bzflag Sourceforge project]&lt;br /&gt;
* [http://www.bzflag.de/ Phagozytose German BZFlag Clan]&lt;br /&gt;
* [http://pub33.ezboard.com/bbzflag The old unofficial forum]&lt;br /&gt;
* [http://sourceforge.net/mail/?group_id=3248 The mailing lists] on Sourceforge&lt;br /&gt;
* [http://www.cruzan.info/bzflag/bzflag.html Sid6.7 Bzflag Worlds Website!] BZFlag help, IP cheater list and some links&lt;br /&gt;
* [http://zeebrothers.net/ The Legendary Zeebrothers]  Server&lt;br /&gt;
* [http://mybzflag.net/ MDG - Map Development Group - Mapping help]&lt;br /&gt;
* [http://cruelmania.freeforums.org/ Cruel dog&#039;s CruelMania website and forums - Unofficial forums]&lt;br /&gt;
&lt;br /&gt;
== Halted BZFlag-related sites ==&lt;br /&gt;
* [http://www.icosaedro.it/bze/ BZFlag map editor in M2] Note - editor development appears to have stopped in December 2004, hence it&#039;s unlikely to handle [[BZW]] v2 objects&lt;br /&gt;
* [http://bzfsgui.sourceforge.net The BZFlag Server GUI Project] on Sourceforge.  Note - development appears to have stopped in November 2003 and states that bzfs 1.10 is the latest release it supports&lt;br /&gt;
&lt;br /&gt;
== Other non-BZFlag-related sites ==&lt;br /&gt;
* [http://www.download-free-games.com/war_game_download/index.htm War Games]&lt;br /&gt;
* [http://www.freewebs.com/shellshockbz/ Shell Shock]&lt;br /&gt;
* [http://www.kelsoes.com/how/ Hell On Wheels] Note - this site was marked as under construction when access was attempted on 14th July 2007&lt;/div&gt;</summary>
		<author><name>Flash</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Compiling&amp;diff=4772</id>
		<title>Compiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Compiling&amp;diff=4772"/>
		<updated>2008-07-23T01:27:37Z</updated>

		<summary type="html">&lt;p&gt;Flash: Added some real XCode content&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
Compiling BZFlag is the act of taking the raw source codes for the game and using tools to build an executable application(s) for a target system.&lt;br /&gt;
&lt;br /&gt;
==Source Code==&lt;br /&gt;
In order to compile a user must have his or her own copy of the [[BZFlag_Source|Source Code]]. The code can be obtained from a source archive from the [[Download]] page, or from the [[BZFlag_SVN]] server.&lt;br /&gt;
&lt;br /&gt;
==Readme Files==&lt;br /&gt;
Users should always read the README files for the appropriate operating system. These files are located in the root directory of the source code tree.&lt;br /&gt;
&lt;br /&gt;
==Compilers==&lt;br /&gt;
BZFlag is capable of being built on a number of compilers. The compiler used will depend in some way on the operating system of the computer doing the build.&lt;br /&gt;
&lt;br /&gt;
Linux computers, use the GCC compiler.&lt;br /&gt;
Macintosh Computers use the XCode compiler&lt;br /&gt;
Windows Computers can use the Visual C++ compiler, or the MinGW compiler (based on GCC)&lt;br /&gt;
&lt;br /&gt;
===GCC===&lt;br /&gt;
The GCC build as a number of requirements;&lt;br /&gt;
* Automake X.XX&lt;br /&gt;
* Autoconf X.XX&lt;br /&gt;
* Autotools X.XX&lt;br /&gt;
* SDL Development libraries 1.2.10 or greater&lt;br /&gt;
* OpenGL Development libraries 1.1 or greater&lt;br /&gt;
&lt;br /&gt;
If the required dependencies are installed, the user must then run the following commands from at root level of the source tree&lt;br /&gt;
&lt;br /&gt;
  ./autogen.sh&lt;br /&gt;
  ./configure&lt;br /&gt;
  ./make&lt;br /&gt;
  ./make install&lt;br /&gt;
&lt;br /&gt;
Please note that depending on permissions levels the &#039;&#039;&#039;make install&#039;&#039;&#039; command may need to be run as an administrator or root.&lt;br /&gt;
&lt;br /&gt;
===XCode===&lt;br /&gt;
Launch XCode and open the &#039;&#039;&#039;bzflag/BZFlag.xcodeproj&#039;&#039;&#039; project. Note that XCode should have &#039;&#039;&#039;BZFlag&#039;&#039;&#039; selected as the active target and &#039;&#039;&#039;Development&#039;&#039;&#039; as the active build configuration. Click on &#039;&#039;&#039;Targets&#039;&#039;&#039; then click the &#039;&#039;&#039;Build&#039;&#039;&#039; icon. When this process completes, your application will be in &#039;&#039;&#039;bzflag/build/Development&#039;&#039;&#039;. You can then move it wherever you like.&lt;br /&gt;
&lt;br /&gt;
===Visual C++===&lt;br /&gt;
&lt;br /&gt;
==== 2.0.x ====&lt;br /&gt;
&lt;br /&gt;
==== 2.99.x =====&lt;br /&gt;
&lt;br /&gt;
===Other build systems===&lt;br /&gt;
Other build systems may be supported in the various readme files (minGW, IRIX, SOLARIS,etc..)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Compiling]]&lt;/div&gt;</summary>
		<author><name>Flash</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Talk:Sample_conf&amp;diff=4611</id>
		<title>Talk:Sample conf</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Talk:Sample_conf&amp;diff=4611"/>
		<updated>2008-05-19T04:33:33Z</updated>

		<summary type="html">&lt;p&gt;Flash: Recommend removing redundant page.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page would seem to be redundant with [[BZFS_Command_Line_Options]]. The latter page is more useful, in my opinion. If this page is to be retained, perhaps it should just point to the sample conf that is distributed with the game.&lt;br /&gt;
--[[User:Flash|Flash]] 00:33, 19 May 2008 (EDT)&lt;/div&gt;</summary>
		<author><name>Flash</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=BZFS_API&amp;diff=4535</id>
		<title>BZFS API</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=BZFS_API&amp;diff=4535"/>
		<updated>2008-05-02T18:39:28Z</updated>

		<summary type="html">&lt;p&gt;Flash: fixed typos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DoDoc|fill in articles for all API functions}}&lt;br /&gt;
&lt;br /&gt;
The BZFS API (Application Programmers Interface) is a set of C++ functions, structures, and classes that is exported by [[BZFS]] to be used by [[Plug-ins]]. The API provides access to the various states and data structures of a running BZFS game and is the primary method of communication between a plug-in and the game server.&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
The BZFS API is defined entirely in the &#039;&#039;&#039;bzfsAPI.h&#039;&#039;&#039; header file that is part of the [[BZFlag Source]] code. The header is also included with each install of the BZFlag installer for Microsoft Windows.&lt;br /&gt;
&lt;br /&gt;
Plug-ins include this file in their source code so that they may access the functions it contains.&lt;br /&gt;
&lt;br /&gt;
==Naming Conventions==&lt;br /&gt;
All BZFS API code structures will begin with the prefix &#039;&#039;&#039;bz_&#039;&#039;&#039; for clarification and to prevent conflicts with names of code structures inside BZFS or any plug-ins.&lt;br /&gt;
&lt;br /&gt;
==API Versions==&lt;br /&gt;
The API was added in version 2.0.4 of BZFlag. While working well for many users, it was found to be lacking in a number of features that would make make it difficult for plug-ins to run when the API itself was changed.&lt;br /&gt;
&lt;br /&gt;
As of version 2.1 of BZFlag, the entire API was versioned and set up to use derived classes to that plug-ins written to use an older version of the API will work in newer versions of the software. Newer data structures would be put into further derived classes and would not be seen by the older plug-in. Due to this change a large number of API functions changed in name. This change causes all older 2.0.x plug-ins to no longer work with out a source code change. Once older plug-ins are updated to the new 2.1 API they will use the new versioning system and work fine in newer versions with out any needed changes.&lt;br /&gt;
&lt;br /&gt;
==Entry Points==&lt;br /&gt;
There are 3 primary entry points into each plug-in. These entry points are the 3 core functions that every plug-in must implement.&lt;br /&gt;
&lt;br /&gt;
 BZF_PLUGIN_CALL int [[bz_Load]] ( const char* command );&lt;br /&gt;
 BZF_PLUGIN_CALL int [[bz_Unload]] ( void );&lt;br /&gt;
 BZF_PLUGIN_CALL int [[bz_GetVersion]] ( void );&lt;br /&gt;
&lt;br /&gt;
[[bz_Load]] is called when the plug-in is first initialized. This is when the plug-in should register any [[Event(API)|event handlers]] needed and initialize any &amp;quot;one time&amp;quot; startup data.&lt;br /&gt;
&lt;br /&gt;
[[bz_Unload]] is called when a plug-in is no longer needed and will be shut down. This is most commonly called when bzfs is shutting down, or when a plug-in is unloaded manualy.&lt;br /&gt;
&lt;br /&gt;
[[bz_GetVersion]] is called by bzfs before any other functions are called. The function should return the version of the API that it is written for. This is to prevent bzfs from attempting to load plug-ins that use a newer incompatible API.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;bzfsAPI.h&#039;&#039;&#039; defines a C MACRO to help ease the implementation of this function. All a plug-in must do is put the macro;&lt;br /&gt;
&lt;br /&gt;
 BZ_GET_PLUGIN_VERSION&lt;br /&gt;
&lt;br /&gt;
somewhere in its sources, and then export the function. This will automatically return the API version of the current API you are using. See the sample plug-ins for examples. These will be the only 3 functions called by bzfs for non-event actions.&lt;br /&gt;
&lt;br /&gt;
All entry point functions should be preceded with the BZF_PLUGIN_CALL macro. This macro will tell your compiler to export these functions so bzfs can call them after the plug-in is loaded.&lt;br /&gt;
&lt;br /&gt;
==Types==&lt;br /&gt;
&lt;br /&gt;
Due to how Microsoft Windows handles memory access between an application and dynamically loaded Libaries(DLLs), there are a few custom data types that are used in the API. These are used for common STL style containers, for strings and lists.&lt;br /&gt;
&lt;br /&gt;
===bz_ApiString===&lt;br /&gt;
Any text passed back from the API or events will come in the form of a [[bz_ApiString]]. This is a class defined in the API that behaves much like a std::string. The &#039;c_str()&#039; method can be used to get the text out as a normal &#039;const char*&#039;. The class also supports many assignment functions for setting it&#039;s contents.&lt;br /&gt;
&lt;br /&gt;
A plug-in should never need to make variables of its&#039; own using the [[bz_ApiString]] type, but should use a standard stl std::string instead, [[bz_ApiString]] provides an appropriate assignment operator.&lt;br /&gt;
&lt;br /&gt;
[[bz_ApiString]] also includes some utility functions such as replace all and tokenize that are commonly needed by plug-ins.&lt;br /&gt;
&lt;br /&gt;
===bz_APILists===&lt;br /&gt;
&lt;br /&gt;
A few API functions require lists of integers, strings, or floats. For these functions the plug-in will need to use one of the following list classes. These classes are similar to the std::vector in implementation. When a plug-in needs to allocate one of these lists, it must use the appropriate allocator function, so BZFS can make a new list for the plug-in to use. These will return a pointer to a new list for the plug-in to use. When the plug-in is finished with the list, it needs to tell BZFS to delete the list with a call to the appropriate delete function.&lt;br /&gt;
The lists types are;&lt;br /&gt;
  {| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;20&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
  !List&lt;br /&gt;
  !allocator function&lt;br /&gt;
  !delete function&lt;br /&gt;
  !contained type&lt;br /&gt;
  |-&lt;br /&gt;
  |[[bz_APIIntList]]&lt;br /&gt;
  |[[bz_newIntList]]&lt;br /&gt;
  |[[bz_deleteIntList]]&lt;br /&gt;
  |int&lt;br /&gt;
  |-&lt;br /&gt;
  |[[bz_APIFloatList]]&lt;br /&gt;
  |[[bz_newFloatList]]&lt;br /&gt;
  |[[bz_deleteFloatList]]&lt;br /&gt;
  |float&lt;br /&gt;
  |-&lt;br /&gt;
  |[[bz_APIStringList]]&lt;br /&gt;
  |[[bz_newStringList]]&lt;br /&gt;
  |[[bz_deleteStringList]]&lt;br /&gt;
  |[[bz_ApiString]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
===Enumerations===&lt;br /&gt;
A number of enumerations exist in the API and are used by a number of API functions and events.&lt;br /&gt;
  [[bz_eTeamType]]&lt;br /&gt;
  [[Event(API)|bz_eEventType]]&lt;br /&gt;
  [[bz_eShotType]]&lt;br /&gt;
  [[bz_eGameType]]&lt;br /&gt;
  [[bz_ePlayerStatus]]&lt;br /&gt;
  [[bz_eWorldObjectType]]&lt;br /&gt;
  [[bz_eAPIColType]]&lt;br /&gt;
  [[bz_ePlayerType]]&lt;br /&gt;
  [[bz_eRejectCodes]]&lt;br /&gt;
  [[bz_ePlayerDeathReason]]&lt;br /&gt;
&lt;br /&gt;
==Events==&lt;br /&gt;
Plug-ins can register callbacks so they can be notified of various actions and state changes in the current BZFS game. These events tell a plug-in when important things happen, such as when a player has spawned, or is killed. These events are the primary form of communication from the BZFS server into the plug-in.&lt;br /&gt;
&lt;br /&gt;
See the [[Event(API)|API events]] page for more detailed information on events.&lt;br /&gt;
&lt;br /&gt;
==Functions==&lt;br /&gt;
The BZFS API provides a number of functions to plug-ins for use in querying the current game state. Functions are used both to get information about the game, and to trigger in game actions, such as activating a world weapon.&lt;br /&gt;
&lt;br /&gt;
See the [[Functions(API)|API Functions]] page for more information on functions.&lt;br /&gt;
&lt;br /&gt;
==Wiki Documnetation==&lt;br /&gt;
The documentation for the API provided on this wiki is mostly concerned with the current development version of the software. There have been changes over time to the API. Any changes to classes and functions will be noted in the new documentation under a &#039;&#039;History&#039;&#039; section. In general the initial API that was released with the 2.0.x product line was not consistent, and many of these inconsistencies are being worked out with newer versions of the API (3.0 and later)&lt;br /&gt;
&lt;br /&gt;
All API developers should use the bzfsAPI.h file as well for exact spellings of methods and parameters.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
&lt;br /&gt;
[[Event(API)|API Events]]&lt;br /&gt;
&lt;br /&gt;
[[Functions(API)|API Functions]]&lt;br /&gt;
&lt;br /&gt;
[[Plug-ins]]&lt;br /&gt;
&lt;br /&gt;
[[BZFS]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Plug-Ins]]&lt;/div&gt;</summary>
		<author><name>Flash</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Talk:Builds_List&amp;diff=4525</id>
		<title>Talk:Builds List</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Talk:Builds_List&amp;diff=4525"/>
		<updated>2008-04-25T04:37:34Z</updated>

		<summary type="html">&lt;p&gt;Flash: Nuke this page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Is there really any benefit to this page? Every time a new release comes out, all the clever titles for the following sections need to be updated. For example, 2.0.10 is now released, so the &amp;quot;unstable&amp;quot; tag no longer applies. I&#039;d vote to remove this page.--[[User:Flash|Flash]] 00:37, 25 April 2008 (EDT)&lt;/div&gt;</summary>
		<author><name>Flash</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=BZFS_Command_Line_Options&amp;diff=4524</id>
		<title>BZFS Command Line Options</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=BZFS_Command_Line_Options&amp;diff=4524"/>
		<updated>2008-04-24T21:19:38Z</updated>

		<summary type="html">&lt;p&gt;Flash: add concept of &amp;quot;include&amp;quot; conf files&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;BZFS supports a number of command line options that let you set the various modes and parameters for the game. &lt;br /&gt;
&lt;br /&gt;
==Use==&lt;br /&gt;
Any command line option can be passed to BZFS in the command line, or placed in a text file passed in with the -conf parameter.&lt;br /&gt;
&lt;br /&gt;
==Config files==&lt;br /&gt;
A [[Sample conf|config file]] is simply a text file with a list of command line options, one per line. This file can be the parameter to the -conf command line option. BZFS will load all options in the config file as if they had been passed in as runtime options. Note that a config file may itself include the -conf option, allowing one config file to &amp;quot;include&amp;quot; another. This could be useful if a group of servers (hosted on the same machine) want to share common settings.&lt;br /&gt;
&lt;br /&gt;
==The Options==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-a&#039;&#039;&#039; &#039;&#039;linear angular&#039;&#039;&lt;br /&gt;
Sets the maximum linear and angular accelerations. The units are somewhat arbitrary so you&#039;ll have to experiment to find suitable values. Positive values will set limits to the acceleration and lower they are, greater is the inertia. Zero or negative values disable acceleration limits. &#039;&#039;&#039;-a 50 38&#039;&#039;&#039; is recommended for standard-speed servers.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-admsg&#039;&#039;&#039; &#039;&#039;message&#039;&#039;&lt;br /&gt;
Define a message which will be broadcast to all players every 15 minutes. This option can be used multiple times to define a multi-line message.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-advertise&#039;&#039;&#039; &#039;&#039;groupname,groupname,...&#039;&#039;&lt;br /&gt;
Allows control of who can see this server on the server list. Use -advertise NONE to make a private server (no one will see the server, but global logins can be used). The default, if -advertise is not specified, is to allow everyone to see the server. Otherwise, your server will only be listed to members of the groups which you specify with -advertise.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-autoTeam&#039;&#039;&#039;&lt;br /&gt;
Instructs the server to automatically assign joining players to the team that needs more players, overriding user preference. For specifics on operation, see [[Auto Team]].&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-b&#039;&#039;&#039;&lt;br /&gt;
When  -c  is  supplied, this option randomly rotates the buildings.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-ban&#039;&#039;&#039; &#039;&#039;ip{,ip}*&#039;&#039; &lt;br /&gt;
Prohibits connections from the listed IP addresses. Trailing 255 bytes are treated as mask bytes.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-banfile&#039;&#039;&#039; &#039;&#039;filename&#039;&#039;&lt;br /&gt;
Specifies the name of a file where bzfs will store the banlist. It will load the banlist from this file when it starts (if the file exists), and write the banlist back to the file when someone gets banned or unbanned. If this option isn&#039;t given the banlist will not be saved.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-banTime&#039;&#039;&#039;&lt;br /&gt;
Default number of minutes player should be banned (unspecified, the default is 300).&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-c&#039;&#039;&#039;&lt;br /&gt;
Enables the capture-the-flag style game. By default this allocates one team flag per team. This can be modified see &#039;&#039;&#039;+f&#039;&#039;&#039; &#039;&#039;team&#039;&#039;. By default, the free-for-all style is used.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-cache&#039;&#039;&#039; &#039;&#039;worldCacheURL&#039;&#039;&lt;br /&gt;
Specifies the URL for the world cache file. This is a binary file that clients will attempt to download before getting the world from the bzfs server.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-cacheout&#039;&#039;&#039; &#039;&#039;filename&#039;&#039;&lt;br /&gt;
Save the currently specified world into a binary cache file and exit.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-conf&#039;&#039;&#039; &#039;&#039;configfilename&#039;&#039;&lt;br /&gt;
Specifies the name of a configuration file to be used to set all of the bzfs options, rather than setting them on the command line.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-cr&#039;&#039;&#039;&lt;br /&gt;
Enables the capture-the-flag style game with random map. You can optionally specify a building density by providing a number (default is 5). One team flag per team is provided, but more can be added through &#039;&#039;&#039;+f&#039;&#039;&#039; &#039;&#039;team&#039;&#039;. By default, the free-for-all style is used.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-d&#039;&#039;&#039;&lt;br /&gt;
Increase debugging level. If more &#039;&#039;&#039;-d&#039;&#039;&#039; is given, more debugging info is obtained.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-density&#039;&#039;&#039; &#039;&#039;num&#039;&#039;&lt;br /&gt;
Specify density for buildings, i.e. the higher the integer number, the more buildings you will get. This applies to automatically generated maps only.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-disableBots&#039;&#039;&#039;&lt;br /&gt;
Prevent clients from using the ROGER autopilot or from using robots.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;+f&#039;&#039;&#039; &#039;&#039;{good|bad|teamflag-id}[{count}]&#039;&#039;&lt;br /&gt;
Forces the existence of the given flag. If specified multiple times for the same flag-id, then that many flags will appear. The good argument is equivalent to specifying &#039;&#039;&#039;+f&#039;&#039;&#039; once for each kind of good flag. Same goes for the bad argument. The teamflag-id must match one of the predefined [[FlagCode|Flag Codes]].&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-f&#039;&#039;&#039; &#039;&#039;{flag-id}&#039;&#039;&lt;br /&gt;
Restricts a certain flag from existing.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-fb&#039;&#039;&#039;&lt;br /&gt;
Allow flags on box buildings.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-filterCallsigns&#039;&#039;&#039;&lt;br /&gt;
Turn on the filtering of callsigns and email addresses. Callsigns and addresses are compared against bad words provided via &#039;&#039;&#039;-badwords&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-filterChat&#039;&#039;&#039;&lt;br /&gt;
Turn on the filtering of chat messages. Messages that contain words listed via a &#039;&#039;&#039;-badwords&#039;&#039;&#039; file are replaced with !@#$%^&amp;amp;* characters.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-filterSimple&#039;&#039;&#039;&lt;br /&gt;
By default, all filtering is aggressive, matching much more than what is strictly listed in a &#039;&#039;&#039;-badwords&#039;&#039;&#039; file for convenience. Providing this option will make the &#039;&#039;&#039;-filterCallsigns&#039;&#039;&#039; and &#039;&#039;&#039;-filterChat&#039;&#039;&#039; comparisons exact match only.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-g&#039;&#039;&#039;&lt;br /&gt;
Quit after serving one game.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-groupdb&#039;&#039;&#039; &#039;&#039;file&#039;&#039;&lt;br /&gt;
Load groups from file&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-h&#039;&#039;&#039;&lt;br /&gt;
Buildings are given random heights.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-handicap&#039;&#039;&#039;&lt;br /&gt;
Players are given a handicap advantage based on their ability in relation to the other players. Handicapped players will have faster tanks and shots. The handicap is determined by the player&#039;s score in relation to other players.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-help&#039;&#039;&#039;&lt;br /&gt;
Shows a help page and lists all the valid flag id&#039;s.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-helpmsg&#039;&#039;&#039; &#039;&#039;file name&#039;&#039;&lt;br /&gt;
Create a help message accessible by /help name, which prints the contents of file. Restricted to 10 lines per help message.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-i&#039;&#039;&#039; &#039;&#039;interface&#039;&#039;&lt;br /&gt;
Server will listen for and respond to &#039;&#039;pings&#039;&#039; (sent via broadcast) on the given interface. Clients use this to find active servers on the network. This is the TCP/UDP/IP address the server will listen on.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-j&#039;&#039;&#039;&lt;br /&gt;
Allows jumping.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-lagdrop&#039;&#039;&#039; &#039;&#039;warn-count&#039;&#039;&lt;br /&gt;
Kicks players after warn-count lag warnings.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-lagwarn&#039;&#039;&#039; &#039;&#039;time/ms&#039;&#039;&lt;br /&gt;
Send warnings to players that lag more than time.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-loadplugin&#039;&#039;&#039; &#039;&#039;/filename&#039;&#039;&lt;br /&gt;
[[http://my.bzflag.org/w/Plugins]]&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-mp&#039;&#039;&#039; &#039;&#039;total | rogue,red,green,blue,purple,observer&#039;&#039;&lt;br /&gt;
Sets the maximum number of players, total or per team.A single value sets the total number of players allowed. Five comma separated values set the maximum for each team. If a count is left blank then no limit is set for that team, except for the limit on the total number of players. Both forms may be provided.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-mps&#039;&#039;&#039; &#039;&#039;max-score&#039;&#039;&lt;br /&gt;
Sets a maximum score for individual players. The first player to reach this score is declared the winner and the game is over.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-ms &#039;&#039;shots&#039;&#039;&lt;br /&gt;
Allows up to shots simultaneous shots for each player. This is 1 by default.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-mts&#039;&#039;&#039; &#039;&#039;max-score&#039;&#039;&lt;br /&gt;
Sets a maximum score for teams. The first team to reach this score is declared the winner and the game is over.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-noMasterBanlist&#039;&#039;&#039;&lt;br /&gt;
Server will not attempt to load the [[Master Ban]] list from the internet.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-p&#039;&#039;&#039; &#039;&#039;port&#039;&#039;&lt;br /&gt;
Listen for game connections on port instead of the default port.Use &#039;&#039;&#039;-help&#039;&#039;&#039; to print the default port, or use &#039;&#039;&#039;-d&#039;&#039;&#039; debug printing.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-passdb&#039;&#039;&#039; &#039;&#039;file&#039;&#039;&lt;br /&gt;
Load passwords from file&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-passwd&#039;&#039;&#039; &#039;&#039;password&#039;&#039;&lt;br /&gt;
Specify a server administrator password for use in remote administration such as /kick, /ban, /mute, etc messages.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-pidfile&#039;&#039;&#039; &#039;&#039;filename&#039;&#039;&lt;br /&gt;
Specify a file where the server will write its process ID so it may be used for remote administration.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-poll&#039;&#039;&#039; &#039;&#039;variable=value&#039;&#039;&lt;br /&gt;
Configure several aspects of the in-game polling system.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-public&#039;&#039;&#039;&lt;br /&gt;
Causes the server to register itself with a list server, which clients can query to get a list of bzfs servers. By default, a server will respond to broadcast queries, allowing clients to find servers running on the standard port on the local subnet.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-publicaddr&#039;&#039;&#039; &#039;&#039;address[:port]&#039;&#039;&lt;br /&gt;
Advertise this server with the given address and port. Only has an effect when used with &#039;&#039;&#039;-public&#039;&#039;&#039;. Normally a server advertises itself at the local address and port. Some servers are not accessible from the internet at this address (for example servers behind a firewall using Network Address Translation). Use this option to specify the address and/or port that internet users should use to access this server.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-publiclist&#039;&#039;&#039; &#039;&#039;url&#039;&#039;&lt;br /&gt;
Advertise this server on the list servers listed at url. Only has an effect when used with &#039;&#039;&#039;-public&#039;&#039;&#039;. A built-in url is used by default. The BZFlag clients use the same built-in url so, by default, clients will see public servers automatically. This argument may be provided multiple times to publicize a server to multiple list servers.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-q&#039;&#039;&#039;&lt;br /&gt;
If specified, the server will not listen for nor respond to ``pings&#039;&#039;. BZFlag sends out these pings to give the user a list of available servers.This effectively makes the server private, especially if the &#039;&#039;&#039;-p&#039;&#039;&#039; option is also used.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;+r&#039;&#039;&#039;&lt;br /&gt;
Makes most shots ricochet. Super bullets, shock waves, and guided missiles do not.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-rabbit&#039;&#039;&#039; &#039;&#039;[score|killer|random]&#039;&#039;&lt;br /&gt;
Enables the rabbit-hunt style game. By default, the free-for-all style is used. You must specify the algorithm used to pick a new rabbit when the old one dies. The score algorithm uses a modified wins/(wins+losses) score and picks the top scoring player to be the new rabbit. The killer algorithm specifies a reverse tag game where whomever kills the rabbit becomes the new rabbit. The random algorithm randomly picks a new rabbit without regard to score. (The score algorithm is the original behavior.)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-recbuf&#039;&#039;&#039; &#039;&#039;size&#039;&#039;&lt;br /&gt;
Start with the recording buffer active, with the specified size (in megabytes).&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-recbufonly&#039;&#039;&#039;&lt;br /&gt;
Disable recording straight to files&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-recdir&#039;&#039;&#039; &#039;&#039;directory&#039;&#039;&lt;br /&gt;
Specify the directory for record and replay files.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-replay&#039;&#039;&#039;&lt;br /&gt;
Start the server in replay mode.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-reportfile&#039;&#039;&#039; &#039;&#039;filename&#039;&#039;&lt;br /&gt;
Enable the /report command and log all reports to &#039;&#039;filename&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-reportpipe&#039;&#039;&#039; &#039;&#039;command&#039;&#039;&lt;br /&gt;
Enable the /report command and execute &#039;&#039;command&#039;&#039; when a report is filed. This can be used together with, or instead of the &#039;&#039;&#039;-reportfile&#039;&#039;&#039; option.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-requireudp&#039;&#039;&#039;&lt;br /&gt;
Require clients to use parallel UDP. If players fire before opening a UDP channel, kick them off the server.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;+s&#039;&#039;&#039; &#039;&#039;num-flags&#039;&#039;&lt;br /&gt;
The server will have an extra num-flags random super flags available at all times. The &#039;&#039;&#039;-f&#039;&#039;&#039; option can be used to restrict which types of flags will be added. Required flags given by the &#039;&#039;&#039;+f&#039;&#039;&#039; option are not included in the num-flags total.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-s&#039;&#039;&#039; &#039;&#039;num-flags&#039;&#039;&lt;br /&gt;
The server will have up to num-flags random super flags available at any time.The &#039;&#039;&#039;-f&#039;&#039;&#039; option can be used to restrict which types of flags will be added. Required flags given by the &#039;&#039;&#039;+f&#039;&#039;&#039; option are not included in the &#039;&#039;num-flags&#039;&#039; total.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-sa&#039;&#039;&#039;&lt;br /&gt;
Antidote flags are provided for players with bad flags.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-sb&#039;&#039;&#039;&lt;br /&gt;
Allow spawns on box buildings.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-set&#039;&#039;&#039; &#039;&#039;name value&#039;&#039;&lt;br /&gt;
Set BZDB variable name to value&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-sl&#039;&#039;&#039; &#039;&#039;id num&#039;&#039;&lt;br /&gt;
Restrict flag id to num shots.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-spamtime&#039;&#039;&#039; &#039;&#039;time&#039;&#039; &lt;br /&gt;
Minimum &#039;&#039;time&#039;&#039; between player chat messages that are alike.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-spamwarn&#039;&#039;&#039; &#039;&#039;warnLimit&#039;&#039;&lt;br /&gt;
Number of warnings a player/spammer gets, who violates &#039;&#039;&#039;-spamtime&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-speedtol&#039;&#039;&#039; &#039;&#039;factor&#039;&#039;&lt;br /&gt;
Override the default speed auto kick factor. The factor should not be less then 1.0. The factor is a multiplier.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-srvmsg&#039;&#039;&#039; &#039;&#039;message&#039;&#039;&lt;br /&gt;
Define a server welcome message. This option can be used multiple times to define a multiline message.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-st&#039;&#039;&#039; &#039;&#039;time&#039;&#039;&lt;br /&gt;
Bad flags are automatically dropped after time seconds.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-sw&#039;&#039;&#039; &#039;&#039;count&#039;&#039;&lt;br /&gt;
Bad flags are automatically dropped after count wins. Capturing a team flag does not count as a win.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-synctime&#039;&#039;&#039;&lt;br /&gt;
Forces all clients to use the same time of day.T he current time is determined by the server&#039;s clock. This disables the + and - keys on the clients.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-t&#039;&#039;&#039;&lt;br /&gt;
Adds teleporters to the game.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-timemanual&#039;&#039;&#039; &lt;br /&gt;
The countdown has to be started manually using the /countdown command. This is useful for matches.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-tk&#039;&#039;&#039;&lt;br /&gt;
Changes the default behavior where a player dies when he kills a teammate. When using this option, he will just get a -1 score penalty for the kill but not be killed in game.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-tkannounce&#039;&#039;&#039;&lt;br /&gt;
Announces team kills to the admin channel&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-tkkr&#039;&#039;&#039; &#039;&#039;percent&#039;&#039;&lt;br /&gt;
Kicks players whose team killing to normal kill ratio is greater than percent [1-100]. A start up grace period is given to players.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-ts&#039;&#039;&#039; &#039;&#039;[micros]&#039;&#039;&lt;br /&gt;
Include timestamp information in DEBUG output useful for logging. If micros is specified, microseconds will be added to the timestamp.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-userdb&#039;&#039;&#039; &#039;&#039;file&#039;&#039;&lt;br /&gt;
Load group associations from file&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-vars&#039;&#039;&#039; &#039;&#039;file&#039;&#039;&lt;br /&gt;
Loads values for game configurable variables from file. Entries are one per line in the form: set variable value. For a list of variables that are configurable, in the BZFlag client, send a message with /set as the text.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-version&#039;&#039;&#039;&lt;br /&gt;
Prints the version number of the executable.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-vetoTime&#039;&#039;&#039;&lt;br /&gt;
Max seconds authorized user has to abort poll(default is 20).&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-votePercentage&#039;&#039;&#039;&lt;br /&gt;
Percentage of players required to affirm a poll (unspecified, the default is 50.1%).&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-voteRepeatTime&#039;&#039;&#039;&lt;br /&gt;
Minimum seconds required before a player may repeat a vote. &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-world&#039;&#039;&#039; &#039;&#039;world-file&#039;&#039;&lt;br /&gt;
Reads a specific BZFlag .bzw world file in [[BZW]] format as the game map.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;-worldsize&#039;&#039;&#039; &#039;&#039;world-size&#039;&#039;&lt;br /&gt;
Changes the size for random maps&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
[[BZW|BZW world format]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Server]]&lt;/div&gt;</summary>
		<author><name>Flash</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=BZFlag_on_IRC&amp;diff=4523</id>
		<title>BZFlag on IRC</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=BZFlag_on_IRC&amp;diff=4523"/>
		<updated>2008-04-24T12:56:00Z</updated>

		<summary type="html">&lt;p&gt;Flash: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The BZFlag communities use the [http://freenode.net/ freenode IRC network] for communication and collaboration. [http://en.wikipedia.org/wiki/IRC IRC]&lt;br /&gt;
&lt;br /&gt;
The [http://freenode.net/ freenode network] is used for all IRC communications.&lt;br /&gt;
Common channels include:&lt;br /&gt;
* [irc://irc.freenode.net/#bzflag #bzflag]&lt;br /&gt;
* [irc://irc.freenode.net/#bzchat #bzchat]&lt;br /&gt;
&lt;br /&gt;
A web interface is provided to these channels at http://my.BZFlag.org/irc/irc.cgi&lt;br /&gt;
==Channels==&lt;br /&gt;
&lt;br /&gt;
===#bzflag===&lt;br /&gt;
The #bzflag channel is the primary development and support channel. The major developers and many long time community members are users. Discussions in the channel range from development and coding discussions to technical support and bug reports. #bzflag is a great channel to discuss new features and bugs. The channel is moderated by the project administration and development staff. &#039;&#039;&#039;This channel is not for help with specific servers or administration issues&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===#bzchat===&lt;br /&gt;
The #bzchat channel is a more informal channel designated for player community discussions.&lt;br /&gt;
&lt;br /&gt;
===Other channels===&lt;br /&gt;
A number of players, servers, and [[leagues]] have their own channel for more focused discussion, some of these include:&lt;br /&gt;
&lt;br /&gt;
* ##bar (DUCLeague team, The Barbarians)&lt;br /&gt;
* #BoomBZ (Team Channel for GU team [BoOm])&lt;br /&gt;
* ##bz-inc (DUCLeague team, [http://my.bzflag.org/league/index.php?link=teaminfo&amp;amp;id=689/ Bz-Incorporated])&lt;br /&gt;
* ##bzflagr (Support channel for the [http://bzflagr.net BZFlagr.net servers.])&lt;br /&gt;
* #bzfx (Support channel for the bzfx.net BZFlag servers)&lt;br /&gt;
* ##bzpod (Channel to discuss the BZFlag podcast, BZPod)&lt;br /&gt;
* ##bzw (A place to discuss map making for BZFlag, including ideas and help)&lt;br /&gt;
* #divi (Support channel for [http://divi.fairserve.net Divibox] and other [http://fairserve.bzflag.org Fairserve] servers)&lt;br /&gt;
* #dub (Support channel for the dub.bzflag.org BZFlag servers)&lt;br /&gt;
* ##ducleague (Support channel for [http://my.bzflag.org/league/ Ducati League (DucLeague)])&lt;br /&gt;
* #forestforce ([http://gu.bzleague.com/index.php?link=teaminfo&amp;amp;id=10 GULeague Team])&lt;br /&gt;
* ##guleague (Support channel for [http://gu.bzleague.com/ GamesUnited League (GULeague)])&lt;br /&gt;
* #hepcat (Support channel for borrego.hepcat.org BZFlag server) &#039;&#039;defunct&#039;&#039;&lt;br /&gt;
* ##icf (Support channel for [http://gu.bzleague.com/index.php?link=teaminfo&amp;amp;id=112 Incredible Chipper Frogs, (GULeague)])&lt;br /&gt;
* #inleague (Support channel for [http://in.bzleague.com InterNational League (INLeague)])&lt;br /&gt;
* #kas (GULeague team, KAS)&lt;br /&gt;
* ##norang (Support channel for [http://bzflag.norang.ca Norang.ca] BZFlag servers)&lt;br /&gt;
* #pillbox (Support channel for [http://pillbox.bzleague.com/ Pillbox League (PBLeague)])&lt;br /&gt;
* ##planetmofo (Support channel for [http://www.planet-mofo.com planet-mofo.com] servers)&lt;br /&gt;
* #plosileague (Support channel for [http://bzfx.net/league/ Plosileague])&lt;br /&gt;
* #silvercat (Support channel for [http://silvercat.bzflag.org/ Silvercat BZFlag servers]) &#039;&#039;defunct&#039;&#039;&lt;br /&gt;
* ##t42 ([http://gu.bzleague.com/index.php?link=teaminfo&amp;amp;id=39 GULeague team])&lt;br /&gt;
* ##untamed ([http://my.bzflag.org/league/index.php?link=teaminfo&amp;amp;id=909 DUCLeague team])&lt;br /&gt;
&lt;br /&gt;
==IRC Clients==&lt;br /&gt;
To access the IRC network you need to use an IRC client, there are many IRC client softwares available for most operating systems. &lt;br /&gt;
&lt;br /&gt;
http://irchelp.org/ is an excellent resource for more information on general IRC.&lt;br /&gt;
&lt;br /&gt;
===Web IRC Interface===&lt;br /&gt;
The project provides a [http://my.BZFlag.org/irc/irc.cgi web based interface] to the main IRC channels. These are intended mostly for tech support issues, and the web interface is limited in the number of channels it can access.&lt;br /&gt;
&lt;br /&gt;
==External links==&lt;br /&gt;
http://my.BZFlag.org/irc/irc.cgi&lt;br /&gt;
&lt;br /&gt;
http://irchelp.org/&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Support]]&lt;/div&gt;</summary>
		<author><name>Flash</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Creating_a_server&amp;diff=4451</id>
		<title>Creating a server</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Creating_a_server&amp;diff=4451"/>
		<updated>2008-04-18T05:20:11Z</updated>

		<summary type="html">&lt;p&gt;Flash: /* Configure your Server */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Creating a server is the process of using [[BZFS]] software to host a game for users to play on.&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
Running a server can be done in both [[public]] or [[private]] modes. It involves running the server software [[BZFS]] on some host computer. For [[public]] servers this host computer must be connected to the internet, and be able to accept incoming connections on a fixed port.&lt;br /&gt;
&lt;br /&gt;
== Planning a Server ==&lt;br /&gt;
&lt;br /&gt;
Before you create a server, you need to decide what you want your server will be like. There are a few requirements in creating a server. First, you need a good connection. BZFS servers are usually on fast connections. On a 56k in the US, you can probably host up to 3 players under bearable latency. In other countries on a 56k, you can probably host up to 8 or so. This is due to more stricter and demanding interference  restrictions in the US. If you are on a high end DSL or higher connection, you need not worry what country you are in since your connection is fast enough to handle many players. With really fast connections, such as T1 or related, you could host dozens (although you may not want to do so).&lt;br /&gt;
&lt;br /&gt;
You must provide an address to connect to. You will specify this address when you run the server (more on this below). The address may be your IP address (something like 192.12.193.123), or the domain name pointing to your computer (e.g. BZFlag.ducati.org). If your server is going to be on a machine that is connected via DSL or Cable, figure out if your provider is giving you a dynamic or a static IP. If the IP address is static, your life will be a little easier since you can specify that address once and forever. If the IP is dynamic, this means that your internet provider will change the address once in a while (without warning). In this case you probably want to &amp;quot;[[Alias Your IP Address]]&amp;quot; to a static name (click on the link for how to).&lt;br /&gt;
&lt;br /&gt;
Next you need to have an idea of how your server is going to look: you are probably already familiar with the game style (CTF, Rabbit) from playing on existing servers. You may specify a map or ask your server to create a random one. You will also be able to specify many details of the game play (how many good and bad flags, jumping, ricochet, etc...). All of this is accomplished in the next step.&lt;br /&gt;
&lt;br /&gt;
== Configure your Server ==&lt;br /&gt;
&lt;br /&gt;
In this step, you specify all the server options. The cleanest way to accomplish this is to create a configuration file. Fortunately, the BZFlag installation provides you with a sample configuration file that you can modify according to your wishes. You will find this file in the directory where you installed BZFlag under a subdirectory called &amp;lt;code&amp;gt;misc&amp;lt;/code&amp;gt;. The file is named &amp;lt;code&amp;gt;bzfs.conf&amp;lt;/code&amp;gt;. Open &amp;lt;code&amp;gt;bzfs.conf&amp;lt;/code&amp;gt; in a text editor (in windows, notepad will be just fine; in GNU/Linux, Unix, Debian, etc.. : vi would work nice).&lt;br /&gt;
&lt;br /&gt;
Read through &amp;lt;code&amp;gt;bzfs.conf&amp;lt;/code&amp;gt; to understand all the options. Remove the # sign on the lines corresponding to the options you want to set. Add # at the beginning of the line if you don&#039;t want that option. After you have finished your changes, you can save that file with a different name (this will be helpful if you want to run server with different configurations: just save many files with different names).&lt;br /&gt;
&lt;br /&gt;
Note also that recent BZFlag installations come with a &amp;quot;nice&amp;quot; web-based configuration builder that lets you create a configuration using a simple web form. Run it by selecting &amp;quot;BZFS configuration builder&amp;quot; from the BZFlag folder in the start menu. Your web browser will pop up with a web form that will prompt you for several configuration choices. Please note that the form will not save the configuration file for you: you will still have to copy and paste the text generated by the web form into your configuration file.&lt;br /&gt;
&lt;br /&gt;
Here is an incomplete list of things you must or can specify in the configuration file.&lt;br /&gt;
&lt;br /&gt;
* Choose a password for administrative purposes. With this password, you can use the administrative operations, such as changing the lag kick threshold or setting environment variables. This is done by adding the following line to your configuration : &amp;lt;code&amp;gt;-passwd PASS&amp;lt;/code&amp;gt; (replacing PASS with a password of your choice). Once the server is running, run your client and login as an administrator by entering &amp;quot;&amp;lt;code&amp;gt;/password PASS&amp;lt;/code&amp;gt;&amp;quot; (without quotes &amp;quot;&amp;quot;) as a chat message.&lt;br /&gt;
* If the server is to be public, you must specify the server people should connect to. The option is added with the following line &amp;quot;&amp;lt;code&amp;gt;-publicaddr server.name.com:5154&amp;lt;/code&amp;gt;&amp;quot; (without quotes), or &amp;quot;&amp;lt;code&amp;gt;-publicaddr 111.111.111.111:5154&amp;lt;/code&amp;gt;&amp;quot; where you should replace &amp;lt;code&amp;gt;111.111.111.111:5154&amp;lt;/code&amp;gt; with your IP address. &amp;lt;code&amp;gt;5154&amp;lt;/code&amp;gt; is the port the server will listen to. Make sure it is the same number as the one specified in a line starting with &amp;lt;code&amp;gt;-p 5154&amp;lt;/code&amp;gt;. You can change the port but don&#039;t do that if you don&#039;t know what you are doing. We recommend you use port numbers that are proven to work in other servers.&lt;br /&gt;
* Specify other options. For example, if you want to allow jumping, then your conf file should have a line starting with &amp;lt;code&amp;gt;-j&amp;lt;/code&amp;gt;. Other options are: ricochet, which needs a line starting with &amp;lt;code&amp;gt;+r&amp;lt;/code&amp;gt;. Read through &amp;lt;code&amp;gt;bzfs.conf&amp;lt;/code&amp;gt; and you&#039;ll find out how to specify the game style (rabbit, ctf, etc...), the number of flags, etc.... If you want to run different configurations you can create as many conf files as you like (with different names of course). Just specify the correct configuration file you want to invoke in the bat file mentioned in the previous paragraph. One of the options that you can set in the configuration file is a map the server should use.&lt;br /&gt;
* You can choose whether to use a custom map or a random one. If you use a random one, decide whether or not to include teleporters. If you want to include them, add (again, to your configuration) the option &amp;quot;&amp;lt;code&amp;gt;-t&amp;lt;/code&amp;gt;&amp;quot;. If you are playing CTF and you want a random map, use &amp;quot;&amp;lt;code&amp;gt;-cr&amp;lt;/code&amp;gt;&amp;quot; instead of standard &amp;quot;&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;&amp;quot;, in addition to &amp;quot;&amp;lt;code&amp;gt;-t&amp;lt;/code&amp;gt;&amp;quot;. For a custom server, use: &amp;lt;code&amp;gt;-world &amp;quot;MAP_NAME&amp;quot;&amp;lt;/code&amp;gt; ; replacing &amp;lt;code&amp;gt;MAP_NAME&amp;lt;/code&amp;gt; with the file name of the map, which must be in the BZFS directory. You have probably seen that when you visit other server, one of the menus has the &amp;quot;save map&amp;quot; option. That means you can save that map for use on your server. Just save it somewhere in your pc, and specify the location of the map in the configuration file, next to the line that starts with &amp;lt;code&amp;gt;-world&amp;lt;/code&amp;gt;&lt;br /&gt;
* You can choose the max number of players (for example &amp;lt;code&amp;gt;-mp 10&amp;lt;/code&amp;gt; says there can&#039;t be more than 10 players). But just because you can host many, decide if you really want to. The more players on your server, the higher the overall latency will be and the more bandwidth your server will consume. Moreover, more than 4 players per team on a ctf or more than 6 players on a rabbit style is just not fun. Experiment if you plan to host a lot, otherwise don&#039;t worry. Not only latency that matters, but many players will make the field busy. Tanks will get killed often and there would be a lot of action. This is good, and bad. Good in that it is a lot of fun! But bad in that the average alive time may only be a few seconds.&lt;br /&gt;
* A server description would be nice. Note that there is a small limit on how many characters you can put for description, and it gets smaller based on how long the server address is. Add a description by adding option: &amp;lt;code&amp;gt;-public DESCRIPTION&amp;lt;/code&amp;gt;&lt;br /&gt;
* You can choose what flags, if any, to include or restrict. You must be familiar with the flag abbreviations, which are listed using command &amp;quot;&amp;lt;code&amp;gt;bzfs -help&amp;lt;/code&amp;gt;&amp;quot; near the end of the help message. Add flags to the server using &amp;quot;&amp;lt;code&amp;gt;+f ABBR&amp;lt;/code&amp;gt;&amp;quot; and restrict flags using &amp;quot;&amp;lt;code&amp;gt;-f ABBR&amp;lt;/code&amp;gt;&amp;quot; replacing &amp;lt;code&amp;gt;ABBR&amp;lt;/code&amp;gt; with the flag abbreviation.&lt;br /&gt;
&lt;br /&gt;
This should get you started, but there are many more options you can set. Some of them are explained below in the section &amp;quot;Good Administration&amp;quot;. In any event, most of the options can be understood by reading the file bzfs.conf provided with the installation.&lt;br /&gt;
&lt;br /&gt;
== Getting your server on the public list ==&lt;br /&gt;
&lt;br /&gt;
BZFlag has a central list server that keeps track of all the public servers. Using the &amp;lt;code&amp;gt;-public &amp;quot;some text&amp;quot;&amp;lt;/code&amp;gt; command line argument will tell your local server to attempt to register itself on the public server. This is normally all that is required to get your server listed.&lt;br /&gt;
&lt;br /&gt;
The list server will need to be able to access your server just as other players will. This is done by connecting back to the public IP address where your server is running. The list server only checks the tcp connection back to your server at present, though players will also try udp on the same IP address and port number.&lt;br /&gt;
&lt;br /&gt;
You can test your server with the bot in #BZFlag on irc.freenode.net IRC network. See http://irchelp.org/ for more information on irc. You may want to use the web interface at http://my.BZFlag.org/irc/irc.cgi if you do not already have an irc client like [http://xchat.org/ X-Chat] or [http://mirc.com mIRC] installed. Once you are in the #BZFlag channel tell the bot to contact your server by doing this with your machine name or IP address and the :port number:&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
 ~bzfquery bzflag.secretplace.us:5255&lt;br /&gt;
|}&lt;br /&gt;
You should get a list of players back like:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
 &amp;lt;ibot&amp;gt; X:0(0-0) R:-78(95-173) G:4(67-63) B:-4(172-176) Tofe(R:anonymous)-27(29-56) zapped&lt;br /&gt;
 (O:anonymous)0(0-0) cookiecutter(G)14(28-14) Shoot For Brains [CAN-NS](G:shoot@me.com)7(20-13)&lt;br /&gt;
 Attilla(X:Terleckyjy@terleckyjy)42(79-37) emul(G)-15(18-33) immel(G)-2(1-3) shadow&lt;br /&gt;
 (B:matt@tiger.prinz)-10(0-10) jp(R:PenovichJ@penovichj)-31(31-62)&lt;br /&gt;
|}&lt;br /&gt;
or&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
 &amp;lt;ibot&amp;gt; No Players&lt;br /&gt;
|}&lt;br /&gt;
which means the bot was able to contact your server, just that there are no players on it at the moment. This is ok.&lt;br /&gt;
&lt;br /&gt;
If you get:&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
 &amp;lt;ibot&amp;gt; could not connect to 127.0.0.1:5154&lt;br /&gt;
|}&lt;br /&gt;
Then your server is firewalled and the list server cannot contact it. This means that you will not be able to get your server on the list. Chances are you have a firewall blocking external access to your server.&lt;br /&gt;
&lt;br /&gt;
Note: when you run the bzflag client on the same network as a server it should discover the server by using a broadcast ping. If your server shows up in the list, but without the description next to it, this means that you found it through broadcast discovery, and &#039;&#039;&#039;not from the public list server&#039;&#039;&#039;. If the server description that you included on the &amp;lt;code&amp;gt;-public &amp;quot;this text&amp;quot;&amp;lt;/code&amp;gt; command line option is there, then your server is correctly listed on the public server list.&lt;br /&gt;
&lt;br /&gt;
Using multiple &amp;lt;code&amp;gt;-d&amp;lt;/code&amp;gt; options to the server will result in some useful (and some useless) messages from the server.&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
 bzflag@phoenix:~/bzflag-1.10$ src/bzfs/bzfs -d -d -d -i 24.1.104.25 -p 51540 -public &amp;quot;My Server Name&amp;quot;&lt;br /&gt;
 style: 0&lt;br /&gt;
 There is a voting arbiter with the following settings:&lt;br /&gt;
         vote time is 60 seconds&lt;br /&gt;
         veto time is 10 seconds&lt;br /&gt;
         votes required are 3&lt;br /&gt;
         vote percentage necessary is 50.099998&lt;br /&gt;
         vote repeat time is 300 seconds&lt;br /&gt;
         available voters is initially set to 200&lt;br /&gt;
 Running a public server with the following settings:&lt;br /&gt;
         public address is 24.1.104.25:51540&lt;br /&gt;
         listening on 24.1.104.25:51540&lt;br /&gt;
         with title of &amp;quot;My Server Name&amp;quot;&lt;br /&gt;
 Sent ADD message to list server&lt;br /&gt;
 GET /db/?action=ADD&amp;amp;nameport=24.1.104.25:51540&amp;amp;version=BZFS1910&amp;amp;gameinfo=0000000100000000000000000000c800c800c800c800c800c800c8&amp;amp;&lt;br /&gt;
 build=1.10.7.20040809-RELEASE-linux-gnu&amp;amp;title=My+Server+Name HTTP/1.1&lt;br /&gt;
 Host: my.BZFlag.org&lt;br /&gt;
 Cache-Control: no-cache&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 Player [0] accept() from 24.1.104.25:50579 on 6&lt;br /&gt;
 Player  [0] on 6 removed: Disconnected&lt;br /&gt;
|}&lt;br /&gt;
* the -i parameter is used here to force an IP address. This server happens to have more than one IP address. This is not required on most servers.&lt;br /&gt;
* the -p parameter is used to pick a different port number than the default. If you are only running one server, it is recommended that you leave this off and use the default port number.&lt;br /&gt;
* notice the debug line that starts with &amp;quot;&amp;lt;code&amp;gt;GET&amp;lt;/code&amp;gt;&amp;quot;. This is the request that was sent to the bzflag list server to attempt to get listed&lt;br /&gt;
* notice the &amp;quot;&amp;lt;code&amp;gt;Player [0]&amp;lt;/code&amp;gt;&amp;quot; lines. This indicates that the list server connected back and then disconnected. If you don&#039;t see this then it is likely that your server is firewalled and the list server is unable to connect back and so will &#039;&#039;&#039;not&#039;&#039;&#039; list your server.&lt;br /&gt;
&lt;br /&gt;
== Running the server ==&lt;br /&gt;
&lt;br /&gt;
There are different ways to run a server. On both Windows and *nix, the program (BZFS) is in the directory where you installed BZFlag (most likely: &amp;quot;&amp;lt;code&amp;gt;C:/Program Files/BZFlag2.0.0&amp;lt;/code&amp;gt;&amp;quot;, or on your usr account). The program containing the server is BZFS.exe. Double clicking on it will run a server with default options, but clearly you want to specify your own options, for example those you saved in the configuration file generated in the previous step. One way to do it is to specify all the commands for the server in a batch file, so you can just double click on it to start a server. On other systems such as Linux, create an executable with the commands, or a shell script, or see if there are any related ways to store console/text based command interface commands in a &amp;quot;shortcut&amp;quot; style.&lt;br /&gt;
&lt;br /&gt;
On Windows: Here is a [SampleBatchFile]. Open notepad or any other text editor, copy the content of the file, make the changes that you need to change (notably: the location of BZFS and the config file bzfs.conf). Save the file with a nice name and extension .bat (for example: nicename.bat) on your desktop or a window of your choice. You probably understand what the batch file is doing: the lines beginning with &amp;quot;set&amp;quot; specify the content of some variables, such as the location of BZFS and the configuration files. The server is started on the line next to last (before &amp;quot;pause&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t want to have a batch file or for some reason your batch file doesn&#039;t work, here is a procedure that always works: from the start menu in your windows machine, look for the &amp;quot;command prompt&amp;quot; and click on it. A black window will open up. Type: &amp;lt;code&amp;gt;cd &amp;quot;c:\Program Files\BZFlag2.0.0&amp;quot;&amp;lt;/code&amp;gt;  (this should work in most cases, unless you installed BZFlag in a different directory). Once you are there type: &amp;lt;code&amp;gt;bzfs -conf &amp;quot;C:\Program Files\BZFlag2.0.0\Data\bzfs.conf&amp;quot;&amp;lt;/code&amp;gt; (change what is between quotes with the exact location of the configuration file).&lt;br /&gt;
&lt;br /&gt;
On *nix: Use a config file, or a shell script. A config file can be made simply by taking all of your command line options you want to pass to BZFS, and placing them in a config file, one options on each line. An HTML file has been created that is shipped with BZFlag (in /data/ on binary releases, and in /misc/ in source releases or CVS). A shell script can be made the same way. A config file can be used, by changing directory to BZFS, and do &amp;quot;bzfs -conf CONF.conf&amp;quot;, replacing CONF.conf with the config file in the same BZFS directory.&lt;br /&gt;
&lt;br /&gt;
Once the server is running, log into it with your client and type /password PASS, where PASS is the password you chose in the configuration step. You&#039;ll be greeted by the client as an administrator. The KeysAndCommands and ServerCommands pages list a number of things you can do as an admin (although I don&#039;t think either of those pages is complete). If when you type one of those commands you get a &amp;quot;You do not have permission&amp;quot; message on client commands, it means that you forgot to login as admin (or somehow your login failed). Type in your client /password PASS replacing PASS with the password that you specified in the configuration phase. If this doesn&#039;t work shut down your server, go back to the configuration step and make sure you are getting the right password.&lt;br /&gt;
&lt;br /&gt;
== Sharing Administration Status ==&lt;br /&gt;
&lt;br /&gt;
Helpful links about this topic:&lt;br /&gt;
&lt;br /&gt;
http://my.bzflag.org/bb/viewtopic.php?t=5960&lt;br /&gt;
and&lt;br /&gt;
http://my.bzflag.org/bb/viewtopic.php?t=6516&lt;br /&gt;
&lt;br /&gt;
Sometimes people will want to share administrator status. Multiple people can be assigned permissions on a server, and all can do more than the normal DEFAULT group (general public). This allows a server to be better administrated, as when one admin is not watching it, another one can. So how do you do this? This is quite easy to do. First off, configure your server to accept group permissions. This is done through BZFS command &amp;quot;&amp;lt;code&amp;gt;-groupdb FILE&amp;lt;/code&amp;gt;&amp;quot;. This stores group names and permissions for that group. Its syntax for adding groups is: &amp;quot;GROUPNAME: permissions...&amp;quot;, replacing GROUPNAME with the name of the group. Don&#039;t worry about adding ADMIN or DEFAULT groups, as those get thrown in automatically. Make one up, but please do not alter ADMIN group, as this is stuff administrators can do, and why limit yourself? Groupnames may not have spaces or quotes. Replace &amp;quot;permissions&amp;quot; with permissions, and take out the backslash in the command. For example, write &amp;quot;lagstats&amp;quot; instead of &amp;quot;/lagstats&amp;quot;. So a sample line would be, &amp;quot;JRADMIN: playerlist ban kick&amp;quot;. Separate permissions by a space, and DO NOT put permissions on different lines! Make sure the group name and ALL permissions are on the same line!&lt;br /&gt;
&lt;br /&gt;
Now that you have your groups laid out, you must create a pas-swo-rd dat-ab-ase to store nicks and passwords created using &amp;quot;/register&amp;quot;, as only registered users may be added to groups. To add people to a group, have them register, and enter BZFlag admin client command &amp;quot;/setgroup CALLSIGN GROUPNAME&amp;quot;, replacing CALLSIGN with their callsign, case sensitive (add quotes around it if the callsign has spaces), and GROUPNAME with the name of the group to add them to. And that?s it! Easy as pie! This enables you to have multiple admins on one server. But what if you don&#039;t want other admins? Easy, create a smaller admin group, such as JRADMIN, in which they have more privileges than a normal person, but not as many as an admin. One privilege you MUST be very careful in giving a person is /shutdownserver. This is terrible if misused, as it kills the server. Trust wisely. And finally, if your server supports /report, starting in 1.11.*, people with privilege to &amp;quot;/viewreports&amp;quot; can see any reports filed, regardless of whether or not the person with that privilege has the computer that stores the reports.&lt;br /&gt;
&lt;br /&gt;
== Shutting down your server ==&lt;br /&gt;
&lt;br /&gt;
If you have had enough of your server, shut it down by entering /shutdownserver in the client. You can also just terminate BZFS execution, but this is not proper and takes a while for the client server list to realize it was terminated.&lt;br /&gt;
&lt;br /&gt;
Now that the server is running, how does it work? Well, the BZFS window or execution must stay alive to keep the server alive. If you close the BZFS window or halt its execution, the server goes too. It will stay on the server list for a short time if halted suddenly.&lt;br /&gt;
&lt;br /&gt;
Closing the server window, or halting its execution, is somewhat like turning off the power suddenly as a way to shutdown your computer - it is not proper, and is not recommended.&lt;br /&gt;
&lt;br /&gt;
== Good Administration ==&lt;br /&gt;
&lt;br /&gt;
Just because you have a server, that&#039;s not all. You must maintain it and keep your players satisfied. Check it often. One way to get feedback is to support the &amp;quot;/report&amp;quot; command.&lt;br /&gt;
&lt;br /&gt;
Enable this using BZFS by setting the configuration option &amp;quot;-reportfile FILENAME&amp;quot; replacing FILENAME with a file to use to write reports to, or &amp;quot;-reportpipe FILENAME&amp;quot; replacing FILENAME with the file to pipe reports to. Reports are made through the client and are simply human messages.&lt;br /&gt;
&lt;br /&gt;
But besides that, you must watch the people that come on your server. Often times people will pause or become &amp;quot;NR&amp;quot;, not responding. &amp;quot;Not responding&amp;quot; means that they haven&#039;t sent a packet in a while (5 seconds by default). This happens to people with slow connections, or people with messed up connections because their connection simply can&#039;t send packets fast enough to be within the threshold. Usually they will be kicked automatically for idling too long, but if not, a kick is suitable. Take action against teamkillers (people who kill their own team on PURPOSE, not by occasional mistake), cheaters (a ban is usually nice :), people who log in/off constantly (people who constantly log on &amp;amp; off to reset their score, a warning is suitable), and any other nasty behavior.&lt;br /&gt;
&lt;br /&gt;
You may want to implement a filter to filter chat or callsigns or both from abusive words. Make a file with a phrase/word that should be filtered on every line, and add it to the server using configuration option &amp;quot;-badwords FILE&amp;quot;, replacing FILE with the file name IN QUOTES that is found in the BZFS directory. Then set whether to filter chat, callsigns, or both using &amp;quot;-filterCallsigns&amp;quot; and/or &amp;quot;-filterChat&amp;quot;. Sometimes, BZFS will be too strict and filter things that aren&#039;t bad. You can make simple exact matches happen using &amp;quot;-filterSimple&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
So you have a filter, but what if a bad person comes on? Take reasonable action, a warning to start, a permanent ban at worst. Punishment severity is, in order, a warning (use the chat), a kick (/kick REASON), a temporary ban (/ban IP DURATION REASON), and a permanent ban (/ban IP REASON). IP is delinquent&#039;s IP address (found using &amp;quot;/playerlist&amp;quot; admin command), DURATION is the amount of time in minutes (do not put a number alone if to ban forever), and REASON is an optional text string of the reason, which will be sent to the player and recorded in your logs. If you want to just kick a person off the server temporarily, use &amp;quot;/kick REASON&amp;quot;, replacing REASON with an optional text string of the reason why. If you want bans to last after you shut down or restart your server, make sure you specified a ban file, which is a file that BZFS can store banned IPs in, using BZFS command-line option &amp;quot;-banfile FILE&amp;quot;, where FILE is the name of the file in the BZFS directory.&lt;br /&gt;
&lt;br /&gt;
== World Files ==&lt;br /&gt;
&lt;br /&gt;
World files should have the &amp;quot;.bzw&amp;quot; file extension and be in [[BZW]] format. If world files live in the &amp;quot;&amp;lt;code&amp;gt;worlds&amp;lt;/code&amp;gt;&amp;quot; directory under the config directory they will be usable when you start a simple server from inside the client. You should not use this method to run a dedicated server, just for starting a LAN game etc. The &amp;quot;&amp;lt;code&amp;gt;worlds&amp;lt;/code&amp;gt;&amp;quot; directory is located:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;~/.bzf/worlds/&amp;quot; - on Linux and Unix Systems.&lt;br /&gt;
* &amp;quot;My Documents\My BZFlag Files\worlds\&amp;quot; - on Microsoft Windows.&lt;br /&gt;
* &amp;quot;~/Library/Application Support/BZFlag/worlds&amp;quot; - on Apple Mac OS X.&lt;br /&gt;
&lt;br /&gt;
== Other Information ==&lt;br /&gt;
&lt;br /&gt;
BZFlag has not been carefully audited for buffer overflows and other remote attacks, however, large packets or suspicious packets make the server kick the player that sent it. You should never trust the server to be your guard. It&#039;s a good idea to run your BZFlag server as a user with minimal permissions on your machine and to run it in a [[BZFS in a chroot jail|chroot jail]].&lt;br /&gt;
&lt;br /&gt;
== Regarding &amp;quot;cheat&amp;quot; servers ==&lt;br /&gt;
&lt;br /&gt;
While the license for BZFlag allows users to run any server modification that they wish, or to modify the code in any way, the project administration asks that users do not publish or host &amp;quot;cheat&amp;quot; type clients or servers. These cheats ruin the game for the average player, when they are mixed in with the normal game servers and clients. We understand the desire to expand and modify the game and it&#039;s sources, so it is requested that anyone wishing to run a game that uses modified code or logic to do so using a different network protocol than the current public release. This will let modified games be played, and prevent modified clients from being used on public unmodified games, as they would be incompatible. The BZFlag project administrators reserve the right to remove the public listings of any game servers that do not adhere to this rule. Administrators also reserve the right to remove any global accounts or access to public services at any time.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
[[Commands]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Server Variables]] &amp;lt;br&amp;gt;&lt;br /&gt;
[[BZFS in a chroot jail]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Known Cheats]]&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
http://my.bzflag.org/bb/viewtopic.php?t=2915 post on the BZFlag Forums&lt;br /&gt;
&lt;br /&gt;
[[Category:Server]]&lt;br /&gt;
[[Category:Support]]&lt;/div&gt;</summary>
		<author><name>Flash</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Category:Compiling&amp;diff=4342</id>
		<title>Category:Compiling</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Category:Compiling&amp;diff=4342"/>
		<updated>2008-03-30T08:10:56Z</updated>

		<summary type="html">&lt;p&gt;Flash: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pages dealing with the building and compiling of BZFlag into usable binary executables.&lt;br /&gt;
&lt;br /&gt;
==Compiling BZFlag 2.0.x on Windows==&lt;br /&gt;
To compile BZFlag 2.0.x on Windows, it is recommended that you use Microsoft Visual C++. MSVC7 and MSVC8 are the recommended, MSVC9 may have some incompatibilities. You may use MSVC Express Edition to compile BZFlag, but you will not be able to distribute your executables.&lt;br /&gt;
&lt;br /&gt;
Once you have downloaded your source code, you will also need libcURL, the Windows Server 2003 Platform SDK and DirectX April 2007 SDK. (Note that the November 2007 SDK is incompatible.) Install these libs.&lt;br /&gt;
&lt;br /&gt;
Once the libs are installed, go to the win32 subdirectory of the BZFlag source and go to either the MSVC7 or MSVC8 directories, depending on the version you are using. Click on the BZFlag solution, and build the projects by pressing F5. This may take some time. Once the projects have been built look under the top directory for your executable.&lt;br /&gt;
&lt;br /&gt;
==Compiling BZFlag 2.0.x on MacOSX==&lt;br /&gt;
To compile BZFlag 2.0.x on MacOSX, you need to have XCode installed. In addition, you will need to get SDL from the [http://www.libsdl.org SDL web site].&lt;br /&gt;
&lt;br /&gt;
The simplest way to build is to use the Terminal command-line interface. From the &#039;&#039;&#039;bzflag&#039;&#039;&#039; directory, run &lt;br /&gt;
    % &#039;&#039;&#039;./autogen.sh&#039;&#039;&#039;&lt;br /&gt;
    % &#039;&#039;&#039;./configure&#039;&#039;&#039;&lt;br /&gt;
    % &#039;&#039;&#039;make&#039;&#039;&#039;&lt;br /&gt;
Note that depending on your preferences, you may want to use the following arguments to configure: &#039;&#039;&#039;--enable-universal&#039;&#039;&#039; to make a universal binary and &#039;&#039;&#039;--enable-shared&#039;&#039;&#039; to use shared objects. For testing and development purposes, it is strongly recommended that you use &#039;&#039;&#039;--enable-debug&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
After &#039;&#039;&#039;make&#039;&#039;&#039; has completed (without errors!) the three executables ([[:Category:client|BZFlag]], [[BZFS]], and [[BZAdmin]] will be located in the &#039;&#039;&#039;bzflag/src/&#039;&#039;target&#039;&#039;&#039;&#039;&#039; directory. You can run these programs from the command line, but if you want to make a double-clickable application, you will need to use XCode.&lt;br /&gt;
&lt;br /&gt;
Launch XCode and open the &#039;&#039;&#039;bzflag/BZFlag.xcodeproj&#039;&#039;&#039; project. Note that XCode should have &#039;&#039;&#039;BZFlag&#039;&#039;&#039; selected as the active target and &#039;&#039;&#039;Development&#039;&#039;&#039; as the active build configuration. Click on &#039;&#039;&#039;Targets&#039;&#039;&#039; then click the &#039;&#039;&#039;Build&#039;&#039;&#039; icon. When this process completes, your application will be in &#039;&#039;&#039;bzflag/build/Development&#039;&#039;&#039;. You can then move it wherever you like.&lt;/div&gt;</summary>
		<author><name>Flash</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Lag&amp;diff=4341</id>
		<title>Lag</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Lag&amp;diff=4341"/>
		<updated>2008-03-30T07:59:52Z</updated>

		<summary type="html">&lt;p&gt;Flash: /* Lag and BZFlag */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The term Lag is a shorthand version for the concept of [http://en.wikipedia.org/wiki/Lag Network Latency]. It represents the real world delay in sending messages from one computer to another over a network. All network connections have latency.&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
Lag is the network latency of a connection, or the time it takes for a network packet to travel from one host to another. Due to the speed of light, all network transmissions take some time, there is no such thing is a true &amp;quot;0&amp;quot; lag. &lt;br /&gt;
&lt;br /&gt;
Different types of internet connections have different latency characteristics, dependent on the technologies they use. Most modern broadband systems ( like cable modems or DSL ) have a minimum latency that measures in a few milliseconds. Modems can have minimum latencies that measure in the 10s to 100s of milliseconds. The bandwidth rating of a network connection has little impact on it&#039;s minimum latency. A DSL line rated at 3 megabits in bandwidth often has the same latency as one rated at 1 megabit.&lt;br /&gt;
&lt;br /&gt;
The distance along the network a message travels will also increase the time it takes to reach it&#039;s destination. The more hubs, routers, and switches the packets have to travel ( or hops ) will add additional time, as each hop takes some time to complete. Hosts that are more physically distant usually have more hops between them, due to the nature of the internet.&lt;br /&gt;
&lt;br /&gt;
==Lag and BZFlag==&lt;br /&gt;
Latency affects real time games in a very specific manner. A message sent from one user to the server will take some time to reach the server. This means that by the time the server receives a position update from a player, that user may  and probably has) have already moved from that position. Additional time is spent sending the message from the server to the other players. Depending on the latency of the various network connections, each player will get the update message at a different real world time. &lt;br /&gt;
&lt;br /&gt;
The short version of this is, when you get a message, the client isn&#039;t there anymore. This presents problems for messages that are time sensitive, such as positional updates, and shots.&lt;br /&gt;
&lt;br /&gt;
The current version of BZFlag ([[BZFlag 2.0.8|v.2.0.8]]) does not do any type of latency compensation on player messages. This means that the player you see on your screen is not where he is on his screen. This can produce an error in the perceived game states between the 2 users. One user may shoot where he believes the other is, and in his view score a hit, while on the other user&#039;s screen he has moved away from the position and saw a clear miss. The first user simply has not received his new positional update yet, because it is in the middle of network transmission.&lt;br /&gt;
&lt;br /&gt;
The BZFlag server has a method for measuring the latency of each client, and displaying it as a numeric value in milliseconds. You can check lag for all players by using the command &#039;&#039;&#039;/lagstats&#039;&#039;&#039; while playing (just send &#039;&#039;&#039;/lagstats&#039;&#039;&#039; as a chat message). Lagstats shows an approximation of the amount of time it takes for a network message to go back and forth from one player to the server and back again, not the amount of time it takes to go from one player to another player. For example, if you fire a shot, your client sends a message to the server, giving shot direction and speed. The server then relays this information to all the other clients.&lt;br /&gt;
&lt;br /&gt;
Other lag-related problems are &amp;quot;missing&amp;quot; or &amp;quot;dropped&amp;quot; packets and &amp;quot;jitter&amp;quot;. These can occur if there are more severe network problems which cause messages between players and the server to simply get lost, or to be delayed by inconsistent amounts of time. In an attempt to keep this explanation simple, these problems will not be covered here, other than to say that they compound the effects of lag to an even higher degree.&lt;br /&gt;
&lt;br /&gt;
Lag affects what you see while playing BZFlag, especially if the delay is high. The most common effect seen is &amp;quot;shots going through other tanks.&amp;quot; Many times you will hear players say &amp;quot;my shot went through you&amp;quot;, or &amp;quot;why didn&#039;t you die.&amp;quot; Many people have been accused of cheating due to the sometimes misunderstood effects of lag.&lt;br /&gt;
&lt;br /&gt;
== Fixing Lag ==&lt;br /&gt;
How to fix lag depends on what is causing it.&lt;br /&gt;
&lt;br /&gt;
=== Slow Internet Connection ===&lt;br /&gt;
Lag can be caused by a slow internet connection, such as dial-up. In that case, find a server that is more allowing, or get a better connection.&lt;br /&gt;
&lt;br /&gt;
=== Satellite Internet ===&lt;br /&gt;
Satellite internet is far too laggy for BZFlag. Sorry.&lt;br /&gt;
&lt;br /&gt;
=== Automatic Updates ===&lt;br /&gt;
Make sure software is not running scans for automatic updates in the background.&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
Don&#039;t download something and play BZFlag at the same time.&lt;br /&gt;
&lt;br /&gt;
=== Internet-intensive programs ===&lt;br /&gt;
Other programs, such as other people playing an online game on your network, can cause lag.&lt;br /&gt;
&lt;br /&gt;
=== Distant Server ===&lt;br /&gt;
Try a different server. Often, lag is just caused by distance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==The lag test program==&lt;br /&gt;
[[Image:Sample.png|thumb|200px|right|Chestal&#039;s lag-recording test program]]&lt;br /&gt;
&lt;br /&gt;
On the right, is a capture from a test program created by Chestal. This test program allows us to accurately capture and replay events which occur in BZFlag. With a small modification to the BZflag client program, it is possible to log tank movements and shots to a file. This file can then be analyzed with a special visualization program. In this sample, you can see two tanks, surrounded by circles which are their &#039;hit-zones&#039;. Any shots which intersect the hit-zone circle should result in an exploding tank! The green tank represents the player who was logging, other tank(s) are always red. Here, the green tank was lucky enough to avoid both shots by squeezing between them!&lt;br /&gt;
&lt;br /&gt;
NOTE: The tools mentioned here are not generally available, due to the large size of the log files created, and requirements of the visualization tool. There was some progress on this (automatic playback, height indicator, map displaying, callsigns) but the results are not available to the public, either.&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
===A real, common example of lag.===&lt;br /&gt;
&lt;br /&gt;
Here is a rather common example of a near-miss (no tanks exploded in this sequence). This is a real example, not an illustration. All three tankers were running the special logging client described above, and these images visualize all three captured logs at approximately the same moment. Note that even though lag was relatively low (all players were below 100ms), these captures show that each player sees something a bit different. Keep in mind that the green tank in each image is the one who&#039;s log is being shown. Click on any image for a full screen capture of the visualization tool.&lt;br /&gt;
&lt;br /&gt;
[[Image:Smallb.png|thumb|262px|right|Tank B&#039;s View]]&lt;br /&gt;
TANK B&#039;s LOG:&lt;br /&gt;
&lt;br /&gt;
Here we see tank B&#039;s point of view. From here, we see a shot which appears to hit tank A. In fact from this tank&#039;s point of view, it clearly does hit tank A.&lt;br /&gt;
&lt;br /&gt;
(Note: Tank B lag was approx. 50ms)&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
[[Image:Smalla.png|thumb|262px|right|Tank A&#039;s View]]&lt;br /&gt;
TANK A&#039;s LOG:&lt;br /&gt;
&lt;br /&gt;
And, here is tank A&#039;s point of view. The shot here has missed tank A. Keep in mind that tank A is moving forward here.&lt;br /&gt;
&lt;br /&gt;
(Note: Tank A lag was approx. 90ms)&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
[[Image:Smallc.png|thumb|262px|right|Tank C&#039;s View]]&lt;br /&gt;
TANK C&#039;s LOG:&lt;br /&gt;
&lt;br /&gt;
Tank C sees something similar to what tank B saw.&lt;br /&gt;
&lt;br /&gt;
(Note: Tank C lag was approx. 25ms)&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
===So, what happened?===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Probably the most important factor to keep in mind here is that it is a player&#039;s OWN client which determines when he/she is hit,&#039;&#039;&#039; as it has the most accurate representation of its own tank location. Your tank&#039;s position is calculated locally, without any lag.&lt;br /&gt;
&lt;br /&gt;
So, tank A did not explode, because it &#039;knew&#039; that it had moved forward to avoid the shot. Due to the delay from lag, tanks B and C still saw tank A at its old position which had occurred a little over 1/10 second ago, so it &#039;&#039;&#039;appeared&#039;&#039;&#039; to them that the shot went through.&lt;br /&gt;
&lt;br /&gt;
In conclusion, not only can understanding lag make you a better player, but it can also explain why shots seem to go through other tanks. In general, your shots will be much more accurate if you compensate for lag by shooting where you opponent will be in 100ms, or whatever you and your opponent&#039;s combined lag is. Of course, if your opponent is constantly switching directions, this can be difficult.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Client]]&lt;br /&gt;
[[Category:Server]]&lt;/div&gt;</summary>
		<author><name>Flash</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Talk:Installing&amp;diff=3903</id>
		<title>Talk:Installing</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Talk:Installing&amp;diff=3903"/>
		<updated>2008-01-06T03:52:52Z</updated>

		<summary type="html">&lt;p&gt;Flash: Where to put details on how to compile&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There is no place that actually talks about the process of compiling a source distribution. Does that belong here, or on the Compiling page? Compiling is even more of a stub than this...&lt;/div&gt;</summary>
		<author><name>Flash</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Network_Protocol&amp;diff=2190</id>
		<title>Network Protocol</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Network_Protocol&amp;diff=2190"/>
		<updated>2007-04-23T04:42:16Z</updated>

		<summary type="html">&lt;p&gt;Flash: spell check&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;
&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>Flash</name></author>
	</entry>
</feed>