<?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=JeffM2501</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=JeffM2501"/>
	<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/Special:Contributions/JeffM2501"/>
	<updated>2026-05-19T15:14:37Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=IRC_Cloaks&amp;diff=8858</id>
		<title>IRC Cloaks</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=IRC_Cloaks&amp;diff=8858"/>
		<updated>2015-04-12T18:45:58Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Since BZFlag is a registered project with the Freenode IRC network, we are able to give you IRC cloaks (custom hostmasks) for the project.&lt;br /&gt;
&lt;br /&gt;
They are available to developers, server owners, and players that have helped the project out or been affiliated for a significant time.&lt;br /&gt;
&lt;br /&gt;
==Process==&lt;br /&gt;
Cloaks must be requested with one of the project administrators (TimRiker, Blast007, and brlcad). It is the sole discretion of the project administrators on the use and distribution of cloaks. &lt;br /&gt;
&lt;br /&gt;
They must (only) be requested in person on IRC.  Do not send requests via BZBB or via E-mail. Send one of the project administrators a private message on IRC stating that you&#039;d like to have a cloak and what you think that cloak should be.&lt;br /&gt;
&lt;br /&gt;
Users that request cloaks must be registered on BZBB and have a valid E-Mail address attached to the name.&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
Users that have a BZFlag cloak must conduct themselves in a mature and civil manner at all times on Freenode. The cloak associates you as a representative of the project and your behavior should not reflect poorly upon the BZFlag community. Users that do not conduct themselves in a reasonable manner will have their cloaks removed.&lt;br /&gt;
&lt;br /&gt;
==Cloak Format==&lt;br /&gt;
All BZFlag cloaks follow a standard format. There are different cloaks available depending on the amount of involvement in the project.&lt;br /&gt;
&lt;br /&gt;
; /bzflag/player/BZ_NAME&lt;br /&gt;
: Long-time players in good standing can request a player cloak. Long-time means you&#039;ve been playing for at least 6 months. You should have an established BZFlag callsign that you&#039;ve been using over that timeframe.&lt;br /&gt;
&lt;br /&gt;
; /bzflag/contributor/BZ_NAME&lt;br /&gt;
: Users that are contributors to the project in additional ways.&lt;br /&gt;
&lt;br /&gt;
; /bzflag/serverop/BZ_NAME&lt;br /&gt;
: Server owners that run major servers that fully support global services, and promote good clean play can get a server owner cloak.&lt;br /&gt;
&lt;br /&gt;
; /bzflag/developer/BZ_NAME&lt;br /&gt;
: Users that are developers (i.e., have commit access) can get a developer cloak.&lt;br /&gt;
&lt;br /&gt;
; /bzflag/projectadmin/BZ_NAME&lt;br /&gt;
: Project administrators are allowed a project admin cloak.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BZ_NAME&#039;&#039;&#039; is your registered BZBB username. Spaces or Underscores &amp;quot;_&amp;quot; will be removed from cloaks.&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
; Player : /bzflag/player/SportChick/essy&lt;br /&gt;
; Contributor : /bzflag/contributor/ibot&lt;br /&gt;
; Server Op : /bzflag/serverop/Manu&lt;br /&gt;
; Developer : /bzflag/developer/Chestal&lt;br /&gt;
; Admin : /bzflag/projectadmin/learner&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Category:Development&amp;diff=8857</id>
		<title>Category:Development</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Category:Development&amp;diff=8857"/>
		<updated>2015-04-12T18:45:34Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
BZFlag is developed as an open source guided development process involving a number of developers all over the world.&lt;br /&gt;
&lt;br /&gt;
==Organization==&lt;br /&gt;
Open source development tends to not have as formal a structure as traditional development, but the bzflag project does have a group of developers that are responsible for various aspects of projet.&lt;br /&gt;
&lt;br /&gt;
===Copyright Maintainer===&lt;br /&gt;
Tim Riker (TimRiker) is the copyright holder and intellectual property manager for the project and manages its various legal operations.&lt;br /&gt;
&lt;br /&gt;
===Development Leads===&lt;br /&gt;
Scott Wichser (Blast007) and Jeff Makey (Bullet Catcher) are the development leads. They are responsible for the day to day development and planning of the various releases of BZFlag. They maintain the [[BZFlag Source]] Code, [[BZFlag_SVN|SVN]] repository, and ensure that development of the game goes according to the design goals and [[Development_RoadMap]].&lt;br /&gt;
&lt;br /&gt;
===Service Managers===&lt;br /&gt;
Scott Wichser (Blast007) and Joe Vano (JoeVano) manage the public services that BZFlag clients and servers use such as the [[List Server]] and [[Global Registration]] System.&lt;br /&gt;
&lt;br /&gt;
====Forum Administrators====&lt;br /&gt;
A number of community members maintain the [[BZFlag Forums]] including;&lt;br /&gt;
&lt;br /&gt;
* L4m3r&lt;br /&gt;
* DTRemenak&lt;br /&gt;
* BRLCAD&lt;br /&gt;
* Blast007&lt;br /&gt;
* Bryjen&lt;br /&gt;
* joevano&lt;br /&gt;
* Bullet Catcher&lt;br /&gt;
* Constitution&lt;br /&gt;
&lt;br /&gt;
==Communications==&lt;br /&gt;
Development communications mostly happens in the [[BZFlag_on_IRC|BZFlag IRC channel]]. There are development mailing lists on the sourceforge site but they are rarely used. Many developers are often on the IRC channel and are more then willing to discuss things relating to bzflag development.&lt;br /&gt;
&lt;br /&gt;
==Coding Policy==&lt;br /&gt;
BZFlag has a documented coding policy that is in the DEVINFO file that is included with every source code release.&lt;br /&gt;
&lt;br /&gt;
==Wiki Development Design Templates==&lt;br /&gt;
In order to help out developers in building collaborative documents, the wiki has several templates that can be used to setup documents.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IdeaDesign&#039;&#039;&#039;  This template is intended to be used to flesh out an idea or proposed change that has not yet been accepted but is being worked on by multiple people. This is where all new ideas should start.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DesignDocument&#039;&#039;&#039; Once an idea or change has been approved and made part of the development plan it will be changed to a Design Document. This indicates that the feature can be worked on in the development codebase by any developer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specification&#039;&#039;&#039; If additional documentation is needed for a feature then those documents can use this template. Specifications should also be put into a category or name space with the associated design document overview.&lt;br /&gt;
&lt;br /&gt;
===Notes on Patches===&lt;br /&gt;
Some ideas may not be accepted by the development community right away, if the idea proposer wishes to implement the idea or parts of the idea to prove it out then those changes should be submitted to the [http://sourceforge.net/tracker/?group_id=3248&amp;amp;atid=303248 SourceForge Patch Tracker]. This will allow developers and team leaders to review the patch and decide if it should be included in the mainline release. It also lets other use or extend the code changes for private use. &lt;br /&gt;
&lt;br /&gt;
==Resources==&lt;br /&gt;
[[SVN]] repository stored on Source Forge.&lt;br /&gt;
&lt;br /&gt;
[[BZFlag Source]] Information on the source code for the game.&lt;br /&gt;
&lt;br /&gt;
[[BZFS API]] Information on the API for plug-in development.&lt;br /&gt;
&lt;br /&gt;
[http://sourceforge.net/tracker/?group_id=3248&amp;amp;atid=303248 SourceForge Patch Tracker] where code changes from new developers are submitted.&lt;br /&gt;
&lt;br /&gt;
[http://sourceforge.net/tracker/?group_id=3248&amp;amp;atid=103248 SourceForge Bug Tracker] where users report bugs or problems in the game.&lt;br /&gt;
&lt;br /&gt;
[http://sourceforge.net/tracker/?group_id=3248&amp;amp;atid=353248 SourceForge Feature Requests] where users request new features ( pending approval).&lt;br /&gt;
&lt;br /&gt;
==Helping Out==&lt;br /&gt;
BZFlag can always use new developers. Users that wish to become more involved in the development process are encouraged to join the IRC channel and talk to the developers and players there.&lt;br /&gt;
&lt;br /&gt;
The next step is to submit patches to the patch tracker so the new developer can get the hang of how the codebase works and so that project management can evaluate the coding ability/style of the new developer. The best way to get started is to take a look at the bugs in the Bug Tracker.&lt;br /&gt;
&lt;br /&gt;
If a new developer fits into the project well and is productive they will often be given &#039;&#039;&#039;commit access&#039;&#039;&#039; to the SVN system so they may make changes directly to the code.&lt;br /&gt;
&lt;br /&gt;
==Versions==&lt;br /&gt;
The current shipping version is based on the 2.4.2 tag &#039;&#039;&#039;tags/v2_4_2/&#039;&#039;&#039; in svn&lt;br /&gt;
&lt;br /&gt;
The current development version is 2.4.3 and is maintenance for the 2.4.x line, it is located in &#039;&#039;&#039;trunk/bzflag&#039;&#039;&#039; in svn.&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=BZFlag_Project&amp;diff=8856</id>
		<title>BZFlag Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=BZFlag_Project&amp;diff=8856"/>
		<updated>2015-04-12T18:45:02Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Project Administrators are users responsible for maintaining the global network services of the project.&lt;br /&gt;
&lt;br /&gt;
==Current Administrators==&lt;br /&gt;
The current administration staff for the SourceForge project includes:&lt;br /&gt;
*[[Tim Riker]]&lt;br /&gt;
*[[Scott Wichser]]&lt;br /&gt;
*[[Jeff Makey]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Concepts]]&lt;br /&gt;
&amp;lt;!-- Bad idea, Developer category is for people --&amp;gt;&lt;br /&gt;
&amp;lt;!-- [[Category:Developer]] --&amp;gt;&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Installing_on_Linux&amp;diff=8843</id>
		<title>Installing on Linux</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Installing_on_Linux&amp;diff=8843"/>
		<updated>2015-01-02T21:22:44Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: Don&amp;#039;t use the zip file on linux, use the tarball&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are various packages of BZFlag available to many different distributions.&lt;br /&gt;
&lt;br /&gt;
== Compiling from Source ==&lt;br /&gt;
This document is not designed to cover information about compiling.&lt;br /&gt;
&lt;br /&gt;
{{main|Compiling}}&lt;br /&gt;
&lt;br /&gt;
see also [[ubuntu_and_bzflag_2.4]]&lt;br /&gt;
&lt;br /&gt;
== Installing from tarball ==&lt;br /&gt;
You extract it and run the install script as root.&lt;br /&gt;
&lt;br /&gt;
    tar -vzxf package.tar.gz&lt;br /&gt;
    cd bzflag-2.4.2&lt;br /&gt;
    ./configure --prefix=/install/path&lt;br /&gt;
    make&lt;br /&gt;
    sudo make install&lt;br /&gt;
&lt;br /&gt;
== Installing using a package manager ==&lt;br /&gt;
This depends on your distribution. Different distributions use different package managers.&lt;br /&gt;
&lt;br /&gt;
To understand the command lines please understand:&lt;br /&gt;
 $ &#039;&#039;indicates a user shell&#039;&#039;&lt;br /&gt;
 # &#039;&#039;indicates a root shell&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 $ sudo &#039;&#039;is replaceable by&#039;&#039; #&lt;br /&gt;
&lt;br /&gt;
=== Graphical Package Managers ===&lt;br /&gt;
Search for &amp;quot;BZFlag&amp;quot; and install it.&amp;lt;br /&amp;gt;&lt;br /&gt;
BZFlag will most likely be sorted to the Games category.&lt;br /&gt;
&lt;br /&gt;
=== Fedora / Red Hat / Mandriva / SUSE ===&lt;br /&gt;
 $ sudo yum install bzflag&lt;br /&gt;
&lt;br /&gt;
For the server package:&lt;br /&gt;
 $ sudo yum install bzflag-server&lt;br /&gt;
&lt;br /&gt;
=== Native RPM ===&lt;br /&gt;
 $ sudo rpm -ivh bzflag.x86.208.rpm&lt;br /&gt;
&lt;br /&gt;
=== Ubuntu / Debian ===&lt;br /&gt;
 $ sudo apt-get install bzflag&lt;br /&gt;
&lt;br /&gt;
For the server package:&lt;br /&gt;
 $ sudo apt-get install bzflag-server&lt;br /&gt;
&lt;br /&gt;
=== Other Debian / DPKG ===&lt;br /&gt;
&lt;br /&gt;
If you&#039;re only using the DPKG/Apt package manager you will be abled to install your downloaded package with the following command:&lt;br /&gt;
&lt;br /&gt;
 # dpkg -i package.deb&lt;br /&gt;
&lt;br /&gt;
Replace package.deb with the particular package you want to install (e.g. bzflag-2.0.13.deb).&lt;br /&gt;
&lt;br /&gt;
Download required packages from here: http://packages.debian.org/sid/bzflag&lt;br /&gt;
&lt;br /&gt;
* bzflag&lt;br /&gt;
* bzflag-data&lt;br /&gt;
* bzflag-client&lt;br /&gt;
* bzflag-server &lt;br /&gt;
&lt;br /&gt;
Please note that you need to resolve any further dependencies yourself, DPKG can&#039;t do this for you. &lt;br /&gt;
&lt;br /&gt;
=== Arch ===&lt;br /&gt;
&lt;br /&gt;
 # pacman -S bzflag&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gentoo ===&lt;br /&gt;
&lt;br /&gt;
 # emerge bzflag&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
* http://sourceforge.net/projects/bzflag/files/ Official BZFlag file repository on SourceForge&lt;br /&gt;
* http://packages.debian.org/sid/bzflag BZFlag-packages for debian sid in the official debian repository&lt;br /&gt;
&lt;br /&gt;
[[Category:Installing]]&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Bz_getShotGUID&amp;diff=8780</id>
		<title>Bz getShotGUID</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Bz_getShotGUID&amp;diff=8780"/>
		<updated>2014-04-19T22:09:51Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: Created page with &amp;quot;{{BZFS_API_Doc}} {{BZFS_API_Funcs}} ==Prototype== BZF_API uint32_t bz_getShotGUID (int fromPlayer, int shotID);  ==Parameters== {| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;20&amp;quot; cellspacing=&amp;quot;0&amp;quot; ...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{BZFS_API_Doc}}&lt;br /&gt;
{{BZFS_API_Funcs}}&lt;br /&gt;
==Prototype==&lt;br /&gt;
BZF_API uint32_t bz_getShotGUID (int fromPlayer, int shotID);&lt;br /&gt;
&lt;br /&gt;
==Parameters==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;20&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
  !name&lt;br /&gt;
  !type&lt;br /&gt;
  !value description&lt;br /&gt;
  |-&lt;br /&gt;
  |fromPlayer&lt;br /&gt;
  |int &lt;br /&gt;
  |the player who owns the shot, BZ_SERVER for world weapons&lt;br /&gt;
  |-&lt;br /&gt;
  |shotID&lt;br /&gt;
  |int&lt;br /&gt;
  |the local ID of the shot for the specified player&lt;br /&gt;
  |}&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
This API function will return the Globally Unique Identifier(GUID) for the specified shot if it exists, or 0 if it does not.&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
Shot GUIDs are unique to each shot fired (within a range of over 4 billion shots fired per server session). This ID can be useful to detect unique shots independent of player reload timers.&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Bz_shotHasMetaData&amp;diff=8779</id>
		<title>Bz shotHasMetaData</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Bz_shotHasMetaData&amp;diff=8779"/>
		<updated>2014-04-19T22:06:50Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: Created page with &amp;quot;{{BZFS_API_Doc}} {{BZFS_API_Funcs}} ==Prototype== BZF_API bool bz_shotHasMetaData (int fromPlayer, int shotID , const char* name); ==Parameters== {| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;20...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{BZFS_API_Doc}}&lt;br /&gt;
{{BZFS_API_Funcs}}&lt;br /&gt;
==Prototype==&lt;br /&gt;
BZF_API bool bz_shotHasMetaData (int fromPlayer, int shotID , const char* name);&lt;br /&gt;
==Parameters==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;20&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
  !name&lt;br /&gt;
  !type&lt;br /&gt;
  !value desription&lt;br /&gt;
  |-&lt;br /&gt;
  |fromPlayer&lt;br /&gt;
  |int &lt;br /&gt;
  |the player who owns the shot, BZ_SERVER for world weapons&lt;br /&gt;
  |-&lt;br /&gt;
  |shotID&lt;br /&gt;
  |int&lt;br /&gt;
  |the local ID of the shot for the specified player&lt;br /&gt;
  |-&lt;br /&gt;
  |name&lt;br /&gt;
  |const char*&lt;br /&gt;
  |the name of the MetaData value to check&lt;br /&gt;
  |}&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
This API function will return true if the specified shot exists and has data stored under the specified name.&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
Shot MetaData is useful for plug-ins that need to fake extra player shots with server based world weapons. Using MetaData a plug-in can store player or score information with the shot to be used later when the shot hits a target or expires. Shot MetaData is server side only and is unique to each shot fired. Multiple shots with the same ID over time will not contain the same data.&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Bz_setShotMetaData&amp;diff=8778</id>
		<title>Bz setShotMetaData</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Bz_setShotMetaData&amp;diff=8778"/>
		<updated>2014-04-19T22:05:38Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: Created page with &amp;quot;{{BZFS_API_Doc}} {{BZFS_API_Funcs}} ==Prototype== BZF_API void_t bz_setShotMetaData (int fromPlayer, int shotID, const char* name, uint32_t value); ==Parameters== {| border=&amp;quot;1...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{BZFS_API_Doc}}&lt;br /&gt;
{{BZFS_API_Funcs}}&lt;br /&gt;
==Prototype==&lt;br /&gt;
BZF_API void_t bz_setShotMetaData (int fromPlayer, int shotID, const char* name, uint32_t value);&lt;br /&gt;
==Parameters==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;20&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
  !name&lt;br /&gt;
  !type&lt;br /&gt;
  !value desription&lt;br /&gt;
  |-&lt;br /&gt;
  |fromPlayer&lt;br /&gt;
  |int &lt;br /&gt;
  |the player who owns the shot, BZ_SERVER for world weapons&lt;br /&gt;
  |-&lt;br /&gt;
  |shotID&lt;br /&gt;
  |int&lt;br /&gt;
  |the local ID of the shot for the specified player&lt;br /&gt;
  |-&lt;br /&gt;
  |name&lt;br /&gt;
  |const char*&lt;br /&gt;
  |the name of the MetaData value to set&lt;br /&gt;
  |-&lt;br /&gt;
  |name&lt;br /&gt;
  |uint32&lt;br /&gt;
  |the value to associate with the shot&lt;br /&gt;
  |}&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
This API function will set the specified data and associated it with the specified shot. If the shot does not exist the function will do nothing. Setting data for a name on a shot will replace any previous data that was associated with the name.&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
Shot MetaData is useful for plug-ins that need to fake extra player shots with server based world weapons. Using MetaData a plug-in can store player or score information with the shot to be used later when the shot hits a target or expires. Shot MetaData is server side only and is unique to each shot fired. Multiple shots with the same ID over time will not contain the same data.&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Bz_getShotMetaData&amp;diff=8777</id>
		<title>Bz getShotMetaData</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Bz_getShotMetaData&amp;diff=8777"/>
		<updated>2014-04-19T22:03:15Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: Created page with &amp;quot;{{BZFS_API_Doc}} {{BZFS_API_Funcs}} ==Prototype== BZF_API uint32_t bz_getShotMetaData (int fromPlayer, int shotID, const char* name); ==Parameters== {| border=&amp;quot;1&amp;quot; cellpadding=...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{BZFS_API_Doc}}&lt;br /&gt;
{{BZFS_API_Funcs}}&lt;br /&gt;
==Prototype==&lt;br /&gt;
BZF_API uint32_t bz_getShotMetaData (int fromPlayer, int shotID, const char* name);&lt;br /&gt;
==Parameters==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;20&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
  !name&lt;br /&gt;
  !type&lt;br /&gt;
  !value desription&lt;br /&gt;
  |-&lt;br /&gt;
  |fromPlayer&lt;br /&gt;
  |int &lt;br /&gt;
  |the player who owns the shot, BZ_SERVER for world weapons&lt;br /&gt;
  |-&lt;br /&gt;
  |shotID&lt;br /&gt;
  |int&lt;br /&gt;
  |the local ID of the shot for the specified player&lt;br /&gt;
  |-&lt;br /&gt;
  |name&lt;br /&gt;
  |const char*&lt;br /&gt;
  |the name of the MetaData value to get&lt;br /&gt;
  |}&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
This API function will return the data associated with the specified name for the specified shot. If the shot does not exist, or does not have any data for the name the function will return 0&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
Shot MetaData is useful for plug-ins that need to fake extra player shots with server based world weapons. Using MetaData a plug-in can store player or score information with the shot to be used later when the shot hits a target or expires. Shot MetaData is server side only and is unique to each shot fired. Multiple shots with the same ID over time will not contain the same data.&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Functions_(API)&amp;diff=8776</id>
		<title>Functions (API)</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Functions_(API)&amp;diff=8776"/>
		<updated>2014-04-19T21:57:20Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: /* Shot Type Control */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DoDoc|&lt;br /&gt;
Fill in articles for all API Functions&amp;lt;br&amp;gt;&lt;br /&gt;
Finish updating to 2.3.x&amp;lt;br&amp;gt;&lt;br /&gt;
Verify future API functions.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{BZFS_API_Doc}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&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;
== Function Groups ==&lt;br /&gt;
Functions are broken into a series of groups based on the type of action or information they deal with.&lt;br /&gt;
&lt;br /&gt;
=== Event Registration ===&lt;br /&gt;
2.0.x&lt;br /&gt;
 BZF_API bool [[bz_registerEvent]] ( [[Event(API)|bz_eEventType]] eventType, [[Event(API)|bz_EventHandler]]* eventHandler );&lt;br /&gt;
 BZF_API bool [[bz_removeEvent]] ( [[Event(API)|bz_eEventType]] eventType, [[Event(API)|bz_EventHandler]]* eventHandler );&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[Register]] ( [[Event(API)|bz_eEventType]] eventType );&lt;br /&gt;
 virtual void Cleanup() {Flush();}&lt;br /&gt;
&lt;br /&gt;
=== Non-Player Connections ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_registerNonPlayerConnectionHandler]] ( int connectionID, [[bz_NonPlayerConnectionHandler]]* handler );&lt;br /&gt;
 BZF_API bool [[bz_removeNonPlayerConnectionHandler]] ( int connectionID, [[bz_NonPlayerConnectionHandler]]* handler );&lt;br /&gt;
 BZF_API bool [[bz_sendNonPlayerData]] ( int connectionID, const void *data, unsigned int size );&lt;br /&gt;
 BZF_API bool [[bz_disconectNonPlayerConnection]] ( int connectionID );&lt;br /&gt;
 BZF_API unsigned int [[bz_getNonPlayerConnectionOutboundPacketCount]] ( int connectionID );&lt;br /&gt;
 BZF_API const char* [[bz_getNonPlayerConnectionIP]] ( int connectionID );&lt;br /&gt;
 BZF_API const char* [[bz_getNonPlayerConnectionHost]] ( int connectionID );&lt;br /&gt;
&lt;br /&gt;
=== Player Information ===&lt;br /&gt;
==== Player Information ====&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_hasPerm]] ( int playerID, const char* perm );&lt;br /&gt;
 BZF_API bool [[bz_getAdmin]] ( int playerID );&lt;br /&gt;
 BZF_API bz_eTeamType [[bz_getPlayerTeam]] ( int playerID );&lt;br /&gt;
 BZF_API const char* [[bz_getPlayerCallsign]] ( int playerID );&lt;br /&gt;
 BZF_API const char* [[bz_getPlayerIPAddress]] ( int playerID );&lt;br /&gt;
 BZF_API const char* [[bz_getPlayerFlag]] ( int playerID );&lt;br /&gt;
?&lt;br /&gt;
 BZF_API const char* [[bz_getPlayerReferrer]] ( int playerID );&lt;br /&gt;
 BZF_API const char* [[bz_getPlayerCustomData]] (int playerID, const char* key );&lt;br /&gt;
&lt;br /&gt;
==== Player State Information ====&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_isPlayerPaused]] ( int playerID );&lt;br /&gt;
 BZF_API bool [[bz_canPlayerSpawn]]( int playerID );&lt;br /&gt;
 BZF_API bool [[bz_getPlayerCurrentState]] ( int playerID, bz_PlayerUpdateState &amp;amp;state );&lt;br /&gt;
?&lt;br /&gt;
 BZF_API bool [[bz_getPlayerPosition]] ( int playerID, float pos[3], bool extrapolate );&lt;br /&gt;
 BZF_API bool [[bz_getPlayerRotation]] ( int playerID, float *rot, bool extrapolate );&lt;br /&gt;
 BZF_API bool [[bz_getPlayerVelocity]] ( int playerID, float vel[3] );&lt;br /&gt;
 BZF_API bool [[bz_getPlayerAngVel]] ( int playerID, float *angvel );&lt;br /&gt;
 BZF_API bool [[bz_getPlayerPhysicsDriver]] ( int playerID, int* phydrv );&lt;br /&gt;
&lt;br /&gt;
==== Player Lists and Records ====&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API [[bz_BasePlayerRecord]] *[[bz_getPlayerByIndex]] ( int index );&lt;br /&gt;
 BZF_API bool [[bz_updatePlayerData]] ( [[bz_BasePlayerRecord]] *playerRecord );&lt;br /&gt;
 BZF_API bool [[bz_freePlayerRecord]] ( [[bz_BasePlayerRecord]] *playerRecord );&lt;br /&gt;
&lt;br /&gt;
 BZF_API [[bz_APIIntList]] *[[bz_newIntList]] ( void );&lt;br /&gt;
 BZF_API [[bz_APIIntList]] *[[bz_getPlayerIndexList]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_getPlayerIndexList]] ( [[bz_APIIntList]] *playerList );&lt;br /&gt;
 BZF_API void [[bz_deleteIntList]] ( [[bz_APIIntList]] *l);&lt;br /&gt;
&lt;br /&gt;
Unknown&lt;br /&gt;
 BZF_API [[bz_BasePlayerRecord]] *[[bz_getPlayerByBZID]] ( int BZID );&lt;br /&gt;
 BZF_API [[bz_BasePlayerRecord]] *[[bz_getPlayerByCallsign]] ( const char* name );&lt;br /&gt;
&lt;br /&gt;
==== Player Management ====&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_grantPerm]] ( int playerID, const char* perm );&lt;br /&gt;
 BZF_API bool [[bz_revokePerm]] ( int playerID, const char* perm );&lt;br /&gt;
 BZF_API bool [[bz_validAdminPassword]] ( const char* passwd );&lt;br /&gt;
 BZF_API bool [[bz_setPlayerOperator]] ( int playerId );&lt;br /&gt;
?&lt;br /&gt;
 BZF_API bool [[bz_setPlayerSpawnable]]( int playerID, bool spawn );&lt;br /&gt;
 BZF_API bool [[bz_setPlayerLimboMessage]]( int playerID, const char* text );&lt;br /&gt;
 BZF_API bool [[bz_setPlayerCustomData]] (int playerID, const char* key, const char* data );&lt;br /&gt;
&lt;br /&gt;
=== Team Management ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API unsigned int [[bz_getTeamPlayerLimit]] ( bz_eTeamType team );&lt;br /&gt;
 BZF_API int [[bz_getTeamCount]] ([[bz_eTeamType]] team );&lt;br /&gt;
 BZF_API int [[bz_getTeamScore]] ([[bz_eTeamType]] team );&lt;br /&gt;
 BZF_API int [[bz_getTeamWins]] ([[bz_eTeamType]] team );&lt;br /&gt;
 BZF_API int [[bz_getTeamLosses]] ([[bz_eTeamType]] team );&lt;br /&gt;
 BZF_API void [[bz_setTeamWins]] ([[bz_eTeamType]] team, int wins );&lt;br /&gt;
 BZF_API void [[bz_setTeamLosses]] ([[bz_eTeamType]] team, int losses );&lt;br /&gt;
 BZF_API void [[bz_resetTeamScore]] ([[bz_eTeamType]] team );&lt;br /&gt;
 BZF_API void [[bz_resetTeamScores]] ( void );&lt;br /&gt;
?&lt;br /&gt;
 BZF_API void [[bz_changeTeam]]( int player, [[bz_eTeamType]] team );&lt;br /&gt;
&lt;br /&gt;
=== Score Management ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_setPlayerWins]] ( int playerId, int wins );&lt;br /&gt;
 BZF_API bool [[bz_setPlayerLosses]] ( int playerId, int losses );&lt;br /&gt;
 BZF_API bool [[bz_setPlayerTKs]] ( int playerId, int tks );&lt;br /&gt;
 BZF_API bool [[bz_resetPlayerScore]] ( int playerId );&lt;br /&gt;
 BZF_API int [[bz_getPlayerWins]] ( int playerId );&lt;br /&gt;
 BZF_API int [[bz_getPlayerLosses]] ( int playerId );&lt;br /&gt;
 BZF_API int [[bz_getPlayerTKs]] ( int playerId );&lt;br /&gt;
 BZF_API float [[bz_getPlayerRank]] ( int playerId );&lt;br /&gt;
&lt;br /&gt;
=== Latency Information ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API int [[bz_getPlayerLag]] ( int playerId );&lt;br /&gt;
 BZF_API int [[bz_getPlayerJitter]] ( int playerId );&lt;br /&gt;
 BZF_API float [[bz_getPlayerPacketloss]] ( int playerId );&lt;br /&gt;
 BZF_API int [[bz_getIdleTime]] ( int playerId );&lt;br /&gt;
 BZF_API int [[bz_getPausedTime]] ( int playerId );&lt;br /&gt;
&lt;br /&gt;
=== Permission Group Management ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API [[bz_APIStringList]]* [[bz_getGroupList]] ( void );&lt;br /&gt;
 BZF_API [[bz_APIStringList]]* [[bz_getGroupPerms]] ( const char* group );&lt;br /&gt;
 BZF_API bool [[bz_groupAllowPerm]] ( const char* group, const char* perm );&lt;br /&gt;
&lt;br /&gt;
=== Chat Messages ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_sendTextMessage]] (int from, int to, const char* message);&lt;br /&gt;
 BZF_API bool [[bz_sendTextMessage]] (int from, [[bz_eTeamType]] to, const char* message);&lt;br /&gt;
 BZF_API bool [[bz_sendTextMessagef]] (int from, int to, const char* fmt, ...);&lt;br /&gt;
 BZF_API bool [[bz_sendTextMessagef]] (int from, [[bz_eTeamType]] to, const char* fmt, ...);&lt;br /&gt;
?&lt;br /&gt;
 BZF_API bool [[bz_sendFetchResMessage]] ( int playerID,  const char* URL );&lt;br /&gt;
 BZF_API bool [[bz_sendJoinServer]] ( int playerID, const char* address, int port, int team, const char* referrer, const char* message );&lt;br /&gt;
 BZF_API bool [[bz_sendLuaData]] ( int dstPlayerID, int dstScriptID, int statusBits, const char* data, int len,&lt;br /&gt;
                               int srcPlayerID = 0, int srcScriptID = 0 );&lt;br /&gt;
&lt;br /&gt;
=== Server Management ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_restart]] ( void );&lt;br /&gt;
 BZF_API void [[bz_shutdown]] ();&lt;br /&gt;
 BZF_API void [[bz_superkill]] ();&lt;br /&gt;
 BZF_API void [[bz_gameOver]] ( int playerID, bz_eTeamType = eNoTeam );&lt;br /&gt;
 BZF_API void [[bz_reloadLocalBans]] ();&lt;br /&gt;
 BZF_API void [[bz_reloadMasterBans]] ();&lt;br /&gt;
 BZF_API void [[bz_reloadGroups]] ();&lt;br /&gt;
 BZF_API void [[bz_reloadUsers]] ();&lt;br /&gt;
 BZF_API void [[bz_reloadHelp]] ();&lt;br /&gt;
 BZF_API int [[bz_getPlayerCount]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_getShotMismatch]] ( void );&lt;br /&gt;
 BZF_API void [[bz_setShotMismatch]] ( bool value );&lt;br /&gt;
?&lt;br /&gt;
 BZF_API bool [[bz_anyPlayers]] ( void );&lt;br /&gt;
&lt;br /&gt;
=== Rabbit Hunt ===&lt;br /&gt;
?&lt;br /&gt;
 BZF_API void [[bz_newRabbit]] ( int player, bool swap );&lt;br /&gt;
 BZF_API void [[bz_removeRabbit]] ( int player );&lt;br /&gt;
&lt;br /&gt;
=== Map Management ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API void [[bz_setClientWorldDownloadURL]] ( const char* URL );&lt;br /&gt;
 BZF_API const [[bz_ApiString]] [[bz_getClientWorldDownloadURL]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_saveWorldCacheFile]] ( const char* file );&lt;br /&gt;
&lt;br /&gt;
=== Flag Management ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_givePlayerFlag]] ( int playerID, const char* flagType, bool force );&lt;br /&gt;
 BZF_API bool [[bz_removePlayerFlag]] ( int playerID );&lt;br /&gt;
 BZF_API void [[bz_resetFlags]] ( bool onlyUnused, bool keepTeamFlags = false );&lt;br /&gt;
 BZF_API unsigned int [[bz_getNumFlags]] ( void );&lt;br /&gt;
 BZF_API const [[bz_ApiString]] [[bz_getFlagName|bz_getName]] ( int flag );&lt;br /&gt;
 BZF_API bool [[bz_resetFlag]] ( int flag );&lt;br /&gt;
 BZF_API int [[bz_flagPlayer]] ( int flag );&lt;br /&gt;
 BZF_API int [[bz_getPlayerFlagID]] ( int playerID );&lt;br /&gt;
 BZF_API bool [[bz_getFlagPosition]] ( int flag, float* pos );&lt;br /&gt;
 BZF_API bool [[bz_moveFlag]] ( int flag, float pos[3] );&lt;br /&gt;
 BZF_API bool [[bz_RegisterCustomFlag]] ( const char* abbr, const char* name, const char* helpString, bz_eShotType shotType, bz_eFlagQuality quality );&lt;br /&gt;
&lt;br /&gt;
=== Shot Type Control ===&lt;br /&gt;
?&lt;br /&gt;
 BZF_API bool [[bz_setPlayerShotType]] ( int playerId, [[bz_eShotType]] shotType );&lt;br /&gt;
&lt;br /&gt;
=== Shot Management ===&lt;br /&gt;
2.4.5+&lt;br /&gt;
 BZF_API uint32_t [[bz_getShotMetaData]] (int fromPlayer, int shotID, const char* name);&lt;br /&gt;
 BZF_API void [[bz_setShotMetaData]] (int fromPlayer, int shotID , const char* name, uint32_t value);&lt;br /&gt;
 BZF_API bool [[bz_shotHasMetaData]] (int fromPlayer, int shotID , const char* name);&lt;br /&gt;
 BZF_API uint32_t [[bz_getShotGUID]] (int fromPlayer, int shotID);&lt;br /&gt;
&lt;br /&gt;
=== World Weapon Management ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_fireWorldWep]] ( const char* flagType, float lifetime, int fromPlayer, float *pos, float tilt, float direction, int shotID , float dt, bz_eTeamType shotTeam = eRogueTeam );&lt;br /&gt;
 BZF_API bool [[bz_fireWorldWep]] ( const char* flagType, float lifetime, int fromPlayer, float *pos, float tilt, float direction, int *shotID , float dt, bz_eTeamType shotTeam = eRogueTeam );&lt;br /&gt;
 BZF_API int [[bz_fireWorldGM]] ( int targetPlayerID, float lifetime, float *pos, float tilt, float direction, float dt, bz_eTeamType shotTeam = eRogueTeam );&lt;br /&gt;
&lt;br /&gt;
=== Server Time ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API double [[bz_getCurrentTime]] ( void );&lt;br /&gt;
 BZF_API void [[bz_getLocaltime]] ( [[bz_Time]] *ts );&lt;br /&gt;
 BZF_API void [[bz_getUTCtime]] ( [[bz_Time]] *ts );&lt;br /&gt;
&lt;br /&gt;
?&lt;br /&gt;
 BZF_API float [[bz_getMaxWaitTime]] ( void );&lt;br /&gt;
 BZF_API void [[bz_setMaxWaitTime]] ( float maxTime );&lt;br /&gt;
&lt;br /&gt;
=== Global Database Management (BZDB) ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API double [[bz_getBZDBDouble]] ( const char* variable );&lt;br /&gt;
 BZF_API [[bz_ApiString]] [[bz_getBZDBString]] ( const char* variable );&lt;br /&gt;
 BZF_API bool [[bz_getBZDBBool]] ( const char* variable );&lt;br /&gt;
 BZF_API int [[bz_getBZDBInt]] ( const char* variable );&lt;br /&gt;
 BZF_API int [[bz_getBZDBItemPerms]] ( const char* variable );&lt;br /&gt;
 BZF_API bool [[bz_getBZDBItemPesistent]] ( const char* variable );&lt;br /&gt;
 BZF_API bool [[bz_BZDBItemExists]] ( const char* variable );&lt;br /&gt;
 BZF_API bool [[bz_setBZDBDouble]] ( const char* variable, double val, int perms = 0, bool persistent = false );&lt;br /&gt;
 BZF_API bool [[bz_setBZDBString]] ( const char* variable, const char *val, int perms = 0, bool persistent = false  );&lt;br /&gt;
 BZF_API bool [[bz_setBZDBBool]] ( const char* variable, bool val, int perms = 0, bool persistent = false  );&lt;br /&gt;
 BZF_API bool [[bz_setBZDBInt]] ( const char* variable, int val, int perms = 0, bool persistent = false  );&lt;br /&gt;
 BZF_API int [[bz_getBZDBVarList]] ( bz_APIStringList	*varList );&lt;br /&gt;
 BZF_API void [[bz_resetBZDBVar]] ( const char* variable );&lt;br /&gt;
 BZF_API void [[bz_resetALLBZDBVars]] ( void );&lt;br /&gt;
&lt;br /&gt;
=== Logging ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API void [[bz_debugMessage]] ( int level, const char* message );&lt;br /&gt;
 BZF_API void [[bz_debugMessagef]] ( int level, const char* fmt, ... )&lt;br /&gt;
 BZF_API int [[bz_getDebugLevel]] ( void );&lt;br /&gt;
&lt;br /&gt;
=== Server Administration ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_kickUser]] ( int playerIndex, const char* reason, bool notify );&lt;br /&gt;
 BZF_API bool [[bz_IPBanUser]] ( int bannedByIndex, const char* ip, int duration, const char* reason );&lt;br /&gt;
 BZF_API bool [[bz_HostBanUser]] ( int bannedByIndex, const char* hostmask, int duration, const char* reason );&lt;br /&gt;
 BZF_API bool [[bz_IPUnbanUser]] ( const char* ip );&lt;br /&gt;
 BZF_API bool [[bz_IDUnbanUser]] ( const char* bzID );&lt;br /&gt;
 BZF_API bool [[bz_HostUnbanUser]] ( const char* hostmask );&lt;br /&gt;
 &lt;br /&gt;
 BZF_API int [[bz_getLagWarn]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_setLagWarn]] ( int lagwarn );&lt;br /&gt;
 BZF_API bool [[bz_pollActive]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_pollVeto]] ( void );&lt;br /&gt;
&lt;br /&gt;
?&lt;br /&gt;
 BZF_API bool [[bz_IDBanUser]] ( int bannedByIndex, const char* bzID , int duration, const char *reason );&lt;br /&gt;
&lt;br /&gt;
=== Reporting ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API [[bz_APIStringList]]* [[bz_getReports]] ( void );&lt;br /&gt;
?&lt;br /&gt;
 BZF_API unsigned int [[bz_getReportCount]] ( void );&lt;br /&gt;
 BZF_API const char* [[bz_getReportSource]] ( unsigned int id );&lt;br /&gt;
 BZF_API const char* [[bz_getReportBody]] ( unsigned int id );&lt;br /&gt;
 BZF_API const char* [[bz_getReportTime]] ( unsigned int id );&lt;br /&gt;
 BZF_API bool [[bz_clearReport]] ( unsigned int id );&lt;br /&gt;
 BZF_API bool [[bz_clearAllReports]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_fileReport]] ( const char* message, const char* from );&lt;br /&gt;
&lt;br /&gt;
=== Timed Game Management ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_setTimeLimit]] ( float timeLimit );&lt;br /&gt;
 BZF_API float [[bz_getTimeLimit]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_isTimeManualStart]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_isCountDownActive]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_isCountDownInProgress]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_isCountDownPaused]] ( void );&lt;br /&gt;
 BZF_API void [[bz_pauseCountdown]] ( const char *pausedBy );&lt;br /&gt;
 BZF_API void [[bz_resumeCountdown]] ( const char *resumedBy );&lt;br /&gt;
 BZF_API void [[bz_startCountdown]] ( int delay, float limit, const char *byWho );&lt;br /&gt;
&lt;br /&gt;
=== Custom Text Commands ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_registerCustomSlashCommand]] ( const char* command, [[bz_CustomSlashCommandHandler]] *handler );&lt;br /&gt;
 BZF_API bool [[bz_removeCustomSlashCommand]] ( const char* command );&lt;br /&gt;
&lt;br /&gt;
=== Plug-in Management ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API int [[bz_getLoadedPlugins]] ( [[bz_APIStringList]] * list );&lt;br /&gt;
 BZF_API bool [[bz_loadPlugin]] ( const char* path, const char* params );&lt;br /&gt;
 BZF_API bool [[bz_unloadPlugin]] ( const char* path );&lt;br /&gt;
 BZF_API const char* [[bz_pluginBinPath]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_registerCustomPluginHandler]] ( const char* extension, [[bz_APIPluginHandler]] * handler );&lt;br /&gt;
 BZF_API bool [[bz_removeCustomPluginHandler]] ( const char* extension, [[bz_APIPluginHandler]] * handler );&lt;br /&gt;
&lt;br /&gt;
=== Public Server Information ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_getPublic]] ( void );&lt;br /&gt;
 BZF_API [[bz_ApiString]] [[bz_getPublicAddr]] ( void );&lt;br /&gt;
 BZF_API [[bz_ApiString]] [[bz_getPublicDescription]] ( void );&lt;br /&gt;
 BZF_API int [[bz_getPublicPort]] ( void );&lt;br /&gt;
 BZF_API void [[bz_updateListServer]] ( void );&lt;br /&gt;
&lt;br /&gt;
=== HTTP Transfer ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_addURLJob]] ( const char* URL, [[bz_BaseURLHandler]]* handler = NULL, const char* postData = NULL );&lt;br /&gt;
 BZF_API bool [[bz_removeURLJob]] ( const char* URL );&lt;br /&gt;
?&lt;br /&gt;
 BZF_API bool [[bz_stopAllURLJobs]] ( void );&lt;br /&gt;
&lt;br /&gt;
=== Callback Functions ===&lt;br /&gt;
?&lt;br /&gt;
 BZF_API bool [[bz_registerCallBack]] ( const char* name, [[bz_GenericCallback]] *callback );&lt;br /&gt;
 BZF_API bool [[bz_registerCallBack]] ( const char* name, [[bz_GenericCallbackFunc]] callback );&lt;br /&gt;
 BZF_API bool [[bz_removeCallBack]] ( const char* name, [[bz_GenericCallback]] *callback );&lt;br /&gt;
 BZF_API bool [[bz_removeCallBack]] ( const char* name, [[bz_GenericCallbackFunc]] callback );&lt;br /&gt;
 BZF_API bool [[bz_callCallback]] ( const char* name, void *param );&lt;br /&gt;
 BZF_API bool [[bz_callbackExists]] ( const char* name );&lt;br /&gt;
&lt;br /&gt;
=== Inter-Plug-in Communications ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_clipFieldExists]] ( const char *name );&lt;br /&gt;
 BZF_API const char* [[bz_getclipFieldString]] ( const char *name );&lt;br /&gt;
 BZF_API float [[bz_getclipFieldFloat]] ( const char *name );&lt;br /&gt;
 BZF_API int [[bz_getclipFieldInt]] ( const char *name );&lt;br /&gt;
 BZF_API bool [[bz_setclipFieldString]] ( const char *name, const char* data );&lt;br /&gt;
 BZF_API bool [[bz_setclipFieldFloat]] ( const char *name, float data );&lt;br /&gt;
 BZF_API bool [[bz_setclipFieldInt]] ( const char *name, int data );&lt;br /&gt;
 BZF_API bool [[bz_addClipFieldNotifier]] ( const char *name, [[bz_ClipFiledNotifier *cb );&lt;br /&gt;
 BZF_API bool [[bz_removeClipFieldNotifier]] ( const char *name, [[bz_ClipFiledNotifier *cb );&lt;br /&gt;
&lt;br /&gt;
=== Game Recording ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_saveRecBuf]] ( const char * _filename, int seconds);&lt;br /&gt;
 BZF_API bool [[bz_startRecBuf]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_stopRecBuf]] ( void );&lt;br /&gt;
&lt;br /&gt;
=== Map Management ===&lt;br /&gt;
==== Map Information ====&lt;br /&gt;
?&lt;br /&gt;
 BZF_API void [[bz_getWorldSize]] ( float *size, float *wallHeight );&lt;br /&gt;
 BZF_API unsigned int [[bz_getWorldObjectCount]] ( void );&lt;br /&gt;
 BZF_API [[bz_APIWorldObjectList]]* [[bz_getWorldObjectList]] ( void );&lt;br /&gt;
 BZF_API void [[bz_releaseWorldObjectList]] ( [[bz_APIWorldObjectList]] *list );&lt;br /&gt;
 BZF_API unsigned int [[bz_findWorldObject]] ( const char *name );&lt;br /&gt;
 BZF_API [[bz_APIBaseWorldObject]]* [[bz_getWorldObjectByID]] ( unsigned int id );&lt;br /&gt;
 BZF_API bool [[bz_getTeleLinkIDs]] ( const char* teleName, int* frontLink, int* backLink );&lt;br /&gt;
 BZF_API const char* [[bz_getLinkTeleName]] ( int linkIndex );&lt;br /&gt;
 BZF_API int [[bz_getPhyDrvID]] ( const char* phyDrvName );&lt;br /&gt;
 BZF_API const char* [[bz_getPhyDrvName]] ( unsigned int phyDrvID );&lt;br /&gt;
 BZF_API bool [[bz_SetWorldObjectTangibility]] ( int id, const [[bz_SolidObjectPassableAtributes]] &amp;amp;atribs );&lt;br /&gt;
 BZF_API bool [[bz_GetWorldObjectTangibility]] ( int id, [[bz_SolidObjectPassableAtributes]] &amp;amp;atribs );&lt;br /&gt;
 BZF_API void [[bz_ResetWorldObjectTangibilities]] ( void );&lt;br /&gt;
&lt;br /&gt;
==== Map Collisions ====&lt;br /&gt;
?&lt;br /&gt;
 [[bz_eAPIColType]] [[bz_cylinderInMapObject]] ( float pos[3], float height, float radius, [[bz_APIBaseWorldObject]] **object );&lt;br /&gt;
 [[bz_eAPIColType]] [[bz_boxInMapObject]] ( float pos[3], float size[3], float angle, [[bz_APIBaseWorldObject]] **object );&lt;br /&gt;
&lt;br /&gt;
==== Custom Map Objects ====&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_registerCustomMapObject]] ( const char* object, [[bz_CustomMapObjectHandler]] *handler );&lt;br /&gt;
 BZF_API bool [[bz_removeCustomMapObject]] ( const char* object );&lt;br /&gt;
&lt;br /&gt;
=== Utility ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API const char *[[bz_MD5]] ( const char* str );&lt;br /&gt;
 BZF_API const char *[[bz_MD5]] ( const void* data, size_t size );&lt;br /&gt;
 BZF_API const char *[[bz_getServerVersion]] ( void );&lt;br /&gt;
 BZF_API const char *[[bz_getProtocolVersion]] ( void );&lt;br /&gt;
&lt;br /&gt;
=== Misc ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_getStandardSpawn]] ( int playerID, float pos[3], float *rot );&lt;br /&gt;
 BZF_API bool [[bz_killPlayer]] ( int playerID, bool spawnOnBase);&lt;br /&gt;
 BZF_API bool [[bz_killPlayer]] ( int playerID, bool spawnOnBase, int killerID = -1, const char* flagID = NULL );&lt;br /&gt;
 BZF_API bool [[bz_sendPlayCustomLocalSound]] ( int playerID, const char* soundName );&lt;br /&gt;
 BZF_API [[bz_ApiString]] [[bz_filterPath]] ( const char* path );&lt;br /&gt;
 BZF_API const char *[[bz_format]](const char* fmt, ...)_ATTRIBUTE12;&lt;br /&gt;
 BZF_API const char *[[bz_toupper]](const char* val );&lt;br /&gt;
 BZF_API const char *[[bz_tolower]](const char* val );&lt;br /&gt;
 BZF_API const char *[[bz_urlEncode]](const char* val );&lt;br /&gt;
 BZF_API [[bz_eGameType]] [[bz_getGameType]]( void );&lt;br /&gt;
 BZF_API [[bz_eTeamType]] [[bz_checkBaseAtPoint]] ( float pos[3] );&lt;br /&gt;
 BZF_API int [[bz_APIVersion]] ( void );&lt;br /&gt;
?&lt;br /&gt;
 BZF_API bool [[bz_allowJumping]] ( void );&lt;br /&gt;
&lt;br /&gt;
=== Server Side Players (Development) ===&lt;br /&gt;
? (In API for 2.3+, but will crash a server)&lt;br /&gt;
 BZF_API int [[bz_addServerSidePlayer]] ( [[bz_ServerSidePlayerHandler]] *handler );&lt;br /&gt;
 BZF_API bool [[bz_removeServerSidePlayer]] ( int playerID, [[bz_ServerSidePlayerHandler]] *handler );&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
[[BZFS API]]&lt;br /&gt;
&lt;br /&gt;
[[plug-ins]]&lt;br /&gt;
&lt;br /&gt;
[[Category:BZFS_API_Functions]]&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Bz_fireWorldWep&amp;diff=8773</id>
		<title>Bz fireWorldWep</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Bz_fireWorldWep&amp;diff=8773"/>
		<updated>2014-04-19T18:43:25Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: /* Prototype */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{BZFS_API_Doc}}&lt;br /&gt;
{{BZFS_API_Funcs}}&lt;br /&gt;
==Prototypes==&lt;br /&gt;
BZF_API bool bz_fireWorldWep ( const char* flagType, float lifetime, int fromPlayer, float *pos, float tilt, float direction, int shotID , float dt , bz_eTeamType shotTeam = eRogueTeam );&lt;br /&gt;
&lt;br /&gt;
BZF_API bool bz_fireWorldWep ( const char* flagType, float lifetime, int fromPlayer, float *pos, float tilt, float direction, int *shotID , float dt , bz_eTeamType shotTeam = eRogueTeam );&lt;br /&gt;
&lt;br /&gt;
==Parameters==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;20&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
  !name&lt;br /&gt;
  !type&lt;br /&gt;
  !value desription&lt;br /&gt;
  |-&lt;br /&gt;
  |flagType &lt;br /&gt;
  |const char* &lt;br /&gt;
  |Flag type the world weapon will fire with&lt;br /&gt;
  |-&lt;br /&gt;
  |lifetime&lt;br /&gt;
  |float&lt;br /&gt;
  |How long the world weapon will &amp;quot;live&amp;quot;.&lt;br /&gt;
  |-&lt;br /&gt;
  |fromPlayer&lt;br /&gt;
  |int&lt;br /&gt;
  |Player ID that fired the shot, or BZ_SERVER.&lt;br /&gt;
  |-&lt;br /&gt;
  |*pos &lt;br /&gt;
  |float&lt;br /&gt;
  |Position the world weapon will fire from.&lt;br /&gt;
  |-&lt;br /&gt;
  |tilt &lt;br /&gt;
  |float&lt;br /&gt;
  |The tilt of the weapon in radians.&lt;br /&gt;
  |-&lt;br /&gt;
  |direction&lt;br /&gt;
  |float&lt;br /&gt;
  |The direction of which to fire the world weapon in radians. (rotation)&lt;br /&gt;
  |-&lt;br /&gt;
  |shotID&lt;br /&gt;
  |int (or int * for second version)&lt;br /&gt;
  |Shot ID of the world weapon. Each shot is given a unique shot ID for shot tracking. For the second version a pointer to an int that will contain the generated shot ID.&lt;br /&gt;
  |-&lt;br /&gt;
  |dt&lt;br /&gt;
  |float&lt;br /&gt;
  |Delay time. How many seconds the weapon waits before firing.&lt;br /&gt;
  |-&lt;br /&gt;
  |shotTeam&lt;br /&gt;
  |bz_eTeamType&lt;br /&gt;
  |Team color of the weapon. (Rogue by default)&lt;br /&gt;
  |}&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
This API function will fire w worldweapon at the specified location with the specified parameters.&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Bz_fireWorldWep&amp;diff=8772</id>
		<title>Bz fireWorldWep</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Bz_fireWorldWep&amp;diff=8772"/>
		<updated>2014-04-19T18:43:11Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{BZFS_API_Doc}}&lt;br /&gt;
{{BZFS_API_Funcs}}&lt;br /&gt;
==Prototype==&lt;br /&gt;
BZF_API bool bz_fireWorldWep ( const char* flagType, float lifetime, int fromPlayer, float *pos, float tilt, float direction, int shotID , float dt , bz_eTeamType shotTeam = eRogueTeam );&lt;br /&gt;
&lt;br /&gt;
BZF_API bool bz_fireWorldWep ( const char* flagType, float lifetime, int fromPlayer, float *pos, float tilt, float direction, int *shotID , float dt , bz_eTeamType shotTeam = eRogueTeam );&lt;br /&gt;
&lt;br /&gt;
==Parameters==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;20&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
  !name&lt;br /&gt;
  !type&lt;br /&gt;
  !value desription&lt;br /&gt;
  |-&lt;br /&gt;
  |flagType &lt;br /&gt;
  |const char* &lt;br /&gt;
  |Flag type the world weapon will fire with&lt;br /&gt;
  |-&lt;br /&gt;
  |lifetime&lt;br /&gt;
  |float&lt;br /&gt;
  |How long the world weapon will &amp;quot;live&amp;quot;.&lt;br /&gt;
  |-&lt;br /&gt;
  |fromPlayer&lt;br /&gt;
  |int&lt;br /&gt;
  |Player ID that fired the shot, or BZ_SERVER.&lt;br /&gt;
  |-&lt;br /&gt;
  |*pos &lt;br /&gt;
  |float&lt;br /&gt;
  |Position the world weapon will fire from.&lt;br /&gt;
  |-&lt;br /&gt;
  |tilt &lt;br /&gt;
  |float&lt;br /&gt;
  |The tilt of the weapon in radians.&lt;br /&gt;
  |-&lt;br /&gt;
  |direction&lt;br /&gt;
  |float&lt;br /&gt;
  |The direction of which to fire the world weapon in radians. (rotation)&lt;br /&gt;
  |-&lt;br /&gt;
  |shotID&lt;br /&gt;
  |int (or int * for second version)&lt;br /&gt;
  |Shot ID of the world weapon. Each shot is given a unique shot ID for shot tracking. For the second version a pointer to an int that will contain the generated shot ID.&lt;br /&gt;
  |-&lt;br /&gt;
  |dt&lt;br /&gt;
  |float&lt;br /&gt;
  |Delay time. How many seconds the weapon waits before firing.&lt;br /&gt;
  |-&lt;br /&gt;
  |shotTeam&lt;br /&gt;
  |bz_eTeamType&lt;br /&gt;
  |Team color of the weapon. (Rogue by default)&lt;br /&gt;
  |}&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
This API function will fire w worldweapon at the specified location with the specified parameters.&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Functions_(API)&amp;diff=8771</id>
		<title>Functions (API)</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Functions_(API)&amp;diff=8771"/>
		<updated>2014-04-19T18:42:08Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: /* World Weapon Management */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DoDoc|&lt;br /&gt;
Fill in articles for all API Functions&amp;lt;br&amp;gt;&lt;br /&gt;
Finish updating to 2.3.x&amp;lt;br&amp;gt;&lt;br /&gt;
Verify future API functions.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{BZFS_API_Doc}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&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;
== Function Groups ==&lt;br /&gt;
Functions are broken into a series of groups based on the type of action or information they deal with.&lt;br /&gt;
&lt;br /&gt;
=== Event Registration ===&lt;br /&gt;
2.0.x&lt;br /&gt;
 BZF_API bool [[bz_registerEvent]] ( [[Event(API)|bz_eEventType]] eventType, [[Event(API)|bz_EventHandler]]* eventHandler );&lt;br /&gt;
 BZF_API bool [[bz_removeEvent]] ( [[Event(API)|bz_eEventType]] eventType, [[Event(API)|bz_EventHandler]]* eventHandler );&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[Register]] ( [[Event(API)|bz_eEventType]] eventType );&lt;br /&gt;
 virtual void Cleanup() {Flush();}&lt;br /&gt;
&lt;br /&gt;
=== Non-Player Connections ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_registerNonPlayerConnectionHandler]] ( int connectionID, [[bz_NonPlayerConnectionHandler]]* handler );&lt;br /&gt;
 BZF_API bool [[bz_removeNonPlayerConnectionHandler]] ( int connectionID, [[bz_NonPlayerConnectionHandler]]* handler );&lt;br /&gt;
 BZF_API bool [[bz_sendNonPlayerData]] ( int connectionID, const void *data, unsigned int size );&lt;br /&gt;
 BZF_API bool [[bz_disconectNonPlayerConnection]] ( int connectionID );&lt;br /&gt;
 BZF_API unsigned int [[bz_getNonPlayerConnectionOutboundPacketCount]] ( int connectionID );&lt;br /&gt;
 BZF_API const char* [[bz_getNonPlayerConnectionIP]] ( int connectionID );&lt;br /&gt;
 BZF_API const char* [[bz_getNonPlayerConnectionHost]] ( int connectionID );&lt;br /&gt;
&lt;br /&gt;
=== Player Information ===&lt;br /&gt;
==== Player Information ====&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_hasPerm]] ( int playerID, const char* perm );&lt;br /&gt;
 BZF_API bool [[bz_getAdmin]] ( int playerID );&lt;br /&gt;
 BZF_API bz_eTeamType [[bz_getPlayerTeam]] ( int playerID );&lt;br /&gt;
 BZF_API const char* [[bz_getPlayerCallsign]] ( int playerID );&lt;br /&gt;
 BZF_API const char* [[bz_getPlayerIPAddress]] ( int playerID );&lt;br /&gt;
 BZF_API const char* [[bz_getPlayerFlag]] ( int playerID );&lt;br /&gt;
?&lt;br /&gt;
 BZF_API const char* [[bz_getPlayerReferrer]] ( int playerID );&lt;br /&gt;
 BZF_API const char* [[bz_getPlayerCustomData]] (int playerID, const char* key );&lt;br /&gt;
&lt;br /&gt;
==== Player State Information ====&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_isPlayerPaused]] ( int playerID );&lt;br /&gt;
 BZF_API bool [[bz_canPlayerSpawn]]( int playerID );&lt;br /&gt;
 BZF_API bool [[bz_getPlayerCurrentState]] ( int playerID, bz_PlayerUpdateState &amp;amp;state );&lt;br /&gt;
?&lt;br /&gt;
 BZF_API bool [[bz_getPlayerPosition]] ( int playerID, float pos[3], bool extrapolate );&lt;br /&gt;
 BZF_API bool [[bz_getPlayerRotation]] ( int playerID, float *rot, bool extrapolate );&lt;br /&gt;
 BZF_API bool [[bz_getPlayerVelocity]] ( int playerID, float vel[3] );&lt;br /&gt;
 BZF_API bool [[bz_getPlayerAngVel]] ( int playerID, float *angvel );&lt;br /&gt;
 BZF_API bool [[bz_getPlayerPhysicsDriver]] ( int playerID, int* phydrv );&lt;br /&gt;
&lt;br /&gt;
==== Player Lists and Records ====&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API [[bz_BasePlayerRecord]] *[[bz_getPlayerByIndex]] ( int index );&lt;br /&gt;
 BZF_API bool [[bz_updatePlayerData]] ( [[bz_BasePlayerRecord]] *playerRecord );&lt;br /&gt;
 BZF_API bool [[bz_freePlayerRecord]] ( [[bz_BasePlayerRecord]] *playerRecord );&lt;br /&gt;
&lt;br /&gt;
 BZF_API [[bz_APIIntList]] *[[bz_newIntList]] ( void );&lt;br /&gt;
 BZF_API [[bz_APIIntList]] *[[bz_getPlayerIndexList]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_getPlayerIndexList]] ( [[bz_APIIntList]] *playerList );&lt;br /&gt;
 BZF_API void [[bz_deleteIntList]] ( [[bz_APIIntList]] *l);&lt;br /&gt;
&lt;br /&gt;
Unknown&lt;br /&gt;
 BZF_API [[bz_BasePlayerRecord]] *[[bz_getPlayerByBZID]] ( int BZID );&lt;br /&gt;
 BZF_API [[bz_BasePlayerRecord]] *[[bz_getPlayerByCallsign]] ( const char* name );&lt;br /&gt;
&lt;br /&gt;
==== Player Management ====&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_grantPerm]] ( int playerID, const char* perm );&lt;br /&gt;
 BZF_API bool [[bz_revokePerm]] ( int playerID, const char* perm );&lt;br /&gt;
 BZF_API bool [[bz_validAdminPassword]] ( const char* passwd );&lt;br /&gt;
 BZF_API bool [[bz_setPlayerOperator]] ( int playerId );&lt;br /&gt;
?&lt;br /&gt;
 BZF_API bool [[bz_setPlayerSpawnable]]( int playerID, bool spawn );&lt;br /&gt;
 BZF_API bool [[bz_setPlayerLimboMessage]]( int playerID, const char* text );&lt;br /&gt;
 BZF_API bool [[bz_setPlayerCustomData]] (int playerID, const char* key, const char* data );&lt;br /&gt;
&lt;br /&gt;
=== Team Management ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API unsigned int [[bz_getTeamPlayerLimit]] ( bz_eTeamType team );&lt;br /&gt;
 BZF_API int [[bz_getTeamCount]] ([[bz_eTeamType]] team );&lt;br /&gt;
 BZF_API int [[bz_getTeamScore]] ([[bz_eTeamType]] team );&lt;br /&gt;
 BZF_API int [[bz_getTeamWins]] ([[bz_eTeamType]] team );&lt;br /&gt;
 BZF_API int [[bz_getTeamLosses]] ([[bz_eTeamType]] team );&lt;br /&gt;
 BZF_API void [[bz_setTeamWins]] ([[bz_eTeamType]] team, int wins );&lt;br /&gt;
 BZF_API void [[bz_setTeamLosses]] ([[bz_eTeamType]] team, int losses );&lt;br /&gt;
 BZF_API void [[bz_resetTeamScore]] ([[bz_eTeamType]] team );&lt;br /&gt;
 BZF_API void [[bz_resetTeamScores]] ( void );&lt;br /&gt;
?&lt;br /&gt;
 BZF_API void [[bz_changeTeam]]( int player, [[bz_eTeamType]] team );&lt;br /&gt;
&lt;br /&gt;
=== Score Management ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_setPlayerWins]] ( int playerId, int wins );&lt;br /&gt;
 BZF_API bool [[bz_setPlayerLosses]] ( int playerId, int losses );&lt;br /&gt;
 BZF_API bool [[bz_setPlayerTKs]] ( int playerId, int tks );&lt;br /&gt;
 BZF_API bool [[bz_resetPlayerScore]] ( int playerId );&lt;br /&gt;
 BZF_API int [[bz_getPlayerWins]] ( int playerId );&lt;br /&gt;
 BZF_API int [[bz_getPlayerLosses]] ( int playerId );&lt;br /&gt;
 BZF_API int [[bz_getPlayerTKs]] ( int playerId );&lt;br /&gt;
 BZF_API float [[bz_getPlayerRank]] ( int playerId );&lt;br /&gt;
&lt;br /&gt;
=== Latency Information ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API int [[bz_getPlayerLag]] ( int playerId );&lt;br /&gt;
 BZF_API int [[bz_getPlayerJitter]] ( int playerId );&lt;br /&gt;
 BZF_API float [[bz_getPlayerPacketloss]] ( int playerId );&lt;br /&gt;
 BZF_API int [[bz_getIdleTime]] ( int playerId );&lt;br /&gt;
 BZF_API int [[bz_getPausedTime]] ( int playerId );&lt;br /&gt;
&lt;br /&gt;
=== Permission Group Management ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API [[bz_APIStringList]]* [[bz_getGroupList]] ( void );&lt;br /&gt;
 BZF_API [[bz_APIStringList]]* [[bz_getGroupPerms]] ( const char* group );&lt;br /&gt;
 BZF_API bool [[bz_groupAllowPerm]] ( const char* group, const char* perm );&lt;br /&gt;
&lt;br /&gt;
=== Chat Messages ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_sendTextMessage]] (int from, int to, const char* message);&lt;br /&gt;
 BZF_API bool [[bz_sendTextMessage]] (int from, [[bz_eTeamType]] to, const char* message);&lt;br /&gt;
 BZF_API bool [[bz_sendTextMessagef]] (int from, int to, const char* fmt, ...);&lt;br /&gt;
 BZF_API bool [[bz_sendTextMessagef]] (int from, [[bz_eTeamType]] to, const char* fmt, ...);&lt;br /&gt;
?&lt;br /&gt;
 BZF_API bool [[bz_sendFetchResMessage]] ( int playerID,  const char* URL );&lt;br /&gt;
 BZF_API bool [[bz_sendJoinServer]] ( int playerID, const char* address, int port, int team, const char* referrer, const char* message );&lt;br /&gt;
 BZF_API bool [[bz_sendLuaData]] ( int dstPlayerID, int dstScriptID, int statusBits, const char* data, int len,&lt;br /&gt;
                               int srcPlayerID = 0, int srcScriptID = 0 );&lt;br /&gt;
&lt;br /&gt;
=== Server Management ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_restart]] ( void );&lt;br /&gt;
 BZF_API void [[bz_shutdown]] ();&lt;br /&gt;
 BZF_API void [[bz_superkill]] ();&lt;br /&gt;
 BZF_API void [[bz_gameOver]] ( int playerID, bz_eTeamType = eNoTeam );&lt;br /&gt;
 BZF_API void [[bz_reloadLocalBans]] ();&lt;br /&gt;
 BZF_API void [[bz_reloadMasterBans]] ();&lt;br /&gt;
 BZF_API void [[bz_reloadGroups]] ();&lt;br /&gt;
 BZF_API void [[bz_reloadUsers]] ();&lt;br /&gt;
 BZF_API void [[bz_reloadHelp]] ();&lt;br /&gt;
 BZF_API int [[bz_getPlayerCount]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_getShotMismatch]] ( void );&lt;br /&gt;
 BZF_API void [[bz_setShotMismatch]] ( bool value );&lt;br /&gt;
?&lt;br /&gt;
 BZF_API bool [[bz_anyPlayers]] ( void );&lt;br /&gt;
&lt;br /&gt;
=== Rabbit Hunt ===&lt;br /&gt;
?&lt;br /&gt;
 BZF_API void [[bz_newRabbit]] ( int player, bool swap );&lt;br /&gt;
 BZF_API void [[bz_removeRabbit]] ( int player );&lt;br /&gt;
&lt;br /&gt;
=== Map Management ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API void [[bz_setClientWorldDownloadURL]] ( const char* URL );&lt;br /&gt;
 BZF_API const [[bz_ApiString]] [[bz_getClientWorldDownloadURL]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_saveWorldCacheFile]] ( const char* file );&lt;br /&gt;
&lt;br /&gt;
=== Flag Management ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_givePlayerFlag]] ( int playerID, const char* flagType, bool force );&lt;br /&gt;
 BZF_API bool [[bz_removePlayerFlag]] ( int playerID );&lt;br /&gt;
 BZF_API void [[bz_resetFlags]] ( bool onlyUnused, bool keepTeamFlags = false );&lt;br /&gt;
 BZF_API unsigned int [[bz_getNumFlags]] ( void );&lt;br /&gt;
 BZF_API const [[bz_ApiString]] [[bz_getFlagName|bz_getName]] ( int flag );&lt;br /&gt;
 BZF_API bool [[bz_resetFlag]] ( int flag );&lt;br /&gt;
 BZF_API int [[bz_flagPlayer]] ( int flag );&lt;br /&gt;
 BZF_API int [[bz_getPlayerFlagID]] ( int playerID );&lt;br /&gt;
 BZF_API bool [[bz_getFlagPosition]] ( int flag, float* pos );&lt;br /&gt;
 BZF_API bool [[bz_moveFlag]] ( int flag, float pos[3] );&lt;br /&gt;
 BZF_API bool [[bz_RegisterCustomFlag]] ( const char* abbr, const char* name, const char* helpString, bz_eShotType shotType, bz_eFlagQuality quality );&lt;br /&gt;
&lt;br /&gt;
=== Shot Type Control ===&lt;br /&gt;
?&lt;br /&gt;
 BZF_API bool [[bz_setPlayerShotType]] ( int playerId, [[bz_eShotType]] shotType );&lt;br /&gt;
&lt;br /&gt;
=== World Weapon Management ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_fireWorldWep]] ( const char* flagType, float lifetime, int fromPlayer, float *pos, float tilt, float direction, int shotID , float dt, bz_eTeamType shotTeam = eRogueTeam );&lt;br /&gt;
 BZF_API bool [[bz_fireWorldWep]] ( const char* flagType, float lifetime, int fromPlayer, float *pos, float tilt, float direction, int *shotID , float dt, bz_eTeamType shotTeam = eRogueTeam );&lt;br /&gt;
 BZF_API int [[bz_fireWorldGM]] ( int targetPlayerID, float lifetime, float *pos, float tilt, float direction, float dt, bz_eTeamType shotTeam = eRogueTeam );&lt;br /&gt;
&lt;br /&gt;
=== Server Time ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API double [[bz_getCurrentTime]] ( void );&lt;br /&gt;
 BZF_API void [[bz_getLocaltime]] ( [[bz_Time]] *ts );&lt;br /&gt;
 BZF_API void [[bz_getUTCtime]] ( [[bz_Time]] *ts );&lt;br /&gt;
&lt;br /&gt;
?&lt;br /&gt;
 BZF_API float [[bz_getMaxWaitTime]] ( void );&lt;br /&gt;
 BZF_API void [[bz_setMaxWaitTime]] ( float maxTime );&lt;br /&gt;
&lt;br /&gt;
=== Global Database Management (BZDB) ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API double [[bz_getBZDBDouble]] ( const char* variable );&lt;br /&gt;
 BZF_API [[bz_ApiString]] [[bz_getBZDBString]] ( const char* variable );&lt;br /&gt;
 BZF_API bool [[bz_getBZDBBool]] ( const char* variable );&lt;br /&gt;
 BZF_API int [[bz_getBZDBInt]] ( const char* variable );&lt;br /&gt;
 BZF_API int [[bz_getBZDBItemPerms]] ( const char* variable );&lt;br /&gt;
 BZF_API bool [[bz_getBZDBItemPesistent]] ( const char* variable );&lt;br /&gt;
 BZF_API bool [[bz_BZDBItemExists]] ( const char* variable );&lt;br /&gt;
 BZF_API bool [[bz_setBZDBDouble]] ( const char* variable, double val, int perms = 0, bool persistent = false );&lt;br /&gt;
 BZF_API bool [[bz_setBZDBString]] ( const char* variable, const char *val, int perms = 0, bool persistent = false  );&lt;br /&gt;
 BZF_API bool [[bz_setBZDBBool]] ( const char* variable, bool val, int perms = 0, bool persistent = false  );&lt;br /&gt;
 BZF_API bool [[bz_setBZDBInt]] ( const char* variable, int val, int perms = 0, bool persistent = false  );&lt;br /&gt;
 BZF_API int [[bz_getBZDBVarList]] ( bz_APIStringList	*varList );&lt;br /&gt;
 BZF_API void [[bz_resetBZDBVar]] ( const char* variable );&lt;br /&gt;
 BZF_API void [[bz_resetALLBZDBVars]] ( void );&lt;br /&gt;
&lt;br /&gt;
=== Logging ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API void [[bz_debugMessage]] ( int level, const char* message );&lt;br /&gt;
 BZF_API void [[bz_debugMessagef]] ( int level, const char* fmt, ... )&lt;br /&gt;
 BZF_API int [[bz_getDebugLevel]] ( void );&lt;br /&gt;
&lt;br /&gt;
=== Server Administration ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_kickUser]] ( int playerIndex, const char* reason, bool notify );&lt;br /&gt;
 BZF_API bool [[bz_IPBanUser]] ( int bannedByIndex, const char* ip, int duration, const char* reason );&lt;br /&gt;
 BZF_API bool [[bz_HostBanUser]] ( int bannedByIndex, const char* hostmask, int duration, const char* reason );&lt;br /&gt;
 BZF_API bool [[bz_IPUnbanUser]] ( const char* ip );&lt;br /&gt;
 BZF_API bool [[bz_IDUnbanUser]] ( const char* bzID );&lt;br /&gt;
 BZF_API bool [[bz_HostUnbanUser]] ( const char* hostmask );&lt;br /&gt;
 &lt;br /&gt;
 BZF_API int [[bz_getLagWarn]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_setLagWarn]] ( int lagwarn );&lt;br /&gt;
 BZF_API bool [[bz_pollActive]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_pollVeto]] ( void );&lt;br /&gt;
&lt;br /&gt;
?&lt;br /&gt;
 BZF_API bool [[bz_IDBanUser]] ( int bannedByIndex, const char* bzID , int duration, const char *reason );&lt;br /&gt;
&lt;br /&gt;
=== Reporting ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API [[bz_APIStringList]]* [[bz_getReports]] ( void );&lt;br /&gt;
?&lt;br /&gt;
 BZF_API unsigned int [[bz_getReportCount]] ( void );&lt;br /&gt;
 BZF_API const char* [[bz_getReportSource]] ( unsigned int id );&lt;br /&gt;
 BZF_API const char* [[bz_getReportBody]] ( unsigned int id );&lt;br /&gt;
 BZF_API const char* [[bz_getReportTime]] ( unsigned int id );&lt;br /&gt;
 BZF_API bool [[bz_clearReport]] ( unsigned int id );&lt;br /&gt;
 BZF_API bool [[bz_clearAllReports]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_fileReport]] ( const char* message, const char* from );&lt;br /&gt;
&lt;br /&gt;
=== Timed Game Management ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_setTimeLimit]] ( float timeLimit );&lt;br /&gt;
 BZF_API float [[bz_getTimeLimit]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_isTimeManualStart]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_isCountDownActive]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_isCountDownInProgress]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_isCountDownPaused]] ( void );&lt;br /&gt;
 BZF_API void [[bz_pauseCountdown]] ( const char *pausedBy );&lt;br /&gt;
 BZF_API void [[bz_resumeCountdown]] ( const char *resumedBy );&lt;br /&gt;
 BZF_API void [[bz_startCountdown]] ( int delay, float limit, const char *byWho );&lt;br /&gt;
&lt;br /&gt;
=== Custom Text Commands ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_registerCustomSlashCommand]] ( const char* command, [[bz_CustomSlashCommandHandler]] *handler );&lt;br /&gt;
 BZF_API bool [[bz_removeCustomSlashCommand]] ( const char* command );&lt;br /&gt;
&lt;br /&gt;
=== Plug-in Management ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API int [[bz_getLoadedPlugins]] ( [[bz_APIStringList]] * list );&lt;br /&gt;
 BZF_API bool [[bz_loadPlugin]] ( const char* path, const char* params );&lt;br /&gt;
 BZF_API bool [[bz_unloadPlugin]] ( const char* path );&lt;br /&gt;
 BZF_API const char* [[bz_pluginBinPath]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_registerCustomPluginHandler]] ( const char* extension, [[bz_APIPluginHandler]] * handler );&lt;br /&gt;
 BZF_API bool [[bz_removeCustomPluginHandler]] ( const char* extension, [[bz_APIPluginHandler]] * handler );&lt;br /&gt;
&lt;br /&gt;
=== Public Server Information ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_getPublic]] ( void );&lt;br /&gt;
 BZF_API [[bz_ApiString]] [[bz_getPublicAddr]] ( void );&lt;br /&gt;
 BZF_API [[bz_ApiString]] [[bz_getPublicDescription]] ( void );&lt;br /&gt;
 BZF_API int [[bz_getPublicPort]] ( void );&lt;br /&gt;
 BZF_API void [[bz_updateListServer]] ( void );&lt;br /&gt;
&lt;br /&gt;
=== HTTP Transfer ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_addURLJob]] ( const char* URL, [[bz_BaseURLHandler]]* handler = NULL, const char* postData = NULL );&lt;br /&gt;
 BZF_API bool [[bz_removeURLJob]] ( const char* URL );&lt;br /&gt;
?&lt;br /&gt;
 BZF_API bool [[bz_stopAllURLJobs]] ( void );&lt;br /&gt;
&lt;br /&gt;
=== Callback Functions ===&lt;br /&gt;
?&lt;br /&gt;
 BZF_API bool [[bz_registerCallBack]] ( const char* name, [[bz_GenericCallback]] *callback );&lt;br /&gt;
 BZF_API bool [[bz_registerCallBack]] ( const char* name, [[bz_GenericCallbackFunc]] callback );&lt;br /&gt;
 BZF_API bool [[bz_removeCallBack]] ( const char* name, [[bz_GenericCallback]] *callback );&lt;br /&gt;
 BZF_API bool [[bz_removeCallBack]] ( const char* name, [[bz_GenericCallbackFunc]] callback );&lt;br /&gt;
 BZF_API bool [[bz_callCallback]] ( const char* name, void *param );&lt;br /&gt;
 BZF_API bool [[bz_callbackExists]] ( const char* name );&lt;br /&gt;
&lt;br /&gt;
=== Inter-Plug-in Communications ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_clipFieldExists]] ( const char *name );&lt;br /&gt;
 BZF_API const char* [[bz_getclipFieldString]] ( const char *name );&lt;br /&gt;
 BZF_API float [[bz_getclipFieldFloat]] ( const char *name );&lt;br /&gt;
 BZF_API int [[bz_getclipFieldInt]] ( const char *name );&lt;br /&gt;
 BZF_API bool [[bz_setclipFieldString]] ( const char *name, const char* data );&lt;br /&gt;
 BZF_API bool [[bz_setclipFieldFloat]] ( const char *name, float data );&lt;br /&gt;
 BZF_API bool [[bz_setclipFieldInt]] ( const char *name, int data );&lt;br /&gt;
 BZF_API bool [[bz_addClipFieldNotifier]] ( const char *name, [[bz_ClipFiledNotifier *cb );&lt;br /&gt;
 BZF_API bool [[bz_removeClipFieldNotifier]] ( const char *name, [[bz_ClipFiledNotifier *cb );&lt;br /&gt;
&lt;br /&gt;
=== Game Recording ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_saveRecBuf]] ( const char * _filename, int seconds);&lt;br /&gt;
 BZF_API bool [[bz_startRecBuf]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_stopRecBuf]] ( void );&lt;br /&gt;
&lt;br /&gt;
=== Map Management ===&lt;br /&gt;
==== Map Information ====&lt;br /&gt;
?&lt;br /&gt;
 BZF_API void [[bz_getWorldSize]] ( float *size, float *wallHeight );&lt;br /&gt;
 BZF_API unsigned int [[bz_getWorldObjectCount]] ( void );&lt;br /&gt;
 BZF_API [[bz_APIWorldObjectList]]* [[bz_getWorldObjectList]] ( void );&lt;br /&gt;
 BZF_API void [[bz_releaseWorldObjectList]] ( [[bz_APIWorldObjectList]] *list );&lt;br /&gt;
 BZF_API unsigned int [[bz_findWorldObject]] ( const char *name );&lt;br /&gt;
 BZF_API [[bz_APIBaseWorldObject]]* [[bz_getWorldObjectByID]] ( unsigned int id );&lt;br /&gt;
 BZF_API bool [[bz_getTeleLinkIDs]] ( const char* teleName, int* frontLink, int* backLink );&lt;br /&gt;
 BZF_API const char* [[bz_getLinkTeleName]] ( int linkIndex );&lt;br /&gt;
 BZF_API int [[bz_getPhyDrvID]] ( const char* phyDrvName );&lt;br /&gt;
 BZF_API const char* [[bz_getPhyDrvName]] ( unsigned int phyDrvID );&lt;br /&gt;
 BZF_API bool [[bz_SetWorldObjectTangibility]] ( int id, const [[bz_SolidObjectPassableAtributes]] &amp;amp;atribs );&lt;br /&gt;
 BZF_API bool [[bz_GetWorldObjectTangibility]] ( int id, [[bz_SolidObjectPassableAtributes]] &amp;amp;atribs );&lt;br /&gt;
 BZF_API void [[bz_ResetWorldObjectTangibilities]] ( void );&lt;br /&gt;
&lt;br /&gt;
==== Map Collisions ====&lt;br /&gt;
?&lt;br /&gt;
 [[bz_eAPIColType]] [[bz_cylinderInMapObject]] ( float pos[3], float height, float radius, [[bz_APIBaseWorldObject]] **object );&lt;br /&gt;
 [[bz_eAPIColType]] [[bz_boxInMapObject]] ( float pos[3], float size[3], float angle, [[bz_APIBaseWorldObject]] **object );&lt;br /&gt;
&lt;br /&gt;
==== Custom Map Objects ====&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_registerCustomMapObject]] ( const char* object, [[bz_CustomMapObjectHandler]] *handler );&lt;br /&gt;
 BZF_API bool [[bz_removeCustomMapObject]] ( const char* object );&lt;br /&gt;
&lt;br /&gt;
=== Utility ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API const char *[[bz_MD5]] ( const char* str );&lt;br /&gt;
 BZF_API const char *[[bz_MD5]] ( const void* data, size_t size );&lt;br /&gt;
 BZF_API const char *[[bz_getServerVersion]] ( void );&lt;br /&gt;
 BZF_API const char *[[bz_getProtocolVersion]] ( void );&lt;br /&gt;
&lt;br /&gt;
=== Misc ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_getStandardSpawn]] ( int playerID, float pos[3], float *rot );&lt;br /&gt;
 BZF_API bool [[bz_killPlayer]] ( int playerID, bool spawnOnBase);&lt;br /&gt;
 BZF_API bool [[bz_killPlayer]] ( int playerID, bool spawnOnBase, int killerID = -1, const char* flagID = NULL );&lt;br /&gt;
 BZF_API bool [[bz_sendPlayCustomLocalSound]] ( int playerID, const char* soundName );&lt;br /&gt;
 BZF_API [[bz_ApiString]] [[bz_filterPath]] ( const char* path );&lt;br /&gt;
 BZF_API const char *[[bz_format]](const char* fmt, ...)_ATTRIBUTE12;&lt;br /&gt;
 BZF_API const char *[[bz_toupper]](const char* val );&lt;br /&gt;
 BZF_API const char *[[bz_tolower]](const char* val );&lt;br /&gt;
 BZF_API const char *[[bz_urlEncode]](const char* val );&lt;br /&gt;
 BZF_API [[bz_eGameType]] [[bz_getGameType]]( void );&lt;br /&gt;
 BZF_API [[bz_eTeamType]] [[bz_checkBaseAtPoint]] ( float pos[3] );&lt;br /&gt;
 BZF_API int [[bz_APIVersion]] ( void );&lt;br /&gt;
?&lt;br /&gt;
 BZF_API bool [[bz_allowJumping]] ( void );&lt;br /&gt;
&lt;br /&gt;
=== Server Side Players (Development) ===&lt;br /&gt;
? (In API for 2.3+, but will crash a server)&lt;br /&gt;
 BZF_API int [[bz_addServerSidePlayer]] ( [[bz_ServerSidePlayerHandler]] *handler );&lt;br /&gt;
 BZF_API bool [[bz_removeServerSidePlayer]] ( int playerID, [[bz_ServerSidePlayerHandler]] *handler );&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
[[BZFS API]]&lt;br /&gt;
&lt;br /&gt;
[[plug-ins]]&lt;br /&gt;
&lt;br /&gt;
[[Category:BZFS_API_Functions]]&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Talk:Flag_ideas&amp;diff=8649</id>
		<title>Talk:Flag ideas</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Talk:Flag_ideas&amp;diff=8649"/>
		<updated>2013-05-04T23:25:12Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: Wiki != discussion&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We have flags classified as a &amp;quot;Maybe&amp;quot;, but some are Red (Pass), Yellow (Fail), and Grey (which doesn&#039;t even mean anything in the legend!). We need some clarification from Riker about what to do with the &amp;quot;Maybes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
- Pine (Bentus)&lt;br /&gt;
&lt;br /&gt;
== Where to put ideas for existing flags? ==&lt;br /&gt;
&lt;br /&gt;
Where do I put ideas for modifications to existing flags? I have this idea that Shield should, when you are hit, make you invincible briefly.&lt;br /&gt;
&lt;br /&gt;
== Disappointed that &amp;quot;Flame Thrower&amp;quot; got rejected ==&lt;br /&gt;
I don&#039;t think I explained the effect and appearance well enough because the rejection comment is &amp;quot;shockwave does the same thing beter&amp;quot;.  My intention with this flag is nothing like SW!  The idea was to introduce a new sound and accompanying visual, without it being some absurdly complex or uber-deadly change to the game, as so many of the suggestions here seem to be!  The shot would be a bit like a thief beam, but slightly longer in duration, say half a second or so (probably server configurable).  Its projection length out of the barrel would be similar to thief, or maybe shorter (again, server configurable).  To add some realism, if the turret turns while the flame is emitting, it should &amp;quot;snake&amp;quot; slightly, just like a real flame thrower!  The flame should never ricochet. -Steve ([[User:Mr Burns|Mr Burns]] 05:17, 27 March 2008 (EDT))&lt;br /&gt;
&lt;br /&gt;
== Hoping someone will see this ==&lt;br /&gt;
&lt;br /&gt;
Hey, all. I know ideas go on the SourceForge page, and I know some of these may be similar to rejected things, but honestly there are TONS of them and while I attempted to read them all I only got about a fourth of the way through before my eyes crossed. I&#039;m not geared mentally for these sorts of trials, and I apologize if this is seen as rude. (I seriously have a hard time, mentally, with these things.)&lt;br /&gt;
&lt;br /&gt;
I&#039;m hoping it won&#039;t be too terrible if I lay out some ideas I&#039;ve had for flags since I first downloaded the game in the early 2000s...&lt;br /&gt;
&lt;br /&gt;
Let&#039;s get the one I KNOW is similar to another right out of the way. I&#039;ve done it differently, so please do give me a chance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Flamethrower&#039;&#039;&#039; - The exact way Thief works, but with a kill instead of a flag steal. Short range, but a &#039;line&#039; instead of a single projectile.&lt;br /&gt;
&lt;br /&gt;
* This is Laser without the constant problem of nuking yourself with a bad angle. It has great benefit (Laser w/o danger), a drawback (Laser w/o range), and it provides a new style of play to master when you get the flag.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Landmine&#039;&#039;&#039; - Simply a smaller Shockwave on delay, radiating out BEHIND you as you proceed on.&lt;br /&gt;
&lt;br /&gt;
* Before you reject by saying &amp;quot;Shockwave&amp;quot;, note that this is the ultimate evasive flag. It&#039;s a counter to being chased down by someone, and much less cheap than mashing the jump key to avoid their bullets. Drawback is no forward firing! &#039;&#039;&#039;Plus it can kill you if you don&#039;t move your butt!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mirror&#039;&#039;&#039; - Front of tank causes riccochet. Rest of tank is still vulnerable. Only works with normal shots. (No effect against super bullet, laser, shockwave, guided missile, etc.)&lt;br /&gt;
&lt;br /&gt;
* Not related to whether a server has riccochet on or not! The front of your tank bounces projectiles off, that&#039;s it. Protects you from face shots, leaving the rest of you open to attack.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;X-Ray&#039;&#039;&#039; - You can see through the closest structure, but only in window area.&lt;br /&gt;
&lt;br /&gt;
* Benefit: X-Ray sight. Drawbacks: Only in window, and only the closest object you&#039;re near, like with &amp;quot;Identify&amp;quot;, it tracks the proximity. Also, while you&#039;re peeping, you&#039;ll probably get shot. - However, it&#039;s not useless, would be effective for watching Overthruster and Stealth players.&lt;br /&gt;
&lt;br /&gt;
Alternate &#039;&#039;&#039;X-Ray&#039;&#039;&#039; - You can see through any structure, but only in window area.&lt;br /&gt;
&lt;br /&gt;
* If the proximity thing is too complex or would render it useless, just open it up to all structures. Imagine having the X-Ray flag and going: &amp;quot;WHOA, hey I didn&#039;t someone was there!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gauss Cannon&#039;&#039;&#039; - Bullet immediately arrives at terminal point (end of life, or enemy/wall) without traveling.&lt;br /&gt;
&lt;br /&gt;
* Benefit: You&#039;re immediately hitting where you aimed. Drawback: If your aim is off, you get NO chance of hitting as bullet travels.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repulsor&#039;&#039;&#039; - Tanks within radius are repelled from you.&lt;br /&gt;
&lt;br /&gt;
* This might sound silly at first, but really think about how useful it would be to automatically repell enemies and allies alike. Benefit: They can&#039;t get a close shot. Drawback: YOU can&#039;t get a close shot. Please really think about the dynamics this would create and how people would learn to use it from both perspectives.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Attractor&#039;&#039;&#039; - Tanks within radius are drawn to you.&lt;br /&gt;
&lt;br /&gt;
* Opposite of above. I beg you to think about it as a legit feature, not a silly quick thought. Tanks moving toward you quickly, and moving away from you slowly. Benefit is drawing enemies to be shot, drawback is of course drawing them in to shoot you.&lt;br /&gt;
&lt;br /&gt;
* Either of the last two could work or not work on bullets, depending on preference.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sonic Cannon&#039;&#039;&#039; - Projecile from the front spreads out in waves in cone shape. Best visual example is the RSS symbol.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;This is different enough from Shockwave as it&#039;s EASY to avoid killing teammates while also not providing the all-around protection!&#039;&#039;&#039; It&#039;s a great new benefit/flaw dynamic that BZFlag could really be fun with.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sticky Charge&#039;&#039;&#039; - When you hit an enemy tank with a bullet, it &amp;quot;sticks to them&amp;quot; (no graphical representation, though) but they can still fire. After a few moments, they detonate with shockwave effect, giving you the resulting kills.&lt;br /&gt;
&lt;br /&gt;
* I know this is a weird/silly one, but think it over. Benefit: Obvious. Drawback: Takes a few moments, and they (plus others) can easily fire back on you while YOUR shits are just sticking.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Quicksand&#039;&#039;&#039; - Penalty flag. You get burrowed but can&#039;t fire. Anyone can run you over!&lt;br /&gt;
&lt;br /&gt;
* Just a cool concept. Sorry. :X&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lightning&#039;&#039;&#039; - Randomly bending laser with short range.&lt;br /&gt;
&lt;br /&gt;
* In other words, exactly like lightning. All that would need to be done is to have the existing Laser/Thief line zig-zag randomly as if it were riccocheting within the small area in front of your tank. Benefit: Get tanks to left/right with your crooked, jagged laser. Drawback: It&#039;s short range, and random - which makes it tougher to actually aim at one guy.&lt;br /&gt;
&lt;br /&gt;
Alternate &#039;&#039;&#039;Lightning&#039;&#039;&#039; - Lock on, like Guided Missile, but you fire a bending laser that zaps at your target.&lt;br /&gt;
&lt;br /&gt;
* You get the idea, this is more like real lightning, shooting toward a &amp;quot;lightning rod&amp;quot;. Imagine firing this from atop a building like GM. You&#039;d be like a God firing lightning down on mortals! Problem is they might swerve out of the way by a hair, and you&#039;re having to lock on before you can do anything useful. (This is like GM + Laser, I know, but think about it?)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That&#039;s the tip of the iceberg, but now I&#039;ll sit back and see if anyone ever comes here... and if I get yelled at. -- [[Special:Contributions/4.154.6.138|4.154.6.138]] 06:58, 1 May 2013 (UTC) (Mr. Slow)&lt;br /&gt;
&lt;br /&gt;
All of these are rejected ideas for many many reasons --[[User:JeffM2501|JeffM2501]] 23:27, 1 May 2013 (UTC)&lt;br /&gt;
:It&#039;s actually not possible that these are already all rejected due to the variations that would come into play. Plus I doubt you even checked, some of these are way out there and probably never suggested before. [[Special:Contributions/4.153.8.113|4.153.8.113]] 23:19, 4 May 2013 (UTC)&lt;br /&gt;
:: The wiki isn&#039;t a discussion board, you can talk about ideas on the forums or IRC. --[[User:JeffM2501|JeffM2501]] 23:25, 4 May 2013 (UTC)&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Talk:Flag_ideas&amp;diff=8647</id>
		<title>Talk:Flag ideas</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Talk:Flag_ideas&amp;diff=8647"/>
		<updated>2013-05-01T23:27:37Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We have flags classified as a &amp;quot;Maybe&amp;quot;, but some are Red (Pass), Yellow (Fail), and Grey (which doesn&#039;t even mean anything in the legend!). We need some clarification from Riker about what to do with the &amp;quot;Maybes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
- Pine (Bentus)&lt;br /&gt;
&lt;br /&gt;
== Where to put ideas for existing flags? ==&lt;br /&gt;
&lt;br /&gt;
Where do I put ideas for modifications to existing flags? I have this idea that Shield should, when you are hit, make you invincible briefly.&lt;br /&gt;
&lt;br /&gt;
== Disappointed that &amp;quot;Flame Thrower&amp;quot; got rejected ==&lt;br /&gt;
I don&#039;t think I explained the effect and appearance well enough because the rejection comment is &amp;quot;shockwave does the same thing beter&amp;quot;.  My intention with this flag is nothing like SW!  The idea was to introduce a new sound and accompanying visual, without it being some absurdly complex or uber-deadly change to the game, as so many of the suggestions here seem to be!  The shot would be a bit like a thief beam, but slightly longer in duration, say half a second or so (probably server configurable).  Its projection length out of the barrel would be similar to thief, or maybe shorter (again, server configurable).  To add some realism, if the turret turns while the flame is emitting, it should &amp;quot;snake&amp;quot; slightly, just like a real flame thrower!  The flame should never ricochet. -Steve ([[User:Mr Burns|Mr Burns]] 05:17, 27 March 2008 (EDT))&lt;br /&gt;
&lt;br /&gt;
== Hoping someone will see this ==&lt;br /&gt;
&lt;br /&gt;
Hey, all. I know ideas go on the SourceForge page, and I know some of these may be similar to rejected things, but honestly there are TONS of them and while I attempted to read them all I only got about a fourth of the way through before my eyes crossed. I&#039;m not geared mentally for these sorts of trials, and I apologize if this is seen as rude. (I seriously have a hard time, mentally, with these things.)&lt;br /&gt;
&lt;br /&gt;
I&#039;m hoping it won&#039;t be too terrible if I lay out some ideas I&#039;ve had for flags since I first downloaded the game in the early 2000s...&lt;br /&gt;
&lt;br /&gt;
Let&#039;s get the one I KNOW is similar to another right out of the way. I&#039;ve done it differently, so please do give me a chance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Flamethrower&#039;&#039;&#039; - The exact way Thief works, but with a kill instead of a flag steal. Short range, but a &#039;line&#039; instead of a single projectile.&lt;br /&gt;
&lt;br /&gt;
* This is Laser without the constant problem of nuking yourself with a bad angle. It has great benefit (Laser w/o danger), a drawback (Laser w/o range), and it provides a new style of play to master when you get the flag.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Landmine&#039;&#039;&#039; - Simply a smaller Shockwave on delay, radiating out BEHIND you as you proceed on.&lt;br /&gt;
&lt;br /&gt;
* Before you reject by saying &amp;quot;Shockwave&amp;quot;, note that this is the ultimate evasive flag. It&#039;s a counter to being chased down by someone, and much less cheap than mashing the jump key to avoid their bullets. Drawback is no forward firing! &#039;&#039;&#039;Plus it can kill you if you don&#039;t move your butt!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mirror&#039;&#039;&#039; - Front of tank causes riccochet. Rest of tank is still vulnerable. Only works with normal shots. (No effect against super bullet, laser, shockwave, guided missile, etc.)&lt;br /&gt;
&lt;br /&gt;
* Not related to whether a server has riccochet on or not! The front of your tank bounces projectiles off, that&#039;s it. Protects you from face shots, leaving the rest of you open to attack.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;X-Ray&#039;&#039;&#039; - You can see through the closest structure, but only in window area.&lt;br /&gt;
&lt;br /&gt;
* Benefit: X-Ray sight. Drawbacks: Only in window, and only the closest object you&#039;re near, like with &amp;quot;Identify&amp;quot;, it tracks the proximity. Also, while you&#039;re peeping, you&#039;ll probably get shot. - However, it&#039;s not useless, would be effective for watching Overthruster and Stealth players.&lt;br /&gt;
&lt;br /&gt;
Alternate &#039;&#039;&#039;X-Ray&#039;&#039;&#039; - You can see through any structure, but only in window area.&lt;br /&gt;
&lt;br /&gt;
* If the proximity thing is too complex or would render it useless, just open it up to all structures. Imagine having the X-Ray flag and going: &amp;quot;WHOA, hey I didn&#039;t someone was there!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gauss Cannon&#039;&#039;&#039; - Bullet immediately arrives at terminal point (end of life, or enemy/wall) without traveling.&lt;br /&gt;
&lt;br /&gt;
* Benefit: You&#039;re immediately hitting where you aimed. Drawback: If your aim is off, you get NO chance of hitting as bullet travels.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Repulsor&#039;&#039;&#039; - Tanks within radius are repelled from you.&lt;br /&gt;
&lt;br /&gt;
* This might sound silly at first, but really think about how useful it would be to automatically repell enemies and allies alike. Benefit: They can&#039;t get a close shot. Drawback: YOU can&#039;t get a close shot. Please really think about the dynamics this would create and how people would learn to use it from both perspectives.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Attractor&#039;&#039;&#039; - Tanks within radius are drawn to you.&lt;br /&gt;
&lt;br /&gt;
* Opposite of above. I beg you to think about it as a legit feature, not a silly quick thought. Tanks moving toward you quickly, and moving away from you slowly. Benefit is drawing enemies to be shot, drawback is of course drawing them in to shoot you.&lt;br /&gt;
&lt;br /&gt;
* Either of the last two could work or not work on bullets, depending on preference.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sonic Cannon&#039;&#039;&#039; - Projecile from the front spreads out in waves in cone shape. Best visual example is the RSS symbol.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;This is different enough from Shockwave as it&#039;s EASY to avoid killing teammates while also not providing the all-around protection!&#039;&#039;&#039; It&#039;s a great new benefit/flaw dynamic that BZFlag could really be fun with.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sticky Charge&#039;&#039;&#039; - When you hit an enemy tank with a bullet, it &amp;quot;sticks to them&amp;quot; (no graphical representation, though) but they can still fire. After a few moments, they detonate with shockwave effect, giving you the resulting kills.&lt;br /&gt;
&lt;br /&gt;
* I know this is a weird/silly one, but think it over. Benefit: Obvious. Drawback: Takes a few moments, and they (plus others) can easily fire back on you while YOUR shits are just sticking.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Quicksand&#039;&#039;&#039; - Penalty flag. You get burrowed but can&#039;t fire. Anyone can run you over!&lt;br /&gt;
&lt;br /&gt;
* Just a cool concept. Sorry. :X&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lightning&#039;&#039;&#039; - Randomly bending laser with short range.&lt;br /&gt;
&lt;br /&gt;
* In other words, exactly like lightning. All that would need to be done is to have the existing Laser/Thief line zig-zag randomly as if it were riccocheting within the small area in front of your tank. Benefit: Get tanks to left/right with your crooked, jagged laser. Drawback: It&#039;s short range, and random - which makes it tougher to actually aim at one guy.&lt;br /&gt;
&lt;br /&gt;
Alternate &#039;&#039;&#039;Lightning&#039;&#039;&#039; - Lock on, like Guided Missile, but you fire a bending laser that zaps at your target.&lt;br /&gt;
&lt;br /&gt;
* You get the idea, this is more like real lightning, shooting toward a &amp;quot;lightning rod&amp;quot;. Imagine firing this from atop a building like GM. You&#039;d be like a God firing lightning down on mortals! Problem is they might swerve out of the way by a hair, and you&#039;re having to lock on before you can do anything useful. (This is like GM + Laser, I know, but think about it?)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That&#039;s the tip of the iceberg, but now I&#039;ll sit back and see if anyone ever comes here... and if I get yelled at. -- [[Special:Contributions/4.154.6.138|4.154.6.138]] 06:58, 1 May 2013 (UTC) (Mr. Slow)&lt;br /&gt;
&lt;br /&gt;
All of these are rejected ideas for many many reasons --[[User:JeffM2501|JeffM2501]] 23:27, 1 May 2013 (UTC)&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Functions_(API)&amp;diff=8624</id>
		<title>Functions (API)</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Functions_(API)&amp;diff=8624"/>
		<updated>2013-03-29T22:45:28Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: /* Player Lists and Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DoDoc|&lt;br /&gt;
Fill in articles for all API Functions&amp;lt;br&amp;gt;&lt;br /&gt;
Finish updating to 2.3.x&amp;lt;br&amp;gt;&lt;br /&gt;
Verify future API functions.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{BZFS_API_Doc}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&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;
== Function Groups ==&lt;br /&gt;
Functions are broken into a series of groups based on the type of action or information they deal with.&lt;br /&gt;
&lt;br /&gt;
=== Event Registration ===&lt;br /&gt;
2.0.x&lt;br /&gt;
 BZF_API bool [[bz_registerEvent]] ( [[Event(API)|bz_eEventType]] eventType, [[Event(API)|bz_EventHandler]]* eventHandler );&lt;br /&gt;
 BZF_API bool [[bz_removeEvent]] ( [[Event(API)|bz_eEventType]] eventType, [[Event(API)|bz_EventHandler]]* eventHandler );&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[Register]] ( [[Event(API)|bz_eEventType]] eventType );&lt;br /&gt;
 virtual void Cleanup() {Flush();}&lt;br /&gt;
&lt;br /&gt;
=== Non-Player Connections ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_registerNonPlayerConnectionHandler]] ( int connectionID, [[bz_NonPlayerConnectionHandler]]* handler );&lt;br /&gt;
 BZF_API bool [[bz_removeNonPlayerConnectionHandler]] ( int connectionID, [[bz_NonPlayerConnectionHandler]]* handler );&lt;br /&gt;
 BZF_API bool [[bz_sendNonPlayerData]] ( int connectionID, const void *data, unsigned int size );&lt;br /&gt;
 BZF_API bool [[bz_disconectNonPlayerConnection]] ( int connectionID );&lt;br /&gt;
 BZF_API unsigned int [[bz_getNonPlayerConnectionOutboundPacketCount]] ( int connectionID );&lt;br /&gt;
 BZF_API const char* [[bz_getNonPlayerConnectionIP]] ( int connectionID );&lt;br /&gt;
 BZF_API const char* [[bz_getNonPlayerConnectionHost]] ( int connectionID );&lt;br /&gt;
&lt;br /&gt;
=== Player Information ===&lt;br /&gt;
==== Player Information ====&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_hasPerm]] ( int playerID, const char* perm );&lt;br /&gt;
 BZF_API bool [[bz_getAdmin]] ( int playerID );&lt;br /&gt;
 BZF_API bz_eTeamType [[bz_getPlayerTeam]] ( int playerID );&lt;br /&gt;
 BZF_API const char* [[bz_getPlayerCallsign]] ( int playerID );&lt;br /&gt;
 BZF_API const char* [[bz_getPlayerIPAddress]] ( int playerID );&lt;br /&gt;
 BZF_API const char* [[bz_getPlayerFlag]] ( int playerID );&lt;br /&gt;
?&lt;br /&gt;
 BZF_API const char* [[bz_getPlayerReferrer]] ( int playerID );&lt;br /&gt;
 BZF_API const char* [[bz_getPlayerCustomData]] (int playerID, const char* key );&lt;br /&gt;
&lt;br /&gt;
==== Player State Information ====&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_isPlayerPaused]] ( int playerID );&lt;br /&gt;
 BZF_API bool [[bz_canPlayerSpawn]]( int playerID );&lt;br /&gt;
 BZF_API bool [[bz_getPlayerCurrentState]] ( int playerID, bz_PlayerUpdateState &amp;amp;state );&lt;br /&gt;
?&lt;br /&gt;
 BZF_API bool [[bz_getPlayerPosition]] ( int playerID, float pos[3], bool extrapolate );&lt;br /&gt;
 BZF_API bool [[bz_getPlayerRotation]] ( int playerID, float *rot, bool extrapolate );&lt;br /&gt;
 BZF_API bool [[bz_getPlayerVelocity]] ( int playerID, float vel[3] );&lt;br /&gt;
 BZF_API bool [[bz_getPlayerAngVel]] ( int playerID, float *angvel );&lt;br /&gt;
 BZF_API bool [[bz_getPlayerPhysicsDriver]] ( int playerID, int* phydrv );&lt;br /&gt;
&lt;br /&gt;
==== Player Lists and Records ====&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API [[bz_BasePlayerRecord]] *[[bz_getPlayerByIndex]] ( int index );&lt;br /&gt;
 BZF_API [[bz_BasePlayerRecord]] *[[bz_getPlayerByCallsign]] ( const char* name );&lt;br /&gt;
 BZF_API bool [[bz_updatePlayerData]] ( [[bz_BasePlayerRecord]] *playerRecord );&lt;br /&gt;
 BZF_API bool [[bz_freePlayerRecord]] ( [[bz_BasePlayerRecord]] *playerRecord );&lt;br /&gt;
&lt;br /&gt;
 BZF_API [[bz_APIIntList]] *[[bz_newIntList]] ( void );&lt;br /&gt;
 BZF_API [[bz_APIIntList]] *[[bz_getPlayerIndexList]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_getPlayerIndexList]] ( [[bz_APIIntList]] *playerList );&lt;br /&gt;
 BZF_API void [[bz_deleteIntList]] ( [[bz_APIIntList]] *l);&lt;br /&gt;
&lt;br /&gt;
==== Player Management ====&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_grantPerm]] ( int playerID, const char* perm );&lt;br /&gt;
 BZF_API bool [[bz_revokePerm]] ( int playerID, const char* perm );&lt;br /&gt;
 BZF_API bool [[bz_validAdminPassword]] ( const char* passwd );&lt;br /&gt;
 BZF_API bool [[bz_setPlayerOperator]] ( int playerId );&lt;br /&gt;
?&lt;br /&gt;
 BZF_API bool [[bz_setPlayerSpawnable]]( int playerID, bool spawn );&lt;br /&gt;
 BZF_API bool [[bz_setPlayerLimboMessage]]( int playerID, const char* text );&lt;br /&gt;
 BZF_API bool [[bz_setPlayerCustomData]] (int playerID, const char* key, const char* data );&lt;br /&gt;
&lt;br /&gt;
=== Team Management ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API unsigned int [[bz_getTeamPlayerLimit]] ( bz_eTeamType team );&lt;br /&gt;
 BZF_API int [[bz_getTeamCount]] ([[bz_eTeamType]] team );&lt;br /&gt;
 BZF_API int [[bz_getTeamScore]] ([[bz_eTeamType]] team );&lt;br /&gt;
 BZF_API int [[bz_getTeamWins]] ([[bz_eTeamType]] team );&lt;br /&gt;
 BZF_API int [[bz_getTeamLosses]] ([[bz_eTeamType]] team );&lt;br /&gt;
 BZF_API void [[bz_setTeamWins]] ([[bz_eTeamType]] team, int wins );&lt;br /&gt;
 BZF_API void [[bz_setTeamLosses]] ([[bz_eTeamType]] team, int losses );&lt;br /&gt;
 BZF_API void [[bz_resetTeamScore]] ([[bz_eTeamType]] team );&lt;br /&gt;
 BZF_API void [[bz_resetTeamScores]] ( void );&lt;br /&gt;
?&lt;br /&gt;
 BZF_API void [[bz_changeTeam]]( int player, [[bz_eTeamType]] team );&lt;br /&gt;
&lt;br /&gt;
=== Score Management ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_setPlayerWins]] ( int playerId, int wins );&lt;br /&gt;
 BZF_API bool [[bz_setPlayerLosses]] ( int playerId, int losses );&lt;br /&gt;
 BZF_API bool [[bz_setPlayerTKs]] ( int playerId, int tks );&lt;br /&gt;
 BZF_API bool [[bz_resetPlayerScore]] ( int playerId );&lt;br /&gt;
 BZF_API int [[bz_getPlayerWins]] ( int playerId );&lt;br /&gt;
 BZF_API int [[bz_getPlayerLosses]] ( int playerId );&lt;br /&gt;
 BZF_API int [[bz_getPlayerTKs]] ( int playerId );&lt;br /&gt;
 BZF_API float [[bz_getPlayerRank]] ( int playerId );&lt;br /&gt;
&lt;br /&gt;
=== Latency Information ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API int [[bz_getPlayerLag]] ( int playerId );&lt;br /&gt;
 BZF_API int [[bz_getPlayerJitter]] ( int playerId );&lt;br /&gt;
 BZF_API float [[bz_getPlayerPacketloss]] ( int playerId );&lt;br /&gt;
 BZF_API int [[bz_getIdleTime]] ( int playerId );&lt;br /&gt;
&lt;br /&gt;
=== Permission Group Management ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API [[bz_APIStringList]]* [[bz_getGroupList]] ( void );&lt;br /&gt;
 BZF_API [[bz_APIStringList]]* [[bz_getGroupPerms]] ( const char* group );&lt;br /&gt;
 BZF_API bool [[bz_groupAllowPerm]] ( const char* group, const char* perm );&lt;br /&gt;
&lt;br /&gt;
=== Chat Messages ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_sendTextMessage]] (int from, int to, const char* message);&lt;br /&gt;
 BZF_API bool [[bz_sendTextMessage]] (int from, [[bz_eTeamType]] to, const char* message);&lt;br /&gt;
 BZF_API bool [[bz_sendTextMessagef]] (int from, int to, const char* fmt, ...);&lt;br /&gt;
 BZF_API bool [[bz_sendTextMessagef]] (int from, [[bz_eTeamType]] to, const char* fmt, ...);&lt;br /&gt;
?&lt;br /&gt;
 BZF_API bool [[bz_sendFetchResMessage]] ( int playerID,  const char* URL );&lt;br /&gt;
 BZF_API bool [[bz_sendJoinServer]] ( int playerID, const char* address, int port, int team, const char* referrer, const char* message );&lt;br /&gt;
 BZF_API bool [[bz_sendLuaData]] ( int dstPlayerID, int dstScriptID, int statusBits, const char* data, int len,&lt;br /&gt;
                               int srcPlayerID = 0, int srcScriptID = 0 );&lt;br /&gt;
&lt;br /&gt;
=== Server Management ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_restart]] ( void );&lt;br /&gt;
 BZF_API void [[bz_shutdown]] ();&lt;br /&gt;
 BZF_API void [[bz_superkill]] ();&lt;br /&gt;
 BZF_API void [[bz_gameOver]] ( int playerID, bz_eTeamType = eNoTeam );&lt;br /&gt;
 BZF_API void [[bz_reloadLocalBans]] ();&lt;br /&gt;
 BZF_API void [[bz_reloadMasterBans]] ();&lt;br /&gt;
 BZF_API void [[bz_reloadGroups]] ();&lt;br /&gt;
 BZF_API void [[bz_reloadUsers]] ();&lt;br /&gt;
 BZF_API void [[bz_reloadHelp]] ();&lt;br /&gt;
 BZF_API int [[bz_getPlayerCount]] ( void );&lt;br /&gt;
?&lt;br /&gt;
 BZF_API bool [[bz_anyPlayers]] ( void );&lt;br /&gt;
&lt;br /&gt;
=== Rabbit Hunt ===&lt;br /&gt;
?&lt;br /&gt;
 BZF_API void [[bz_newRabbit]] ( int player, bool swap );&lt;br /&gt;
 BZF_API void [[bz_removeRabbit]] ( int player );&lt;br /&gt;
&lt;br /&gt;
=== Map Management ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API void [[bz_setClientWorldDownloadURL]] ( const char* URL );&lt;br /&gt;
 BZF_API const [[bz_ApiString]] [[bz_getClientWorldDownloadURL]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_saveWorldCacheFile]] ( const char* file );&lt;br /&gt;
&lt;br /&gt;
=== Flag Management ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_givePlayerFlag]] ( int playerID, const char* flagType, bool force );&lt;br /&gt;
 BZF_API bool [[bz_removePlayerFlag]] ( int playerID );&lt;br /&gt;
 BZF_API void [[bz_resetFlags]] ( bool onlyUnused, bool keepTeamFlags = false );&lt;br /&gt;
 BZF_API unsigned int [[bz_getNumFlags]] ( void );&lt;br /&gt;
 BZF_API const [[bz_ApiString]] [[bz_getFlagName|bz_getName]] ( int flag );&lt;br /&gt;
 BZF_API bool [[bz_resetFlag]] ( int flag );&lt;br /&gt;
 BZF_API int [[bz_flagPlayer]] ( int flag );&lt;br /&gt;
 BZF_API bool [[bz_getFlagPosition]] ( int flag, float* pos );&lt;br /&gt;
 BZF_API bool [[bz_moveFlag]] ( int flag, float pos[3] );&lt;br /&gt;
 BZF_API bool [[bz_RegisterCustomFlag]] ( const char* abbr, const char* name, const char* helpString, bz_eShotType shotType, bz_eFlagQuality quality );&lt;br /&gt;
&lt;br /&gt;
=== Shot Type Control ===&lt;br /&gt;
?&lt;br /&gt;
 BZF_API bool [[bz_setPlayerShotType]] ( int playerId, [[bz_eShotType]] shotType );&lt;br /&gt;
&lt;br /&gt;
=== World Weapon Management ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_fireWorldWep]] ( const char* flagType, float lifetime, int fromPlayer, float *pos, float tilt, float direction, int shotID , float dt, bz_eTeamType shotTeam = eRogueTeam );&lt;br /&gt;
 BZF_API int [[bz_fireWorldGM]] ( int targetPlayerID, float lifetime, float *pos, float tilt, float direction, float dt, bz_eTeamType shotTeam = eRogueTeam );&lt;br /&gt;
&lt;br /&gt;
=== Server Time ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API double [[bz_getCurrentTime]] ( void );&lt;br /&gt;
 BZF_API void [[bz_getLocaltime]] ( [[bz_Time]] *ts );&lt;br /&gt;
 BZF_API void [[bz_getUTCtime]] ( [[bz_Time]] *ts );&lt;br /&gt;
&lt;br /&gt;
?&lt;br /&gt;
 BZF_API float [[bz_getMaxWaitTime]] ( void );&lt;br /&gt;
 BZF_API void [[bz_setMaxWaitTime]] ( float maxTime );&lt;br /&gt;
&lt;br /&gt;
=== Global Database Management (BZDB) ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API double [[bz_getBZDBDouble]] ( const char* variable );&lt;br /&gt;
 BZF_API [[bz_ApiString]] [[bz_getBZDBString]] ( const char* variable );&lt;br /&gt;
 BZF_API bool [[bz_getBZDBBool]] ( const char* variable );&lt;br /&gt;
 BZF_API int [[bz_getBZDBInt]] ( const char* variable );&lt;br /&gt;
 BZF_API int [[bz_getBZDBItemPerms]] ( const char* variable );&lt;br /&gt;
 BZF_API bool [[bz_getBZDBItemPesistent]] ( const char* variable );&lt;br /&gt;
 BZF_API bool [[bz_BZDBItemExists]] ( const char* variable );&lt;br /&gt;
 BZF_API bool [[bz_setBZDBDouble]] ( const char* variable, double val, int perms = 0, bool persistent = false );&lt;br /&gt;
 BZF_API bool [[bz_setBZDBString]] ( const char* variable, const char *val, int perms = 0, bool persistent = false  );&lt;br /&gt;
 BZF_API bool [[bz_setBZDBBool]] ( const char* variable, bool val, int perms = 0, bool persistent = false  );&lt;br /&gt;
 BZF_API bool [[bz_setBZDBInt]] ( const char* variable, int val, int perms = 0, bool persistent = false  );&lt;br /&gt;
 BZF_API int [[bz_getBZDBVarList]] ( bz_APIStringList	*varList );&lt;br /&gt;
 BZF_API void [[bz_resetBZDBVar]] ( const char* variable );&lt;br /&gt;
 BZF_API void [[bz_resetALLBZDBVars]] ( void );&lt;br /&gt;
&lt;br /&gt;
=== Logging ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API void [[bz_debugMessage]] ( int level, const char* message );&lt;br /&gt;
 BZF_API void [[bz_debugMessagef]] ( int level, const char* fmt, ... )&lt;br /&gt;
 BZF_API int [[bz_getDebugLevel]] ( void );&lt;br /&gt;
&lt;br /&gt;
=== Server Administration ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_kickUser]] ( int playerIndex, const char* reason, bool notify );&lt;br /&gt;
 BZF_API bool [[bz_IPBanUser]] ( int bannedByIndex, const char* ip, int duration, const char* reason );&lt;br /&gt;
 BZF_API bool [[bz_HostBanUser]] ( int bannedByIndex, const char* hostmask, int duration, const char* reason );&lt;br /&gt;
 BZF_API bool [[bz_IPUnbanUser]] ( const char* ip );&lt;br /&gt;
 BZF_API bool [[bz_IDUnbanUser]] ( const char* bzID );&lt;br /&gt;
 BZF_API bool [[bz_HostUnbanUser]] ( const char* hostmask );&lt;br /&gt;
 &lt;br /&gt;
 BZF_API int [[bz_getLagWarn]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_setLagWarn]] ( int lagwarn );&lt;br /&gt;
 BZF_API bool [[bz_pollActive]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_pollVeto]] ( void );&lt;br /&gt;
&lt;br /&gt;
?&lt;br /&gt;
 BZF_API bool [[bz_IDBanUser]] ( int bannedByIndex, const char* bzID , int duration, const char *reason );&lt;br /&gt;
&lt;br /&gt;
=== Reporting ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API [[bz_APIStringList]]* [[bz_getReports]] ( void );&lt;br /&gt;
?&lt;br /&gt;
 BZF_API unsigned int [[bz_getReportCount]] ( void );&lt;br /&gt;
 BZF_API const char* [[bz_getReportSource]] ( unsigned int id );&lt;br /&gt;
 BZF_API const char* [[bz_getReportBody]] ( unsigned int id );&lt;br /&gt;
 BZF_API const char* [[bz_getReportTime]] ( unsigned int id );&lt;br /&gt;
 BZF_API bool [[bz_clearReport]] ( unsigned int id );&lt;br /&gt;
 BZF_API bool [[bz_clearAllReports]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_fileReport]] ( const char* message, const char* from );&lt;br /&gt;
&lt;br /&gt;
=== Timed Game Management ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_setTimeLimit]] ( float timeLimit );&lt;br /&gt;
 BZF_API float [[bz_getTimeLimit]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_isTimeManualStart]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_isCountDownActive]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_isCountDownInProgress]] ( void );&lt;br /&gt;
 BZF_API void [[bz_pauseCountdown]] ( const char *pausedBy );&lt;br /&gt;
 BZF_API void [[bz_resumeCountdown]] ( const char *resumedBy );&lt;br /&gt;
 BZF_API void [[bz_startCountdown]] ( int delay, float limit, const char *byWho );&lt;br /&gt;
&lt;br /&gt;
=== Custom Text Commands ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_registerCustomSlashCommand]] ( const char* command, [[bz_CustomSlashCommandHandler]] *handler );&lt;br /&gt;
 BZF_API bool [[bz_removeCustomSlashCommand]] ( const char* command );&lt;br /&gt;
&lt;br /&gt;
=== Plug-in Management ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API int [[bz_getLoadedPlugins]] ( [[bz_APIStringList]] * list );&lt;br /&gt;
 BZF_API bool [[bz_loadPlugin]] ( const char* path, const char* params );&lt;br /&gt;
 BZF_API bool [[bz_unloadPlugin]] ( const char* path );&lt;br /&gt;
 BZF_API const char* [[bz_pluginBinPath]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_registerCustomPluginHandler]] ( const char* extension, [[bz_APIPluginHandler]] * handler );&lt;br /&gt;
 BZF_API bool [[bz_removeCustomPluginHandler]] ( const char* extension, [[bz_APIPluginHandler]] * handler );&lt;br /&gt;
&lt;br /&gt;
=== Public Server Information ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_getPublic]] ( void );&lt;br /&gt;
 BZF_API [[bz_ApiString]] [[bz_getPublicAddr]] ( void );&lt;br /&gt;
 BZF_API [[bz_ApiString]] [[bz_getPublicDescription]] ( void );&lt;br /&gt;
 BZF_API int [[bz_getPublicPort]] ( void );&lt;br /&gt;
 BZF_API void [[bz_updateListServer]] ( void );&lt;br /&gt;
&lt;br /&gt;
=== HTTP Transfer ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_addURLJob]] ( const char* URL, [[bz_BaseURLHandler]]* handler = NULL, const char* postData = NULL );&lt;br /&gt;
 BZF_API bool [[bz_removeURLJob]] ( const char* URL );&lt;br /&gt;
?&lt;br /&gt;
 BZF_API bool [[bz_stopAllURLJobs]] ( void );&lt;br /&gt;
&lt;br /&gt;
=== Callback Functions ===&lt;br /&gt;
?&lt;br /&gt;
 BZF_API bool [[bz_registerCallBack]] ( const char* name, [[bz_GenericCallback]] *callback );&lt;br /&gt;
 BZF_API bool [[bz_registerCallBack]] ( const char* name, [[bz_GenericCallbackFunc]] callback );&lt;br /&gt;
 BZF_API bool [[bz_removeCallBack]] ( const char* name, [[bz_GenericCallback]] *callback );&lt;br /&gt;
 BZF_API bool [[bz_removeCallBack]] ( const char* name, [[bz_GenericCallbackFunc]] callback );&lt;br /&gt;
 BZF_API bool [[bz_callCallback]] ( const char* name, void *param );&lt;br /&gt;
 BZF_API bool [[bz_callbackExists]] ( const char* name );&lt;br /&gt;
&lt;br /&gt;
=== Inter-Plug-in Communications ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_clipFieldExists]] ( const char *name );&lt;br /&gt;
 BZF_API const char* [[bz_getclipFieldString]] ( const char *name );&lt;br /&gt;
 BZF_API float [[bz_getclipFieldFloat]] ( const char *name );&lt;br /&gt;
 BZF_API int [[bz_getclipFieldInt]] ( const char *name );&lt;br /&gt;
 BZF_API bool [[bz_setclipFieldString]] ( const char *name, const char* data );&lt;br /&gt;
 BZF_API bool [[bz_setclipFieldFloat]] ( const char *name, float data );&lt;br /&gt;
 BZF_API bool [[bz_setclipFieldInt]] ( const char *name, int data );&lt;br /&gt;
 BZF_API bool [[bz_addClipFieldNotifier]] ( const char *name, [[bz_ClipFiledNotifier *cb );&lt;br /&gt;
 BZF_API bool [[bz_removeClipFieldNotifier]] ( const char *name, [[bz_ClipFiledNotifier *cb );&lt;br /&gt;
&lt;br /&gt;
=== Game Recording ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_saveRecBuf]] ( const char * _filename, int seconds);&lt;br /&gt;
 BZF_API bool [[bz_startRecBuf]] ( void );&lt;br /&gt;
 BZF_API bool [[bz_stopRecBuf]] ( void );&lt;br /&gt;
&lt;br /&gt;
=== Map Management ===&lt;br /&gt;
==== Map Information ====&lt;br /&gt;
?&lt;br /&gt;
 BZF_API void [[bz_getWorldSize]] ( float *size, float *wallHeight );&lt;br /&gt;
 BZF_API unsigned int [[bz_getWorldObjectCount]] ( void );&lt;br /&gt;
 BZF_API [[bz_APIWorldObjectList]]* [[bz_getWorldObjectList]] ( void );&lt;br /&gt;
 BZF_API void [[bz_releaseWorldObjectList]] ( [[bz_APIWorldObjectList]] *list );&lt;br /&gt;
 BZF_API unsigned int [[bz_findWorldObject]] ( const char *name );&lt;br /&gt;
 BZF_API [[bz_APIBaseWorldObject]]* [[bz_getWorldObjectByID]] ( unsigned int id );&lt;br /&gt;
 BZF_API bool [[bz_getTeleLinkIDs]] ( const char* teleName, int* frontLink, int* backLink );&lt;br /&gt;
 BZF_API const char* [[bz_getLinkTeleName]] ( int linkIndex );&lt;br /&gt;
 BZF_API int [[bz_getPhyDrvID]] ( const char* phyDrvName );&lt;br /&gt;
 BZF_API const char* [[bz_getPhyDrvName]] ( unsigned int phyDrvID );&lt;br /&gt;
 BZF_API bool [[bz_SetWorldObjectTangibility]] ( int id, const [[bz_SolidObjectPassableAtributes]] &amp;amp;atribs );&lt;br /&gt;
 BZF_API bool [[bz_GetWorldObjectTangibility]] ( int id, [[bz_SolidObjectPassableAtributes]] &amp;amp;atribs );&lt;br /&gt;
 BZF_API void [[bz_ResetWorldObjectTangibilities]] ( void );&lt;br /&gt;
&lt;br /&gt;
==== Map Collisions ====&lt;br /&gt;
?&lt;br /&gt;
 [[bz_eAPIColType]] [[bz_cylinderInMapObject]] ( float pos[3], float height, float radius, [[bz_APIBaseWorldObject]] **object );&lt;br /&gt;
 [[bz_eAPIColType]] [[bz_boxInMapObject]] ( float pos[3], float size[3], float angle, [[bz_APIBaseWorldObject]] **object );&lt;br /&gt;
&lt;br /&gt;
==== Custom Map Objects ====&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_registerCustomMapObject]] ( const char* object, [[bz_CustomMapObjectHandler]] *handler );&lt;br /&gt;
 BZF_API bool [[bz_removeCustomMapObject]] ( const char* object );&lt;br /&gt;
&lt;br /&gt;
=== Utility ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API const char *[[bz_MD5]] ( const char* str );&lt;br /&gt;
 BZF_API const char *[[bz_MD5]] ( const void* data, size_t size );&lt;br /&gt;
 BZF_API const char *[[bz_getServerVersion]] ( void );&lt;br /&gt;
 BZF_API const char *[[bz_getProtocolVersion]] ( void );&lt;br /&gt;
&lt;br /&gt;
=== Misc ===&lt;br /&gt;
2.3+&lt;br /&gt;
 BZF_API bool [[bz_getStandardSpawn]] ( int playerID, float pos[3], float *rot );&lt;br /&gt;
 BZF_API bool [[bz_killPlayer]] ( int playerID, bool spawnOnBase);&lt;br /&gt;
 BZF_API bool [[bz_killPlayer]] ( int playerID, bool spawnOnBase, int killerID = -1, const char* flagID = NULL );&lt;br /&gt;
 BZF_API bool [[bz_sendPlayCustomLocalSound]] ( int playerID, const char* soundName );&lt;br /&gt;
 BZF_API [[bz_ApiString]] [[bz_filterPath]] ( const char* path );&lt;br /&gt;
 BZF_API const char *[[bz_format]](const char* fmt, ...)_ATTRIBUTE12;&lt;br /&gt;
 BZF_API const char *[[bz_toupper]](const char* val );&lt;br /&gt;
 BZF_API const char *[[bz_tolower]](const char* val );&lt;br /&gt;
 BZF_API const char *[[bz_urlEncode]](const char* val );&lt;br /&gt;
 BZF_API [[bz_eGameType]] [[bz_getGameType]]( void );&lt;br /&gt;
 BZF_API [[bz_eTeamType]] [[bz_checkBaseAtPoint]] ( float pos[3] );&lt;br /&gt;
 BZF_API int [[bz_APIVersion]] ( void );&lt;br /&gt;
?&lt;br /&gt;
 BZF_API bool [[bz_allowJumping]] ( void );&lt;br /&gt;
&lt;br /&gt;
=== Server Side Players (Development) ===&lt;br /&gt;
? (In API for 2.3+, but will crash a server)&lt;br /&gt;
 BZF_API int [[bz_addServerSidePlayer]] ( [[bz_ServerSidePlayerHandler]] *handler );&lt;br /&gt;
 BZF_API bool [[bz_removeServerSidePlayer]] ( int playerID, [[bz_ServerSidePlayerHandler]] *handler );&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
[[BZFS API]]&lt;br /&gt;
&lt;br /&gt;
[[plug-ins]]&lt;br /&gt;
&lt;br /&gt;
[[Category:BZFS_API_Functions]]&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=BZFlag_SVN&amp;diff=8617</id>
		<title>BZFlag SVN</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=BZFlag_SVN&amp;diff=8617"/>
		<updated>2013-03-18T17:36:53Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: update to the new URL&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;BZFlag SVN, is the [http://en.wikipedia.org/wiki/Subversion_(software) Subversion Revision Control System] used by the development team to maintain and store the [[BZFlag Source]] code. The SVN system is hosted by [http://www.sourceforge.net SourceForge] and is accessible by anyone with the proper software. The SVN system replaces the [[BZFlag CVS]] system that was used in the past.&lt;br /&gt;
&lt;br /&gt;
==SVN clients==&lt;br /&gt;
To access the source code via SVN , you will need a SVN client. Most unix/linux type operating systems have the command line SVN client as an installable option. Windows users must download the Windows native [http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91 SVN command line utility] or a third party SVN client, such as [http://tortoisesvn.tigris.org/ the Tortoise Graphical SVN Client] (highly recommended). SVN is also available to Windows users via [http://cygwin.com/ Cygwin] with SVN and other common Devel tools selected during installation.&lt;br /&gt;
&lt;br /&gt;
==Getting code from SVN Access==&lt;br /&gt;
===Command line===&lt;br /&gt;
The simplest way to get the bzflag source code is to use the URL for the current ( or TRUNK ) bzflag module.&lt;br /&gt;
&lt;br /&gt;
 svn co &amp;lt;nowiki&amp;gt;svn://svn.code.sf.net/p/bzflag/code/trunk/bzflag&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will get you the current bzflag source code for the development version.&lt;br /&gt;
&lt;br /&gt;
If you want the SVN code for the 2.0.x compatible version use the URL&lt;br /&gt;
&lt;br /&gt;
 svn co &amp;lt;nowiki&amp;gt;svn://svn.code.sf.net/p/bzflag/code/branches/release_maint/v2_0/bzflag&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you wish to get all of our source code in one step, you can get the entire repository with the command.&lt;br /&gt;
&lt;br /&gt;
 svn co &amp;lt;nowiki&amp;gt;svn://svn.code.sf.net/p/bzflag/code/&amp;lt;/nowiki&amp;gt; bzflag&lt;br /&gt;
&lt;br /&gt;
This will get all modules, branches, tags, and subdirs. Beware! This is a very large amount of data (make sure you have at least 2.7 GB of disk space available) and will take a while and will be rather useless, as it is the code for every version of bzflag. Most users will only need the code for one specific version.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;best&#039;&#039;&#039; way, is to only get the subdir for the module you are interested in. This is much more efficient and suitable for most users. The most common module to get is the bzflag module, as it is the actual game.&lt;br /&gt;
&lt;br /&gt;
Please see the sections below for more information about the URLs to use for branches and modules.&lt;br /&gt;
&lt;br /&gt;
===TortoiseSVN===&lt;br /&gt;
&lt;br /&gt;
Windows users that use the Tortoise Graphical SVN Client simply enter the URL of the SVN path they wish to check out in the field marked &#039;&#039;URL of repository&#039;&#039;. For the current version of all modules simply use the /trunk path. Note, if you want your code to be checked out into a new folder, be sure to enter that folder name in the &#039;&#039;Checkout directory&#039;&#039; field.&lt;br /&gt;
&lt;br /&gt;
If you wish to get only a single module subdir, or a revision, simply use the URL specified in the sections below.&lt;br /&gt;
&lt;br /&gt;
==Committing Code to SVN==&lt;br /&gt;
&lt;br /&gt;
Project developers that need write access to the source code to make changes ( or [[commits]] ) need to provide their sourceforge username and password when doing a SVN commit. A sourceforge account is required for developer access, as well as approval from a project administrator.&lt;br /&gt;
&lt;br /&gt;
Please make sure that your svn config file includes the correct [[Auto-props]].  If you get a [[Mime-types]] error, you either didn&#039;t enable the correct auto-props setting in your subversion config file or you need to manually set file properties.  &lt;br /&gt;
&lt;br /&gt;
===Command Line===&lt;br /&gt;
Using the command&lt;br /&gt;
  svn commit&lt;br /&gt;
in a directory that has code changes will commit any changed code back to the repository. The svn client will prompt you for your username and password.&lt;br /&gt;
&lt;br /&gt;
===TortoiseSVN===&lt;br /&gt;
Windows users that use the Tortoise Graphical SVN Client can simply choose the SVN commit item, and enter their username and password when prompted.&lt;br /&gt;
&lt;br /&gt;
Tortoise users may set auto-props from the General Settings property page; click the Edit button and paste the auto-props into the correct section, then un-comment the &amp;quot;enable-auto-props = yes&amp;quot; line above it.&lt;br /&gt;
&lt;br /&gt;
==Updating code from SVN to the current version==&lt;br /&gt;
&lt;br /&gt;
===Command Line===&lt;br /&gt;
Using the command&lt;br /&gt;
   svn up&lt;br /&gt;
in the directory that has checked out code will cause subversion to update that code to the current version for that branch.&lt;br /&gt;
&lt;br /&gt;
===TortoiseSVN===&lt;br /&gt;
Windows users that use the Tortoise Graphical SVN Client can simply choose the SVN update item from their right click menus.&lt;br /&gt;
&lt;br /&gt;
==Reverting local code to the server&#039;s version==&lt;br /&gt;
&lt;br /&gt;
===Command Line===&lt;br /&gt;
Using the command&lt;br /&gt;
  svn revert&lt;br /&gt;
  svn up&lt;br /&gt;
in the directory that has checked out code will cause subversion to set flags on all modified local files, then update the code to match the code on the server. NOTE: This has the effect of wiping out all local changes, so use with caution!&lt;br /&gt;
&lt;br /&gt;
===TortoiseSVN===&lt;br /&gt;
Right click on the file or directory you would like to revert and from the TortoiseSVN submenu, select &#039;&#039;&#039;Revert...&#039;&#039;&#039;. The menus is context sensitive, so there must be code that has been modified for the menu choice to be available.&lt;br /&gt;
&lt;br /&gt;
==Module sub directories==&lt;br /&gt;
&lt;br /&gt;
The source code in SVN is broken up into a number of modules for ease of use and management. When requesting the source code from the SVN system a sub-directory may be specified to limit the code that is accessed.&lt;br /&gt;
&lt;br /&gt;
The current SVN modules are:&lt;br /&gt;
*bzflag : The main module that includes the game [[BZFlag 2.0.8|client]], [[BZFS|server]], [[plug-ins]], and [[BZAdmin]].&lt;br /&gt;
*admin : The [[Master Ban]] list&lt;br /&gt;
*bzedit : The linux version of the BZFlag map editor [[BZEdit]]&lt;br /&gt;
*bzeditw32 : The windows version of the BZFlag map editor [[BZEditWin32]]&lt;br /&gt;
*web : The main website at http://www.bzflag.org&lt;br /&gt;
*db : Files related to the website http://my.bzflag.org and the [[Global Registration]] system.&lt;br /&gt;
*pybzflag : an abandoned python implementation of BZFlag&lt;br /&gt;
*bzworkbench : The source code for [[BZWorkBench]]&lt;br /&gt;
*bzwgen: The source code for the automatic city generator.&lt;br /&gt;
&lt;br /&gt;
to get the current version of a module, you would add &lt;br /&gt;
  /trunk/MODULE_NAME&lt;br /&gt;
after the normal SVN URL.&lt;br /&gt;
&lt;br /&gt;
so to get the current version of just the bzflag module, the URL would be&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;svn://svn.code.sf.net/p/bzflag/code/trunk/bzflag/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From the command line&lt;br /&gt;
&lt;br /&gt;
 svn co &amp;lt;nowiki&amp;gt;svn://svn.code.sf.net/p/bzflag/code/trunk/bzflag&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Branches==&lt;br /&gt;
Branches in subversion are simply subfolders.&lt;br /&gt;
All branches are in the /branches subdirectory off the root level of the SVN tree, listed [http://bzflag.svn.sourceforge.net/viewvc/bzflag/branches/ here].&lt;br /&gt;
To get the code in a branch, you simply use the branch URL in your svn client.&lt;br /&gt;
&lt;br /&gt;
To get the 2.0.x branch of the BZFlag module, you&#039;d use the following URL.&lt;br /&gt;
   svn://svn.code.sf.net/p/bzflag/code/branches/release_maint/v2_0/bzflag/&lt;br /&gt;
&lt;br /&gt;
==Useful Tools==&lt;br /&gt;
&lt;br /&gt;
===Windows===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tortoise Graphical SVN Client&#039;&#039;&#039;: integrates subversion into the windows explorer shell. http://tortoisesvn.tigris.org/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ankh Subversion&#039;&#039;&#039;: integrates subversion into Visual C++ as a native source control provider. http://ankhsvn.tigris.org/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;WinMerge&#039;&#039;&#039;: visual merge and diff tool for windows. http://winmerge.org/&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
[[Versions]]&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
[http://sourceforge.net/svn/?group_id=3248 SourceForge SVN Access page]&lt;br /&gt;
&lt;br /&gt;
[http://bzflag.svn.sourceforge.net/viewvc/bzflag/ BZFlag SVN Tree]&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Compiling]]&lt;br /&gt;
[[Category:Versions]]&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=BZFlag_SVN&amp;diff=8616</id>
		<title>BZFlag SVN</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=BZFlag_SVN&amp;diff=8616"/>
		<updated>2013-03-18T17:36:17Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: update to the new URL&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;BZFlag SVN, is the [http://en.wikipedia.org/wiki/Subversion_(software) Subversion Revision Control System] used by the development team to maintain and store the [[BZFlag Source]] code. The SVN system is hosted by [http://www.sourceforge.net SourceForge] and is accessible by anyone with the proper software. The SVN system replaces the [[BZFlag CVS]] system that was used in the past.&lt;br /&gt;
&lt;br /&gt;
==SVN clients==&lt;br /&gt;
To access the source code via SVN , you will need a SVN client. Most unix/linux type operating systems have the command line SVN client as an installable option. Windows users must download the Windows native [http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91 SVN command line utility] or a third party SVN client, such as [http://tortoisesvn.tigris.org/ the Tortoise Graphical SVN Client] (highly recommended). SVN is also available to Windows users via [http://cygwin.com/ Cygwin] with SVN and other common Devel tools selected during installation.&lt;br /&gt;
&lt;br /&gt;
==Getting code from SVN Access==&lt;br /&gt;
===Command line===&lt;br /&gt;
The simplest way to get the bzflag source code is to use the URL for the current ( or TRUNK ) bzflag module.&lt;br /&gt;
&lt;br /&gt;
 svn co &amp;lt;nowiki&amp;gt;svn://svn.code.sf.net/p/bzflag/code/trunk/bzflag&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will get you the current bzflag source code for the development version.&lt;br /&gt;
&lt;br /&gt;
If you want the SVN code for the 2.0.x compatible version use the URL&lt;br /&gt;
&lt;br /&gt;
 svn co &amp;lt;nowiki&amp;gt;svn://svn.code.sf.net/p/bzflag/code/branches/release_maint/v2_0/bzflag&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you wish to get all of our source code in one step, you can get the entire repository with the command.&lt;br /&gt;
&lt;br /&gt;
 svn co &amp;lt;nowiki&amp;gt;svn://svn.code.sf.net/p/bzflag/code/&amp;lt;/nowiki&amp;gt; bzflag&lt;br /&gt;
&lt;br /&gt;
This will get all modules, branches, tags, and subdirs. Beware! This is a very large amount of data (make sure you have at least 2.7 GB of disk space available) and will take a while and will be rather useless, as it is the code for every version of bzflag. Most users will only need the code for one specific version.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;best&#039;&#039;&#039; way, is to only get the subdir for the module you are interested in. This is much more efficient and suitable for most users. The most common module to get is the bzflag module, as it is the actual game.&lt;br /&gt;
&lt;br /&gt;
Please see the sections below for more information about the URLs to use for branches and modules.&lt;br /&gt;
&lt;br /&gt;
===TortoiseSVN===&lt;br /&gt;
&lt;br /&gt;
Windows users that use the Tortoise Graphical SVN Client simply enter the URL of the SVN path they wish to check out in the field marked &#039;&#039;URL of repository&#039;&#039;. For the current version of all modules simply use the /trunk path. Note, if you want your code to be checked out into a new folder, be sure to enter that folder name in the &#039;&#039;Checkout directory&#039;&#039; field.&lt;br /&gt;
&lt;br /&gt;
If you wish to get only a single module subdir, or a revision, simply use the URL specified in the sections below.&lt;br /&gt;
&lt;br /&gt;
==Committing Code to SVN==&lt;br /&gt;
&lt;br /&gt;
Project developers that need write access to the source code to make changes ( or [[commits]] ) need to provide their sourceforge username and password when doing a SVN commit. A sourceforge account is required for developer access, as well as approval from a project administrator.&lt;br /&gt;
&lt;br /&gt;
Please make sure that your svn config file includes the correct [[Auto-props]].  If you get a [[Mime-types]] error, you either didn&#039;t enable the correct auto-props setting in your subversion config file or you need to manually set file properties.  &lt;br /&gt;
&lt;br /&gt;
===Command Line===&lt;br /&gt;
Using the command&lt;br /&gt;
  svn commit&lt;br /&gt;
in a directory that has code changes will commit any changed code back to the repository. The svn client will prompt you for your username and password.&lt;br /&gt;
&lt;br /&gt;
===TortoiseSVN===&lt;br /&gt;
Windows users that use the Tortoise Graphical SVN Client can simply choose the SVN commit item, and enter their username and password when prompted.&lt;br /&gt;
&lt;br /&gt;
Tortoise users may set auto-props from the General Settings property page; click the Edit button and paste the auto-props into the correct section, then un-comment the &amp;quot;enable-auto-props = yes&amp;quot; line above it.&lt;br /&gt;
&lt;br /&gt;
==Updating code from SVN to the current version==&lt;br /&gt;
&lt;br /&gt;
===Command Line===&lt;br /&gt;
Using the command&lt;br /&gt;
   svn up&lt;br /&gt;
in the directory that has checked out code will cause subversion to update that code to the current version for that branch.&lt;br /&gt;
&lt;br /&gt;
===TortoiseSVN===&lt;br /&gt;
Windows users that use the Tortoise Graphical SVN Client can simply choose the SVN update item from their right click menus.&lt;br /&gt;
&lt;br /&gt;
==Reverting local code to the server&#039;s version==&lt;br /&gt;
&lt;br /&gt;
===Command Line===&lt;br /&gt;
Using the command&lt;br /&gt;
  svn revert&lt;br /&gt;
  svn up&lt;br /&gt;
in the directory that has checked out code will cause subversion to set flags on all modified local files, then update the code to match the code on the server. NOTE: This has the effect of wiping out all local changes, so use with caution!&lt;br /&gt;
&lt;br /&gt;
===TortoiseSVN===&lt;br /&gt;
Right click on the file or directory you would like to revert and from the TortoiseSVN submenu, select &#039;&#039;&#039;Revert...&#039;&#039;&#039;. The menus is context sensitive, so there must be code that has been modified for the menu choice to be available.&lt;br /&gt;
&lt;br /&gt;
==Module sub directories==&lt;br /&gt;
&lt;br /&gt;
The source code in SVN is broken up into a number of modules for ease of use and management. When requesting the source code from the SVN system a sub-directory may be specified to limit the code that is accessed.&lt;br /&gt;
&lt;br /&gt;
The current SVN modules are:&lt;br /&gt;
*bzflag : The main module that includes the game [[BZFlag 2.0.8|client]], [[BZFS|server]], [[plug-ins]], and [[BZAdmin]].&lt;br /&gt;
*admin : The [[Master Ban]] list&lt;br /&gt;
*bzedit : The linux version of the BZFlag map editor [[BZEdit]]&lt;br /&gt;
*bzeditw32 : The windows version of the BZFlag map editor [[BZEditWin32]]&lt;br /&gt;
*web : The main website at http://www.bzflag.org&lt;br /&gt;
*db : Files related to the website http://my.bzflag.org and the [[Global Registration]] system.&lt;br /&gt;
*pybzflag : an abandoned python implementation of BZFlag&lt;br /&gt;
*bzworkbench : The source code for [[BZWorkBench]]&lt;br /&gt;
*bzwgen: The source code for the automatic city generator.&lt;br /&gt;
&lt;br /&gt;
to get the current version of a module, you would add &lt;br /&gt;
  /trunk/MODULE_NAME&lt;br /&gt;
after the normal SVN URL.&lt;br /&gt;
&lt;br /&gt;
so to get the current version of just the bzflag module, the URL would be&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;svn://svn.code.sf.net/p/bzflag/code/trunk/bzflag/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From the command line&lt;br /&gt;
&lt;br /&gt;
 svn co &amp;lt;nowiki&amp;gt;svn://svn.code.sf.net/p/bzflag/code/trunk/bzflag&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Branches==&lt;br /&gt;
Branches in subversion are simply subfolders.&lt;br /&gt;
All branches are in the /branches subdirectory off the root level of the SVN tree, listed [http://bzflag.svn.sourceforge.net/viewvc/bzflag/branches/ here].&lt;br /&gt;
To get the code in a branch, you simply use the branch URL in your svn client.&lt;br /&gt;
&lt;br /&gt;
To get the 2.0.x branch of the BZFlag module, you&#039;d use the following URL.&lt;br /&gt;
   https://bzflag.svn.sourceforge.net/svnroot/bzflag/branches/release_maint/v2_0/bzflag/&lt;br /&gt;
&lt;br /&gt;
==Useful Tools==&lt;br /&gt;
&lt;br /&gt;
===Windows===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tortoise Graphical SVN Client&#039;&#039;&#039;: integrates subversion into the windows explorer shell. http://tortoisesvn.tigris.org/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ankh Subversion&#039;&#039;&#039;: integrates subversion into Visual C++ as a native source control provider. http://ankhsvn.tigris.org/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;WinMerge&#039;&#039;&#039;: visual merge and diff tool for windows. http://winmerge.org/&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
[[Versions]]&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
[http://sourceforge.net/svn/?group_id=3248 SourceForge SVN Access page]&lt;br /&gt;
&lt;br /&gt;
[http://bzflag.svn.sourceforge.net/viewvc/bzflag/ BZFlag SVN Tree]&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Compiling]]&lt;br /&gt;
[[Category:Versions]]&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Category:Development&amp;diff=8588</id>
		<title>Category:Development</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Category:Development&amp;diff=8588"/>
		<updated>2013-02-10T08:38:48Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: Add notes on the various dev templates and when each should be used, and point out the patch tracker for submissions of code for new ideas&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
BZFlag is developed as an open source guided development process involving a number of developers all over the world.&lt;br /&gt;
&lt;br /&gt;
==Organization==&lt;br /&gt;
Open source development tends to not have as formal a structure as traditional development, but the bzflag project does have a group of developers that are responsible for various aspects of projet.&lt;br /&gt;
&lt;br /&gt;
===Copyright Maintainer===&lt;br /&gt;
Tim Riker (TimRiker) is the copyright holder and intellectual property manager for the project and manages its various legal operations.&lt;br /&gt;
&lt;br /&gt;
===Development Leads===&lt;br /&gt;
Scott Wichser (Blast007) and Jeffery Myers (JeffM) are the development leads. They are responsible for the day to day development and planning of the various releases of BZFlag. They maintain the [[BZFlag Source]] Code, [[BZFlag_SVN|SVN]] repository, and ensure that development of the game goes according to the design goals and [[Development_RoadMap]].&lt;br /&gt;
&lt;br /&gt;
===Service Managers===&lt;br /&gt;
Scott Wichser (Blast007) and Joe Vano (JoeVano) manage the public services that BZFlag clients and servers use such as the [[List Server]] and [[Global Registration]] System.&lt;br /&gt;
&lt;br /&gt;
====Forum Administrators====&lt;br /&gt;
A number of community members maintain the [[BZFlag Forums]] including;&lt;br /&gt;
&lt;br /&gt;
* L4m3r&lt;br /&gt;
* DTRemenak&lt;br /&gt;
* BRLCAD&lt;br /&gt;
* Blast007&lt;br /&gt;
* Bryjen&lt;br /&gt;
* joevano&lt;br /&gt;
* Bullet Catcher&lt;br /&gt;
* Constitution&lt;br /&gt;
&lt;br /&gt;
==Communications==&lt;br /&gt;
Development communications mostly happens in the [[BZFlag_on_IRC|BZFlag IRC channel]]. There are development mailing lists on the sourceforge site but they are rarely used. Many developers are often on the IRC channel and are more then willing to discuss things relating to bzflag development.&lt;br /&gt;
&lt;br /&gt;
==Coding Policy==&lt;br /&gt;
BZFlag has a documented coding policy that is in the DEVINFO file that is included with every source code release.&lt;br /&gt;
&lt;br /&gt;
==Wiki Development Design Templates==&lt;br /&gt;
In order to help out developers in building collaborative documents, the wiki has several templates that can be used to setup documents.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;IdeaDesign&#039;&#039;&#039;  This template is intended to be used to flesh out an idea or proposed change that has not yet been accepted but is being worked on by multiple people. This is where all new ideas should start.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DesignDocument&#039;&#039;&#039; Once an idea or change has been approved and made part of the development plan it will be changed to a Design Document. This indicates that the feature can be worked on in the development codebase by any developer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Specification&#039;&#039;&#039; If additional documentation is needed for a feature then those documents can use this template. Specifications should also be put into a category or name space with the associated design document overview.&lt;br /&gt;
&lt;br /&gt;
===Notes on Patches===&lt;br /&gt;
Some ideas may not be accepted by the development community right away, if the idea proposer wishes to implement the idea or parts of the idea to prove it out then those changes should be submitted to the [http://sourceforge.net/tracker/?group_id=3248&amp;amp;atid=303248 SourceForge Patch Tracker]. This will allow developers and team leaders to review the patch and decide if it should be included in the mainline release. It also lets other use or extend the code changes for private use. &lt;br /&gt;
&lt;br /&gt;
==Resources==&lt;br /&gt;
[[SVN]] repository stored on Source Forge.&lt;br /&gt;
&lt;br /&gt;
[[BZFlag Source]] Information on the source code for the game.&lt;br /&gt;
&lt;br /&gt;
[[BZFS API]] Information on the API for plug-in development.&lt;br /&gt;
&lt;br /&gt;
[http://sourceforge.net/tracker/?group_id=3248&amp;amp;atid=303248 SourceForge Patch Tracker] where code changes from new developers are submitted.&lt;br /&gt;
&lt;br /&gt;
[http://sourceforge.net/tracker/?group_id=3248&amp;amp;atid=103248 SourceForge Bug Tracker] where users report bugs or problems in the game.&lt;br /&gt;
&lt;br /&gt;
[http://sourceforge.net/tracker/?group_id=3248&amp;amp;atid=353248 SourceForge Feature Requests] where users request new features ( pending approval).&lt;br /&gt;
&lt;br /&gt;
==Helping Out==&lt;br /&gt;
BZFlag can always use new developers. Users that wish to become more involved in the development process are encouraged to join the IRC channel and talk to the developers and players there.&lt;br /&gt;
&lt;br /&gt;
The next step is to submit patches to the patch tracker so the new developer can get the hang of how the codebase works and so that project management can evaluate the coding ability/style of the new developer. The best way to get started is to take a look at the bugs in the Bug Tracker.&lt;br /&gt;
&lt;br /&gt;
If a new developer fits into the project well and is productive they will often be given &#039;&#039;&#039;commit access&#039;&#039;&#039; to the SVN system so they may make changes directly to the code.&lt;br /&gt;
&lt;br /&gt;
==Versions==&lt;br /&gt;
The current shipping version is based on the 2.4.2 tag &#039;&#039;&#039;tags/v2_4_2/&#039;&#039;&#039; in svn&lt;br /&gt;
&lt;br /&gt;
The current development version is 2.4.3 and is maintenance for the 2.4.x line, it is located in &#039;&#039;&#039;trunk/bzflag&#039;&#039;&#039; in svn.&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Timedctf&amp;diff=8587</id>
		<title>Timedctf</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Timedctf&amp;diff=8587"/>
		<updated>2013-02-10T08:30:01Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: This was shipped, it&amp;#039;s not a dev thing anymore&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The timedctf plugin will start a timed capture the flag game in which a team must capture another team&#039;s flag in a configurable amount of time.&lt;br /&gt;
&lt;br /&gt;
=Description=&lt;br /&gt;
* If the time expires before the team captures a flag, all members of the team will be destroyed and the timer will restart for that team. &lt;br /&gt;
* If the team captures another team&#039;s flag before their time expires, their timer is reset and starts counting down again. &lt;br /&gt;
* All 4 teams have individual timers.&lt;br /&gt;
&lt;br /&gt;
There are &#039;&#039;&#039;warning messages&#039;&#039;&#039; sent to individual teams as their time starts to expire:&lt;br /&gt;
&lt;br /&gt;
* A warning every minute (with time remaining) until the last minute.&amp;lt;br /&amp;gt; &lt;br /&gt;
* A warning at 30 seconds before time expires.&lt;br /&gt;
* A warning at 20 seconds before time expires.&lt;br /&gt;
* A warning at 10 seconds before time expires.&lt;br /&gt;
&lt;br /&gt;
The plugin also monitors the &#039;&#039;&#039;balance of teams&#039;&#039;&#039; and will disable the timer if teams are uneven. To determine if teams are balanced or not, at least a 75% match is used. This means that even teams would be considered:&lt;br /&gt;
&lt;br /&gt;
These would work:&lt;br /&gt;
* 2 vs 2 (100%)&lt;br /&gt;
* 3 vs 4 (75%)&lt;br /&gt;
&lt;br /&gt;
These won&#039;t:&lt;br /&gt;
* 2 vs 4 (50%)&lt;br /&gt;
* 1 vs 4 (25%)&lt;br /&gt;
&lt;br /&gt;
The percentage is calculated this way:&lt;br /&gt;
 smaller team / larger team * 100&lt;br /&gt;
&lt;br /&gt;
If the teams are uneven, capture the flag is disabled; if a player tries to pick up a team flag, it will almost immediately be dropped.&lt;br /&gt;
&lt;br /&gt;
The plugin is set up for all 4 teams (red, green, blue and purple) and will monitor/time all 4 teams. However, it is best suited to 2 team capture the flag type maps in that it only looks for the 75% match between any 2 team sizes. This means that it is possible (on a 4 team ctf map) to have teams considered to be even if:&lt;br /&gt;
&lt;br /&gt;
1 vs 1 vs 3 vs 1&amp;lt;br /&amp;gt;&lt;br /&gt;
2 vs 2 vs 8 vs 1&amp;lt;br /&amp;gt;&lt;br /&gt;
and so on.&lt;br /&gt;
&lt;br /&gt;
There are also informative messages when the status of the game changes, for example:&lt;br /&gt;
&lt;br /&gt;
If a new player joins/parts that causes team imbalance, a message is sent stating that teams are uneven and timed ctf is disabled. If a new player joins/parts that balances teams out, a message is sent that timed ctf is enabled and how much time there is to capture a flag. And so on...&lt;br /&gt;
&lt;br /&gt;
There are also standard CTF sounds used whenever significant events take place.&lt;br /&gt;
&lt;br /&gt;
Note that the balance of teams will still be monitored when the ctf timer is off, and team flags will be dropped if teams are uneven (as described above). This allows this plugin to be utilized for fair, normal ctf play as well, if the ctf timer is turned off.  If both functions (tctf and fairctf) are turned off, the plugin is effectively disabled.  If the fair CTF function is disabled and the timed CTF function is enabled, the plugin will check for at least 2 teams&lt;br /&gt;
present before allowing timed CTF to take place.&lt;br /&gt;
&lt;br /&gt;
=Usage=&lt;br /&gt;
&lt;br /&gt;
The plugin will allow the time limit to be passed to the plugin through the -loadplugin command line with bzfs.  The format is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&#039;&#039;&#039;-loadplugin &amp;lt;path&amp;gt;timedctf,i&#039;&#039;&#039;&amp;quot; where i is the timer value (in minutes)for timed ctf.  For example,&amp;quot;-loadplugin plugins/timedctf,7&amp;quot; would start the plugin with the timer set for 7 minutes.  The minimum is 1 minute and the maximum is 120 minutes.  If no time is specified, the plugin defaults to 5 minutes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Server Commands=&lt;br /&gt;
The plugin has the following &#039;&#039;&#039;administration&#039;&#039;&#039; commands available:&lt;br /&gt;
&lt;br /&gt;
 /tctftime &amp;lt;iii&amp;gt; - this will change required capture time to &amp;lt;iii&amp;gt; (1-120 minutes).&amp;lt;br /&amp;gt;&lt;br /&gt;
 /tctfoff        - this will disable timed CTF.&amp;lt;br /&amp;gt;&lt;br /&gt;
 /tctfon         - this will enable timed CTF.&amp;lt;br /&amp;gt;&lt;br /&gt;
 /tctfsoundoff   - this will disable timed CTF sounds.&amp;lt;br /&amp;gt;&lt;br /&gt;
 /tctfsoundon    - this will enable timed CTF sounds.&amp;lt;br /&amp;gt;&lt;br /&gt;
 /tctfstatus     - this will return the current status of functions and the current time limit.&amp;lt;br /&amp;gt;&lt;br /&gt;
 /fairctfoff     - this will disable the fair ctf function.&amp;lt;br /&amp;gt;&lt;br /&gt;
 /fairctfon      - this will enable the fair ctf function.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Plug-Ins]]&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=LogDetail&amp;diff=8586</id>
		<title>LogDetail</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=LogDetail&amp;diff=8586"/>
		<updated>2013-02-10T08:29:32Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: This was shipped, it&amp;#039;s not a dev thing anymore&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;logDetail is a standard [[Plug-ins|plug-in]] that is shipped with the [[BZFlag Source|source code]]. It allows the server owner to record nearly everything that happens on a server.  logDetail is included in [[BZFlag 2.0.6|v2.0.6]] and later releases.&lt;br /&gt;
&lt;br /&gt;
==Logged Items==&lt;br /&gt;
logDetail will log the following events.&lt;br /&gt;
&lt;br /&gt;
* Join/Part with IP&lt;br /&gt;
* All Chat, including Private Messages&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
When logDetail is loaded it will force the logged data to be output to the normal debug stream. Server owners that wish to save his to a file must use the [[Redirect|redirect or pipe]] option on the host OS. &lt;br /&gt;
&lt;br /&gt;
==How to load the plugin==&lt;br /&gt;
In the configuration file put: &lt;br /&gt;
&lt;br /&gt;
* -loadplugin /path/to/logDetail.so&lt;br /&gt;
&lt;br /&gt;
While launching [[BZFS]] the part where you declare your configuration file should look like.&lt;br /&gt;
&lt;br /&gt;
* -conf /path/to/conf.conf &amp;gt;&amp;gt; Serverlog&lt;br /&gt;
&lt;br /&gt;
Now the logs will be saved in the same directory as your configuration file.&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
&lt;br /&gt;
[[Category:Plug-Ins]]&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=CrystalSpace_client&amp;diff=8585</id>
		<title>CrystalSpace client</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=CrystalSpace_client&amp;diff=8585"/>
		<updated>2013-02-10T08:29:00Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: This is an old idea, the info is good but not part of the current development effort&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{IdeaDesign}}&lt;br /&gt;
&lt;br /&gt;
The Crystal Space client was an effort is to provide implement the BZFlag client using the a [http://crystalspace3d.org crystalspace] 3d engine and application framework. Development work never progressed past an inital prototype and was not picked up by the mainline system.&lt;br /&gt;
&lt;br /&gt;
The current version is very experimental but, is compatible with all 2.0.x servers. It will be only available via SVN, using the v2_0_cs_branch.&lt;br /&gt;
&lt;br /&gt;
Currently, the client is playable, does not contain all the features of the stable release. It is not recommended as a playing client, only to be used for development.&lt;br /&gt;
&lt;br /&gt;
That is the plan on the development, subject to change without any prior notification:&lt;br /&gt;
[[Image:Crystal001.jpg|thumb|450px|right|Tank redone]]&lt;br /&gt;
# Integrate BZFlag client in the Crystal-Space framework, particularly regarding the event handling nature of it. &amp;lt;span style=&amp;quot;color: rgb(255, 0, 0);&amp;quot;&amp;gt;(done)&amp;lt;/span&amp;gt;&lt;br /&gt;
# Handle the command line interface a la Crystal-Space: &amp;lt;span style=&amp;quot;color: rgb(255, 0, 0);&amp;quot;&amp;gt;(done)&amp;lt;/span&amp;gt;&lt;br /&gt;
#* Option values separated by &#039;=&#039; instead of &#039; &#039;&lt;br /&gt;
#* Own handling of -help&lt;br /&gt;
#* Request of option on the command line using CS API&lt;br /&gt;
# Joystick handling done from Crystal Space &amp;lt;span style=&amp;quot;color: rgb(255, 0, 0);&amp;quot;&amp;gt;(done)&amp;lt;/span&amp;gt; This is actually having less functionality of native porting, as the force feedback is missing. I&#039;ll think I&#039;ll revert the joystick change when the work will go further.&lt;br /&gt;
# Remove the open GL calls from BZFlag &amp;lt;span style=&amp;quot;color: rgb(255, 0, 0);&amp;quot;&amp;gt;(mostly done)&amp;lt;/span&amp;gt; &lt;br /&gt;
# Crystal-Space manages mouse and keyboard, as far as possible.&amp;lt;span style=&amp;quot;color: rgb(255, 0, 0);&amp;quot;&amp;gt;(done)&amp;lt;/span&amp;gt; &lt;br /&gt;
# A world with a fixed sky with sun, the ground, and a wall all around the field. All done in XML using the CS rendering API and a camera.&amp;lt;span style=&amp;quot;color: rgb(255, 0, 0);&amp;quot;&amp;gt;(partially done, missing the real time update, the moon and the stars)&amp;lt;/span&amp;gt;&lt;br /&gt;
# Reintegrate the 2D element like text and hud &amp;lt;span style=&amp;quot;color: rgb(255, 0, 0);&amp;quot;&amp;gt;(mostly done)&amp;lt;/span&amp;gt;. Some problem with the text, using bitmap instead of texture, and coordinate system in the 2d renderer.&lt;br /&gt;
# Tank models integrated, only a fixed size tank &amp;lt;span style=&amp;quot;color: rgb(255, 0, 0);&amp;quot;&amp;gt;(done)&amp;lt;/span&amp;gt;&lt;br /&gt;
# Build the world element using CS API (need to fix use of material)&lt;br /&gt;
# Add shot&lt;br /&gt;
# Add the radar renderer, using a procedural texture.&lt;br /&gt;
# Change configuration file using the CS format&lt;br /&gt;
# Rework the debugging functionality (like screenshot and FPS) using the bugplug plugin, but controllable with the old way (T for FPS, F5 for screenshot, both configurable from option)&lt;br /&gt;
# Build the Menu selection using the [http://www.cegui.org.uk Crazy Eddie GUI]&lt;br /&gt;
# Rewrite the collision detection code using the [http://ode.org/ ode] plug-in&lt;br /&gt;
# Network layer done using a parallel thread that communicate with the engine&lt;br /&gt;
# Ship it! Actual ship should be done continuously during the development, to gain acceptance of the product&lt;br /&gt;
&lt;br /&gt;
The idea is to have at any stage of development a working client, so we can see the product and change the direction of development at an early stage, if that is required, or abandon this idea at all.&lt;br /&gt;
&lt;br /&gt;
Actual work on this project is on the 2.0.x branch, as to not delay the the 2.2 release. If the integration is successful, and the performance is acceptable then we can look into putting this work into a production release. Crystal Space, being a 3rd party library may have limited support for some of the less popular Operating Systems, as such support for those may be more difficult. Crystal Space does support the majority of our popular Operating Systems, including IRIX and Solaris.&lt;br /&gt;
&lt;br /&gt;
All developers are invited to contribute if they have the desire. It is just asked that work be coordinated with the author and originator of the project, [[Alfredo Tupone]].&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Strong_Authentication&amp;diff=8584</id>
		<title>Strong Authentication</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Strong_Authentication&amp;diff=8584"/>
		<updated>2013-02-10T08:28:03Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{IdeaDesign}}&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%;margin-top:+1em;background-color:#FF0000;border:1px solid #ccc;&amp;quot;&lt;br /&gt;
|&amp;lt;div style=&amp;quot;font-size:162%&amp;quot;&amp;gt;&#039;&#039;&#039;Kerberos authentication was rejected as an implementation system as overly complex with no real benefit over the token system, this document is kept for historical reasons.&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To use strong auhentication on bzflag an infrastructure based on kerberos should be put in place.&lt;br /&gt;
&lt;br /&gt;
kdc: is the kerberos Key Distribution Center, part of the mit-kerberos5 distribution. It should be unique, possibly with a slave configured, and for bzflag to work it should  be configured to serve the realm BZFLAG.ORG . Your system needs to know where KDC is.&lt;br /&gt;
So you should write a /etc/krb5.conf on Unix or krb5.ini on windows, with the following content:&lt;br /&gt;
&lt;br /&gt;
 [realms]&lt;br /&gt;
 BZFLAG.ORG = {&lt;br /&gt;
         kdc = bryjen.bzflag.org&lt;br /&gt;
         admin_server = bryen.bzflag.org&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
This is temporary and will be changed whenever we decide on where to put it.&lt;br /&gt;
&lt;br /&gt;
On the kerberos database should be created one principal (kerberos user) for any client and one principal for any server that should participate.&lt;br /&gt;
&lt;br /&gt;
* Server principal name should be #port/publicaddr@BZFLAG.ORG (like 5154/bzflag0.gamesunited.de@BZFLAG.ORG)&lt;br /&gt;
* Client principal name should be clientName@BZFLAG.ORG (like c3po@BZFLAG.ORG)&lt;br /&gt;
&lt;br /&gt;
When starting a public server it will try to authenticate using the value given in -port -publicaddr and -password&lt;br /&gt;
&lt;br /&gt;
When starting a client, it will authenticate to the server if the bzdb variable: username &amp;amp; password are defined (in the bzfs config file). So write the following lines on your config:&lt;br /&gt;
&lt;br /&gt;
 set username yourName&lt;br /&gt;
 &lt;br /&gt;
 set password yourSecret&lt;br /&gt;
&lt;br /&gt;
If credentials are unmatched, you will be still logged as an untrusted user.&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Recordmatch&amp;diff=8583</id>
		<title>Recordmatch</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Recordmatch&amp;diff=8583"/>
		<updated>2013-02-10T08:27:25Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: This was shipped, it&amp;#039;s not a dev thing anymore&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Recordmatch is a standard [[Plug-ins|plug-in]] that is shipped with the [[BZFlag Source|source code]].  It allows for match games, such as league matches, to be recorded onto the server to be replayed later.  It will automatically record when a game (match) is started, and it will record with a filename given by the current date and time.  Recordmatch is included in [[BZFlag 2.0.6|v2.0.6]] and later releases.&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
Before trying to use this plug-in, [[Replay_Server#Recording_Setup|configure]] bzfs to support recording.&lt;br /&gt;
&lt;br /&gt;
When the recordmatch plug-in is loaded, it waits for a match game to be started. When a game is started, it will create a new file to store the recording, named with the current date and time. When the game is ended, it will stop recording and close the file. The plug-in is loaded in the same way as any other and takes no parameters:&lt;br /&gt;
&lt;br /&gt;
 -loadplugin &amp;quot;/path/to/the/plugin/recordmatch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
or with the in game commands if the server is already running:&lt;br /&gt;
&lt;br /&gt;
 /loadplugin &amp;quot;/path/to/the/plugin/recordmatch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;-loadplugin&amp;quot; syntax is used in the [[sample conf|server configuration]] file or at the command line when invoking a game [[BZFS|server]].&lt;br /&gt;
&lt;br /&gt;
Be sure that you have in the configuration file: &lt;br /&gt;
* -time X (Where X is the number of seconds of a match)&lt;br /&gt;
* -timemanual&lt;br /&gt;
&lt;br /&gt;
==Commands==&lt;br /&gt;
For most match servers for leagues the players will have the following commands:&lt;br /&gt;
&lt;br /&gt;
* /countdown &amp;quot;Will start the match&amp;quot;&lt;br /&gt;
* /gameover    &amp;quot;Will end the match immediately. &lt;br /&gt;
* /timelimit X  &amp;quot;Allows player to change the time limit to X, where X is the number of seconds&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
The BZFS API was changed in the development of [[BZFlag 2.0.6|v2.0.6]] to allow for recordings to be started. Recordmatch is the first plug-in to use the newly-added capability.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Plug-Ins]]&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Mime-types&amp;diff=8582</id>
		<title>Mime-types</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Mime-types&amp;diff=8582"/>
		<updated>2013-02-10T08:26:11Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: This is a development resource not a design document, really it&amp;#039;s just instructions on how to setup SVN clients&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Development]]&lt;br /&gt;
&lt;br /&gt;
When a developer commits a new file to the repository, they may get an error about mime types not being set.  This is because there is (intentionally) a commit hook set up that verifies that there are mime types set on all files being added to the repository.&lt;br /&gt;
&lt;br /&gt;
Subversion uses file mime-types for lots of useful things like for web interface browsing of the repository.  You can either set up your subversion config to [[Auto-props|auto-set mime types]] or you can directly set the mime type on the file before you commit the file using svn propset.&lt;br /&gt;
&lt;br /&gt;
Sean provides a copy of his Subversion configuration that includes property settings for many file types.  You can download and install it with this:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;curl http://bzflag.org/~sean/subversion.config &amp;gt; ~/.subversion/config&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Once installed, run &#039;&#039;svn revert&#039;&#039; on your new file and then add it again.  The properties should be set if the config file is installed properly and it&#039;s a recognized file type.&lt;br /&gt;
&lt;br /&gt;
This problem usually looks like this:&lt;br /&gt;
&lt;br /&gt;
 [sean@bz (Wed May 28 13:27:55) bzflag]$ svn commit some_new_file.c&lt;br /&gt;
 Sending      some_new_file.c&lt;br /&gt;
 Transmitting file data ...svn: Commit failed (details follow):&lt;br /&gt;
 svn: MERGE request failed on &#039;/svnroot/bzflag/trunk/bzflag&#039;&lt;br /&gt;
 svn: &#039;pre-commit&#039; hook failed with error output:&lt;br /&gt;
 /var/local/mastertree/service-svn/hook-scripts/check-mime-type.pl:&lt;br /&gt;
 &lt;br /&gt;
 bzflag/trunk/bzflag/some_new_file.c : svn:mime-type is not set&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    Every added file must have the svn:mime-type property set. In&lt;br /&gt;
    addition text files must have the svn:eol-style property set.&lt;br /&gt;
    &lt;br /&gt;
    For binary files try running&lt;br /&gt;
    svn propset svn:mime-type application/octet-stream path/of/file&lt;br /&gt;
    &lt;br /&gt;
    For text files try&lt;br /&gt;
    svn propset svn:mime-type text/plain path/of/file&lt;br /&gt;
    svn propset svn:eol-style native path/of/file&lt;br /&gt;
    &lt;br /&gt;
    You may want to consider uncommenting the auto-props section&lt;br /&gt;
    in your ~/.subversion/config file. Read the Subversion book&lt;br /&gt;
    (http://svnbook.red-bean.com/), Chapter 7, Properties section,&lt;br /&gt;
    Automatic Property Setting subsection for more help.&lt;br /&gt;
&lt;br /&gt;
 [sean@bz (Wed May 28 13:28:55) bzflag]$ svn revert some_new_file.c&lt;br /&gt;
 Reverted &#039;some_new_file.c&#039;&lt;br /&gt;
 [sean@bz (Wed May 28 13:29:55) bzflag]$ curl http://bzflag.org/~sean/subversion.config &amp;gt; ~/.subversion/config&lt;br /&gt;
   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current&lt;br /&gt;
                                  Dload  Upload   Total   Spent    Left  Speed&lt;br /&gt;
 100 10810  100 10810    0     0  30099      0 --:--:-- --:--:-- --:--:-- 81278&lt;br /&gt;
 [sean@bz (Wed May 28 13:30:55) bzflag]$ svn add some_new_file.c&lt;br /&gt;
 A         some_new_file.c&lt;br /&gt;
 [sean@bz (Wed May 28 13:31:55) bzflag]$ svn commit some_new_file.c&lt;br /&gt;
 ... no mime type error ...&lt;br /&gt;
&lt;br /&gt;
That said, if one wanted to manually add or change a file&#039;s properties:&lt;br /&gt;
 [sean@bz (Wed May 29 13:50:51) bzflag]$ svn add some_file.odd&lt;br /&gt;
 A         some_new_file.c&lt;br /&gt;
 [sean@bz (Wed May 29 13:50:51) bzflag]$ svn propset svn:mime-type text/plain some_file.odd&lt;br /&gt;
 [sean@bz (Wed May 29 13:50:51) bzflag]$ svn propset svn:eol-style native some_file.odd&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Quick_keys&amp;diff=8581</id>
		<title>Quick keys</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Quick_keys&amp;diff=8581"/>
		<updated>2013-02-10T08:25:10Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: This was always just an idea proposal, it should be reviewed and voted on since it mostly affects sportsmanship and chat defaults&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{IdeaDesign}}&lt;br /&gt;
Options-&amp;gt;Input Settings-&amp;gt;[[Key_Mapping|Change Key Mapping]]-&amp;gt;Define Quick Keys&lt;br /&gt;
&lt;br /&gt;
This page is a proposal for default quick keys. Having default team messages can increase teamplay(verify).&lt;br /&gt;
[[BZFlagWiki:Be_bold|Be bold]] in editing this table. This is not a job for one person. See the discussion for any discrepancies.&lt;br /&gt;
When this table looks complete, it &#039;&#039;may&#039;&#039; be included and the design document tag removed.&lt;br /&gt;
{|{{Prettytable}}&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Quick &amp;lt;br&amp;gt; Keys|| Send to All &amp;lt;br&amp;gt; Alt || Send to Team &amp;lt;br&amp;gt; Ctrl&lt;br /&gt;
|-&lt;br /&gt;
| F1 || Thanks || Defend our base&lt;br /&gt;
|-&lt;br /&gt;
| F2 || || Our flag is out!&lt;br /&gt;
|- &lt;br /&gt;
| F3 || || &lt;br /&gt;
|-&lt;br /&gt;
| F4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| F5 || You&#039;re Welcome || Attack their base&lt;br /&gt;
|-&lt;br /&gt;
| F6 || || Their flag is out! &lt;br /&gt;
|-&lt;br /&gt;
| F7 || || &lt;br /&gt;
|-&lt;br /&gt;
| F8 || || &lt;br /&gt;
|-&lt;br /&gt;
| F9 || Sorry || Don&#039;t shoot tanks on the same team as you please.&lt;br /&gt;
|-&lt;br /&gt;
| F10 || No problem || &lt;br /&gt;
|-&lt;br /&gt;
| F11 || || &lt;br /&gt;
|-&lt;br /&gt;
| F12 || Geno gone. || Genocide is held!&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=LocalAuthentication&amp;diff=8580</id>
		<title>LocalAuthentication</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=LocalAuthentication&amp;diff=8580"/>
		<updated>2013-02-10T08:24:01Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: Moved to idea since it&amp;#039;s not something we really want to get into, but someone may want to do it as a plugin so keep the info for historical reasons&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{IdeaDesign}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please note that this proposal has been rejected and is just here for historical reference. Global authentication is the only built in authentication system the project will support&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A need exists to provide a local version of global authentication, with users, groups, and permissions.&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
The old local authentication system was not secure, it sent passwords in plain-text as chat messages. This meant that user passwords were stored on the sever in chat logs and easily accessible by anyone. Global Authentication does not send the password directly to a server, but a token. On isolated networks, global authentication is not a valid option.&lt;br /&gt;
&lt;br /&gt;
==Options==&lt;br /&gt;
This is a list of authentication options.&lt;br /&gt;
&lt;br /&gt;
===Request Hash Method===&lt;br /&gt;
One method is to have a server option (-localAuth) that can be added to the server config. This option is only valid when a server is not set as public. Upon connecting the server will send a password hash request to the client as a new message type. The client will then verify if the server is on the same subnet as itself, if so it will ask the user if they wish to send the password hash to the server, warning them of the issues. The client will then hash up the password ( from the password field ) using a different system then the global auth ( not MD5 ) and send the password as a new message. &lt;br /&gt;
&lt;br /&gt;
The server will NOT log these messages by default and they will happen before the player joins the game.&lt;br /&gt;
Questions to answer are:&lt;br /&gt;
*Should it be limited to subnets?&lt;br /&gt;
*Should there be a system to set &amp;quot;acceptable&amp;quot; lan servers to trust?&lt;br /&gt;
*Should there be an option to enter a password just for that one server and the client cache them?&lt;br /&gt;
&lt;br /&gt;
===Legacy As A Plug-In Method===&lt;br /&gt;
Another option is to implement the old passDB as a plug-in using a custom slash command. It has the same issues as the old system but becomes more opt in. It can be called &amp;quot;LocalAuth&amp;quot; and even do auto auth based on hostmask/IP if we want to auto op owners. It&#039;s simple but does not solve any of the issues with plain-text passwords. This may be enough if everyone is just going to move to global anyway.&lt;br /&gt;
&lt;br /&gt;
==Questions==&lt;br /&gt;
*Is this even needed? can LAN users use /password to admin a server? do they really need per user perms?&lt;br /&gt;
*Can this be done any way else?&lt;br /&gt;
*Can/should we make a little list server that the server can point to, to generate tokens, then ask the players if they trust that server? ( doesn&#039;t seem different then trusting the game server really )&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=2.3_QualityChanges&amp;diff=8579</id>
		<title>2.3 QualityChanges</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=2.3_QualityChanges&amp;diff=8579"/>
		<updated>2013-02-10T08:23:12Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: Task was completed with 2.4, no longer a design doc but a reference doc&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==Overview==&lt;br /&gt;
This page describes the changes to the graphics quality system for 2.3&lt;br /&gt;
&lt;br /&gt;
==Goals==&lt;br /&gt;
The goals are replicate the graphics quality settings from 2.99.x branch in 2.3. These changes reflect the trend in personal computing towards having better hardware 3d acceleration.&lt;br /&gt;
&lt;br /&gt;
Current &amp;quot;low&amp;quot; and &amp;quot;medium&amp;quot; settings use OpenGL features that are poorly supported in modern ( last 5 years) hardware and actually slow down performance.&lt;br /&gt;
&lt;br /&gt;
==Changes==&lt;br /&gt;
The current setting of &amp;quot;medium&amp;quot; will be the new &amp;quot;low&amp;quot;, and the current setting of &amp;quot;High&amp;quot; will be the new &amp;quot;medium&amp;quot;. Experimental will move down to &amp;quot;high&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
High will be the default.&lt;br /&gt;
&lt;br /&gt;
Some settings in high will be defaulted to more modern choices ( stencil instead of stipple for shadows)&lt;br /&gt;
&lt;br /&gt;
==Removals==&lt;br /&gt;
Remove requirements for OpenGL 1.0 and 1.1&lt;br /&gt;
Remove BSP rendering system&lt;br /&gt;
Remove Code fror 3dfx and riva 128&lt;br /&gt;
Remove Option for No textures.&lt;br /&gt;
Remove Texture filters that don&#039;t make sense.&lt;br /&gt;
Remove Experimental&lt;br /&gt;
&lt;br /&gt;
[[Category:Graphics]]&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=2.3_NewShotGraphics&amp;diff=8578</id>
		<title>2.3 NewShotGraphics</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=2.3_NewShotGraphics&amp;diff=8578"/>
		<updated>2013-02-10T08:22:37Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: Task was completed with 2.4, no longer a design doc but a reference doc&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
This page describes the changes desired to move the new shot graphics from v3 back to 2.3.&lt;br /&gt;
&lt;br /&gt;
==Goals==&lt;br /&gt;
The goals are to use the new shot graphics from v2.99.x in 2.3. Two competing shot systems were created in v2.99.x and this project will take the best shot graphics for each shot type.&lt;br /&gt;
&lt;br /&gt;
==Shots==&lt;br /&gt;
Trepan&#039;s shots will be used for all shot types except for laser, thief and super bullet. &lt;br /&gt;
&lt;br /&gt;
Geolaser will be used for laser and thief.&lt;br /&gt;
&lt;br /&gt;
Geobolt will be used for super bullet.&lt;br /&gt;
&lt;br /&gt;
==GUI==&lt;br /&gt;
2 new menu items will be made&lt;br /&gt;
&lt;br /&gt;
1) Menu item for Classic shots or Enhanced shots&lt;br /&gt;
&lt;br /&gt;
2) If shots are set to Enhanced a shot length item will be enabled to set the tail size.&lt;br /&gt;
&lt;br /&gt;
[[Category:Graphics]]&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Server_Updated_Shots&amp;diff=8577</id>
		<title>Server Updated Shots</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Server_Updated_Shots&amp;diff=8577"/>
		<updated>2013-02-10T08:21:38Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: Remove TODO group, that is what the version planing pages are for&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DesignDocument}}&lt;br /&gt;
This document describes planed changes to shot handling on the client and server.&lt;br /&gt;
&lt;br /&gt;
==Problem==&lt;br /&gt;
Shots can not be updated in mid flight. We need the server to be able to modify any shot in flight and have the game clients adapt to the new changes.&lt;br /&gt;
&lt;br /&gt;
==Server Shot State==&lt;br /&gt;
To do this, we need the server to have an accurate/authoritative representation of the shots in the game. We need to move the shot strategies over from the client into libGame so they can be tracked by both the players and the server.  Shots are &#039;&#039;&#039;time stamped&#039;&#039;&#039; with a server clock so syncing the states should not be too hard.&lt;br /&gt;
&lt;br /&gt;
It would also be up to the server to send out endshots to all clients. The game client should never send an actual endshot.&lt;br /&gt;
&lt;br /&gt;
==Generic Shot Updates==&lt;br /&gt;
A new [[MsgShotUpdate]] will be created that can send a new time stamp, position, vector, and lifetime for any shot. Any client that receives this message needs to find the shot, delete the old shot path, create a new shot path/strat with the starting position, vectors, and times, then plot the shot position forward to the current server time. This may make shots &amp;quot;pop&amp;quot; as they update if there is a discrepancy, but all states will be valid. This prevents clients from having to provide GM shot updates, and lets the server do non standard shot dynamics such as gravity well, and enforcing shot ends in a predictive manner. Shot updates should be exposed to the [[BZFS_API]]&lt;br /&gt;
&lt;br /&gt;
==Guided Missile Update Changes==&lt;br /&gt;
The [[MsgGMUpdate]] will be removed. A new message &#039;MsgLockon&#039; will be added. This message will simply tell the server who the player wishes to lock on to, and notify locked players that they are locked on to. The shot updates will come from the server with a generic [[MsgShotUpdate]].&lt;br /&gt;
&lt;br /&gt;
==Reload Slot From the server==&lt;br /&gt;
The reload shot slots will be made to be set by the server on a per player basis using a new [[MsgShotAmmo]] message. This message will tell each player how many shot slots they have and what there reload times are. This will be sent out on each flag update and spawn. It will be exposed to the API.&lt;br /&gt;
&lt;br /&gt;
==Shot ID==&lt;br /&gt;
Shot IDs should be separate from the slot.  The client should take all newly fired shots and assign them a temporary shot ID until it gets the shot back from the server. At this time it would replace the shot ID with a valid server ID to be used with shot updates at a later date. The local client should send it&#039;s temporary shot ID when sending a new MsgShotBegin and be passed that local ID back in the verification message. When the server sends the shot back to the local player, it should recompute the shot path from the new data as if it was a remote path, as the server may have modified it. All local shots can go into one big list on the client, as they will have unique IDs.&lt;br /&gt;
===Parted Players===&lt;br /&gt;
Players that part will have there shots asigned to the server player, and the shots will become world weapons.&lt;br /&gt;
&lt;br /&gt;
==GM Behavior==&lt;br /&gt;
A clarification of the GM behavior is as follows:&lt;br /&gt;
*Having The GM flag confers 2 linked abilities to a tank&lt;br /&gt;
**The ability to generate GM type shots&lt;br /&gt;
**The ability to set a lock on target.&lt;br /&gt;
*All live GM shots in the world will always track to the current lock on target for the player they belong to. This behavior is regardless of the target set when a GM is fired.&lt;br /&gt;
*A tank can only lock onto a single target at a time. When a new lock is set, it overrides all previous locks.&lt;br /&gt;
*When a tank has no lock on target GMs are unguided and will fly along there last vector.&lt;br /&gt;
*When the flag is dropped ( ether manually, or by death) The tank looses the ability to set a lock target.&lt;br /&gt;
*When a tank dies the current lock on target is cleared for all live GMS, and shots will be unguided.&lt;br /&gt;
===Changes from 2.0.x===&lt;br /&gt;
The only real change this makes is that the last shot fired from a shot limited GM unable to acquire a target after launch. If the shot is launched locked, it will track.&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=MapView&amp;diff=8576</id>
		<title>MapView</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=MapView&amp;diff=8576"/>
		<updated>2013-02-10T08:20:56Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: Remove TODO group, that is what the version planing pages are for&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DesignDocument}}&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
Map view is an idea to provide more information to players in the HUD to help with dodging shots. It is a cleaner design then what has previously been called &amp;quot;full screen radar&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Problem==&lt;br /&gt;
Given BZFlag&#039;s dependence on 2d game-play, it has become increasingly common for some players to use larger and larger radar views in order to get more visual information about the top down view of shots. This information is useful in lining up long shots and for getting out of the way of incoming shots. In order to maintain a clean UI the size of the radar and chat panel in the game limited so that they do not &amp;quot;Crowd out&amp;quot; the 3d view and minimize it&#039;s importance. There are gaps in the useful size of the radar, 20 to 30% is useful when the 3d view is needed, full screen is useful when aligning up shots, but sizes like 80 and 90% are rarely useful since they fall in-between the 2 useful cases. On some smaller screens there may not be enough visual information in the limited radar screen for a person&#039;s preference. Also in many cases a large radar is only useful when it is made transparent, as a solid background will block the 3d view.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There is a need for a new way to display radar like information for the identification of shot trajectory, while still maintaining a clean UI and not minimizing the importance of the 3d view.&lt;br /&gt;
&lt;br /&gt;
==New Map Mode==&lt;br /&gt;
MapView is a new radar mode that will change how the map data is drawn. When MapView is enabled (from key events) the normal radar panel border will not be drawn and the radar data will be drawn as an overlay on the 3d view. This will allow the use of the full screen for radar-like data but allow the 3d view to show. The user will be able to configure an opacity for the map view background that will default to 0% (invisible) to 25%(smokey). There is no point in going to higher capacities as they would block out the 3d view an make it useless. A new BZDB variable will provide an offset for the center of the map view to the center of the screen in the vertical axis. This will allow the user to configure the map view so it does not interfere with other elements.&lt;br /&gt;
&lt;br /&gt;
This arrangement also lets the chat bar extend across the entire screen instead of being tied to the size of the radar panel. Optionally the user can configure the chatbar to be hidden if they do not want it.&lt;br /&gt;
&lt;br /&gt;
===Implementation===&lt;br /&gt;
====Keys====&lt;br /&gt;
There should be 3 key events, MapViewOn, MapViewOff, and MapViewToggle. The default key bindings should bind only to MapViewToggle, the other 2 modes are to be used by people that want to bind them to key-up and down events to provide a &amp;quot;momentary&amp;quot; button to show the map view instead of a toggle.&lt;br /&gt;
====Drawing====&lt;br /&gt;
MapView should use the majority of the normal radar drawing modes, except for showing the &amp;quot;fancy tank&amp;quot; at the origin. Drawing will also enforce a transparent background on the map and not use any of the radar opacity settings. It should also have 2 major modes that control the rotation of the map drawn, one for fixed Y+ as &amp;quot;up&amp;quot; and one that makes the tanks&#039; current direction as &amp;quot;up&amp;quot;. These settings should be bzdb vars and are not expected to change during game-play. A separate &amp;quot;mapZoom&amp;quot; should also be used to set the scale of the map view independent of the normal radar view.&lt;br /&gt;
&lt;br /&gt;
===Sample Image===&lt;br /&gt;
[[Image:MockUPMapview.png|400px|thumb]]&lt;br /&gt;
This is a mock-up of what the idea should look like. It shows the map not getting in the way of the 3d view.&lt;br /&gt;
&lt;br /&gt;
[[Category:Enhancements]]&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Image_Cache_Enhancements&amp;diff=8575</id>
		<title>Image Cache Enhancements</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Image_Cache_Enhancements&amp;diff=8575"/>
		<updated>2013-02-10T08:20:38Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: Remove TODO group, that is what the version planing pages are for&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DesignDocument}}&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
There are several enhancements we can make to our image caching system.&lt;br /&gt;
===Tracker Items===&lt;br /&gt;
https://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=3602336&amp;amp;group_id=3248&amp;amp;atid=353248&lt;br /&gt;
&lt;br /&gt;
==Image Download Confirm==&lt;br /&gt;
It would be nice to be able to ask the end user if they wish to add a specific server to the allowed downloads. Children who are running with a locked access file should not be asked. The message should be similar to the message for SSL sites with self signed keys in browsers.&lt;br /&gt;
&lt;br /&gt;
==Force Reload==&lt;br /&gt;
In order for a server to use dynamically generated images it must be able to tell clients to reload the image. This has several challenges.&lt;br /&gt;
&lt;br /&gt;
# The client would have to store a hash for the image (may already be done)&lt;br /&gt;
# The client would have to know the URL for every image in order to recheck the hash&lt;br /&gt;
# Curl would need to tell us if the hash is different from the one on disk&lt;br /&gt;
# Curl would need to download the image in the background and not disrupt network play&lt;br /&gt;
# The texture system must be able to reload an individual texture from disk with out affecting the frame rate in a bad way.&lt;br /&gt;
&lt;br /&gt;
Some of these challenges may already have solutions, some may need threading or other time management systems to implement properly.&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Group_Management_System&amp;diff=8574</id>
		<title>Group Management System</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Group_Management_System&amp;diff=8574"/>
		<updated>2013-02-10T08:20:06Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: Remove TODO group, that is what the version planing pages are for&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DesignDocument}}&lt;br /&gt;
&lt;br /&gt;
A need exists to let users manage their own user groups. At present a forum administrator is needed to add or modify groups. This is not optimal.&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
A web system needs to be made that allows a user to register an &amp;quot;organization&amp;quot; and manage a number of user groups tied to that organization.&lt;br /&gt;
&lt;br /&gt;
==Concepts==&lt;br /&gt;
*&#039;&#039;&#039;Organization&#039;&#039;&#039;: organizations are unique name spaces that are registered by a single user. The contain a number of user groups. An organization may be a game server, a group or network of servers, or a league.&lt;br /&gt;
*&#039;&#039;&#039;User Group&#039;&#039;&#039;: user groups contain a list of users that are members of the group, they are managed by a group moderator.&lt;br /&gt;
*&#039;&#039;&#039;Founder&#039;&#039;&#039;: the user who registers an organization and can add co-founders and can create/change/delete groups&lt;br /&gt;
*&#039;&#039;&#039;Managers&#039;&#039;&#039;: the users that are assigned to a group and can add/remove/approve/deny users for that group.&lt;br /&gt;
&lt;br /&gt;
==Implementation==&lt;br /&gt;
This describes a desired implementation.&lt;br /&gt;
===Web Interface===&lt;br /&gt;
A web page system should be created that allows users to create and manage organizations. Organization must have unique names. If an organization name exists at creation time, the user requesting the new organization should be notified that the name is unavailable.  A user should not be able to create an organization that has the same name as any user other than himself.  Organizations must keep a link to their founder account, so that we have a contact e-mail for the organization. The founder can add additional co-founders that can do everything except add/remove the founder and other co-founders.&lt;br /&gt;
&lt;br /&gt;
Organization administrator can create any number of user groups. User group names need to only be unique in the organization they belong to. User groups can have any number of members, pulled from the BZFlag user database. The group membership should store the BZID of the user to allow for name changes. Founders should be able to create, destroy, and rename user groups.&lt;br /&gt;
&lt;br /&gt;
Groups should also have a description field that can be edited by any founder, to identify the group. All members of the group should be able to see this description. When a user is added to a group they should be notified as well. Groups shall be either &#039;&#039;private&#039;&#039; or &#039;&#039;public&#039;&#039;. A &#039;&#039;private&#039;&#039; group is one where only members of that group can see the group and its members. A &#039;&#039;public&#039;&#039; group is one in which the group and the names of its members are visible to all.&lt;br /&gt;
&lt;br /&gt;
Groups shall also have a &#039;membership policy&#039; setting which determines how new members can join the group. There will be three options for the membership policy. An Open group is one in which anyone can join, and a Closed group is one in which only the Founder or one of the groups managers can add new members. The third option is &#039;By Request&#039;, which means that any user can request to be a member of the group, and if they are a member then they can remove themselves at any time. A Founder or group manager must Approve or Deny a request to join a &#039;By Request&#039; group.&lt;br /&gt;
&lt;br /&gt;
For more details on the requirements of the Group Management System see [[Group management system functional requirements]]&lt;br /&gt;
&lt;br /&gt;
===Local Server Setup===&lt;br /&gt;
All groups from the local server will be handled in the format of &#039;&#039;&#039;OrganizationName.UserGroupName&#039;&#039;&#039;. This will fit our current naming convention.&lt;br /&gt;
&lt;br /&gt;
===List Server===&lt;br /&gt;
The list server will parse the organization and user group names out of the group requests, and process them as it does now, pulling data from the new system.&lt;br /&gt;
&lt;br /&gt;
===System Administration===&lt;br /&gt;
A reserved organization should have global administration permissions, to manage all organizations and user groups if needed&lt;br /&gt;
&lt;br /&gt;
==Reserved Names==&lt;br /&gt;
*&#039;&#039;&#039;BZFlag:&#039;&#039;&#039; this organization is for global management of the system.&lt;br /&gt;
*&#039;&#039;&#039;Developers:&#039;&#039;&#039; this organizations is for developers.&lt;br /&gt;
*&#039;&#039;&#039;Local:&#039;&#039;&#039; this organization is reserved for local server groups and should not exist.&lt;br /&gt;
&lt;br /&gt;
==Conversion From phpbb Groups==&lt;br /&gt;
The existing user groups on BZBB are already mostly in the SERVER.GROUP format. We should be able to convert each server into an organization and assign it an owner. The few groups that are left over should be able to be manually ported to the new system. Since the names of most groups will not change, game servers will still work with the new system.&lt;br /&gt;
&lt;br /&gt;
There will be a few difficulties in this process. First, there are already several groups using the BZFLAG organization. If that organization is intended to be reserved, that will need to be handled first.&lt;br /&gt;
&lt;br /&gt;
The second issue will be handling groups with multiple leaders, or organizations that don&#039;t have a consistent set of leaders (as in, ORG.GROUP1 and ORG.GROUP2 have leaders that do not overlap). This probably won&#039;t be a huge issue for most organizations, but it will still be something that has to be handled.&lt;br /&gt;
&lt;br /&gt;
[[Category:Enhancements]]&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Talk:Death_and_Shot_Effects&amp;diff=8573</id>
		<title>Talk:Death and Shot Effects</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Talk:Death_and_Shot_Effects&amp;diff=8573"/>
		<updated>2013-02-10T08:19:14Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: moved Talk:2.3 NewEffects to Talk:Death and Shot Effects: some effects were not implemented and are road mapped for later revs.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Flags==&lt;br /&gt;
The idea is the flag you are shot with not the flag you have so some ideas don&#039;t make sense. such as OO, why would it turn the tank it shot into bricks? Same for bad flags.&lt;br /&gt;
&lt;br /&gt;
--[[User:JeffM2501|JeffM2501]] 12:52, 26 May 2011 (EDT)&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Death_and_Shot_Effects&amp;diff=8572</id>
		<title>Death and Shot Effects</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Death_and_Shot_Effects&amp;diff=8572"/>
		<updated>2013-02-10T08:19:09Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: moved 2.3 NewEffects to Death and Shot Effects: some effects were not implemented and are road mapped for later revs.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DesignDocument}}&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
2.4 should have some graphical punch to help people upgrade.&lt;br /&gt;
&lt;br /&gt;
==Graphical Missile==&lt;br /&gt;
GM can now show a graphical missile.&lt;br /&gt;
&lt;br /&gt;
==GM Trails==&lt;br /&gt;
&lt;br /&gt;
A new &#039;Smoke&#039; option has been added for GMs, it looks pretty sweet.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
image:Gm_smoke_rocket.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Death effects==&lt;br /&gt;
Death effects have been changed so that we can have different effects based on death types.&lt;br /&gt;
The following is a list of ideas.&lt;br /&gt;
&lt;br /&gt;
===Standard===&lt;br /&gt;
Have tank make explosions, fall apart in a pile then burn&lt;br /&gt;
&lt;br /&gt;
===Steamroller===&lt;br /&gt;
Have tank squish flat and burn.&lt;br /&gt;
&lt;br /&gt;
===Laser===&lt;br /&gt;
* Have tank glow then fade out, no explode&lt;br /&gt;
* Blinding white flash, then have tank glow then fade out, no explode. Wireframe?&lt;br /&gt;
&lt;br /&gt;
===Super Bullet===&lt;br /&gt;
Current &amp;quot;rings&amp;quot; explosion&lt;br /&gt;
&lt;br /&gt;
===Flag Capture===&lt;br /&gt;
Capping team&#039;s flag sprouts out of the top of tank and team colored confetti shoots out around before fade out. No explode.&lt;br /&gt;
&lt;br /&gt;
===Genocide===&lt;br /&gt;
Skulls around tank as it falls apart then burns with skull/crossbones smoke.&lt;br /&gt;
&lt;br /&gt;
===Phantom Zone===&lt;br /&gt;
* Like geno, but with ghost texture.&lt;br /&gt;
* Tank goes 2d in YZ falls over then shatters, Superman 2 style&lt;br /&gt;
&lt;br /&gt;
===Water Death===&lt;br /&gt;
Tank slowly scale in Z with bubbles floating up&lt;br /&gt;
&lt;br /&gt;
===Burrow===&lt;br /&gt;
* Tank Parts fly straight up in the air.&lt;br /&gt;
* Tank sinks into the ground and leaves a tombstone.&lt;br /&gt;
* Tank sinks into the ground and leaves a rabbit hole.&lt;br /&gt;
&lt;br /&gt;
===Machine Gun, Rapid Fire===&lt;br /&gt;
Tank parts fly away, all using bullet&#039;s trajectory. &lt;br /&gt;
&lt;br /&gt;
===High Speed, Agility===&lt;br /&gt;
Tank Parts fly away, using reverse of bullet&#039;s trajectory.&lt;br /&gt;
&lt;br /&gt;
=== Shockwave===&lt;br /&gt;
Tank parts fly a short distance, and stop in mid-air before falling.&lt;br /&gt;
&lt;br /&gt;
===Oscillation===&lt;br /&gt;
Tank turns into bricks.&lt;br /&gt;
&lt;br /&gt;
===Bad Flags===&lt;br /&gt;
Similar to flag capture.&lt;br /&gt;
&lt;br /&gt;
===Death Driver===&lt;br /&gt;
Electrical flashes around tank then char to black before fade with smoke.&lt;br /&gt;
&lt;br /&gt;
===Server Kill===&lt;br /&gt;
Tank floats up and slowly fades out in a halo of light&lt;br /&gt;
&lt;br /&gt;
===Guided Missile===&lt;br /&gt;
* Missile impact erupts into a small mushroom cloud, both tank an missile parts scatter out from point of impact&lt;br /&gt;
* leave scorch marks on ground/buildings that fades out slowly over time.&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=GSoC:_LibBZW&amp;diff=8571</id>
		<title>GSoC: LibBZW</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=GSoC:_LibBZW&amp;diff=8571"/>
		<updated>2013-02-10T08:17:14Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: Move to SOC 2008 group&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&#039;&#039;libBZW is a proposed library that will encompass current and future [[BZW]] functionality, replacing independant implementations in various applications, including bzfs.&#039;&#039;&lt;br /&gt;
==Implementation==&lt;br /&gt;
libBZW will be implemented as a static library within [[BZFlag]]. Applications/builds depending on libBZW should be within the BZFlag tree as well for sanity&#039;s sake (i.e. [[BZFS]] will depend on libBZW, and is within /bzflag/src).&lt;br /&gt;
&lt;br /&gt;
==Features==&lt;br /&gt;
*BZW file parsing&lt;br /&gt;
&lt;br /&gt;
==Functionality==&lt;br /&gt;
libBZW will initially contain methods and functionality from the following sources:&lt;br /&gt;
 Just so I can keep track of what files I will need initially, obtained via grep, primitive list.&lt;br /&gt;
 Need to add summaries of functionality desired to be copied/reproduced/replicated from each file. --Lukstr&lt;br /&gt;
*bzflag/&lt;br /&gt;
**src/&lt;br /&gt;
***bzfs/&lt;br /&gt;
****&#039;&#039;&#039;bzfs.cxx&#039;&#039;&#039; -- &#039;&#039;Read worlds (via stream/blob or filename), retrieve WorldInfo&#039;&#039;&lt;br /&gt;
****&#039;&#039;&#039;BZWReader.h&#039;&#039;&#039;&lt;br /&gt;
****&#039;&#039;&#039;BZWReader.cxx&#039;&#039;&#039;&lt;br /&gt;
****&#039;&#039;&#039;BZWError.cxx&#039;&#039;&#039;&lt;br /&gt;
****&#039;&#039;&#039;BZWError.h&#039;&#039;&#039;&lt;br /&gt;
****&#039;&#039;&#039;CmdLineOptions.cxx&#039;&#039;&#039;&lt;br /&gt;
***bzflag/&lt;br /&gt;
****&#039;&#039;&#039;World.cxx&#039;&#039;&#039;&lt;br /&gt;
**tools/&lt;br /&gt;
***modeltool/&lt;br /&gt;
****&#039;&#039;&#039;modeltool.cxx&#039;&#039;&#039; -- &#039;&#039;Creating/writing bzw files&#039;&#039;&lt;br /&gt;
*bzwworkbench/&lt;br /&gt;
**src/&lt;br /&gt;
***model/&lt;br /&gt;
****&#039;&#039;&#039;BZWParser.cpp&#039;&#039;&#039; -- &#039;&#039;Cleaner parser than bzfs?&#039;&#039;&lt;br /&gt;
****&#039;&#039;&#039;Model.cpp&#039;&#039;&#039;&lt;br /&gt;
**include/&lt;br /&gt;
***model/&lt;br /&gt;
****&#039;&#039;&#039;BZWParser.h&#039;&#039;&#039;&lt;br /&gt;
****&#039;&#039;&#039;Model.h&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==API==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Summer Of Code 2008]]&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=MapView&amp;diff=8570</id>
		<title>MapView</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=MapView&amp;diff=8570"/>
		<updated>2013-02-10T08:16:18Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: Still a valid idea that nobody has shot down.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DesignDocument}}&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
Map view is an idea to provide more information to players in the HUD to help with dodging shots. It is a cleaner design then what has previously been called &amp;quot;full screen radar&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==Problem==&lt;br /&gt;
Given BZFlag&#039;s dependence on 2d game-play, it has become increasingly common for some players to use larger and larger radar views in order to get more visual information about the top down view of shots. This information is useful in lining up long shots and for getting out of the way of incoming shots. In order to maintain a clean UI the size of the radar and chat panel in the game limited so that they do not &amp;quot;Crowd out&amp;quot; the 3d view and minimize it&#039;s importance. There are gaps in the useful size of the radar, 20 to 30% is useful when the 3d view is needed, full screen is useful when aligning up shots, but sizes like 80 and 90% are rarely useful since they fall in-between the 2 useful cases. On some smaller screens there may not be enough visual information in the limited radar screen for a person&#039;s preference. Also in many cases a large radar is only useful when it is made transparent, as a solid background will block the 3d view.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There is a need for a new way to display radar like information for the identification of shot trajectory, while still maintaining a clean UI and not minimizing the importance of the 3d view.&lt;br /&gt;
&lt;br /&gt;
==New Map Mode==&lt;br /&gt;
MapView is a new radar mode that will change how the map data is drawn. When MapView is enabled (from key events) the normal radar panel border will not be drawn and the radar data will be drawn as an overlay on the 3d view. This will allow the use of the full screen for radar-like data but allow the 3d view to show. The user will be able to configure an opacity for the map view background that will default to 0% (invisible) to 25%(smokey). There is no point in going to higher capacities as they would block out the 3d view an make it useless. A new BZDB variable will provide an offset for the center of the map view to the center of the screen in the vertical axis. This will allow the user to configure the map view so it does not interfere with other elements.&lt;br /&gt;
&lt;br /&gt;
This arrangement also lets the chat bar extend across the entire screen instead of being tied to the size of the radar panel. Optionally the user can configure the chatbar to be hidden if they do not want it.&lt;br /&gt;
&lt;br /&gt;
===Implementation===&lt;br /&gt;
====Keys====&lt;br /&gt;
There should be 3 key events, MapViewOn, MapViewOff, and MapViewToggle. The default key bindings should bind only to MapViewToggle, the other 2 modes are to be used by people that want to bind them to key-up and down events to provide a &amp;quot;momentary&amp;quot; button to show the map view instead of a toggle.&lt;br /&gt;
====Drawing====&lt;br /&gt;
MapView should use the majority of the normal radar drawing modes, except for showing the &amp;quot;fancy tank&amp;quot; at the origin. Drawing will also enforce a transparent background on the map and not use any of the radar opacity settings. It should also have 2 major modes that control the rotation of the map drawn, one for fixed Y+ as &amp;quot;up&amp;quot; and one that makes the tanks&#039; current direction as &amp;quot;up&amp;quot;. These settings should be bzdb vars and are not expected to change during game-play. A separate &amp;quot;mapZoom&amp;quot; should also be used to set the scale of the map view independent of the normal radar view.&lt;br /&gt;
&lt;br /&gt;
===Sample Image===&lt;br /&gt;
[[Image:MockUPMapview.png|400px|thumb]]&lt;br /&gt;
This is a mock-up of what the idea should look like. It shows the map not getting in the way of the 3d view.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:TODO]]&lt;br /&gt;
[[Category:Enhancements]]&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=GSoC:_Webadmin_2008&amp;diff=8569</id>
		<title>GSoC: Webadmin 2008</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=GSoC:_Webadmin_2008&amp;diff=8569"/>
		<updated>2013-02-10T08:12:34Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: Add link to SOC 2008 specific category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is [[User:BugQ|bugQ]]&#039;s proposal for [[GSoC]] 2008, which may change with the minds of those involved.&lt;br /&gt;
&lt;br /&gt;
See bugQ&#039;s development blog to check and discuss the project&#039;s progress: http://planet-soc.com/blog/89&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
&#039;&#039;&#039;webadmin&#039;&#039;&#039; will be a web-based control interface for [[BZFS]].  As opposed to the existing Javascript/HTML [https://bzflag.svn.sourceforge.net/svnroot/bzflag/trunk/bzflag/misc/bzfs_conf.html tool] for generating config files, this interface will let the server owner control the server directly via a standard web browser.&lt;br /&gt;
&lt;br /&gt;
==Design==&lt;br /&gt;
The use of a browser with a live server will allow additional administration and configuration tasks that are not available with a simple config.&lt;br /&gt;
These tasks include:&lt;br /&gt;
* Editing all config-related files&lt;br /&gt;
* Saving configuration on server-side&lt;br /&gt;
* Reading and clearing logs&lt;br /&gt;
* Controlling and checking the status of the server process.&lt;br /&gt;
 &lt;br /&gt;
=== Initial Limitations===&lt;br /&gt;
Optimally the tool could be developed to a point where it was able to control nearly every aspect of the server. The primary focus of this initial design interface will be ease of use and security. Portability is also a major secondary concern.&lt;br /&gt;
&lt;br /&gt;
==Proposed Features==&lt;br /&gt;
&lt;br /&gt;
=== File editing===&lt;br /&gt;
An example feature lacking in &amp;lt;tt&amp;gt;bzfs_conf.html&amp;lt;/tt&amp;gt; is the ability to edit and save the several other config-related files, like badwords and helpmsg, from within the browser. &lt;br /&gt;
This is reasonable, since Javascript can&#039;t usually write to disk, but for this project, it&#039;s a necessity. It could be as simple as a text field, but a more sophisticated interface might be useful, such as a table of banned IP addresses with a custom input form and buttons to remove addresses from the list. Depending on the of complexity and layout of these, a separate page for the editing interface for each file might also be warranted. On the other hand, the daemon will overwrite a few files on exit for the things that can be changed by server commands, like the banlist, so a better option for those might be to let the user issue commands to the server from the web interface, which would give control over other parts of the server, as well.&lt;br /&gt;
&lt;br /&gt;
=== Plugins ===&lt;br /&gt;
The user should be able to choose from plugins and maps in pre-defined folders, and upload custom maps. Depending on the relative difficulty, maps might be validated on upload or BZFS will check them on startup.  (Although it would be interesting to do the same for plugin files, there probably wouldn&#039;t be any nice way of keeping it secure.)&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
Javascript will be used sparingly, in places where it makes the interface easier to use.  Since not all users allow Javascript, of course, any client-side input validation will be mirrored on the server side.  If time allows, and if it would add to the usability of the tool in certain areas, some use of asynchronus Javascript messages through XMLHttpRequest might be explored.  However, the entire interface must lose no functionality where user scripting is unavailable.&lt;br /&gt;
&lt;br /&gt;
There should also be very few external tools used in this project, so that it can be deployed as widely as possible. It could be written in PHP or another common scripting language, but that would require whatever language chosen to be present on the host machine.  Since BZFlag itself is written in C++, using that language would eliminate the dependency.  It would also allow the admin interface to be implemented as a plug-in, using the in-port HTTP feature of the BZFS API, which would likely make it more convenient to deploy.  However, in order to ease development, a scripting language may be used to create a working prototype which would then be a blueprint to rewrite the tool in C++.&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
[[User:BugQ|BugQ]] will be carrying out tests on the config files generated by the tool as well as hosting a test server for others to try and give comments on.  Suggestions on unnecessary or possible new features should be added to the talk page.&lt;br /&gt;
&lt;br /&gt;
[[Category: Summer Of Code 2008]]&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Google_Summer_of_Code:_2008&amp;diff=8568</id>
		<title>Google Summer of Code: 2008</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Google_Summer_of_Code:_2008&amp;diff=8568"/>
		<updated>2013-02-10T08:12:22Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: Add link to SOC 2008 specific category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The 2008 Google Summer of Code was announced on February 25, 2008.  BZFlag has been accepted again this year as a mentoring organization.  Given our enormously successful participation in the program in 2007, we&#039;re very excited to be participating again and we&#039;re very happy to see the applications that were submitted. BZFlag accepted student project proposals from March 24 until April 7 ending at 5:00 PDT (0:00 April 8 GMT). Further information on our proposal ideas are below.  Hints and tips on  [[Google_Summer_of_Code|getting started, preparing a submission, and the application process]] were available. &#039;&#039;&#039;&#039;&#039;Accepted student proposals will be announced here and on the Google Summer of Code homepage on April 21 at around 12:00 PM PDT (19:00 GMT).&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Promotion Flyers =&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;right&amp;quot;&lt;br /&gt;
 |[[Image:BZGSoC2008_small.gif|thumb|left|512px]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Provided below is a promotional flyer to help spread the word about our involvement with the Google Summer of Code.  Flyers are available in various languages that we have mentors for so that students from all over the globe can be informed about the program.  While many developers can converse fluently in other languages, English is still expected for most developer discussions.  Feel free to distribute the flyer around your local colleges and universities.&lt;br /&gt;
&lt;br /&gt;
* English ([http://my.bzflag.org/gsoc/BZGSoC2008.pdf PDF]) ([http://my.bzflag.org/gsoc/BZGSoC2008.png PNG])&lt;br /&gt;
* Deutsch | German  ([http://my.bzflag.org/gsoc/BZGSoC2008_de.pdf PDF]) ([http://my.bzflag.org/gsoc/BZGSoC2008_de.png PNG])&lt;br /&gt;
* Español | Spanish ([http://my.bzflag.org/gsoc/BZGSoC2008_es.pdf PDF]) ([http://my.bzflag.org/gsoc/BZGSoC2008_es.png PNG])&lt;br /&gt;
&lt;br /&gt;
High praise and special thanks to Harry Keller (aka Saturos) for designing our 2008 GSoC flyer.&lt;br /&gt;
&lt;br /&gt;
= Proposal Ideas =&lt;br /&gt;
&lt;br /&gt;
While there are lots of [[Ideas]] floating around of varying utility to the game, the ideas listed below are the specific areas that we are predominantly interested in seeing worked on as part of the GSoC.  Please note that students are also welcome and encouraged to apply with their own ideas.  They should run those ideas by one of the developers beforehand to make sure they are consistent with the scope and focus of the project, though, as there are some ideas which will not be accepted regardless of the quality of the application and applicant.  We&#039;ve additionally provided several project ideas important to BZFlag development that we would very much like to see proposals for, shown in following. &lt;br /&gt;
&lt;br /&gt;
== Suggest your own idea ==&lt;br /&gt;
BZFlag is always open to new development ideas and is under constant improvement.  If you are familiar with BZFlag&#039;s current capabilities and would like to propose some new enhancement, we&#039;d be happy to hear about.  Please discuss any new ideas with the existing core developers (on our IRC channel), if only to make sure the ideas are in-line with the spirit and constraints of the game.&lt;br /&gt;
&lt;br /&gt;
== Cheat preventions ==&lt;br /&gt;
This task involves making BZFlag more robust towards preventing various cheats from working in the game.  This task implicitly requires adding protections on the server, moving game logic from the client to the server, and/or adding heuristics and other measures for detecting and dealing with cheat clients.  The student should have a strong grasp of the variety of BZFlag cheats that are available.  Please go into detail about which cheats you&#039;re interested in preventing and how you intend to employ those preventive measures. For information on known cheats, check out the [[Known Cheats]] wiki page.&lt;br /&gt;
&lt;br /&gt;
== Global authentication daemon ==&lt;br /&gt;
The goal of this project would be to provide global account management system daemon that the client and servers would communicate with for account, group membership, and profile information.  This effort preferably be written in C++, would need to talk to an LDAP server for persistent storage on the backend, and allow chaining across multiple daemons for data replication and failover service.  The daemon would need to provide a well structured simple communications API that the game client and game servers can securely talk to.&lt;br /&gt;
&lt;br /&gt;
== BZWorkBench world editor enhancement ==&lt;br /&gt;
As a participant in last year&#039;s program, Jude Nelson started work on BZWorkBench.  It is a world file editor with a very solid foundation but much work still remains to be done, including a cross-platform GUI, mesh support, and other editor features.  Ideally, two students would work on this.  For example, one student could focus on improving the GUI&#039;s workflow and ease-of-use, and another could focus on finishing the back-end object manipulation.&lt;br /&gt;
The current GUI does not conform to a specific HIG, nor does its usability resemble many other 3D editors; this should change.  The back-end still lacks support for many of the objects added in BZFlag 2.0, such as Meshes, texture matrices, dynamic colors, etc.&lt;br /&gt;
&lt;br /&gt;
== Enhanced server listing ==&lt;br /&gt;
The game client includes a simplistic listing of publicly available servers.  This task would involve significantly enhancing the listing section in BZFlag to allow for various sortings (e.g. ping time, country, name, etc), favorites, recently used, specific additional information on specific servers, and all existing information.  The task would involve coming up with a user-friendly design that is fully keyboard-accessible.  It could leverage external gui toolkits, use BZFlag&#039;s existing gui library, and/or extend the existing capabilities.  The focus would be on creating an intuitive and informative listing enhancement within the constraints of the gaming interface.&lt;br /&gt;
&lt;br /&gt;
== Modularization of game logic ==&lt;br /&gt;
Much of the game logic is presently mixed in with BZFlag&#039;s graphics code. This lack of organization make it difficult to find code when necessary, and does not allow bzfs, bzrobots, or other tools to utilize the game logic. The game code should be modularized into [[DevelopmentGoals#libGame|libgame]] so that all that is left in the client code is the graphics subsystem. This will also ease the possible future integration of a 3D graphics engine.&lt;br /&gt;
&lt;br /&gt;
== Dead Reckoning and other Networking Enhancements ==&lt;br /&gt;
The basic idea is to improve BZFlag&#039;s networking by performing dead reckoning on the server along with context-sensitive packet delivery culling.  Much work has gone into the game towards moving more and more of the game state to the server, but there is additional migration and protocol changes required.  Similarly, network utilization can be optimized by not relaying certain packets (like miniscule position updates to distant players) based on the current game state.  Some useful background reading for this task include &amp;quot;[http://www.research.ibm.com/netgames2005/papers/aggarwal.pdf Fairness in Dead-Reckoning based Distributed Multi-Player Games (pdf)]&amp;quot; and &amp;quot;[http://www.sigcomm.org/sigcomm2004/workshop_papers/net610-aggarwal.pdf Accuracy in Dead-Reckoning Based Distributed Multi-Player Games (pdf)]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Enhanced cross-platform multiple display support ==&lt;br /&gt;
Add the ability to effectively manage multiple display environments from within the game allowing for the detection, alignment/orientation specification, and resolution parameters for each display via menu options as well as proper full-screen and/or windowed support.  An additional feature could involve allowing the user to dedicate a display to the various primary gui elements (the 3D environment, the radar, and the chat console).  BZFlag&#039;s current context management is mostly handled by SDL or other platform-specific modules, so this could be taken into consideration.  There&#039;s also the possibility of our move to an integrated graphics engine would similarly impact how multidisplay contexts are created and managed.&lt;br /&gt;
&lt;br /&gt;
== Enhanced Statistics system ==&lt;br /&gt;
The goal of this idea would be to extend the existing web based statistics system to be more robust.&lt;br /&gt;
&lt;br /&gt;
Features could include:&lt;br /&gt;
&lt;br /&gt;
*Better integration with the list server.&lt;br /&gt;
*Use of a plug-in or server based stat &amp;quot;push&amp;quot; system instead of the current &amp;quot;pull&amp;quot; system.&lt;br /&gt;
*Better publishing of stats&lt;br /&gt;
*Publishing of recorded stat data to other sites.&lt;br /&gt;
*Better tracking of registered and unregistered players&lt;br /&gt;
*Tracking of leagues and individual match games.&lt;br /&gt;
*Generalizing the stats system to be used in other games/projects.&lt;br /&gt;
&lt;br /&gt;
== Integrated BZFS web interface ==&lt;br /&gt;
The BZFlag game server, BZFS, could benefit from having a browser-accessible http/https interface for viewing server statistics, setting various parameters, and otherwise controlling the server daemon while it is running.  Similar to how your network router has a web interface for changing configuration parameters, this idea is simply to create this interface in a maintainable and portable manner.  Please go into detail on how exactly you&#039;d go about doing this.&lt;br /&gt;
&lt;br /&gt;
== Network Testing and Simulation Environment ==&lt;br /&gt;
This task should provide a controlled testing environment for simulating network behavioral characteristics, including the ability to change virtual network parameters to induce different network conditions of lag and packet loss.  This environment should provide a viewer capability to observe interactions of BZFlag clients being tested from the perspective of the player, the server, and third-party observers.  This simulation framework should work with the client and server directly so that testing of actual changes may be performed in a stand-alone environment.&lt;br /&gt;
&lt;br /&gt;
== Cross server communications system ==&lt;br /&gt;
This task would be the design and implementation of a server spanning chat system. It would allow players from one server to send chat messages to players on other servers. It should also be able to be used to allow players to know where there friends or &amp;quot;buddies&amp;quot; are playing if they are online. The system should tie into the central user name registration system. Added benefits would be the use of existing protocols or applications, such as Jabber or IRC, if they can be integrated cleanly. Support for using off-line apps for chat and friends list access as well as server management would be a plus.&lt;br /&gt;
&lt;br /&gt;
== In-game profile management ==&lt;br /&gt;
BZFlag allows players to specify a callsign and team in addition to other player characteristics and preferences.  This enhancement would focus on allowing the user to specify and manage multiple profiles from within the game.  Profiles could be linked together and should be presented in an intuitive manner (proposal should highlight how you&#039;d go about achieving that).  The profiles would need to associate with global account information as well.&lt;br /&gt;
&lt;br /&gt;
= Mentors =&lt;br /&gt;
The mentors for 2008 are;&lt;br /&gt;
* Sean Morrison (brlcad/learner)&lt;br /&gt;
* Daniel Remenak (DTRemenak/Erroneous)&lt;br /&gt;
* Jeffrey Myers (JeffM/JeffM2501)&lt;br /&gt;
* Julio Jiménez Borreguero (Manu/jujibo)&lt;br /&gt;
* Scott Wichser (Blast/Blast007)&lt;br /&gt;
* David Wollner (JB diGriz)&lt;br /&gt;
* Joe VanOverberghe (Donny_Baker)&lt;br /&gt;
* James Lawrence (spldart)&lt;br /&gt;
&lt;br /&gt;
= Thanks &amp;amp; Appreciation =&lt;br /&gt;
&lt;br /&gt;
Thank you to the following individuals in the BZFlag community that helped prepare GSoC-related marketing materials:&lt;br /&gt;
&lt;br /&gt;
* Harry Keller (aka Saturos)&lt;br /&gt;
* Julio Jiménez Borreguero (aka jujibo aka Manu)&lt;br /&gt;
* Dexter Mason (aka whodaman)&lt;br /&gt;
* Sean Morrison (aka learner aka brlcad)&lt;br /&gt;
* Jeffrey Myers (aka JeffM)&lt;br /&gt;
&lt;br /&gt;
[[Category: Development]]&lt;br /&gt;
[[Category: Summer Of Code 2008]]&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Radar_Marker&amp;diff=8567</id>
		<title>Radar Marker</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Radar_Marker&amp;diff=8567"/>
		<updated>2013-02-10T08:10:06Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: /* Contents */  merge in Radar Annotations since it&amp;#039;s just a subset of the markers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DesignDocument}}&lt;br /&gt;
==Overview==&lt;br /&gt;
A radar marker is a generic radar specific object controlled by the server. It is used to flag things such as the location of team flags, and hunted targets. There is also a [[Radar Marker(object)|proposed map object]] that would allow maps to define arbitrary  markers in the map.&lt;br /&gt;
&lt;br /&gt;
==Contents==&lt;br /&gt;
The object will contain a sub-type and associated data.&lt;br /&gt;
&lt;br /&gt;
The client will then display each subtype on the radar view only. Unknown sub-types will be ignored.&lt;br /&gt;
All 3d point data would be in world space, with the objects being drawn in Z order ( lowest to highest ) in orthographic projection with the map.&lt;br /&gt;
&lt;br /&gt;
The object should also include a text label as an option.&lt;br /&gt;
&lt;br /&gt;
==Uses==&lt;br /&gt;
By taking the maker logic off of the server, we can make the logic be more customizable by the servers&#039; game logic and plug-ins. Addin an option to tie a marker to the location of a specific moving object (tank) would allow for a number of gameplay variations.&lt;br /&gt;
&lt;br /&gt;
==Implementation==&lt;br /&gt;
The client would only need to know how to draw a number of generic marker types ( various shapes ) in a server defined color. The server would simply send a marker message to the client with postional data ( and an attachment object if desired ). The client would then not need to know what this marker is, but simply store it and draw it every frame. Some radar marker types could also have HUD marker components ( flag and hunt ), this should be optional.&lt;br /&gt;
&lt;br /&gt;
By using a separate message system for the markers that is not tied to the map file, the game can send out dynamic updates to the markers while the game is running. This can allow for additional game play modes such as domination, where the controlled base is flagged on the radar with the appropriate color.&lt;br /&gt;
&lt;br /&gt;
[[category:proposed changes]]&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Network_Protocol&amp;diff=8566</id>
		<title>Network Protocol</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Network_Protocol&amp;diff=8566"/>
		<updated>2013-02-10T08:08:01Z</updated>

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

		<summary type="html">&lt;p&gt;JeffM2501: move to IdeaDesign&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{IdeaDesign}}&lt;br /&gt;
&lt;br /&gt;
The Karma System is a proposed player reputation system. At present the &amp;quot;Karma&amp;quot; portion of the system is unimplemented.&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
The &amp;quot;Karma&amp;quot; system is a proposed player reputation tracking system put forward by [[Tim Riker]]. It&#039;s goal is to provide information to users about the behaviors and past actions of other players. Good and helpful players would receive positive &amp;quot;Karma&amp;quot; points, while poor or disruptive players would receive negative points. Servers would have the option of limiting the actions, or outright blocking of players who did not meet some minimum Karma point total.&lt;br /&gt;
&lt;br /&gt;
==Objectives==&lt;br /&gt;
There are two main objectives of the system:&lt;br /&gt;
*prevent misuse of callsigns&lt;br /&gt;
*solve cheating issues on the social level&lt;br /&gt;
&lt;br /&gt;
==Player Database==&lt;br /&gt;
The player database keeps entries for registered players. Each entry must at&lt;br /&gt;
least contain the player&#039;s callsign, email address and some data to allow&lt;br /&gt;
for authentication. This data must be accessible by [[public]] [[BZFS]] servers so&lt;br /&gt;
that these can screen joining players. Any changes require private key signed&lt;br /&gt;
updates.&lt;br /&gt;
&lt;br /&gt;
The player database system is implemented as part of the [[Global Registration]] system that is part of the BZFlag [[List Server]].&lt;br /&gt;
&lt;br /&gt;
==Karma System==&lt;br /&gt;
With the karma system, a rating &#039;&#039;the so-called karma&#039;&#039; is assigned to each registered player in the database. This value should represent the player&#039;s reputation within the community, i.e. well-known and nice players should have a high karma value whereas known cheaters will hopefully get a low value.&lt;br /&gt;
&lt;br /&gt;
BZFlag servers can access this information and for example prevent people with too bad karma from joining the server. Players must have some means to rate other players, thus modifying their karma. It is important that the karma system is balanced and robust against abuse.&lt;br /&gt;
&lt;br /&gt;
==Implementation==&lt;br /&gt;
The player database, registration , and authentication systems are currently in place as part of the [[Global Registration]] system. They have been implemented since [[BZFlag 2.0.0|v2.0.0]] of the software.&lt;br /&gt;
&lt;br /&gt;
===karma system===&lt;br /&gt;
* A new player starts with a neutral karma value, I guess 0 is a natural starting point :-). Karma might be an integer of a floating point value.&lt;br /&gt;
* Each BZFlag server can be configured to require a minimum karma value for each player. When a player does not meet this criterion, he will be rejected. Hopefully, this reduced cheating on these &#039;high quality&#039; servers. Of course there should also be some servers which are open to everyone, otherwise new players could never play and increase their karma. Server admins should balance reasons for specifying a low karma threshold, and thus allowing everyone to play on their server or requiring very high karma and possible improve the quality of people playing, but at the cost of ruling out many players and possibly having a very empty server.&lt;br /&gt;
* the server could also be configured with a minimum admin karma. Players that meet the criteria would be able to change server options, kick players etc. We may want multiple levels of admin access.&lt;br /&gt;
* There must be a convenient way for a player to rate another player. I guess it&#039;s best to be able to do this in-game. Should rating just be done by using +/- resp. up/down? Or by giving a value from -5 to 5? For this to be easy, the player to be rated must be selected in some way. How? A player should be able to see the rank he has given other players easily. Perhaps even on the scoreboard.&lt;br /&gt;
* When doing ratings in-game, either the client or the server must send messages to the list server. It&#039;s probably best if the client sends a signed update to the server and the server forwards it (with game updates as well) to the list server and then updates the rated player info if the list server verifies the signed update packet. The signature is required so that the list server can verify the source of the ranking. Servers might otherwise fake ratings.&lt;br /&gt;
* Should karma value and/or individual ratings be publicly visible / visible to the player himself? Tim thinks so. Players should be able to see who has ranked them, but not what rank they have been given. They should be able to see all the players they have ranked at what rank they have given them. They should also be able to see any player&#039;s rank including their own.&lt;br /&gt;
* The karma value of a player must be calculated as a function of all individual ratings from other players. This must be done in a &#039;fair&#039; way that is robust against misuse. A possible misuse would be a player A registering a lot of identities and giving a low rating to player B with all of his identities. So, ratings must be weighted by karma and player age. This must be designed very carefully, so I suggest stealing this from somewhere. It will be necessary to store the resulting karma value for each player as well as every rating given.&lt;br /&gt;
* Do we want or need some privileged players whose ratings have more weight? This might be needed to get the system started.&lt;br /&gt;
&lt;br /&gt;
==Basic rules for karma adjustment==&lt;br /&gt;
*A user can only have one karma value per other player. This can be changed at any point&lt;br /&gt;
*Impact is determined by these factors:&lt;br /&gt;
**Current rating&lt;br /&gt;
**Assignment tendency (neutral = more impact, all good or all bad = less impact) [keep in mind that some users will ONLY rate players whom they like]&lt;br /&gt;
**Player age - long-time players will have more influence&lt;br /&gt;
**Playing time - people who spend their lives in BZFlag should have more power&lt;br /&gt;
&lt;br /&gt;
==Possible implementation==&lt;br /&gt;
[[David Trowbridge]] submitted the following proposal:&lt;br /&gt;
 Store the entire karma network as a weighted directed graph. Weights along&lt;br /&gt;
 the edges should go from -5 to 5 or some other range specifying the karma&lt;br /&gt;
 adjustment from one player to another. Each node would also have a weight,&lt;br /&gt;
 calculated from the other factors listed above (age, time, etc). When a&lt;br /&gt;
 karma adjustment is made, a walk of the graph is done, computing everbody&#039;s&lt;br /&gt;
 new karma (if someone near the root gets modded up, it could have repercussions&lt;br /&gt;
 through the entire tree, strengthening the adjustments they themselves&lt;br /&gt;
 have made). Nodes furthest from the root (note: the &#039;root&#039; would be someone&lt;br /&gt;
 completely trusted, like the [[Project Administrators]]) have the lowest karma.&lt;br /&gt;
&lt;br /&gt;
With this scheme, bad accounts could be deleted by the same type of algorithm as used for Advogato&#039;s trust metric, setting up a supersink and cutting away all bad nodes, thus preventing abuse.&lt;br /&gt;
&lt;br /&gt;
==Other database items==&lt;br /&gt;
&lt;br /&gt;
The karma system would use a central server (or servers) to store the data. [[Tim Riker]] imagines that this system would include other useful bits like player ladder ranks, league membership, league ranks, map ranks, etc. It may contain gpg signatures, ssh public keys, or perhaps the karma server is a certificate authority for ssl keys and server keys and player keys are authenticated there. The player keys could actually be presented to the users&#039;s browser and use that information to log in to the karma website.&lt;br /&gt;
&lt;br /&gt;
==Karma Web Site==&lt;br /&gt;
The website would show overall ranks for players on the trust scale and probably also ladder ranks, live servers, server stats, player stats, etc. A player would need to authenticate to edit settings. This page would show everyone this player has ranked and the rank they currently have. These would be highlighted to show if those players have ranked this player too. There would be a separate list of people that have ranked this player colored to show if this player has also ranked them. The actual ranks are not shown to encourage fair ranking.&lt;br /&gt;
&lt;br /&gt;
==History==&lt;br /&gt;
The Karma System was the original impetus for the the [[Global Registration]] System that is in use today. The user management and database for this system was chosen to be the user database used by the [[BZFlag Forums]]. This is seen as a limitation by some developers, as modification and extension of the [http://www.phpbb.com PHPBB] that the forums are based on has proved to be difficult. Current development ideas revolve around moving the [[List Server]] to a more distributed system and separating it from the forum system, as well as incorporating a karma or other reputation system.&lt;br /&gt;
&lt;br /&gt;
The lack of development work on the proposed karma system for such a long time, has led it to be somewhat of an &#039;in joke&#039; with the development community, representing desired features that have gone dormant or do not seem likely to be completed.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
[[Global Registration]]&lt;br /&gt;
&lt;br /&gt;
[[List Server]]&lt;br /&gt;
&lt;br /&gt;
[[BZFS]]&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
*http://Advogato.org/ - free software group trust metrics&lt;br /&gt;
*http://keyserver.kjsl.com/~jharris/ka/current/ - GPG trust matrix analysis&lt;br /&gt;
*http://ggz.sourceforge.net/ - possible platform, not planned at present&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=GSoC:_BZWGen_revisited&amp;diff=8564</id>
		<title>GSoC: BZWGen revisited</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=GSoC:_BZWGen_revisited&amp;diff=8564"/>
		<updated>2013-02-10T08:06:06Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: move to IdeaDesign&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{IdeaDesign}}&lt;br /&gt;
&lt;br /&gt;
This is a two part project that aims to address two main issues of BZWGen, accessibility and universality. &lt;br /&gt;
&lt;br /&gt;
Accessibility has been probably the main reason that BZWGen didn&#039;t get much attention -- using the program required downloading a separate program and compiling it&#039;s sources, then running it and setting it up to work with bzfs. On the other side, getting the program to produce different results requires the knowledge of a language that however documented is not straightforward for the user. &lt;br /&gt;
&lt;br /&gt;
Universality addresses the fact that BZWGen would more accurately be called now a City Generator, despite the fact that the underlying engine could do much more. Furthermore, some of the ideas I initially had for 2007 were never even touched. The second (bigger) part of this years project would be to present an accessible way for the program to generate a broad choice of outputs.&lt;br /&gt;
&lt;br /&gt;
== Deliverables ==&lt;br /&gt;
&lt;br /&gt;
The aim of the project is to provide a revised version of BZWGen that will work both as a standalone app and a plugin to bzfs. As a side effect, a common protocol will be presented for handling world-generating plugins.&lt;br /&gt;
&lt;br /&gt;
The generator itself will be severely enhanced to provide a much wider array of output, and to allow a first time user to do much customization without the need of reading much documentation. Additionally textures and data files for the extended generator capabilities will be provided as well.&lt;br /&gt;
&lt;br /&gt;
=== Streamlining ===&lt;br /&gt;
&lt;br /&gt;
To pluginize BZWGen a common interface for generators will be established, which will take care of supplying the generator with necessary data. In case of bzfs data will be read from a config file. The existing map generator will then also be pluginized, an in the future, replaced by a config file for BZWGen that ideally mimics it&#039;s behavior.&lt;br /&gt;
&lt;br /&gt;
=== Documentation update ===&lt;br /&gt;
&lt;br /&gt;
As the system currently is somewhat mysterious to people, I&#039;d like to provide better documentation on the L-system generator, including an illustrated tutorial on writing your own rules.&lt;br /&gt;
&lt;br /&gt;
=== Config file layer ===&lt;br /&gt;
&lt;br /&gt;
L-systems are hardly transparent for someone not used to them. However I didn&#039;t intend them as the main modification tool. Above the low-level L-system layer there should be a lot more readable &amp;quot;template&amp;quot; file layer, that decides what will be generated on a given map zone. What now is treated as command line parameters for BZWG will then be placed in the template file, along with the ability to use different texture sets, and load custom L-system sets.&lt;br /&gt;
&lt;br /&gt;
=== Generation zones ===&lt;br /&gt;
&lt;br /&gt;
The L-system based approach that BZWG uses now is just one of the features I intended for it. To smoothly blend multiple generation tools a system of splitting the map into zones is needed. Each zone will have generation parameters supplied via config files. Zones will be not limited to rectangles as is the case now, but any arbitrary polygon.&lt;br /&gt;
&lt;br /&gt;
=== Road placement algorithm rewrite ===&lt;br /&gt;
&lt;br /&gt;
The current subdivision method will be left intact as an option, but thanks to the custom shaped generation zones, the original intent of the L-system based road placement generator will be implemented. Apart for generating roads it will be able to do a custom territory split of a given map.&lt;br /&gt;
&lt;br /&gt;
=== Extensions ===&lt;br /&gt;
&lt;br /&gt;
Some of the planned extensions to the generator itself are listed below:&lt;br /&gt;
&lt;br /&gt;
* scatter algorithms -- expands on the existing bzfs map generator to allow a finer control on scattering, like the control of scattered objects, control over where objects may be scattered, and control over their size and orientation. Higher level example -- scattering of L-system generated buildings.&lt;br /&gt;
 &lt;br /&gt;
* template based building -- a way to control the placement of other generation algorithms -- constructs the map out of a predefined template, where the template parts will be filled with the given generation result, or a preprepared map-tile.&lt;br /&gt;
 &lt;br /&gt;
* block-connected building -- the map is build out of pre-prepared chunks of geometry that follow the defined rules for connection. This is the way that map generation works in contemporary 3d RPG games -- dungeons are constructed from preprepared components randomly connected. The approach is suitable for overland structures as well.&lt;br /&gt;
 &lt;br /&gt;
* procedural objects -- as time will allow BZWG will be equipped with procedural generators for various real-world objects, for example trees and foliage. Priority is set on items that can be used in the scatter algorithm.&lt;br /&gt;
 &lt;br /&gt;
== Project schedule ==&lt;br /&gt;
&lt;br /&gt;
The existing blog ( http://bzflag.chaosforge.org/ ) will be used to report progress. Posts will be made at least twice weekly during the main program timeframe. Having the experience of last year, I hope to organize my time a lot better this year, and get a lot more accomplished.&lt;br /&gt;
&lt;br /&gt;
=== Phase 1 -- May 26 - July 1 ===&lt;br /&gt;
&lt;br /&gt;
==== May 26 - June 15 ====&lt;br /&gt;
* bzwgen compiles and works as a plugin for bzfs&lt;br /&gt;
* bzwgen&#039;s existing codebase is cleaned up&lt;br /&gt;
* a detailed schedule and plan for the rest of GSoC is prepared and accepted&lt;br /&gt;
* design for the template layer and other promised features&lt;br /&gt;
* reevaluation of bzflags collision code&lt;br /&gt;
* alternative ruleset/textureset to show the current capabilities&lt;br /&gt;
&lt;br /&gt;
==== June 16 - June 28 ====&lt;br /&gt;
* implementation of double-linked graph based network for usage for both the road network algorithm and the new zoning algorithm&lt;br /&gt;
* implementation of an alternative ad-hoc non-orthogonal road layout generator and making it work with the existing grammar (especially rewriting zones to be non-quad)&lt;br /&gt;
&lt;br /&gt;
==== June 30 - July 6 ====&lt;br /&gt;
* scatter generator&lt;br /&gt;
* primitives and custom mesh consolidation&lt;br /&gt;
* procedural meshes (extension of grammar if needed)&lt;br /&gt;
* reconstructing the existing generator as a compile option&lt;br /&gt;
&lt;br /&gt;
=== Phase 2 -- July 6 - August 11 ===&lt;br /&gt;
&lt;br /&gt;
==== July 6 - July 14 ====&lt;br /&gt;
* setting up a test server, promotion on the forum, and outside&lt;br /&gt;
* refining the road layout algorithm to be less chaotic, and more realistic&lt;br /&gt;
* config file layer&lt;br /&gt;
&lt;br /&gt;
==== July 14 - July 20 ====&lt;br /&gt;
* extentending the config file layer with full templating capabilities&lt;br /&gt;
* documentation and tutorial for the existing config/template system&lt;br /&gt;
* sample interesting template/config files, more media&lt;br /&gt;
&lt;br /&gt;
==== July 21 - July 27 ====&lt;br /&gt;
* extension of the grammar system to allow more Mueller-quality buildings (I think I found a solution for that)&lt;br /&gt;
&lt;br /&gt;
==== July 28 - August 3 ====&lt;br /&gt;
* block-connected building system based on the mesh import feature&lt;br /&gt;
* sample data for both &amp;quot;internal&amp;quot; and &amp;quot;external&amp;quot; effects&lt;br /&gt;
* additional template files, and documentation for this and previous weeks features&lt;br /&gt;
&lt;br /&gt;
==== July 4 - August 11 ====&lt;br /&gt;
* bringing it all together, and merging with BZFlag core as much as the devs allow&lt;br /&gt;
&lt;br /&gt;
=== Phase 3 -- August 11+ ===&lt;br /&gt;
&lt;br /&gt;
Cleanup time for the GSoC finalization. Once that is done, I hope that there will be some RFE&#039;s from the community that I will be happy to implement.&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=BZFS2_prototype&amp;diff=8563</id>
		<title>BZFS2 prototype</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=BZFS2_prototype&amp;diff=8563"/>
		<updated>2013-02-10T08:05:23Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: move to IdeaDesign&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{IdeaDesign}}&lt;br /&gt;
&#039;&#039;This is an overview of the BZFS2 prototype released 4/22/2007.&#039;&#039;&lt;br /&gt;
&#039;&#039;This document describes a proof of concept rewrite of BZFS, it does not represent the current state of any release or version of the main project code.&#039;&#039;&lt;br /&gt;
==The New Paradigms==&lt;br /&gt;
&#039;&#039;&#039;Channel&#039;&#039;&#039; - Channels are for transmitting various data at different priorities and with different rights. Players &#039;tune in&#039; and &#039;tune out&#039; of channels depending on the state they are in and the rights that are conferred to them.&lt;br /&gt;
&lt;br /&gt;
The channel model has a super channel which every client is connected to immediately upon connecting to the server. Then, there are one or more game channels where the game is actually played, and any game-related data is sent within this channel. There is at least one admin channel which authenticated users are tuned in to for admin-specific data.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Group&#039;&#039;&#039; - The new security model is a layered grouping model. All entities (players, channels, other groups), are within a group, and rights for any entity depend on the rights of a group and all it&#039;s ancestor groups.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Task&#039;&#039;&#039; - Tasks can be running tasks or timed tasks, and can be registered either from the server, or from plug-ins.&lt;br /&gt;
==Networking==&lt;br /&gt;
Networking is now separate from player data. The base class is Client (Similar to the NetConnectedPeer), with children LocalClient and RemoteClient (RelayClient is planned). The Client abstracts the network implementation away from the server. RemoteClient uses basic sockets, ENetRemoteClient will use ENet, SDLRemoteClient will use SDL-Net.&lt;br /&gt;
&lt;br /&gt;
Message are queued and directed by the Channel. Broadcast messages are broadcast to clients tuned to the channel. Only messages broadcast on the super channel are guaranteed to reach every connected client.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Relay Servers&#039;&#039;&#039; - One method of handling latency over long distances is a relay server, which clients local to the this relay connect to it, and the relay connects to the main server. Messages both ways are batched and fewer packets are sent between a relay and the main than between the main and a direct client player.&lt;br /&gt;
==Game State==&lt;br /&gt;
This server engine is designed to allow game state to be kept by the server in an abstracted form. How this will be implemented is yet to be decided.&lt;br /&gt;
==Plug-ins==&lt;br /&gt;
Several functions that are part of the current BZFS have been removed to be implemented as plug-ins instead. This includes admin functions and voting. This means the server would be packaged with several default plug-ins that add core functionality.&lt;br /&gt;
&lt;br /&gt;
==API==&lt;br /&gt;
Additional API is required to support the admin function plugin, and allow plug-ins to register tasks and commands. By and large, the API does remain the same.&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=Template:IdeaDesign&amp;diff=8562</id>
		<title>Template:IdeaDesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=Template:IdeaDesign&amp;diff=8562"/>
		<updated>2013-02-10T08:05:02Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: add template for design docs for ideas for new features that aren&amp;#039;t yet in the roadmap.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{|style=&amp;quot;width:100%;margin-top:+.7em;background-color:#99ccff;border:1px solid #ccc;&amp;quot;&lt;br /&gt;
|[[Image:Picture_Frame.png]]&lt;br /&gt;
||&#039;&#039;&#039;This page contains a design document for an possible enhancement or feature. It is a work of collaborative design and has not been accepted as a development goal at this time. The final implmented feature if any may differ from the information on this page. If you are not part of the development or design group, please post comments and suggestions on the talk page and not in the middle of the design.&#039;&#039;&#039;&lt;br /&gt;
|}&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;includeonly&amp;gt;[[Category:Unapproved Development Ideas]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;Adding this template to a page will automatically add the page to the [[:Category:Unapproved Development Ideas|Category:Unapproved Development Ideas]] page. To use this template add &#039;&#039;&#039;&amp;lt;nowiki&amp;gt;{{IdeaDesign}}&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039; to at the top of the page you are creating/editing.&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=BZFS2_prototype&amp;diff=8561</id>
		<title>BZFS2 prototype</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=BZFS2_prototype&amp;diff=8561"/>
		<updated>2013-02-10T08:02:12Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: Fix categories&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DesignDocument}}&lt;br /&gt;
&#039;&#039;This is an overview of the BZFS2 prototype released 4/22/2007.&#039;&#039;&lt;br /&gt;
&#039;&#039;This document describes a proof of concept rewrite of BZFS, it does not represent the current state of any release or version of the main project code.&#039;&#039;&lt;br /&gt;
==The New Paradigms==&lt;br /&gt;
&#039;&#039;&#039;Channel&#039;&#039;&#039; - Channels are for transmitting various data at different priorities and with different rights. Players &#039;tune in&#039; and &#039;tune out&#039; of channels depending on the state they are in and the rights that are conferred to them.&lt;br /&gt;
&lt;br /&gt;
The channel model has a super channel which every client is connected to immediately upon connecting to the server. Then, there are one or more game channels where the game is actually played, and any game-related data is sent within this channel. There is at least one admin channel which authenticated users are tuned in to for admin-specific data.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Group&#039;&#039;&#039; - The new security model is a layered grouping model. All entities (players, channels, other groups), are within a group, and rights for any entity depend on the rights of a group and all it&#039;s ancestor groups.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Task&#039;&#039;&#039; - Tasks can be running tasks or timed tasks, and can be registered either from the server, or from plug-ins.&lt;br /&gt;
==Networking==&lt;br /&gt;
Networking is now separate from player data. The base class is Client (Similar to the NetConnectedPeer), with children LocalClient and RemoteClient (RelayClient is planned). The Client abstracts the network implementation away from the server. RemoteClient uses basic sockets, ENetRemoteClient will use ENet, SDLRemoteClient will use SDL-Net.&lt;br /&gt;
&lt;br /&gt;
Message are queued and directed by the Channel. Broadcast messages are broadcast to clients tuned to the channel. Only messages broadcast on the super channel are guaranteed to reach every connected client.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Relay Servers&#039;&#039;&#039; - One method of handling latency over long distances is a relay server, which clients local to the this relay connect to it, and the relay connects to the main server. Messages both ways are batched and fewer packets are sent between a relay and the main than between the main and a direct client player.&lt;br /&gt;
==Game State==&lt;br /&gt;
This server engine is designed to allow game state to be kept by the server in an abstracted form. How this will be implemented is yet to be decided.&lt;br /&gt;
==Plug-ins==&lt;br /&gt;
Several functions that are part of the current BZFS have been removed to be implemented as plug-ins instead. This includes admin functions and voting. This means the server would be packaged with several default plug-ins that add core functionality.&lt;br /&gt;
&lt;br /&gt;
==API==&lt;br /&gt;
Additional API is required to support the admin function plugin, and allow plug-ins to register tasks and commands. By and large, the API does remain the same.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Unapproved Development Ideas]]&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=GMS:_Register_Group_Namespace&amp;diff=8560</id>
		<title>GMS: Register Group Namespace</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=GMS:_Register_Group_Namespace&amp;diff=8560"/>
		<updated>2013-02-10T08:00:44Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: Move to spec&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Specification}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
The purpose of this use case is to describe the process used to register (create) a new group namespace (organisation).&lt;br /&gt;
&lt;br /&gt;
[[Image:UseCase_Register_Group_Namespace-sml.png|Use Case diagram]]&lt;br /&gt;
&lt;br /&gt;
The diagram shows the requirements and rules the use case is responsible for (via the &amp;lt;&amp;lt;realize&amp;gt;&amp;gt; stereotype).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pre-conditions ==&lt;br /&gt;
None&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Post conditions ==&lt;br /&gt;
A new group namespace has been created with the actor identified as its founder.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Requirements and rules realized ==&lt;br /&gt;
* &#039;&#039;RQ1 Namespace names must be unique&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
The system shall prevent a namespace name from being registered if one with the identical name already exists.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;BR1 Prevent the use of reserved namespaces&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
The system shall prevent a namespace from being registered if it is identical to that of a reserved name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;RQ2 Namespace names cannot be identical to a player name other than that of the founder&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
The system shall prevent a namespace name from being registered if it is identical to that of a registered player other than the one the actor has logged in with.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;RQ3 The player who registers a namespace shall be its founder&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
The system shall grant founder status to the player who first registers the namespace.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;RQ4 Only registered players shall be permitted to register a namespace&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
The system shall prevent unregistered players from registering a new namespace.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Flow of events ==&lt;br /&gt;
The flow of events describes the main actor actions and system responses in the execution of the use case.&lt;br /&gt;
&lt;br /&gt;
[[Image:Activity_Register_Group_Namespace-sml.png|Activity diagram showing flow of events]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Messages ==&lt;br /&gt;
&amp;lt;properties&amp;gt;&lt;br /&gt;
Step:= EX-1&lt;br /&gt;
Condition:= Unregistered player&lt;br /&gt;
Message Number:= Err 1&lt;br /&gt;
Message Text:= You must log-in with your BZFlag call sign (user name) in order to register a new namespace.&lt;br /&gt;
&amp;lt;/properties&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;properties&amp;gt;&lt;br /&gt;
Step:= EX-2&lt;br /&gt;
Condition:= Invalid namespace name&lt;br /&gt;
Message Number:= Err 2&lt;br /&gt;
Message Text:= The namespace name is not valid. It must be unique and cannot be the same as another BZFlag user name.&lt;br /&gt;
&amp;lt;/properties&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;properties&amp;gt;&lt;br /&gt;
Step:= BF-4&lt;br /&gt;
Condition:= Successfully added new namespace&lt;br /&gt;
Message Number:= Msg 1&lt;br /&gt;
Message Text:= The namespace has been registered successfully.&lt;br /&gt;
&amp;lt;/properties&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[:Category:Group Manager]]&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=GMS:_View_Groups&amp;diff=8559</id>
		<title>GMS: View Groups</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=GMS:_View_Groups&amp;diff=8559"/>
		<updated>2013-02-10T08:00:20Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: Move to spec&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Specification}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This use case describes the process of viewing the groups the actor is associated with. These are groups the actor is a member of, or those they are the group manager of, and those which they have created. The actor can also retrieve a member list from those groups.&lt;br /&gt;
&lt;br /&gt;
[[Image:UseCase_View_Groups-sml.png|Use case diagram of viewing groups]]&lt;br /&gt;
&lt;br /&gt;
== Pre-conditions ==&lt;br /&gt;
None&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Post conditions ==&lt;br /&gt;
The list of groups the actor is in has been displayed to the actor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Requirements and rules realized ==&lt;br /&gt;
&#039;&#039;&#039;RQ5 Private groups are hidden from players&#039;&#039;&#039; &amp;lt;br /&amp;gt;&lt;br /&gt;
The system shall prevent players from viewing the group name and members of private groups they are not a member of. &amp;lt;br /&amp;gt;&lt;br /&gt;
* &#039;&#039;BR2 Members of private groups&#039;&#039; &amp;lt;br /&amp;gt;&lt;br /&gt;
A member of a private group can see who the other members of that group are. &amp;lt;br /&amp;gt;&lt;br /&gt;
* &#039;&#039;BR3 Public groups visible to all players&#039;&#039; &amp;lt;br /&amp;gt;&lt;br /&gt;
The group name and members of public groups can be viewed by all players &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RQ6 Founders able to view all groups and members&#039;&#039;&#039; &amp;lt;br /&amp;gt;&lt;br /&gt;
The founder, and any co-founders, of a group namespace shall be able to view all groups and group members associated to that namespace. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RQ7 Group managers can view the list of members&#039;&#039;&#039; &amp;lt;br /&amp;gt;&lt;br /&gt;
The system shall enable group managers to view the list of members in any group they manage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RQ32 Display groups and roles&#039;&#039;&#039; &amp;lt;br /&amp;gt;&lt;br /&gt;
The system shall display the groups a player is in, the roles which have been assigned to them, and the groups the actor has created. &amp;lt;br /&amp;gt;&lt;br /&gt;
* &#039;&#039;BR39 Separate roles from membership&#039;&#039; &amp;lt;br /&amp;gt;&lt;br /&gt;
The system shall display the roles a player has separately from the groups they are a member of. &amp;lt;br /&amp;gt;&lt;br /&gt;
* &#039;&#039;BR12 Sort results in ascending alphabetical order&#039;&#039; &amp;lt;br /&amp;gt;&lt;br /&gt;
The system shall sort the result set into ascending alphabetical order using namespace, then group name. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Flow of events ==&lt;br /&gt;
The flow of events describes the main actor actions and system responses in the execution of the use case.&lt;br /&gt;
&lt;br /&gt;
[[Image:Activity_View_Groups-sml.png|Activity diagram of viewing groups]]&lt;br /&gt;
&lt;br /&gt;
== Messages ==&lt;br /&gt;
&amp;lt;properties&amp;gt;&lt;br /&gt;
Step:= EX-1&lt;br /&gt;
Condition:= Player not in any groups&lt;br /&gt;
Message Number:= Msg 3&lt;br /&gt;
Message Text:= No groups found: you are not a member of any groups.&lt;br /&gt;
&amp;lt;/properties&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[:Category:Group Manager]]&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=GMS:_Search_for_Player&amp;diff=8558</id>
		<title>GMS: Search for Player</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=GMS:_Search_for_Player&amp;diff=8558"/>
		<updated>2013-02-10T08:00:02Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: Move to spec&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Specification}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This use case describes the process a group manager will use to search for a player, during the process of adding a player to one or more groups they manage.&lt;br /&gt;
&lt;br /&gt;
[[Image:UC_Search_for_player.png|Use Case diagram]]&lt;br /&gt;
&lt;br /&gt;
The diagram shows the requirements and rules the use case is responsible for (via the &amp;lt;&amp;lt;requirement&amp;gt;&amp;gt; stereotype).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pre-conditions ==&lt;br /&gt;
None&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Post conditions ==&lt;br /&gt;
The system has displayed details of the player the actor has indicated.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Requirements and rules realized ==&lt;br /&gt;
&#039;&#039;&#039;RQ21 Search for player&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
The system shall enable managers to search for players matching a callsign (name) they provide. &amp;lt;br /&amp;gt;&lt;br /&gt;
* &#039;&#039;BR9 Search for exact match then partial&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
The system shall use the criteria supplied by the actor to search for an exact match. If no exact matches are found then the system shall use a partial match method to find names which are similar.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RQ22 Result set contents&#039;&#039;&#039; &amp;lt;br /&amp;gt;&lt;br /&gt;
For each player found, the system shall display  information in rules BR31 and BR32. &amp;lt;br /&amp;gt;&lt;br /&gt;
* &#039;&#039;BR10 Indicate partial match separately&#039;&#039; &amp;lt;br /&amp;gt;&lt;br /&gt;
The system shall indicate exact matches and partial matches separately. &amp;lt;br /&amp;gt;&lt;br /&gt;
* &#039;&#039;BR29 Sort result set&#039;&#039; &amp;lt;br /&amp;gt;&lt;br /&gt;
The system shall sort the result set into ascending alphabetical order using callsign (name). &amp;lt;br /&amp;gt;&lt;br /&gt;
* &#039;&#039;BR31 Result list summary&#039;&#039; &amp;lt;br /&amp;gt;&lt;br /&gt;
For each player found, the system shall display the player&#039;s callsign (name), rank, and the date the callsign was registered. &amp;lt;br /&amp;gt;&lt;br /&gt;
* &#039;&#039;BR32 Result detail &#039;&#039; &amp;lt;br /&amp;gt;&lt;br /&gt;
The system shall display the following information about the player the actor indicates:  the player&#039;s callsign (name), rank, the date the callsign was registered, their avatar, and their signature. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Flow of events ==&lt;br /&gt;
The flow of events describes the main actor actions and system responses in the execution of the use case.&lt;br /&gt;
&lt;br /&gt;
[[Image:Activity_Search_for_Player.png|Activity diagram showing flow of events]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Messages ==&lt;br /&gt;
&amp;lt;properties&amp;gt;&lt;br /&gt;
Step:= EX-1&lt;br /&gt;
Condition:= Invalid search criteria or no callsign provided&lt;br /&gt;
Message Number:= ERR-1&lt;br /&gt;
Message Text:= Please provide a player callsign to search for.&lt;br /&gt;
&amp;lt;/properties&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[:Category:Group Manager]]&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=GMS:_Search_for_Groups&amp;diff=8557</id>
		<title>GMS: Search for Groups</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=GMS:_Search_for_Groups&amp;diff=8557"/>
		<updated>2013-02-10T07:59:42Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: Move to spec&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Specification}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This use case describes the process a player will use to search for a group.&lt;br /&gt;
&lt;br /&gt;
[[Image:UC_Search_Groups.png|Use Case diagram]]&lt;br /&gt;
&lt;br /&gt;
The diagram shows the requirements and rules the use case is responsible for (via the &amp;lt;&amp;lt;requirement&amp;gt;&amp;gt; stereotype).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pre-conditions ==&lt;br /&gt;
None&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Post conditions ==&lt;br /&gt;
The system has returned a result set of groups.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Requirements and rules realized ==&lt;br /&gt;
&#039;&#039;&#039;RQ5 Players cannot view group name and members of private groups they are not a member of&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
The system shall prevent players from viewing the group name and members of private groups they are not a member of.&amp;lt;br /&amp;gt;&lt;br /&gt;
* &#039;&#039;BR8 Namespaces are publicly visible&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &#039;&#039;BR13 The group name and members of public groups can be viewed by all players&#039;&#039; &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RQ9 Search for group&#039;&#039;&#039; &amp;lt;br /&amp;gt;&lt;br /&gt;
The system shall enable players to search for groups matching a namespace and a group name they provide. &amp;lt;br /&amp;gt;&lt;br /&gt;
* &#039;&#039;BR14 Use wildcard for groupname if empty&#039;&#039;  &amp;lt;br /&amp;gt;&lt;br /&gt;
If no value is provided for the group name then search for any group belonging to the provided namespace.&amp;lt;br /&amp;gt;&lt;br /&gt;
* &#039;&#039;BR9 Search for exact match then partial match&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
The system shall use the criteria supplied by the actor to search for an exact match of namespace and group. If no exact matches are found then the system shall use a partial match method to find names which are similar.&amp;lt;br /&amp;gt;&lt;br /&gt;
* &#039;&#039;BR13 Only namespace mandatory&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
The system shall require a value for the namespace. A value for the group name is optional.&amp;lt;br /&amp;gt;&lt;br /&gt;
* &#039;&#039;BR16 Reserved namespaces cannot be searched &#039;&#039; &amp;lt;br /&amp;gt;&lt;br /&gt;
The system shall not search for groups within Reserved namespaces. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RQ12 Result set contents&#039;&#039;&#039; &amp;lt;br /&amp;gt;&lt;br /&gt;
For each group found, the system shall display the name of the group, the group description and the membership policy of the group. &amp;lt;br /&amp;gt;&lt;br /&gt;
* &#039;&#039;BR15 Private groups are excluded from results&#039;&#039; &amp;lt;br /&amp;gt;&lt;br /&gt;
The system shall exclude private groups from all search results. &amp;lt;br /&amp;gt;&lt;br /&gt;
* &#039;&#039;BR10 Indicate partial match separately&#039;&#039; &amp;lt;br /&amp;gt;&lt;br /&gt;
The system shall indicate exact matches and partial matches separately. &amp;lt;br /&amp;gt;&lt;br /&gt;
* &#039;&#039;BR11 Indicate group membership policy&#039;&#039; &amp;lt;br /&amp;gt;&lt;br /&gt;
The system shall indicate which groups have an open membership policy, and which have a by-request membership policy.&amp;lt;br /&amp;gt;&lt;br /&gt;
* &#039;&#039;BR6 Closed groups&#039;&#039; &amp;lt;br /&amp;gt;&lt;br /&gt;
The system shall prevent any player from joining, or requesting to join, a public group with a closed membership policy. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RQ13 Result set formatting&#039;&#039;&#039; &amp;lt;br /&amp;gt;&lt;br /&gt;
The system shall format the display of the result set according to the following rules: BR12 &amp;lt;br /&amp;gt;&lt;br /&gt;
* &#039;&#039;BR12 Sort results in ascending alphabetical order&#039;&#039; &amp;lt;br /&amp;gt;&lt;br /&gt;
The system shall sort the result set into ascending alphabetical order using namespace, then group name.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flow of events ==&lt;br /&gt;
The flow of events describes the main actor actions and system responses in the execution of the use case.&lt;br /&gt;
&lt;br /&gt;
[[Image:Activity_Search_Groups.png|Activity diagram showing flow of events]]&lt;br /&gt;
&lt;br /&gt;
== Messages ==&lt;br /&gt;
&amp;lt;properties&amp;gt;&lt;br /&gt;
Step:= EX-1&lt;br /&gt;
Condition:= Invalid search criteria&lt;br /&gt;
Message Number:= ER-1&lt;br /&gt;
Message Text:= Cannot complete the search: the search criteria are invalid, or contain a reserved name.&lt;br /&gt;
&amp;lt;/properties&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;properties&amp;gt;&lt;br /&gt;
Step:= AF-1&lt;br /&gt;
Condition:= No groups found&lt;br /&gt;
Message Number:= MSG-1&lt;br /&gt;
Message Text:= No groups matching the criteria you provided were found.&lt;br /&gt;
&amp;lt;/properties&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[:Category:Group Manager]]&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
	<entry>
		<id>https://wiki.bzflag.org/index.php?title=GMS:_Remove_co-founder&amp;diff=8556</id>
		<title>GMS: Remove co-founder</title>
		<link rel="alternate" type="text/html" href="https://wiki.bzflag.org/index.php?title=GMS:_Remove_co-founder&amp;diff=8556"/>
		<updated>2013-02-10T07:59:20Z</updated>

		<summary type="html">&lt;p&gt;JeffM2501: Move to spec&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Specification}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
This use case describes the process a founder will use to remove a co-founder from a namespace. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:UC_Remove_co-founder.png|Use Case diagram]]&lt;br /&gt;
&lt;br /&gt;
The diagram shows the requirements and rules the use case is responsible for (via the &amp;lt;&amp;lt;requirement&amp;gt;&amp;gt; stereotype).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pre-conditions ==&lt;br /&gt;
None&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Post conditions ==&lt;br /&gt;
The system has withdrawn the co-founder role from the player indicated by the actor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Extended Use Cases ==&lt;br /&gt;
[[View Groups]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Requirements and rules realized ==&lt;br /&gt;
&#039;&#039;&#039;RQ31 Founders manage co-founders&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
The system shall prevent any player other than the founder of a namespace, from assigning or removing co-founders from that namespace.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RQ26 Notify founder changes&#039;&#039;&#039; &amp;lt;br /&amp;gt;&lt;br /&gt;
The system shall notify a namespace founder of any changes according to rules: BR36, BR38 &amp;lt;br /&amp;gt;&lt;br /&gt;
* &#039;&#039;BR38 Changes to namespaces&#039;&#039; &amp;lt;br /&amp;gt;&lt;br /&gt;
The system shall notify the namespace founders and co-founders when a co-founder has been assigned or removed from a namespace. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RQ19 Notify players of changes in membership&#039;&#039;&#039; &amp;lt;br /&amp;gt;&lt;br /&gt;
The system shall notify a player if they have been added to, or removed from any group or granted or forfeited any role. &amp;lt;br /&amp;gt;&lt;br /&gt;
* &#039;&#039;BR28 Player notification format&#039;&#039; &amp;lt;br /&amp;gt;&lt;br /&gt;
The system shall use a forum private message, email message, and a message displayed on the &#039;my groups&#039; page to alert players of changes to their membership and roles. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Flow of events ==&lt;br /&gt;
The flow of events describes the main actor actions and system responses in the execution of the use case.&lt;br /&gt;
&lt;br /&gt;
[[Image:Activity_Remove_co-founder.png|Activity diagram showing flow of events]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Messages ==&lt;br /&gt;
&amp;lt;properties&amp;gt;&lt;br /&gt;
Step:= EX-1&lt;br /&gt;
Condition:= Actor is not a founder or co-founder of any namespace&lt;br /&gt;
Message Number:= ERR-1&lt;br /&gt;
Message Text:= You cannot make changes to a namespace because you are not a founder/co-founder.&lt;br /&gt;
&amp;lt;/properties&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;properties&amp;gt;&lt;br /&gt;
Step:= AF-1&lt;br /&gt;
Condition:= Selected player is a co-founder of selected namespace&lt;br /&gt;
Message Number:= MSG-1&lt;br /&gt;
Message Text:= Player &amp;lt;player name&amp;gt; is not a co-founder of the &amp;lt;namespace name&amp;gt; namespace&lt;br /&gt;
&amp;lt;/properties&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;properties&amp;gt;&lt;br /&gt;
Step:= BF-12&lt;br /&gt;
Condition:= Successfully removed co-founder.&lt;br /&gt;
Message Number:= MSG-2&lt;br /&gt;
Message Text:= Successfully removed player &amp;lt;player name&amp;gt; as co-founder of &amp;lt;namespace name&amp;gt; namespace.&lt;br /&gt;
&amp;lt;/properties&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[:Category:Group Manager]]&lt;/div&gt;</summary>
		<author><name>JeffM2501</name></author>
	</entry>
</feed>