<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://wiki.minegoboom.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Smong</id>
		<title>ASSS Wiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.minegoboom.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Smong"/>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php/Special:Contributions/Smong"/>
		<updated>2026-05-14T02:42:30Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.28.2</generator>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Sysop_Guide&amp;diff=5948</id>
		<title>Sysop Guide</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Sysop_Guide&amp;diff=5948"/>
				<updated>2008-05-10T18:22:31Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: corrected 2 spelling mistakes. not sure about &amp;quot;Creating New Arenas&amp;quot;, looks like the 2 commands do the same thing?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a guide for sysop functions that are very basic. Stuff such as adding players to modlist and changing maps.&lt;br /&gt;
&lt;br /&gt;
===Adding New Staffer to Staff List===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;*getmodlist&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will recieve a modlist.txt. Open it up and you will see something like...&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/// Senior Refs ///          &amp;lt;Title of group&lt;br /&gt;
//Maeniel+                   &amp;lt;Name of staffer&lt;br /&gt;
//+Maeniel+:4v4              &amp;lt;Arena of power&lt;br /&gt;
//+Name:Arena                &amp;lt;Arena of power&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Just rename all the above to suit your zone. When complete save the file and then...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;*putmodlist&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will take about 2 minutes to update then have the staffer re-login.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Adding LVZs===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;*getfile server.cfg&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt; server is our default, for an arena you will need the name of your arena .cfg. Example: subarena1.cfg&lt;br /&gt;
&lt;br /&gt;
Scroll down till you see LevelFiles, you will see a list of all your enabled lvz's, simply add the name of your lvz to the file and then...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;LevelFiles=lvzname.lvz,lvzname2.lvz,lvzname3.lvz,lvzname4.lvz,lvzname5.lvz&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;*putfile server.cfg&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
After you've done this feel free to upload you lvz's to put with&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;*putfile lvzname.lvz&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It takes a couple of minutes again to upload but you'll see when it's up as you re-enter the zone there will be a new download. &lt;br /&gt;
&lt;br /&gt;
Note: you only need to do the LevelFiles part for every new lvz, after it's up there skip all the steps except *putfile lvzname.lvz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Uploading new map===&lt;br /&gt;
&lt;br /&gt;
Simply&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;*putfile mapname.lvl&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It'll kick everyone and just log back in. Make sure map name is the same as the arena. This will only be different in the case of your own public map (first one as you enter) so find out what yours is.&lt;br /&gt;
&lt;br /&gt;
===Creating New Arenas===&lt;br /&gt;
&lt;br /&gt;
Simply go to the name of the new arena and &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;*putfile mapname.lvl&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
After this you will be kicked, re-login go back to the arena and&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;?setlevel mapname&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Mapname should be the same as setlevel name.&lt;br /&gt;
&lt;br /&gt;
[[Category: Subgame]]&lt;br /&gt;
[[Category: Guides]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Sysop_Guide&amp;diff=5947</id>
		<title>Sysop Guide</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Sysop_Guide&amp;diff=5947"/>
				<updated>2008-05-10T18:19:01Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: adding categories so something links to this page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a guide for sysop functions that are very basic. Stuff such as adding players to modlist and changing maps.&lt;br /&gt;
&lt;br /&gt;
===Adding New Staffer to Staff List===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;*getmodlist&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You will recieve a modlist.txt. Open it up and you will see something like...&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/// Senior Refs ///          &amp;lt;Title of group&lt;br /&gt;
//Maeniel+                   &amp;lt;Name of staffer&lt;br /&gt;
//+Maeniel+:4v4              &amp;lt;Arena of power&lt;br /&gt;
//+Name:Arena                &amp;lt;Arena of power&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Just rename all the above to suit your zone. When complete save the file and then...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;*putmodlist&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will take about 2 minutes to update then have the staffer re-login.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Adding LVZs===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;*getfile server.cfg&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt; server is our default, for an arena you will need the name of your arena .cfg. Example: subarena1.cfg&lt;br /&gt;
&lt;br /&gt;
Scroll down till you see LevelFiles, you will see a list of all your enabled lvz's, simply add the name of your lvz to the file and then...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;evelFiles lvzname.lvz,lvzname2.lvz,lvzname3.lvz,lvzname4.lvz,lvzname5.lvz,=&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;*putfile server.cfg&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
After you've done this feel free to upload you lvz's to put with&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;*putfile lvzname.lvz&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It takes a couple of minutes again to upload but you'll see when it's up as you re-enter the zone there will be a new download. &lt;br /&gt;
&lt;br /&gt;
Note: you only need to do the LevelFiles part for every new lvz, after it's up there skip all the steps except *putfile lvzname.lvz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Uploading new map===&lt;br /&gt;
&lt;br /&gt;
Simply&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;*putfile mapname.lvl&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It'll kick everyone and just log back in. Make sure map name is the same as the arena. This will only be different in the case of your own public map (first one as you enter) so find out what yours is.&lt;br /&gt;
&lt;br /&gt;
===Creating New Arenas===&lt;br /&gt;
&lt;br /&gt;
Simply go to the name of the new arena and &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;*putfile mapname.lvl&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
After this you will be kicked, re-login go back to the arena and&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;?setelevl mapname&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Mapname should be the same as setlevel name.&lt;br /&gt;
&lt;br /&gt;
[[Category: Subgame]]&lt;br /&gt;
[[Category: Guides]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Ball_Friction&amp;diff=5887</id>
		<title>Ball Friction</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Ball_Friction&amp;diff=5887"/>
				<updated>2008-03-10T13:17:51Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: fixed another code tidying typo (good job no one has seems to have seen this yet)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
fireball()&lt;br /&gt;
{&lt;br /&gt;
   ball.frictiontimer = 1000000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// call this per tick&lt;br /&gt;
updateball()&lt;br /&gt;
{&lt;br /&gt;
   if (ball.xspeed || ball.yspeed)&lt;br /&gt;
   {&lt;br /&gt;
      int workfriction = ball.frictiontimer / 1000;&lt;br /&gt;
      ball.xspeed = ball.xspeed * workfriction / 1000;&lt;br /&gt;
      ball.yspeed = ball.yspeed * workfriction / 1000;&lt;br /&gt;
&lt;br /&gt;
      ball.frictiontimer -= cfg_friction;&lt;br /&gt;
      if (ball.frictiontimer &amp;lt; 0)&lt;br /&gt;
         ball.frictiontimer = 0;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Game Intricacies]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Ball_Friction&amp;diff=5886</id>
		<title>Ball Friction</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Ball_Friction&amp;diff=5886"/>
				<updated>2008-03-09T22:49:21Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: adding category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
fireball()&lt;br /&gt;
{&lt;br /&gt;
   ball.frictiontimer = 1000000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// call this per tick&lt;br /&gt;
updateball()&lt;br /&gt;
{&lt;br /&gt;
   if (ball.xspeed &amp;amp;&amp;amp; ball.yspeed)&lt;br /&gt;
   {&lt;br /&gt;
      int workfriction = ball.frictiontimer / 1000;&lt;br /&gt;
      ball.xspeed = ball.xspeed * workfriction / 1000;&lt;br /&gt;
      ball.yspeed = ball.yspeed * workfriction / 1000;&lt;br /&gt;
&lt;br /&gt;
      ball.frictiontimer -= cfg_friction;&lt;br /&gt;
      if (ball.frictiontimer &amp;lt; 0)&lt;br /&gt;
         ball.frictiontimer = 0;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Game Intricacies]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Ball_Friction&amp;diff=5885</id>
		<title>Ball Friction</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Ball_Friction&amp;diff=5885"/>
				<updated>2008-03-09T17:00:02Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: renamed a variable to make it more obvious&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
fireball()&lt;br /&gt;
{&lt;br /&gt;
   ball.frictiontimer = 1000000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// call this per tick&lt;br /&gt;
updateball()&lt;br /&gt;
{&lt;br /&gt;
   if (ball.xspeed &amp;amp;&amp;amp; ball.yspeed)&lt;br /&gt;
   {&lt;br /&gt;
      int workfriction = ball.frictiontimer / 1000;&lt;br /&gt;
      ball.xspeed = ball.xspeed * workfriction / 1000;&lt;br /&gt;
      ball.yspeed = ball.yspeed * workfriction / 1000;&lt;br /&gt;
&lt;br /&gt;
      ball.frictiontimer -= cfg_friction;&lt;br /&gt;
      if (ball.frictiontimer &amp;lt; 0)&lt;br /&gt;
         ball.frictiontimer = 0;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Physics&amp;diff=5884</id>
		<title>Physics</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Physics&amp;diff=5884"/>
				<updated>2008-03-09T16:56:41Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: added ball friction&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[SubSpace]] works on its own special unit scales. This is a collection of observed units and other special physics that SubSpace uses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; Bounce Formula : SpeedAfter = SpeedBefore * (16 / BounceFactor) (See [[Misc Settings]].)&lt;br /&gt;
&lt;br /&gt;
; Rotation : 90Â° rotation in 1/100th of a second, ''ie: Set rotation to 400, can do a full rotation of 360Â° in one second.''&lt;br /&gt;
&lt;br /&gt;
:: In packets, rotation of a player's ship is a number 0-39... where 0 is straight up and proceeding clockwise. This corresponds to which of the 40 degree graphics to display.&lt;br /&gt;
&lt;br /&gt;
: degrees per tick = rotation_setting / 1000&lt;br /&gt;
&lt;br /&gt;
; Speed : Pixels traveled in 10 seconds.&lt;br /&gt;
&lt;br /&gt;
: pixels per tick = speed_setting / 1000&lt;br /&gt;
&lt;br /&gt;
; Thrust : '''Speed''' increased every 1/100th of a second.&lt;br /&gt;
&lt;br /&gt;
:: ''Sample: Thrust of 10 applied for a second increases your speed by 1000''&lt;br /&gt;
&lt;br /&gt;
; Tick : 1/100th of a second, ''i.e. 0.01s or 10ms.''&lt;br /&gt;
&lt;br /&gt;
; Recharge : Amount of energy units gained in 10 seconds.&lt;br /&gt;
&lt;br /&gt;
; Ball Friction : The amount subtracted from a timer per tick. This timer is initialised to 1 million when the ball is fired, and multiplied with the ball x and y speeds separately on each tick. See also [[Ball Friction]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Game Intricacies]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Ball_Friction&amp;diff=5883</id>
		<title>Ball Friction</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Ball_Friction&amp;diff=5883"/>
				<updated>2008-03-09T16:54:21Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: oops, fixed mistake when I was tidying up the code&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
fireball()&lt;br /&gt;
{&lt;br /&gt;
   ball.workfriction = 1000000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// call this per tick&lt;br /&gt;
updateball()&lt;br /&gt;
{&lt;br /&gt;
   if (ball.xspeed &amp;amp;&amp;amp; ball.yspeed)&lt;br /&gt;
   {&lt;br /&gt;
      int workfriction = ball.workfriction / 1000;&lt;br /&gt;
      ball.xspeed = ball.xspeed * workfriction / 1000;&lt;br /&gt;
      ball.yspeed = ball.yspeed * workfriction / 1000;&lt;br /&gt;
&lt;br /&gt;
      ball.workfriction -= cfg_friction;&lt;br /&gt;
      if (ball.workfriction &amp;lt; 0)&lt;br /&gt;
         ball.workfriction = 0;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Ship_Settings&amp;diff=5882</id>
		<title>Ship Settings</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Ship_Settings&amp;diff=5882"/>
				<updated>2008-03-09T16:51:27Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: /* SoccerBallFriction */ linked to ball friction&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''[Warbird] [Javelin] [Spider] [Leviathan] [Terrier] [Weasel] [Lancaster] [Shark]'''&amp;lt;br&amp;gt;&lt;br /&gt;
These settings determine the properties of each of the eight ships. These go in an arena's .[[cfg file]] for [[subgame]] and in [[arena.conf]] for [[ASSS]]. Ship names themselves can be changed with [[shipinfo.dat]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right; margin-left: 20px; margin-bottom: 20px&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== InitialRotation ===&lt;br /&gt;
''Datatype:'' 90&amp;amp;deg;/ second / 100 (That is, 400 for a full rotation in 1s).&lt;br /&gt;
&lt;br /&gt;
Initial rotation rate of the ship.&lt;br /&gt;
&lt;br /&gt;
=== InitialThrust ===&lt;br /&gt;
''Datatype:'' Speed / second / 10.&lt;br /&gt;
&lt;br /&gt;
Initial thrust of ship.&lt;br /&gt;
&lt;br /&gt;
=== InitialSpeed ===&lt;br /&gt;
''Datatype:'' Pixels / second / 10.&lt;br /&gt;
&lt;br /&gt;
Initial speed of ship. Note that 0 will prevent the ship from moving without afterburners or a speed upgrade.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== InitialRecharge ===&lt;br /&gt;
''Datatype:'' Energy / second / 10.&lt;br /&gt;
&lt;br /&gt;
Initial recharge rate.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== InitialEnergy ===&lt;br /&gt;
''Datatype:'' Energy.&lt;br /&gt;
&lt;br /&gt;
Initial amount of energy that the ship can have.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MaximumRotation ===&lt;br /&gt;
''Datatype:'' 90&amp;amp;deg;/(seconds / 100) (That is, 400 for a full rotation in 1s).&lt;br /&gt;
&lt;br /&gt;
Maximum (with upgrades) rotation rate of the ship.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MaximumThrust ===&lt;br /&gt;
''Datatype:'' Speed / second / 10.&lt;br /&gt;
&lt;br /&gt;
Maximum (with upgrades) thrust of ship.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MaximumSpeed === &lt;br /&gt;
''Datatype:'' Pixels / seconds / 10.&lt;br /&gt;
&lt;br /&gt;
Maximum (with upgrades) speed of ship.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MaximumRecharge === &lt;br /&gt;
''Datatype:'' Energy / seconds / 10. (That is, 10 means 1 energy per second.)&lt;br /&gt;
&lt;br /&gt;
Maximum (with upgrades) recharge rate, or how quickly this ship recharges its energy.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MaximumEnergy === &lt;br /&gt;
''Datatype:'' Unknown.&lt;br /&gt;
&lt;br /&gt;
Maximum (with upgrades) amount of energy that the ship can have.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UpgradeRotation ===&lt;br /&gt;
''Datatype:'' 90&amp;amp;deg;/(seconds / 100) (That is, 400 for a full rotation in 1s).&lt;br /&gt;
&lt;br /&gt;
Amount added per Rotation Upgrade Prize.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UpgradeThrust ===&lt;br /&gt;
''Datatype:'' Speed / second / 10.&lt;br /&gt;
&lt;br /&gt;
Amount added per Thruster Upgrade Prize.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UpgradeSpeed ===&lt;br /&gt;
''Datatype:'' Pixels / seconds / 10.&lt;br /&gt;
&lt;br /&gt;
Amount added per Speed Upgrade Prize.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UpgradeRecharge === &lt;br /&gt;
''Datatype:''Energy / seconds / 10..&lt;br /&gt;
&lt;br /&gt;
Amount added per Recharge Upgrade Prize.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== UpgradeEnergy === &lt;br /&gt;
''Datatype:'' Energy.&lt;br /&gt;
&lt;br /&gt;
Amount added per Energy Upgrade Prize.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== CloakStatus ===&lt;br /&gt;
''Datatype:'' Enumeration.&lt;br /&gt;
&lt;br /&gt;
Whether ships can to receive [[Cloak]].&lt;br /&gt;
* 0 = no&lt;br /&gt;
* 1 = yes&lt;br /&gt;
* 2 = yes &amp;amp; starts with prize&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== StealthStatus === &lt;br /&gt;
''Datatype:'' Enumeration.&lt;br /&gt;
&lt;br /&gt;
Whether ships can to receive [[Stealth]].&lt;br /&gt;
* 0 = no&lt;br /&gt;
* 1 = yes&lt;br /&gt;
* 2 = yes &amp;amp; starts with prize&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== XRadarStatus === &lt;br /&gt;
''Datatype:'' Enumeration.&lt;br /&gt;
&lt;br /&gt;
Whether ships can to receive [[X-Radar]].&lt;br /&gt;
* 0 = no&lt;br /&gt;
* 1 = yes&lt;br /&gt;
* 2 = yes &amp;amp; starts with prize&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AntiWarpStatus === &lt;br /&gt;
''Datatype:'' Enumeration.&lt;br /&gt;
&lt;br /&gt;
Whether ships can receive [[AntiWarp]].&lt;br /&gt;
* 0 = no&lt;br /&gt;
* 1 = yes&lt;br /&gt;
* 2 = yes &amp;amp; starts with prize&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== CloakEnergy ===&lt;br /&gt;
''Datatype:'' Energy / second / 10 (0 to 32000).&lt;br /&gt;
&lt;br /&gt;
Amount of energy required to have '''Cloak''' activated.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== StealthEnergy === &lt;br /&gt;
''Datatype:'' Energy / second / 10 (0 to 32000).&lt;br /&gt;
&lt;br /&gt;
Amount of energy required to have '''Stealth''' activated.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== XRadarEnergy === &lt;br /&gt;
''Datatype:'' Energy / second / 10 (0 to 32000).&lt;br /&gt;
&lt;br /&gt;
Amount of energy required to have '''X-Radar''' activated.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AntiWarpEnergy === &lt;br /&gt;
''Datatype:'' Energy / second / 10 (0 to 32000).&lt;br /&gt;
&lt;br /&gt;
Amount of energy required to have '''Anti-Warp''' activated.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== InitialRepel ===&lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
[[Repel]]s given to ships when they spawn.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== InitialBurst === &lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
[[Burst]]s given to ships when they spawn.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== InitialBrick === &lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
[[Brick]]s given to ships when they spawn.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== InitialRocket === &lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
[[Rocket]]s given to ships when they spawn.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== InitialThor === &lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
[[Thor's Hammer]]s given to ships when they spawn.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== InitialDecoy === &lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
[[Decoy]]s given to ships when they spawn.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== InitialPortal === &lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
[[Portal]]s given to ships when they spawn.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== InitialGuns ===&lt;br /&gt;
''Datatype:'' Weapon level (0 to 3).&lt;br /&gt;
&lt;br /&gt;
[[Bullet|Gun]] level given to ships at respawn. Note that a ship cannot start with L4 guns.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== InitialBombs === &lt;br /&gt;
''Datatype:'' Weapon level (0 to 3).&lt;br /&gt;
&lt;br /&gt;
[[Bomb]] level given to ships at respawn. Note that a ship cannot start with L4 bombs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RepelMax ===&lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
Maximum '''Repels''' a ship can store. Any Repel prizes after this will be ignored.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== BurstMax === &lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
Maximum '''Bursts''' a ship can store. Any Repel prizes after this will be ignored.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DecoyMax === &lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
Maximum '''Decoys''' a ship can store. Any Repel prizes after this will be ignored.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RocketMax === &lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
Maximum '''Rockets''' a ship can store. Any Repel prizes after this will be ignored.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ThorMax === &lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
Maximum '''Thor's Hammers''' a ship can store. Any Repel prizes after this will be ignored.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== BrickMax === &lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
Maximum '''Bricks''' a ship can store. Any Repel prizes after this will be ignored.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PortalMax === &lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
Maximum '''Portals''' a ship can store. Any Repel prizes after this will be ignored.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MaxGuns ===&lt;br /&gt;
''Datatype:'' Weapon level (0 to 3).&lt;br /&gt;
&lt;br /&gt;
Maximum '''gun''' level a ship can have. Note that a ship cannot have L4 guns without a flag upgrade.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MaxBombs === &lt;br /&gt;
''Datatype:'' Weapon level (0 to 3).&lt;br /&gt;
&lt;br /&gt;
Maximum '''bomb''' level a ship can have. Note that a ship cannot have L4 bombs without a flag upgrade.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== BulletFireEnergy ===&lt;br /&gt;
''Datatype:'' Energy.&lt;br /&gt;
&lt;br /&gt;
Base energy it takes a ship to fire a bullet. ''Formula:'' EnergyUsed = GunLevel * BulletFireEnergy. So this setting is for an L1 bullet, and is doubled for L2, and so on.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== BulletSpeed ===&lt;br /&gt;
''Datatype:'' Pixels / second / 10.&lt;br /&gt;
&lt;br /&gt;
How fast bullets travel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== BulletFireDelay ===&lt;br /&gt;
''Datatype:'' Seconds / 100.&lt;br /&gt;
&lt;br /&gt;
Delay before a ship can fire another weapon after it fires a bullet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MultiFireEnergy ===&lt;br /&gt;
''Datatype:'' Energy.&lt;br /&gt;
&lt;br /&gt;
Energy it takes a ship to fire a set of multifire bullets. ''Formula:'' EnergyUsed = GunLevel * MultiFireEnergy.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MultiFireDelay ===&lt;br /&gt;
''Datatype:'' Seconds / 100.&lt;br /&gt;
&lt;br /&gt;
Delay before a ship can fire another weapon after it fires a set of multifire bullets.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MultiFireAngle ===&lt;br /&gt;
''Datatype:'' Rotation Points / 1000. (''Note:'' One rotation point equals exactly 9&amp;amp;deg;.)&lt;br /&gt;
&lt;br /&gt;
Angle spread between multi-fire bullets and standard forward-firing bullets.&lt;br /&gt;
&lt;br /&gt;
=== DoubleBarrel ===&lt;br /&gt;
''Datatype:'' Boolean (1=yes, 0=no).&lt;br /&gt;
&lt;br /&gt;
Whether ships fire double-barrel bullets.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== BombFireEnergy ===&lt;br /&gt;
''Datatype:'' Energy.&lt;br /&gt;
&lt;br /&gt;
Amount of energy it takes a ship to fire a bomb.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== BombFireEnergyUpgrade ===&lt;br /&gt;
''Datatype:'' Energy.&lt;br /&gt;
&lt;br /&gt;
Extra energy it takes a ship to fire an upgraded bomb. ''Formula:'' EnergyUsed = BombFireEnergy + (BombLevel - 1) * BombFireEnergyUpgrade.&lt;br /&gt;
&lt;br /&gt;
=== BombThrust ===&lt;br /&gt;
''Datatype:'' Unknown.&lt;br /&gt;
&lt;br /&gt;
Amount of back-thrust (recoil) this ship receives when firing a bomb.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== BombBounceCount ===&lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
Times a bomb fired by this ship can bounce before it explodes on impact&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== BombSpeed ===&lt;br /&gt;
''Datatype:'' Pixels / seconds / 10.&lt;br /&gt;
&lt;br /&gt;
How fast bombs fired by this ship travel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== BombFireDelay ===&lt;br /&gt;
''Datatype:'' Seconds / 100.&lt;br /&gt;
&lt;br /&gt;
Delay before this ship can fire another weapon after it fires a bomb.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== EmpBomb ===&lt;br /&gt;
''Datatype:'' Boolean (1=yes, 0=no).&lt;br /&gt;
&lt;br /&gt;
Whether this ship fires EMP bombs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SeeBombLevel ===&lt;br /&gt;
''Datatype:'' Weapon Level (0 to 4).&lt;br /&gt;
&lt;br /&gt;
Lowest level of bombs this ship can see on radar. ''Special Value:'' 0 = no bombs on radar. (Continuum .36+)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MaxMines ===&lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
Maximum number of mines this ship can place.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SeeMines ===&lt;br /&gt;
''Datatype:'' Boolean (1=yes, 0=no).&lt;br /&gt;
&lt;br /&gt;
Whether ships see mines on radar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LandmineFireEnergy ===&lt;br /&gt;
''Datatype:'' Energy.&lt;br /&gt;
&lt;br /&gt;
Energy it takes this ship to place an L1 mine.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LandmineFireEnergyUpgrade ===&lt;br /&gt;
''Datatype:'' Energy.&lt;br /&gt;
&lt;br /&gt;
Extra energy it takes to place an upgraded landmine. ''Formula:'' EnergyUsed = LandmineFireEnergy + (BombLevel - 1) * LandmineFireEnergyUpgrade.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LandmineFireDelay ===&lt;br /&gt;
''Datatype:'' Seconds / 100.&lt;br /&gt;
&lt;br /&gt;
Delay before a ship can fire another weapon after it drops a landmine.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ShrapnelMax ===&lt;br /&gt;
''Datatype:'' Count (0 to 31).&lt;br /&gt;
&lt;br /&gt;
Maximum shrapnel pieces released from this ship's bombs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ShrapnelRate === &lt;br /&gt;
''Datatype:'' Count (0 to 31).&lt;br /&gt;
&lt;br /&gt;
Additional shrapnel pieces gained by a 'Shrapnel Upgrade' prize.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== BurstSpeed ===&lt;br /&gt;
''Datatype:'' Pixels / seconds / 10.&lt;br /&gt;
&lt;br /&gt;
How fast the burst &amp;quot;shrapnel&amp;quot; move for this ship.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== BurstShrapnel ===&lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
Burst shrapnel released when this ship fires a [[Burst]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TurretThrustPenalty ===&lt;br /&gt;
''Datatype:'' Unknown.&lt;br /&gt;
&lt;br /&gt;
This ship's thrust is decreased this much when a turret it riding.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TurretSpeedPenalty ===&lt;br /&gt;
''Datatype:'' Pixels / second / 10.&lt;br /&gt;
&lt;br /&gt;
This ship's speed is decreased this much when a turret it riding.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TurretLimit ===&lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
Number of turrets allowed on this ship.&lt;br /&gt;
If you don't want ships to attach, set TurretLimit to 0.&lt;br /&gt;
&lt;br /&gt;
=== RocketTime ===&lt;br /&gt;
''Datatype:'' Seconds / 100.&lt;br /&gt;
&lt;br /&gt;
How long a [[Rocket]] lasts.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== InitialBounty ===&lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
Number of prizes given to this ship when it spawns.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AttachBounty ===&lt;br /&gt;
''Datatype:'' Points.&lt;br /&gt;
&lt;br /&gt;
Bounty required by ships to attach to another ship to form a turret.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AfterburnerEnergy ===&lt;br /&gt;
''Datatype:'' Energy.&lt;br /&gt;
&lt;br /&gt;
Energy required to have 'Afterburners' activated.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DisableFastShooting ===&lt;br /&gt;
''Datatype:'' Boolean (1=yes, 0=no).&lt;br /&gt;
&lt;br /&gt;
Whether firing bullets, bombs, or thors is disabled after using afterburners. (Continuum .36+)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Radius ===&lt;br /&gt;
''Datatype:'' Pixels.&lt;br /&gt;
&lt;br /&gt;
The ship's radius from center to outside. ''Special Value:'' 0 = 14 pixels. (Continuum .37+)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DamageFactor ===&lt;br /&gt;
''Datatype:'' Factor (0 to 5000).&lt;br /&gt;
&lt;br /&gt;
How likely a the ship is to lose a prize when damaged. (1 is extremely likely, 5000 is almost never.) ''Special Value:'' 0 = never.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PrizeShareLimit ===&lt;br /&gt;
''Datatype:'' Points.&lt;br /&gt;
&lt;br /&gt;
Maximum bounty that this ship can receive by Team Prizes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SuperTime ===&lt;br /&gt;
''Datatype:'' Seconds / 100.&lt;br /&gt;
&lt;br /&gt;
How long [[Superpower]] lasts for this ship. The actual time is random up to this value.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ShieldsTime ===&lt;br /&gt;
''Datatype:'' Seconds / 100.&lt;br /&gt;
&lt;br /&gt;
How long [[Shields]] last for this ship.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gravity ===&lt;br /&gt;
''Datatype:'' Factor.&lt;br /&gt;
&lt;br /&gt;
Modifies radius over which a [[wormhole]]'s gravity has an effect.&lt;br /&gt;
&lt;br /&gt;
''Formula:'' EffectRadius = 1.325 * Gravity ^ 0.507. That is, a wormhole will have an effect over 31 tiles if this is set to 500.&lt;br /&gt;
&lt;br /&gt;
The setting for Warbird also controls how far out bombs/mines are effected by wormholes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GravityTopSpeed ===&lt;br /&gt;
''Datatype:'' Pixels / seconds / 10.&lt;br /&gt;
&lt;br /&gt;
How much this ship's maximum speed is increased when under the influence of a wormhole's gravity. Note that '''this does not replace the previous speed'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SoccerBallFriction ===&lt;br /&gt;
''Datatype:'' Unknown.&lt;br /&gt;
&lt;br /&gt;
Amount of [[Ball Friction|friction]] on the [[soccer]] ball when it is not carried by a ship.&lt;br /&gt;
&lt;br /&gt;
=== SoccerBallProximity ===&lt;br /&gt;
''Datatype:'' Pixels.&lt;br /&gt;
&lt;br /&gt;
How close the ship must be in order to pick up a ball. Set this to 0 to disallow the ship from picking up a ball.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SoccerBallSpeed ===&lt;br /&gt;
''Datatype:'' Pixels / seconds / 10.&lt;br /&gt;
&lt;br /&gt;
Initial speed given to the ball when fired by this ship.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SoccerThrowTime ===&lt;br /&gt;
''Datatype:'' Seconds / 100.&lt;br /&gt;
&lt;br /&gt;
Time player has to carry soccer ball before it automatically fires (out the back of the ship).&lt;br /&gt;
&lt;br /&gt;
If this is 0 or 32768 or greater then carry time is unlimited and no timer is shown on the players screen.&lt;br /&gt;
&lt;br /&gt;
[[Category: Settings]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Ball_Friction&amp;diff=5881</id>
		<title>Ball Friction</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Ball_Friction&amp;diff=5881"/>
				<updated>2008-03-09T16:50:11Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: initial page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
fireball()&lt;br /&gt;
{&lt;br /&gt;
   ball.workfriction = 1000000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// call this per tick&lt;br /&gt;
updateball()&lt;br /&gt;
{&lt;br /&gt;
   if (ball.xspeed &amp;amp;&amp;amp; ball.yspeed)&lt;br /&gt;
   {&lt;br /&gt;
      int workfriction = ball.workfriction / 1000;&lt;br /&gt;
      ball.xspeed = ball.xspeed * workfriction / 1000;&lt;br /&gt;
      ball.yspeed = ball.yspeed * workfriction / 1000;&lt;br /&gt;
&lt;br /&gt;
      ball.workfriction--;&lt;br /&gt;
      if (ball.workfriction &amp;lt; 0)&lt;br /&gt;
         ball.workfriction = 0;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Talk:Core_Protocol&amp;diff=5807</id>
		<title>Talk:Core Protocol</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Talk:Core_Protocol&amp;diff=5807"/>
				<updated>2007-10-13T20:18:26Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: /* Packets can be nested(?) */ another reason&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note on 0x0a00 packet ==&lt;br /&gt;
I think when asss sends these the total size of each packet is 480 bytes, with the last packet in the stream being the remainder (read: less than 480 bytes).&lt;br /&gt;
&lt;br /&gt;
correct [[User:BaK|BaK]] 06:34, Jan 12, 2007 (PST)&lt;br /&gt;
&lt;br /&gt;
== Note on login response == &lt;br /&gt;
sending back the original key without change means no encryption, both to 1.34 and continuum&lt;br /&gt;
&lt;br /&gt;
== Packets can be nested(?) ==&lt;br /&gt;
Revision: http://wiki.minegoboom.com/index.php?title=Core_protocol&amp;amp;oldid=5804&lt;br /&gt;
&lt;br /&gt;
Revision By: Doc Flabby&lt;br /&gt;
&lt;br /&gt;
[[User:Smong|Smong]] 13:11, October 13, 2007 (PDT) says:&lt;br /&gt;
:I'm not sure on this, I think at one point I decided only 00 03 (reliable) and 00 0e (clustered) packets are allowed to contain other core packets. Or put another way, the fragmented packets (small and large streams) cannot contain another core packet. This is important when it comes to implementing a core protocol stack.&lt;br /&gt;
&lt;br /&gt;
:An implementation could use a packet object which contains a 520 byte buffer, you could have these packet objects allocated statically or from a resizable pool. If this method is used it is impossible to pass a packet larger than 520 bytes through the core protocol stack without some ugly special case code.&lt;br /&gt;
&lt;br /&gt;
:Also since you can only have one small and one large stream at a time you do not need to keep a list of streams. You only need 2 static variables, one for each type of stream (most likely a struct containing a pointer to a dynamically allocated buffer).&lt;br /&gt;
&lt;br /&gt;
:Finally ASSS does not expect a core packet to be inside a fragmented packet (it will just ignore it by default).&lt;br /&gt;
&lt;br /&gt;
[[User:Smong|Smong]] 13:18, October 13, 2007 (PDT) says:&lt;br /&gt;
:Additionally I think this phrase already in the page &amp;quot;There is support for reliable ordered packets, large packets and cluster packets&amp;quot; covers the &amp;quot;Packets can be nested (They are usually processed recursively)&amp;quot; phrase. The original intention of the bullet points was for important specifications that would look awkward written as a complete sentence.&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Talk:Core_Protocol&amp;diff=5806</id>
		<title>Talk:Core Protocol</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Talk:Core_Protocol&amp;diff=5806"/>
				<updated>2007-10-13T20:11:00Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: Packets can be nested(?)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note on 0x0a00 packet ==&lt;br /&gt;
I think when asss sends these the total size of each packet is 480 bytes, with the last packet in the stream being the remainder (read: less than 480 bytes).&lt;br /&gt;
&lt;br /&gt;
correct [[User:BaK|BaK]] 06:34, Jan 12, 2007 (PST)&lt;br /&gt;
&lt;br /&gt;
== Note on login response == &lt;br /&gt;
sending back the original key without change means no encryption, both to 1.34 and continuum&lt;br /&gt;
&lt;br /&gt;
== Packets can be nested(?) ==&lt;br /&gt;
Revision: http://wiki.minegoboom.com/index.php?title=Core_protocol&amp;amp;oldid=5804&lt;br /&gt;
&lt;br /&gt;
Revision By: Doc Flabby&lt;br /&gt;
&lt;br /&gt;
[[User:Smong|Smong]] 13:11, October 13, 2007 (PDT) says:&lt;br /&gt;
:I'm not sure on this, I think at one point I decided only 00 03 (reliable) and 00 0e (clustered) packets are allowed to contain other core packets. Or put another way, the fragmented packets (small and large streams) cannot contain another core packet. This is important when it comes to implementing a core protocol stack.&lt;br /&gt;
&lt;br /&gt;
:An implementation could use a packet object which contains a 520 byte buffer, you could have these packet objects allocated statically or from a resizable pool. If this method is used it is impossible to pass a packet larger than 520 bytes through the core protocol stack without some ugly special case code.&lt;br /&gt;
&lt;br /&gt;
:Also since you can only have one small and one large stream at a time you do not need to keep a list of streams. You only need 2 static variables, one for each type of stream (most likely a struct containing a pointer to a dynamically allocated buffer).&lt;br /&gt;
&lt;br /&gt;
:Finally ASSS does not expect a core packet to be inside a fragmented packet (it will just ignore it by default).&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Directory_server&amp;diff=5799</id>
		<title>Directory server</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Directory_server&amp;diff=5799"/>
				<updated>2007-10-11T19:16:54Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: /* Directory Server Software */ added skydir, I might get back to reformatting this section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A '''Directory server''' is provides a way for [[client]]s to retreive a list of [[zone]]s that are currently online and running. These servers provide information on any zones that have registered with the directory server. This information includes the name and description of the zone, the ip and port that should be used to connect to the zone, the server version, whether or not a billing server is connected to the zone, as well as the number of players in the zone.&lt;br /&gt;
&lt;br /&gt;
Both [[SubSpace]] and [[Continuum]] [[client|clients]] are capable of saving this information locally on the PC in the [[zone.dat]] file.&lt;br /&gt;
&lt;br /&gt;
== Communication ==&lt;br /&gt;
&lt;br /&gt;
A [[client]] can connect to a directory server to retrieve a list of active zones. Client's connect to UDP port 4990 using the [[Directory Client Protocol]].&lt;br /&gt;
&lt;br /&gt;
A [[zone]] can register itself with one or more directory servers so players can find the zone. It utilizes the [[Directory Game Server Protocol]] on UDP port 4991.&lt;br /&gt;
&lt;br /&gt;
== Directory Server Software ==&lt;br /&gt;
&lt;br /&gt;
A variety of directory server's are available for you to download. &lt;br /&gt;
&lt;br /&gt;
* SkyDir by [[User:Doc flabby|Doc Flabby]], written in Python with SQLite.&lt;br /&gt;
** http://forums.minegoboom.com/viewtopic.php?t=7590&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
&lt;br /&gt;
* Public Directory Server software v0.3 (by [[PriitK]])&lt;br /&gt;
** http://www.subspacedownloads.com/index.php?act=list&amp;amp;cat=3&lt;br /&gt;
&lt;br /&gt;
* SubSpace Directory Server 4 (by [[catid]])&lt;br /&gt;
** http://www.mervbot.com/files/DDirServ.zip&lt;br /&gt;
&lt;br /&gt;
* JEDirectoryServer (by ''unknown'')&lt;br /&gt;
** http://www.subspacedownloads.com/index.php?act=list&amp;amp;cat=3&lt;br /&gt;
&lt;br /&gt;
=== Linux ===&lt;br /&gt;
&lt;br /&gt;
* SubSpace Directory Server 4 (by [[catid]]), ported to Linux by [[User:Doc flabby|Doc Flabby]].&lt;br /&gt;
** http://forums.minegoboom.com/viewtopic.php?p=74575&lt;br /&gt;
&lt;br /&gt;
[[Category: Definitions]]&lt;br /&gt;
[[Category: Servers]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Directory_server&amp;diff=5798</id>
		<title>Directory server</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Directory_server&amp;diff=5798"/>
				<updated>2007-10-11T19:12:39Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: /* Communication */ grammar fix, wasn't sure if it was intended to be singular or plural so catered for both&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A '''Directory server''' is provides a way for [[client]]s to retreive a list of [[zone]]s that are currently online and running. These servers provide information on any zones that have registered with the directory server. This information includes the name and description of the zone, the ip and port that should be used to connect to the zone, the server version, whether or not a billing server is connected to the zone, as well as the number of players in the zone.&lt;br /&gt;
&lt;br /&gt;
Both [[SubSpace]] and [[Continuum]] [[client|clients]] are capable of saving this information locally on the PC in the [[zone.dat]] file.&lt;br /&gt;
&lt;br /&gt;
== Communication ==&lt;br /&gt;
&lt;br /&gt;
A [[client]] can connect to a directory server to retrieve a list of active zones. Client's connect to UDP port 4990 using the [[Directory Client Protocol]].&lt;br /&gt;
&lt;br /&gt;
A [[zone]] can register itself with one or more directory servers so players can find the zone. It utilizes the [[Directory Game Server Protocol]] on UDP port 4991.&lt;br /&gt;
&lt;br /&gt;
== Directory Server Software ==&lt;br /&gt;
&lt;br /&gt;
A variety of directory server's are available for you to download. &lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
&lt;br /&gt;
* Public Directory Server software v0.3 (by [[PriitK]])&lt;br /&gt;
** http://www.subspacedownloads.com/index.php?act=list&amp;amp;cat=3&lt;br /&gt;
&lt;br /&gt;
* SubSpace Directory Server 4 (by [[catid]])&lt;br /&gt;
** http://www.mervbot.com/files/DDirServ.zip&lt;br /&gt;
&lt;br /&gt;
* JEDirectoryServer (by ''unknown'')&lt;br /&gt;
** http://www.subspacedownloads.com/index.php?act=list&amp;amp;cat=3&lt;br /&gt;
&lt;br /&gt;
=== Linux ===&lt;br /&gt;
&lt;br /&gt;
* SubSpace Directory Server 4 (by [[catid]]), ported to Linux by [[User:Doc flabby|Doc Flabby]].&lt;br /&gt;
** http://forums.minegoboom.com/viewtopic.php?p=74575&lt;br /&gt;
&lt;br /&gt;
[[Category: Definitions]]&lt;br /&gt;
[[Category: Servers]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Continuum_Encryption&amp;diff=5797</id>
		<title>Continuum Encryption</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Continuum_Encryption&amp;diff=5797"/>
				<updated>2007-10-11T19:09:21Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: some rewording&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The [[Continuum]] encryption algorithm was developed by [[PriitK]] to combat cheating which plagued the original [[SubSpace]] client and server. The actual implementation is supposed to be secret. Only releases of the client [[Continuum]], servers [[Subgame]] and [[ASSS]] support Continuum encryption.&lt;br /&gt;
&lt;br /&gt;
[[Category:Game Intricacies]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Core_Protocol&amp;diff=5793</id>
		<title>Core Protocol</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Core_Protocol&amp;diff=5793"/>
				<updated>2007-10-09T19:04:31Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: took out the tcp protocol part to avoid distracting from the main article&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This protocol is UDP and bi-directional. It can be thought of as another layer within an application's network layer. [[Subgame]], [[ASSS]], [[Continuum]], VIE's [[SubSpace]] client, the [[Directory server]], and some [[Billing Server|Billing Servers]] utilize this protocol.&lt;br /&gt;
&lt;br /&gt;
There is support for reliable ordered packets, large packets and cluster packets.&lt;br /&gt;
&lt;br /&gt;
*The maximum packet size is 520 bytes&lt;br /&gt;
*All integers are little endian&lt;br /&gt;
*All core packets begin with the type byte 0x00&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0x01 login&lt;br /&gt;
offset size comment&lt;br /&gt;
0      1    type 0x00&lt;br /&gt;
1      1    type 0x01&lt;br /&gt;
2      4    client key&lt;br /&gt;
6      2    protocol version (vie = 0x01, ctm = 0x11)&lt;br /&gt;
&lt;br /&gt;
0x02 login response&lt;br /&gt;
offset size comment&lt;br /&gt;
0      1    type 0x00&lt;br /&gt;
1      1    type 0x02&lt;br /&gt;
2      4    ~client key (negative)&lt;br /&gt;
&lt;br /&gt;
0x03 reliable header&lt;br /&gt;
offset size comment&lt;br /&gt;
0      1    type 0x00&lt;br /&gt;
1      1    type 0x03&lt;br /&gt;
2      4    packet id&lt;br /&gt;
6      ?    payload (514 max)&lt;br /&gt;
&lt;br /&gt;
0x04 reliable acknowledge&lt;br /&gt;
offset size comment&lt;br /&gt;
0      1    type 0x00&lt;br /&gt;
1      1    type 0x04&lt;br /&gt;
2      4    packet id&lt;br /&gt;
&lt;br /&gt;
0x05 sync&lt;br /&gt;
offset size comment&lt;br /&gt;
0      1    type 0x00&lt;br /&gt;
1      1    type 0x05&lt;br /&gt;
2      4    local time&lt;br /&gt;
6      4    packets sent&lt;br /&gt;
10     4    packets received&lt;br /&gt;
&lt;br /&gt;
0x06 sync response&lt;br /&gt;
offset size comment&lt;br /&gt;
0      1    type 0x00&lt;br /&gt;
1      1    type 0x06&lt;br /&gt;
2      4    time from last received 0x05 packet&lt;br /&gt;
6      4    server time&lt;br /&gt;
&lt;br /&gt;
0x07 disconnect&lt;br /&gt;
offset size comment&lt;br /&gt;
0      1    type 0x00&lt;br /&gt;
1      1    type 0x07&lt;br /&gt;
&lt;br /&gt;
0x08 small chunk&lt;br /&gt;
offset size comment&lt;br /&gt;
0      1    type 0x00&lt;br /&gt;
1      1    type 0x08&lt;br /&gt;
2      ?    payload (expect 472 max)&lt;br /&gt;
keep appending payloads until 0x09 chunk tail is received&lt;br /&gt;
&lt;br /&gt;
0x09 chunk tail&lt;br /&gt;
offset size comment&lt;br /&gt;
0      1    type 0x00&lt;br /&gt;
1      1    type 0x09&lt;br /&gt;
2      ?    payload (expect 472 or less)&lt;br /&gt;
append this payload then process contents as a non-core packet&lt;br /&gt;
&lt;br /&gt;
0x0A stream&lt;br /&gt;
offset size comment&lt;br /&gt;
0      1    type 0x00&lt;br /&gt;
1      1    type 0x0A&lt;br /&gt;
2      4    total length of all segments&lt;br /&gt;
6      ?    payload &lt;br /&gt;
keep appending payloads until total length is reached then process contents as&lt;br /&gt;
a non-core packet.&lt;br /&gt;
&lt;br /&gt;
0x0B cancel stream request&lt;br /&gt;
offset size comment&lt;br /&gt;
0      1    type 0x00&lt;br /&gt;
1      1    type 0x0B&lt;br /&gt;
&lt;br /&gt;
0x0C cancel stream acknowledge&lt;br /&gt;
offset size comment&lt;br /&gt;
0      1    type 0x00&lt;br /&gt;
1      1    type 0x0C&lt;br /&gt;
&lt;br /&gt;
0x0E cluster&lt;br /&gt;
offset size comment&lt;br /&gt;
0      1    type 0x00&lt;br /&gt;
1      1    type 0x0E&lt;br /&gt;
2      1    length&lt;br /&gt;
3      ?    payload with length as above&lt;br /&gt;
packet repeats from offset 2 until end, process contents as arbitrary packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category: Protocol]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=ChatGui&amp;diff=5644</id>
		<title>ChatGui</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=ChatGui&amp;diff=5644"/>
				<updated>2007-08-12T17:11:53Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: initial page, very brief, just to acknowledge its existence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''ChatGui''' is a chatnet client written by [[User:D1st0rt|D1st0rt]] in C#.&lt;br /&gt;
&lt;br /&gt;
More information and downloads including source are available at http://forums.minegoboom.com/viewtopic.php?t=7623&lt;br /&gt;
&lt;br /&gt;
[[Category: ChatNet Clients]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=User:Smong&amp;diff=5643</id>
		<title>User:Smong</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=User:Smong&amp;diff=5643"/>
				<updated>2007-08-12T17:09:22Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: misc updates&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Smong's website http://toktok.sscentral.com/ has some [[ASSS]] and [[MERVBot]] plugins with source code. There is also some other misc stuff related to SubSpace.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Programs written by Smong ===&lt;br /&gt;
*[[DustEd]] - A basic map editor.&lt;br /&gt;
*[[confclean]] - A .conf file cleaner.&lt;br /&gt;
*[[ChatNet]] - A Java asss chat client.&lt;br /&gt;
*[[NAAP]] - Newbie ASSS Admin Program, a Java tool to setup asss on windows.&lt;br /&gt;
*[http://forums.minegoboom.com/viewtopic.php?t=4635 Blender rotation script], for making 3D shipsets.&lt;br /&gt;
*[http://forums.minegoboom.com/viewtopic.php?t=4535 FSM] - Font Sheet Maker, can be used with SS/Cont and with map tilesets.&lt;br /&gt;
*[http://forums.minegoboom.com/viewtopic.php?t=4367 Nebula] - GUI directory client.&lt;br /&gt;
&lt;br /&gt;
=== ASSS arenas by Smong ===&lt;br /&gt;
Zones (in chronological order):&lt;br /&gt;
*Battlezone (aka BZ)&lt;br /&gt;
**Parts of WZCTF bot cloned in modules&lt;br /&gt;
*Grand Theft Auto (aka GTA)&lt;br /&gt;
**Car jacking&lt;br /&gt;
*Unreal Tournament (aka UT)&lt;br /&gt;
**Adrenaline&lt;br /&gt;
**Bombrun&lt;br /&gt;
**CTF&lt;br /&gt;
**Weapon pickups&lt;br /&gt;
*Pirates!&lt;br /&gt;
**Merchants&lt;br /&gt;
**Towns&lt;br /&gt;
*Command and Conquer (aka CNC)&lt;br /&gt;
** Destructible sentry turrets&lt;br /&gt;
** Destructible base structures&lt;br /&gt;
&lt;br /&gt;
Misc event modules (alphabetical):&lt;br /&gt;
*Avalanche&lt;br /&gt;
*Asteroids&lt;br /&gt;
*Dodgeball&lt;br /&gt;
*Elim&lt;br /&gt;
*Golf&lt;br /&gt;
*Pacman&lt;br /&gt;
*Race&lt;br /&gt;
*Wipeout&lt;br /&gt;
&lt;br /&gt;
=== Misc ASSS developer's 'you might want to know this' ===&lt;br /&gt;
*In the packet callbacks the buffer has been allocated plenty of space, so you can read past the indicated length safely.&lt;br /&gt;
*When using amalloc() it will set the memory to all 0's for you.&lt;br /&gt;
*When using per-arena/player data that is also all 0'd for you.&lt;br /&gt;
*adkey and pdkey are often used as the arena data and player data keys respectively&lt;br /&gt;
*Functions with names_like_this() are probably local (ASSS uses local inplace of the static keyword)&lt;br /&gt;
*Functions with NamesLikeThis() are probably from an interface&lt;br /&gt;
*All your base are belong to us&lt;br /&gt;
*The ShipChange callback is broken, despite several requests for grel to fix it&lt;br /&gt;
*game_timer/Misc:TimedGame is not fully supported yet (shh)&lt;br /&gt;
*The default modules.conf doesn't have scoring:points_periodic, objects or messages&lt;br /&gt;
*The default permissions don't have the ?owner command enabled&lt;br /&gt;
*&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;arena has been changed to ?a, &amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;log to ?lastlog [&amp;lt;lines&amp;gt;] [&amp;lt;filter&amp;gt;] and esc+c with ?quickfix [&amp;lt;filter&amp;gt;]&lt;br /&gt;
*There is a glitch called lag coma where reliable packets get stuck (30+ players?)&lt;br /&gt;
**Supposedly fixed.&lt;br /&gt;
*Downloads do take longer than subgame (needs tweaking)&lt;br /&gt;
*Autowarp/[[Moveto Module|moveto]] does screw up your aim&lt;br /&gt;
*?help got hijacked and it's now used as online commands and settings help.&lt;br /&gt;
**There is a patch to make ?help like subgame, moving the command to ?man (short for manual).&lt;br /&gt;
*The stock objects doesn't support all targets correctly.&lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
*MSN: mp564 at hotmail&lt;br /&gt;
*ICQ: 123727323&lt;br /&gt;
&lt;br /&gt;
=== Some notes on the Soccer:CapturePoints setting ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
capturepoints: positive&lt;br /&gt;
each goal starts with this many tokens&lt;br /&gt;
scoring a goal takes a token from the enemy goal and puts it in your goal&lt;br /&gt;
win by all enemies having 0 tokens&lt;br /&gt;
enemy has no tokens left: &amp;lt;team goal!&amp;gt; 'Enemy goal had no points to give.' &amp;lt;arena ?score&amp;gt;&lt;br /&gt;
&lt;br /&gt;
capturepoints: negative&lt;br /&gt;
when you have this many tokens you win (soccer game over)&lt;br /&gt;
each goal starts with 0 tokens&lt;br /&gt;
scoring a goal gives you (team/freq) 1 token&lt;br /&gt;
&lt;br /&gt;
capturepoints: non-zero&lt;br /&gt;
all modes except mode0: output from ?score sent to whole arena on goal&lt;br /&gt;
end of game message: (ding) 'Soccer game over.'&lt;br /&gt;
&lt;br /&gt;
capturepoints: zero&lt;br /&gt;
just reward points given&lt;br /&gt;
?score does not work&lt;br /&gt;
game never ends&lt;br /&gt;
&lt;br /&gt;
?score: mode0, mode3, mode4, mode5, mode6&lt;br /&gt;
SCORE: Team0:%d Team1:%d Team2:%d Team3:%d&lt;br /&gt;
SCORE: Warbirds:%d Javelins:%d Spiders:%d Leviathans:%d&lt;br /&gt;
&lt;br /&gt;
?score: mode1, mode2&lt;br /&gt;
SCORE: Evens:%d Odds:%d&lt;br /&gt;
SCORE: Warbirds:%d Javelins:%d&lt;br /&gt;
&lt;br /&gt;
special case: mode0&lt;br /&gt;
just reward points given&lt;br /&gt;
no tokens lost or gained&lt;br /&gt;
game never ends&lt;br /&gt;
&lt;br /&gt;
special case: mode1, mode2&lt;br /&gt;
freq's are odds/evens, so spider = warbird etc.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: People]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=NAAP&amp;diff=5642</id>
		<title>NAAP</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=NAAP&amp;diff=5642"/>
				<updated>2007-08-12T17:02:08Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: initial page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Noob ASSS Admin Program''' or '''NAAP''' is a graphical configuration utility for [[ASSS]] written by [[User:Smong|Smong]] in Java.&lt;br /&gt;
&lt;br /&gt;
It's purpose is to hide the alleged complexity of ASSS from newcomers, allowing them to quickly setup a running zone and even import arenas from a subgame zone using a wizard like interface. There is also a built in chatnet client.&lt;br /&gt;
&lt;br /&gt;
It is not intended to provide remote control of ASSS, such as uploading modules and starting/stopping the server.&lt;br /&gt;
&lt;br /&gt;
More information and downloads including source are available at http://forums.minegoboom.com/viewtopic.php?t=6069&lt;br /&gt;
&lt;br /&gt;
[[Category: ChatNet Clients]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=CN-Palm&amp;diff=5641</id>
		<title>CN-Palm</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=CN-Palm&amp;diff=5641"/>
				<updated>2007-08-12T16:54:58Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: initial page, very brief, just to acknowledge its existence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''CN-Palm''' is a chatnet client written by [[User:Smong|Smong]] in C for Palm OS based devices.&lt;br /&gt;
&lt;br /&gt;
More information and downloads including source are available at http://toktok.sscentral.com/ss-chat.html&lt;br /&gt;
&lt;br /&gt;
[[Category: ChatNet Clients]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=ASSS_Chat&amp;diff=5640</id>
		<title>ASSS Chat</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=ASSS_Chat&amp;diff=5640"/>
				<updated>2007-08-12T16:52:07Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: initial page, very brief, just to acknowledge its existence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''ASSS Chat''' is a chatnet client written by pokemon 2001 in VB.&lt;br /&gt;
&lt;br /&gt;
More information and downloads including source are available at http://forums.minegoboom.com/viewtopic.php?t=3555&lt;br /&gt;
&lt;br /&gt;
[[Category: ChatNet Clients]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=CCC&amp;diff=5110</id>
		<title>CCC</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=CCC&amp;diff=5110"/>
				<updated>2007-06-30T22:11:11Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: removed old link, added note about scripts directory, fixed likely typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;CCC is a chat client using the [[ChatNet Protocol|TCP chat protocol]]. It's written in Python by [[User:grelminar|grelminar]]. It is available in the [[ASSS]] distribution (within the scripts directory).&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
&lt;br /&gt;
* runs in a console window, so it's easy to use over ssh&lt;br /&gt;
* auto-reconnecting after disconnection&lt;br /&gt;
* complete logging of everything to a file&lt;br /&gt;
* double-colon support&lt;br /&gt;
* separate windows for different chat channels, mod chat, and private messages&lt;br /&gt;
* multiple profile support&lt;br /&gt;
* auto-enter commands&lt;br /&gt;
&lt;br /&gt;
[[Category: ChatNet Clients]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=LVZ&amp;diff=5285</id>
		<title>LVZ</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=LVZ&amp;diff=5285"/>
				<updated>2007-06-27T13:11:40Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: added info on how to add lvz to an arena&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An LVZ is a file that can customize an arena beyond simply changing the map with a LVL. An LVZ can contain compressed files, map objects, screen objects, or a combination of the three. The server will send the LVZs to a [[Continuum]] client when it enters an arena for storage in the zone's directory (Continuum\Zones\[Zone Name]) along with the LVLs and news.txt for that zone. The primary way of creating an LVZ is the [http://www.shanky.com/cgi-bin/ryan/download.cgi?lvztoolkit.zip LVZ Toolkit] and the [http://forums.minegoboom.com/viewtopic.php?t=3907 Cross Platform Lvz Toolkit] (which includes bug fixes and has better compression).&lt;br /&gt;
&lt;br /&gt;
Continuum only supports 256 different images in all of your lvz files combined. If you exceed this limit, toggling the 257th image will turn on the 1st image. This is often undesired, so be careful.&lt;br /&gt;
&lt;br /&gt;
== Adding/Replacing Files ==&lt;br /&gt;
&lt;br /&gt;
Adding a file to an LVZ with the same filename (extension does not matter) as a default Continuum image or sound file will replace that file for that arena. For example, placing a file called victoryl.wav in an LVZ will override the standard victory music in that arena. Along with the standard BMP (&amp;lt;tt&amp;gt;.bm2&amp;lt;/tt&amp;gt;) and WAV (&amp;lt;tt&amp;gt;.wa2&amp;lt;/tt&amp;gt;) formats, Continuum supports [http://www.libpng.org/pub/png/ PNG], GIF, and JPEG &amp;amp;mdash; MP3 is ''not'' supported.&lt;br /&gt;
&lt;br /&gt;
Adding a file to an LVZ with a different filename from one of the defaults will make that image available to be placed as a map object or screen object.&lt;br /&gt;
&lt;br /&gt;
Note that files included by themselves (not within an LVZ) will take precedence over ones inside an LVZ. This also means that a user can place a file (say, ship1.bm2) in a zone's folder and it will override any custom ship graphics the zone uses.&lt;br /&gt;
&lt;br /&gt;
== Adding LVZ to an arena ==&lt;br /&gt;
LVZ can be set as optional by prefixing a plus (+) before the filename in the settings. Do not rename the actual file.&lt;br /&gt;
&lt;br /&gt;
=== subgame2 ===&lt;br /&gt;
Place the .lvz files in the server root directory. Add the filenames separated by commas to the [Misc] LevelFiles= setting inside the arena's .cfg file.&lt;br /&gt;
&lt;br /&gt;
=== ASSS ===&lt;br /&gt;
Place the .lvz files in the maps directory or the arena's directory (asss/arenas/&amp;lt;arena name&amp;gt;). Add the filenames separated by commas to the [General] LevelFiles= setting inside arena.conf (asss/arenas/&amp;lt;arena name&amp;gt;/arena.conf).&lt;br /&gt;
&lt;br /&gt;
== Map Objects ==&lt;br /&gt;
&lt;br /&gt;
Map objects are images placed by Continuum at a static location on the [[map]]. They can be animated in the normal way for [[SubSpace]]/Continuum, that is, with horizontal and vertical tiles representing frames. Their display time and display mode (when Continuum will display them) can be customized.&lt;br /&gt;
&lt;br /&gt;
== Screen Objects ==&lt;br /&gt;
[[Image:Refpoints.gif|thumb|Click for larger view indicating the locations of the modifiers.]]&lt;br /&gt;
&lt;br /&gt;
Screen objects are images placed by Continuum at a specific point on the screen or a point relative to one of the presets, meaning they will move around with the pilot. Like map objects, they can be animated and their display time and mode can be customized.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
* [[LVZ Format|LVZ File Format]]&lt;br /&gt;
* [[LVZ Scripting]]&lt;br /&gt;
* [[Continuum Level / Ini Tool]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Definitions]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Talk:Installing_New_Modules&amp;diff=4995</id>
		<title>Talk:Installing New Modules</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Talk:Installing_New_Modules&amp;diff=4995"/>
				<updated>2007-06-26T16:35:21Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: note about mysql path&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==zlib==&lt;br /&gt;
Add additional info about optionally adding zlib.dll to the linker in step 6 of &amp;quot;With Dev C++&amp;quot;?&lt;br /&gt;
--[[User:JoWie|JoWie]]&lt;br /&gt;
&lt;br /&gt;
== mysql ==&lt;br /&gt;
If you are compiling mysql.c (or another module that directly requires mysql functions) you may need to add windeps/mysqlinc tothe include directories. --[[User:Smong|Smong]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=This_zone_is_not_connected_to_the_central_player_database&amp;diff=5558</id>
		<title>This zone is not connected to the central player database</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=This_zone_is_not_connected_to_the_central_player_database&amp;diff=5558"/>
				<updated>2007-06-04T13:34:58Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: deleted some waffle&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Zone_warning.png|thumb|The zone warning]]&lt;br /&gt;
&lt;br /&gt;
When trying to enter a [[zone]] that is not connected to the [[Hosts|SSC-biller]], the [[Continuum]] [[client]] will prompt the user with the following message:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;''This zone is not connected to the central player database. You should use a different password for this zone as your passwords may be exposed to zone staff. Do you wish to login using the current password?''&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The Continuum client triggers this message as a security mesure, in order to better protect users from username and password theft. It has often been considered a nuisance, as it sometimes scares new players away from non-[[Hosts|SSC]] [[zone]]s.&lt;br /&gt;
&lt;br /&gt;
You can ignore this message at your own risk.&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Writing_Modules_In_Python&amp;diff=4991</id>
		<title>Writing Modules In Python</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Writing_Modules_In_Python&amp;diff=4991"/>
				<updated>2007-05-22T10:34:24Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: /* Trouble shooting */ added error msg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Basic python module ==&lt;br /&gt;
I have tried to comment what is going on in the source. This module demonstrates callbacks, commands and using interfaces.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# demo asss python module&lt;br /&gt;
# dec 28 2004 smong&lt;br /&gt;
&lt;br /&gt;
# nearly always use this&lt;br /&gt;
from asss import *&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# get some interfaces&lt;br /&gt;
# see chat.h for where I_CHAT comes from, see other .h files for more (fx:&lt;br /&gt;
#  game.h)&lt;br /&gt;
chat = get_interface(I_CHAT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# a callback&lt;br /&gt;
# this function is called when a player enters/leaves, see core.h for PA_???&lt;br /&gt;
#  constants&lt;br /&gt;
def paction(p, action, arena):&lt;br /&gt;
    # start indenting&lt;br /&gt;
    if action == PA_ENTERARENA:&lt;br /&gt;
        # see chat.h for the names of more functions like SendMessage&lt;br /&gt;
        chat.SendMessage(p, &amp;quot;hello &amp;quot; + p.name)&lt;br /&gt;
&lt;br /&gt;
# tell asss to call 'paction' when CB_PLAYERACTION is signalled&lt;br /&gt;
# see .h files for CB_??? names&lt;br /&gt;
cb1 = reg_callback(CB_PLAYERACTION, paction)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# a command&lt;br /&gt;
# see cmdman.h for what each parameter does&lt;br /&gt;
def c_moo(cmd, params, p, targ):&lt;br /&gt;
# help text (?help moo)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;\&lt;br /&gt;
Module: &amp;lt;py&amp;gt; demo&lt;br /&gt;
Targets: none&lt;br /&gt;
a sample command.&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    chat.SendMessage(p, &amp;quot;moo cows&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# tell asss to call 'c_moo' when a player types ?moo&lt;br /&gt;
# note: add cmd_moo to conf/groupdef.dir/default so players have permission to&lt;br /&gt;
#  use this command.&lt;br /&gt;
cmd1 = add_command(&amp;quot;moo&amp;quot;, c_moo)&lt;br /&gt;
&lt;br /&gt;
# setting chat (or other interfaces), cb* or cmd* to None is equivalent to&lt;br /&gt;
#  unregistering that item.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Save this in bin/demo.py. Then ingame make sure pymod is loaded by using ?lsmod and ?insmod. Then add this module with the following command: ?insmod &amp;lt;py&amp;gt; demo. Re-entering the arena and typing ?moo should do some stuff.&lt;br /&gt;
&lt;br /&gt;
== Code snippets ==&lt;br /&gt;
The bread and butter of most custom modules.&lt;br /&gt;
=== Callbacks ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from asss import *&lt;br /&gt;
&lt;br /&gt;
chat = get_interface(I_CHAT)&lt;br /&gt;
&lt;br /&gt;
def goal(arena, p, bid, x, y):&lt;br /&gt;
    chat.SendArenaMessage(arena, &amp;quot;goal.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
cb1 = reg_callback(CB_GOAL, goal) &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Commands ===&lt;br /&gt;
Useful for controlling events, fx: ?elim start. In this case the command is ?t1.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from asss import *&lt;br /&gt;
&lt;br /&gt;
chat = get_interface(I_CHAT)&lt;br /&gt;
&lt;br /&gt;
# cmd = the name of the command, fx: elim&lt;br /&gt;
# params = any parameters, fx: start&lt;br /&gt;
# p = who sent the command&lt;br /&gt;
# targ = player or arena&lt;br /&gt;
def c_mycmd(cmd, params, p, targ):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;\&lt;br /&gt;
some help text&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if isinstance(targ, ArenaType):&lt;br /&gt;
        chat.SendMessage(p, &amp;quot;command sent to public chat&amp;quot;)&lt;br /&gt;
    elif isinstance(targ, PlayerType):&lt;br /&gt;
        chat.SendMessage(p, &amp;quot;command sent as priv msg to %s&amp;quot; % targ.name)&lt;br /&gt;
&lt;br /&gt;
cmd1 = add_command(&amp;quot;t1&amp;quot;, c_mycmd)&lt;br /&gt;
#where the &amp;quot;t1&amp;quot; is located would be the name of the command, ex: ?t1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can parse integers from the params using the following code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
try:&lt;br /&gt;
    val = int(params)&lt;br /&gt;
except ValueError:&lt;br /&gt;
    # here the conversion of params from a string to an int failed.&lt;br /&gt;
    # change the next line to 'pass' to silently ignore the conversion error,&lt;br /&gt;
    # 'return' to exit the function, or 'val = 0' to set a default value to val.&lt;br /&gt;
    chat.SendMessage(p, &amp;quot;Integer parameter required.&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manipulating built-in stats (such as kills/points) ===&lt;br /&gt;
This example makes it so team kills don't effect the wins/losses of both players involved.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
stats = get_interface(I_STATS)&lt;br /&gt;
&lt;br /&gt;
def kill(arena, killer, killed, bty, flags, pts, green):&lt;br /&gt;
    # This checks to see if the killer killed someone on the same team.&lt;br /&gt;
    # If so then it will take away a kill from the killer and take away a death from the killed player.&lt;br /&gt;
    # The scores are updated right away and the stats appear as if you never died.&lt;br /&gt;
&lt;br /&gt;
    if killer.freq == killed.freq:&lt;br /&gt;
        # stats can be incremented...&lt;br /&gt;
        stats.IncrementStat(killer, STAT_KILLS, -1)&lt;br /&gt;
&lt;br /&gt;
        # ...or set to an absolute value&lt;br /&gt;
        deaths = stats.GetStat(killed, STAT_DEATHS, INTERVAL_RESET)&lt;br /&gt;
        stats.SetStat(killed, STAT_DEATHS, INTERVAL_RESET, deaths - 1)&lt;br /&gt;
&lt;br /&gt;
        # SendUpdates must be called so everyone's F2 box shows the correct values&lt;br /&gt;
        stats.SendUpdates()&lt;br /&gt;
    &lt;br /&gt;
    return pts, green&lt;br /&gt;
&lt;br /&gt;
cb1 = reg_callback(CB_KILL, kill)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
More STAT_* types can be found in statcodes.h. If you look at stats.h you can see there is also an IncrementStat function&lt;br /&gt;
&lt;br /&gt;
=== Per-player/arena data ===&lt;br /&gt;
Use this to store game state, player score, etc.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def shipchange(p, newship, newfreq):&lt;br /&gt;
    # prefix mymod_ an abbreviation of your module name to the variable&lt;br /&gt;
    #  so that it doesn't clash with other modules. per arena data works&lt;br /&gt;
    #  in exactly the same way.&lt;br /&gt;
    p.mymod_lastship = p.ship&lt;br /&gt;
&lt;br /&gt;
cb1 = reg_callback(CB_SHIPCHANGE, shipchange)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Persistent per-player data ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;color: red; font-weight: bold; border: thin solid; padding: 5px 5px 5px 5px&amp;quot;&amp;gt;Note this has changed since 1.4.2. See bin/fg_turf.py for the latest implementation. Or the example at: http://forums.minegoboom.com/viewtopic.php?p=63321#63321&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ASSS has built in mechanisms for saving data per player and per arena across sessions (users logging off or server restarting).&lt;br /&gt;
&lt;br /&gt;
You need to provide three functions that will be called by ASSS to save, restore and clear the data. The example below is a complete module.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# each player can save a note that only they can see&lt;br /&gt;
&lt;br /&gt;
from asss import *&lt;br /&gt;
&lt;br /&gt;
chat = get_interface(I_CHAT)&lt;br /&gt;
&lt;br /&gt;
# show and store a note&lt;br /&gt;
def c_note(cmd, params, p, targ):&lt;br /&gt;
    if params:&lt;br /&gt;
        p.note = params&lt;br /&gt;
    if p.note:&lt;br /&gt;
        chat.SendMessage(p, &amp;quot;note: %s&amp;quot; % p.note)&lt;br /&gt;
    else:&lt;br /&gt;
        chat.SendMessage(p, &amp;quot;no note set&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
cmd1 = add_command(&amp;quot;note&amp;quot;, c_note)&lt;br /&gt;
&lt;br /&gt;
# return the data to save for player p&lt;br /&gt;
# returning None means &amp;quot;don't store a record in the database,&lt;br /&gt;
# and delete any record that's there already&amp;quot;.&lt;br /&gt;
def getpd(p):&lt;br /&gt;
    return p.note&lt;br /&gt;
&lt;br /&gt;
# restore the data for player p&lt;br /&gt;
def setpd(p, d):&lt;br /&gt;
    p.note = d&lt;br /&gt;
&lt;br /&gt;
# reset/clear the data for player p&lt;br /&gt;
def clearpd(p):&lt;br /&gt;
    p.note = None&lt;br /&gt;
&lt;br /&gt;
mypd = reg_player_persistent(&lt;br /&gt;
	7890, INTERVAL_FOREVER, PERSIST_GLOBAL,&lt;br /&gt;
	getpd, setpd, clearpd)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ideally you should load the module when the server starts. Alternatively if you load it dynamically you can kick everyone (not desirable) or alter the code to catch AttributeError when it attempts to read from the per player data ''.note''.&lt;br /&gt;
&lt;br /&gt;
Taking a look at ''reg_player_persistent'' the number ''7890'' is arbitrary, but must be unique for every module using persistent data. Low numbers are reserved for the core modules. ''INTERVAL_FOREVER'' is how long this data will be kept for. Interestingly the INTERVAL_* constants are defined in statcodes.h, not persist.h. ''PERSIST_GLOBAL'' is defined in persist.h. Here are the respective code extracts (as of Feb 7 2005).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* these are the possible intervals */&lt;br /&gt;
enum interval_t&lt;br /&gt;
{&lt;br /&gt;
	/* pyconst: enum, &amp;quot;INTERVAL_*&amp;quot; */&lt;br /&gt;
&lt;br /&gt;
	/* these are shared between arenas with the same arenagrp */&lt;br /&gt;
	INTERVAL_FOREVER = 0,&lt;br /&gt;
	INTERVAL_RESET,&lt;br /&gt;
	INTERVAL_MAPROTATION,&lt;br /&gt;
	/* these are not shared between arenas */&lt;br /&gt;
	INTERVAL_GAME = 5,&lt;br /&gt;
	INTERVAL_FOREVER_NONSHARED&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
typedef enum persist_scope_t&lt;br /&gt;
{&lt;br /&gt;
	/* pyconst: enum, &amp;quot;PERSIST_*&amp;quot; */&lt;br /&gt;
&lt;br /&gt;
	PERSIST_ALLARENAS,&lt;br /&gt;
	/* using this for scope means per-player data in every arena */&lt;br /&gt;
	/* using this for scope means per-arena data will be stored&lt;br /&gt;
	 * per-arena */&lt;br /&gt;
&lt;br /&gt;
	PERSIST_GLOBAL&lt;br /&gt;
	/* using this for scope means per-player data shared among all arenas */&lt;br /&gt;
	/* using this for scope means per-arena data will be shared among&lt;br /&gt;
	 * all arenas (so it will effectively be global data). */&lt;br /&gt;
} persist_scope_t;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: ASSS must be compiled with the berkeleydb option for persistent data to be available.&lt;br /&gt;
&lt;br /&gt;
=== Attach/Detach ===&lt;br /&gt;
Attaching and detaching is similar to load/unload in a C module except it is arena specific. So you can use it to initialise per-arena data.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def mm_attach(arena):&lt;br /&gt;
    # do stuff with arena&lt;br /&gt;
def mm_detach(arena):&lt;br /&gt;
    # undo stuff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Looping over all players ===&lt;br /&gt;
This example counts the number of players in an arena.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def count_players(arena):&lt;br /&gt;
    # a list must be used as all other variables are immutable to&lt;br /&gt;
    #  nested functions.&lt;br /&gt;
    players = [0]&lt;br /&gt;
    def cb_count(p):&lt;br /&gt;
        if p.arena == arena:&lt;br /&gt;
            players[0] = players[0] + 1&lt;br /&gt;
    for_each_player(cb_count)&lt;br /&gt;
    return players[0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Timers ===&lt;br /&gt;
Good for checking if a game is over yet. '''A reference to the timer is returned and must be retained''' (you can use per-arena data to store it). Losing the reference will cancel the timer.&lt;br /&gt;
&lt;br /&gt;
''initial'' is the time in 1/100th's of a second before the nested function timer() will be called, you can cancel the timer before it is called. ''interval'' is the time gap, again in 1/100th's of a second between all future calls of timer(). So make_hello_timer(100, 200, arena) will make it send the arena message &amp;quot;hello&amp;quot; every 2 seconds starting from 1 second after make_hello_timer() was called.&lt;br /&gt;
&lt;br /&gt;
The third argument to set_timer (''interval'') can be omitted and it will be assumed to be the same as ''initial''.&lt;br /&gt;
&lt;br /&gt;
The parameter ''arena'' is needed in this case because SendArenaMessage() requires an arena parameter.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def make_hello_timer(initial, interval, arena):&lt;br /&gt;
    def timer():&lt;br /&gt;
        # announce&lt;br /&gt;
        chat.SendArenaMessage(arena, &amp;quot;hello&amp;quot;)&lt;br /&gt;
        # non-repeating timer. return 1 for it to be called after the next interval&lt;br /&gt;
        return 0&lt;br /&gt;
    return set_timer(timer, initial, interval)&lt;br /&gt;
&lt;br /&gt;
def somefunc(arena):&lt;br /&gt;
    # create a hello timer that will execute after 1 second, and then every&lt;br /&gt;
    #  2 seconds until cancelled. timers can cancel themselves, see above.&lt;br /&gt;
    myref = make_hello_timer(100, 200, arena)&lt;br /&gt;
&lt;br /&gt;
    # cancel the timer by losing the reference to it&lt;br /&gt;
    myref = None&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Regions ===&lt;br /&gt;
This is untested but it should go something like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mapdata = get_interface(I_MAPDATA)&lt;br /&gt;
&lt;br /&gt;
# regionname is a string, x and y are map tile coords.&lt;br /&gt;
def region_contains(arena, regionname, x, y):&lt;br /&gt;
    success = 0&lt;br /&gt;
&lt;br /&gt;
    rgn = mapdata.FindRegionByName(arena, regionname)&lt;br /&gt;
&lt;br /&gt;
    if rgn != None and mapdata.Contains(rgn, x, y):&lt;br /&gt;
        success = 1&lt;br /&gt;
&lt;br /&gt;
    return success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
It is a good idea to cache ''rgn'' within [[#Per-player.2Farena_data|per-arena data]] so you don't add unecessary load to the server looking it up everytime.&lt;br /&gt;
&lt;br /&gt;
You might come across a region callback when browsing the .h files. This is currently (1.4.2) not available in python.&lt;br /&gt;
&lt;br /&gt;
=== Moving Balls ===&lt;br /&gt;
This is untested but it should go something like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
balls = get_interface(I_BALLS)&lt;br /&gt;
&lt;br /&gt;
# xy are in tiles&lt;br /&gt;
# bid is ball id (0-7, depends how many balls are in the arena)&lt;br /&gt;
def move_ball(arena, bid, x, y):&lt;br /&gt;
    bd = balldata()&lt;br /&gt;
    bd.state = BALL_ONMAP&lt;br /&gt;
    bd.x = x * 16&lt;br /&gt;
    bd.y = y * 16&lt;br /&gt;
    bd.xspeed = bd.yspeed = 0&lt;br /&gt;
    bd.carrier = None&lt;br /&gt;
    bd.freq = -1&lt;br /&gt;
    bd.time = current_ticks()&lt;br /&gt;
    balls.PlaceBall(arena, bid, bd)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Targets ===&lt;br /&gt;
Many of the module interfaces use Targets to specifiy which players should be affected by a function call.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# entire arena&lt;br /&gt;
tgt = arena&lt;br /&gt;
&lt;br /&gt;
# specific player&lt;br /&gt;
tgt = p&lt;br /&gt;
&lt;br /&gt;
# specific freq&lt;br /&gt;
tgt = (arena, freq)&lt;br /&gt;
&lt;br /&gt;
# entire zone&lt;br /&gt;
tgt = &amp;quot;zone&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# example interface function that requires a tgt&lt;br /&gt;
game.WarpTo(tgt, x, y)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Currently (asss 1.4.3) list targets are not supported.&lt;br /&gt;
&lt;br /&gt;
== Trouble shooting ==&lt;br /&gt;
If code won't run at all check to see if there is a mix of tabs and spaces used for indenting (SyntaxError: invalid syntax). If so convert all indents to the same type (tabs or spaces). It may not be necessary to do this for the entire module, just in affected functions.&lt;br /&gt;
&lt;br /&gt;
Look at the asss console for execution errors (at the time of writing not all errors are relayed to logged in staff), and if that doesn't help, add some chat.SendArenaMessage(ALLARENAS, &amp;quot;i'm at line ...&amp;quot;) type messages to locate the buggy piece of code.&lt;br /&gt;
&lt;br /&gt;
[[Category:Module]]&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Talk:Hosts&amp;diff=5066</id>
		<title>Talk:Hosts</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Talk:Hosts&amp;diff=5066"/>
				<updated>2007-05-17T19:11:12Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: /* Cleanup */ pss move to east coast&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[User:CypherJF|CypherJF]]: Actually I don't think SSN is run by L Chance anymore. I'm not sure the history of it but the latest back I can remember was Altec . running it with Sideburn? Spring/Summer of 2004, Altec . and L Chance brought back SSN using Lord Maucaub's biller system. They shut it back down after HALO switched back to SSZ; and now I believe Dark Mistress / TheBest999 / Cospar / MS-DOS; someone is running it.&lt;br /&gt;
&lt;br /&gt;
[[User:Smong|Smong]]: I think NTC has it now. They keep changing tags which is annoying. For the record I remember them with SSDM and TNT too if you want to stick that in a 'most annoying network decisions ever' page.&lt;br /&gt;
&lt;br /&gt;
[[User:CypherJF|CypherJF]]: Yeah NTC is the Dark Mistress / TheBest999 / Cospar / MS-DOS network.&lt;br /&gt;
&lt;br /&gt;
[[User:Smong|Smong]]:Someone add NTC and SSDT at least. Also I think this page should be called Networks, but that is more jargon I guess and could easily be confused.&lt;br /&gt;
&lt;br /&gt;
[[User:D1st0rt|D1st0rt]]:Whoa 17th is near me? Trench still has a lower ping&lt;br /&gt;
&lt;br /&gt;
== Category? ==&lt;br /&gt;
&lt;br /&gt;
There's already a category called ''Servers'', don't you think this should belong there? I know you couldn't have the short descriptions, but they're kinda hard to keep track of and not that useful. --[[User:Cyan~Fire|Cyan~Fire]]&lt;br /&gt;
&lt;br /&gt;
Well, hmm. We could always make each server its own category, the short desc goes on the category desc, and each zone is added to the specific server category they are on. [[User:Pests|Pests]]&lt;br /&gt;
&lt;br /&gt;
[[User:Smong|Smong]]: I don't think search looks at categories (I feel like I am typing that several times a day).&lt;br /&gt;
&lt;br /&gt;
I wasn't saying remove the page, just saying get rid of the server list, since it'll soon become outdated and is redundant. But, whatever, no biggie. --[[User:Cyan~Fire|Cyan~Fire]]&lt;br /&gt;
&lt;br /&gt;
== Combine Pages? ==&lt;br /&gt;
&lt;br /&gt;
Since there's actually not all that much info to put about each of these servers, how would you feel about me merging all of the individual server pages here? This page could be divided up into Active and Inactive servers, if that's a problem. --[[User:Cyan~Fire|Cyan~Fire]]&lt;br /&gt;
&lt;br /&gt;
[[User:Smong|Smong]]: SSZ Subspace Network? I think that needs changing. SSN is still run by L. Chance? Also who nicked the css for the wiki?&lt;br /&gt;
&lt;br /&gt;
== Cleanup ==&lt;br /&gt;
&lt;br /&gt;
[[User:Smong|Smong]]:&lt;br /&gt;
I don't like the look of this page. First Servers, I would prefer a page called Hosts or Networks.&lt;br /&gt;
&lt;br /&gt;
Next a table of active networks, columns are: tag, owners + contact, website, billing (yes, own billing/yes, tag of other biller/no biller) and location. &amp;lt;s&amp;gt;A network is considered active if it has its own menu on [http://stats.17thparallel.com stats.17thparallel.com].&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:Smong|Smong]] 16:10, Mar 11, 2007 (PDT): A network is any tag with more than 1 zone or has been up for a noticeable period of time.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=1&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Tag&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Operators&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Website&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Billing&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Location&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;CSSS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;unknown&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;unknown&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, Central&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PSS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Doc Flabby&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;[http://www.playsubspace.com/ www.playsubspace.com]&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;unknown&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, East&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSCC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Freakmonger&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, East&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSCE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Luminate &amp;lt;luminate rshl.org&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, East&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSCI&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Argyle&amp;lt;br&amp;gt;Death+ &amp;lt;dxexaxtxh gmail.com&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, Central&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSCU&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PriitK &amp;lt;priitk trenchwars.org&amp;gt;&amp;lt;br&amp;gt;Argyle&amp;lt;br&amp;gt;Death+ &amp;lt;dxexaxtxh gmail.com&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, Multiple&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSCX&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PriitK &amp;lt;priitk trenchwars.org&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, East&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSDC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;blackjayde &amp;lt;support xtremegaming.net&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;[http://ssdc.xtremegaming.net/ ssdc.xtremegaming.net]&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSDC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, East&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSEO&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cybersnipe, contempt&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;http://www.ssenetwork.com/&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, East&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSL&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Steigerwald&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, Central&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSO&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cybersnipe, contempt&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;http://www.ssenetwork.com/&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, East&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SST&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Confess &amp;lt;confess321 yahoo.com&amp;gt;&amp;lt;br&amp;gt;Top Gun. &amp;lt;ajchuck achosting.net&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;[http://www.ssthosting.net www.ssthosting.net]&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SST&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, East&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;T3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Mecbot+&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, East&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The purpose of this table is to serve as a summary of active hosts and so people can quickly find contact details of who is operating them.&lt;br /&gt;
&lt;br /&gt;
Next, a seperate section (or possibly page) containing a history of the networks, start/end dates, ownership, comments (reason for creation/closure, generally accepted reputation).&lt;br /&gt;
&lt;br /&gt;
[[User:I88gerbils|i88gerbils]]: Why not give a brief 1-line summary of TAG, host, web site making the tag a wiki link to description + contact information?  Kind of like the corporation info bar on wikipedia.&lt;br /&gt;
&lt;br /&gt;
{{host|Tag=SSCX|ServerName=SubSpace X|Contact=Xalimar|Email=}}?  {{zone}}?&lt;br /&gt;
&lt;br /&gt;
Agreed with basically all of this. I'll change the name now, and probably separate this at least into current and historical. --[[User:Cyan~Fire|Cyan~Fire]]&lt;br /&gt;
&lt;br /&gt;
[[User:Smong|Smong]]: There's a long way yet to go. I'm still making my way through the recent changes and may start rewriting this page later.&lt;br /&gt;
&lt;br /&gt;
--[[User:I88gerbils|i88gerbils]] 16:24, Mar 10, 2006 (EST): I like my style better.  It's pretty easy to just add a standard wiki template to add an entry.  And probably easier to add CSS for just that template to pretty it up if MGB wants.&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Writing_Modules_In_Python&amp;diff=4200</id>
		<title>Writing Modules In Python</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Writing_Modules_In_Python&amp;diff=4200"/>
				<updated>2007-04-18T19:24:33Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: /* Trouble shooting */ tab/space indent tip&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Basic python module ==&lt;br /&gt;
I have tried to comment what is going on in the source. This module demonstrates callbacks, commands and using interfaces.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# demo asss python module&lt;br /&gt;
# dec 28 2004 smong&lt;br /&gt;
&lt;br /&gt;
# nearly always use this&lt;br /&gt;
from asss import *&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# get some interfaces&lt;br /&gt;
# see chat.h for where I_CHAT comes from, see other .h files for more (fx:&lt;br /&gt;
#  game.h)&lt;br /&gt;
chat = get_interface(I_CHAT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# a callback&lt;br /&gt;
# this function is called when a player enters/leaves, see core.h for PA_???&lt;br /&gt;
#  constants&lt;br /&gt;
def paction(p, action, arena):&lt;br /&gt;
    # start indenting&lt;br /&gt;
    if action == PA_ENTERARENA:&lt;br /&gt;
        # see chat.h for the names of more functions like SendMessage&lt;br /&gt;
        chat.SendMessage(p, &amp;quot;hello &amp;quot; + p.name)&lt;br /&gt;
&lt;br /&gt;
# tell asss to call 'paction' when CB_PLAYERACTION is signalled&lt;br /&gt;
# see .h files for CB_??? names&lt;br /&gt;
cb1 = reg_callback(CB_PLAYERACTION, paction)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# a command&lt;br /&gt;
# see cmdman.h for what each parameter does&lt;br /&gt;
def c_moo(cmd, params, p, targ):&lt;br /&gt;
# help text (?help moo)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;\&lt;br /&gt;
Module: &amp;lt;py&amp;gt; demo&lt;br /&gt;
Targets: none&lt;br /&gt;
a sample command.&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    chat.SendMessage(p, &amp;quot;moo cows&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# tell asss to call 'c_moo' when a player types ?moo&lt;br /&gt;
# note: add cmd_moo to conf/groupdef.dir/default so players have permission to&lt;br /&gt;
#  use this command.&lt;br /&gt;
cmd1 = add_command(&amp;quot;moo&amp;quot;, c_moo)&lt;br /&gt;
&lt;br /&gt;
# setting chat (or other interfaces), cb* or cmd* to None is equivalent to&lt;br /&gt;
#  unregistering that item.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Save this in bin/demo.py. Then ingame make sure pymod is loaded by using ?lsmod and ?insmod. Then add this module with the following command: ?insmod &amp;lt;py&amp;gt; demo. Re-entering the arena and typing ?moo should do some stuff.&lt;br /&gt;
&lt;br /&gt;
== Code snippets ==&lt;br /&gt;
The bread and butter of most custom modules.&lt;br /&gt;
=== Callbacks ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from asss import *&lt;br /&gt;
&lt;br /&gt;
chat = get_interface(I_CHAT)&lt;br /&gt;
&lt;br /&gt;
def goal(arena, p, bid, x, y):&lt;br /&gt;
    chat.SendArenaMessage(arena, &amp;quot;goal.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
cb1 = reg_callback(CB_GOAL, goal) &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Commands ===&lt;br /&gt;
Useful for controlling events, fx: ?elim start. In this case the command is ?t1.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from asss import *&lt;br /&gt;
&lt;br /&gt;
chat = get_interface(I_CHAT)&lt;br /&gt;
&lt;br /&gt;
# cmd = the name of the command, fx: elim&lt;br /&gt;
# params = any parameters, fx: start&lt;br /&gt;
# p = who sent the command&lt;br /&gt;
# targ = player or arena&lt;br /&gt;
def c_mycmd(cmd, params, p, targ):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;\&lt;br /&gt;
some help text&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if isinstance(targ, ArenaType):&lt;br /&gt;
        chat.SendMessage(p, &amp;quot;command sent to public chat&amp;quot;)&lt;br /&gt;
    elif isinstance(targ, PlayerType):&lt;br /&gt;
        chat.SendMessage(p, &amp;quot;command sent as priv msg to %s&amp;quot; % targ.name)&lt;br /&gt;
&lt;br /&gt;
cmd1 = add_command(&amp;quot;t1&amp;quot;, c_mycmd)&lt;br /&gt;
#where the &amp;quot;t1&amp;quot; is located would be the name of the command, ex: ?t1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can parse integers from the params using the following code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
try:&lt;br /&gt;
    val = int(params)&lt;br /&gt;
except ValueError:&lt;br /&gt;
    # here the conversion of params from a string to an int failed.&lt;br /&gt;
    # change the next line to 'pass' to silently ignore the conversion error,&lt;br /&gt;
    # 'return' to exit the function, or 'val = 0' to set a default value to val.&lt;br /&gt;
    chat.SendMessage(p, &amp;quot;Integer parameter required.&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manipulating built-in stats (such as kills/points) ===&lt;br /&gt;
This example makes it so team kills don't effect the wins/losses of both players involved.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
stats = get_interface(I_STATS)&lt;br /&gt;
&lt;br /&gt;
def kill(arena, killer, killed, bty, flags, pts, green):&lt;br /&gt;
    # This checks to see if the killer killed someone on the same team.&lt;br /&gt;
    # If so then it will take away a kill from the killer and take away a death from the killed player.&lt;br /&gt;
    # The scores are updated right away and the stats appear as if you never died.&lt;br /&gt;
&lt;br /&gt;
    if killer.freq == killed.freq:&lt;br /&gt;
        # stats can be incremented...&lt;br /&gt;
        stats.IncrementStat(killer, STAT_KILLS, -1)&lt;br /&gt;
&lt;br /&gt;
        # ...or set to an absolute value&lt;br /&gt;
        deaths = stats.GetStat(killed, STAT_DEATHS, INTERVAL_RESET)&lt;br /&gt;
        stats.SetStat(killed, STAT_DEATHS, INTERVAL_RESET, deaths - 1)&lt;br /&gt;
&lt;br /&gt;
        # SendUpdates must be called so everyone's F2 box shows the correct values&lt;br /&gt;
        stats.SendUpdates()&lt;br /&gt;
    &lt;br /&gt;
    return pts, green&lt;br /&gt;
&lt;br /&gt;
cb1 = reg_callback(CB_KILL, kill)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
More STAT_* types can be found in statcodes.h. If you look at stats.h you can see there is also an IncrementStat function&lt;br /&gt;
&lt;br /&gt;
=== Per-player/arena data ===&lt;br /&gt;
Use this to store game state, player score, etc.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def shipchange(p, newship, newfreq):&lt;br /&gt;
    # prefix mymod_ an abbreviation of your module name to the variable&lt;br /&gt;
    #  so that it doesn't clash with other modules. per arena data works&lt;br /&gt;
    #  in exactly the same way.&lt;br /&gt;
    p.mymod_lastship = p.ship&lt;br /&gt;
&lt;br /&gt;
cb1 = reg_callback(CB_SHIPCHANGE, shipchange)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Persistent per-player data ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;color: red; font-weight: bold; border: thin solid; padding: 5px 5px 5px 5px&amp;quot;&amp;gt;Note this has changed since 1.4.2. See bin/fg_turf.py for the latest implementation. Or the example at: http://forums.minegoboom.com/viewtopic.php?p=63321#63321&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ASSS has built in mechanisms for saving data per player and per arena across sessions (users logging off or server restarting).&lt;br /&gt;
&lt;br /&gt;
You need to provide three functions that will be called by ASSS to save, restore and clear the data. The example below is a complete module.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# each player can save a note that only they can see&lt;br /&gt;
&lt;br /&gt;
from asss import *&lt;br /&gt;
&lt;br /&gt;
chat = get_interface(I_CHAT)&lt;br /&gt;
&lt;br /&gt;
# show and store a note&lt;br /&gt;
def c_note(cmd, params, p, targ):&lt;br /&gt;
    if params:&lt;br /&gt;
        p.note = params&lt;br /&gt;
    if p.note:&lt;br /&gt;
        chat.SendMessage(p, &amp;quot;note: %s&amp;quot; % p.note)&lt;br /&gt;
    else:&lt;br /&gt;
        chat.SendMessage(p, &amp;quot;no note set&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
cmd1 = add_command(&amp;quot;note&amp;quot;, c_note)&lt;br /&gt;
&lt;br /&gt;
# return the data to save for player p&lt;br /&gt;
# returning None means &amp;quot;don't store a record in the database,&lt;br /&gt;
# and delete any record that's there already&amp;quot;.&lt;br /&gt;
def getpd(p):&lt;br /&gt;
    return p.note&lt;br /&gt;
&lt;br /&gt;
# restore the data for player p&lt;br /&gt;
def setpd(p, d):&lt;br /&gt;
    p.note = d&lt;br /&gt;
&lt;br /&gt;
# reset/clear the data for player p&lt;br /&gt;
def clearpd(p):&lt;br /&gt;
    p.note = None&lt;br /&gt;
&lt;br /&gt;
mypd = reg_player_persistent(&lt;br /&gt;
	7890, INTERVAL_FOREVER, PERSIST_GLOBAL,&lt;br /&gt;
	getpd, setpd, clearpd)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ideally you should load the module when the server starts. Alternatively if you load it dynamically you can kick everyone (not desirable) or alter the code to catch AttributeError when it attempts to read from the per player data ''.note''.&lt;br /&gt;
&lt;br /&gt;
Taking a look at ''reg_player_persistent'' the number ''7890'' is arbitrary, but must be unique for every module using persistent data. Low numbers are reserved for the core modules. ''INTERVAL_FOREVER'' is how long this data will be kept for. Interestingly the INTERVAL_* constants are defined in statcodes.h, not persist.h. ''PERSIST_GLOBAL'' is defined in persist.h. Here are the respective code extracts (as of Feb 7 2005).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* these are the possible intervals */&lt;br /&gt;
enum interval_t&lt;br /&gt;
{&lt;br /&gt;
	/* pyconst: enum, &amp;quot;INTERVAL_*&amp;quot; */&lt;br /&gt;
&lt;br /&gt;
	/* these are shared between arenas with the same arenagrp */&lt;br /&gt;
	INTERVAL_FOREVER = 0,&lt;br /&gt;
	INTERVAL_RESET,&lt;br /&gt;
	INTERVAL_MAPROTATION,&lt;br /&gt;
	/* these are not shared between arenas */&lt;br /&gt;
	INTERVAL_GAME = 5,&lt;br /&gt;
	INTERVAL_FOREVER_NONSHARED&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
typedef enum persist_scope_t&lt;br /&gt;
{&lt;br /&gt;
	/* pyconst: enum, &amp;quot;PERSIST_*&amp;quot; */&lt;br /&gt;
&lt;br /&gt;
	PERSIST_ALLARENAS,&lt;br /&gt;
	/* using this for scope means per-player data in every arena */&lt;br /&gt;
	/* using this for scope means per-arena data will be stored&lt;br /&gt;
	 * per-arena */&lt;br /&gt;
&lt;br /&gt;
	PERSIST_GLOBAL&lt;br /&gt;
	/* using this for scope means per-player data shared among all arenas */&lt;br /&gt;
	/* using this for scope means per-arena data will be shared among&lt;br /&gt;
	 * all arenas (so it will effectively be global data). */&lt;br /&gt;
} persist_scope_t;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: ASSS must be compiled with the berkeleydb option for persistent data to be available.&lt;br /&gt;
&lt;br /&gt;
=== Attach/Detach ===&lt;br /&gt;
Attaching and detaching is similar to load/unload in a C module except it is arena specific. So you can use it to initialise per-arena data.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def mm_attach(arena):&lt;br /&gt;
    # do stuff with arena&lt;br /&gt;
def mm_detach(arena):&lt;br /&gt;
    # undo stuff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Looping over all players ===&lt;br /&gt;
This example counts the number of players in an arena.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def count_players(arena):&lt;br /&gt;
    # a list must be used as all other variables are immutable to&lt;br /&gt;
    #  nested functions.&lt;br /&gt;
    players = [0]&lt;br /&gt;
    def cb_count(p):&lt;br /&gt;
        if p.arena == arena:&lt;br /&gt;
            players[0] = players[0] + 1&lt;br /&gt;
    for_each_player(cb_count)&lt;br /&gt;
    return players[0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Timers ===&lt;br /&gt;
Good for checking if a game is over yet. '''A reference to the timer is returned and must be retained''' (you can use per-arena data to store it). Losing the reference will cancel the timer.&lt;br /&gt;
&lt;br /&gt;
''initial'' is the time in 1/100th's of a second before the nested function timer() will be called, you can cancel the timer before it is called. ''interval'' is the time gap, again in 1/100th's of a second between all future calls of timer(). So make_hello_timer(100, 200, arena) will make it send the arena message &amp;quot;hello&amp;quot; every 2 seconds starting from 1 second after make_hello_timer() was called.&lt;br /&gt;
&lt;br /&gt;
The third argument to set_timer (''interval'') can be omitted and it will be assumed to be the same as ''initial''.&lt;br /&gt;
&lt;br /&gt;
The parameter ''arena'' is needed in this case because SendArenaMessage() requires an arena parameter.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def make_hello_timer(initial, interval, arena):&lt;br /&gt;
    def timer():&lt;br /&gt;
        # announce&lt;br /&gt;
        chat.SendArenaMessage(arena, &amp;quot;hello&amp;quot;)&lt;br /&gt;
        # non-repeating timer. return 1 for it to be called after the next interval&lt;br /&gt;
        return 0&lt;br /&gt;
    return set_timer(timer, initial, interval)&lt;br /&gt;
&lt;br /&gt;
def somefunc(arena):&lt;br /&gt;
    # create a hello timer that will execute after 1 second, and then every&lt;br /&gt;
    #  2 seconds until cancelled. timers can cancel themselves, see above.&lt;br /&gt;
    myref = make_hello_timer(100, 200, arena)&lt;br /&gt;
&lt;br /&gt;
    # cancel the timer by losing the reference to it&lt;br /&gt;
    myref = None&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Regions ===&lt;br /&gt;
This is untested but it should go something like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mapdata = get_interface(I_MAPDATA)&lt;br /&gt;
&lt;br /&gt;
# regionname is a string, x and y are map tile coords.&lt;br /&gt;
def region_contains(arena, regionname, x, y):&lt;br /&gt;
    success = 0&lt;br /&gt;
&lt;br /&gt;
    rgn = mapdata.FindRegionByName(arena, regionname)&lt;br /&gt;
&lt;br /&gt;
    if rgn != None and mapdata.Contains(rgn, x, y):&lt;br /&gt;
        success = 1&lt;br /&gt;
&lt;br /&gt;
    return success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
It is a good idea to cache ''rgn'' within [[#Per-player.2Farena_data|per-arena data]] so you don't add unecessary load to the server looking it up everytime.&lt;br /&gt;
&lt;br /&gt;
You might come across a region callback when browsing the .h files. This is currently (1.4.2) not available in python.&lt;br /&gt;
&lt;br /&gt;
=== Moving Balls ===&lt;br /&gt;
This is untested but it should go something like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
balls = get_interface(I_BALLS)&lt;br /&gt;
&lt;br /&gt;
# xy are in tiles&lt;br /&gt;
# bid is ball id (0-7, depends how many balls are in the arena)&lt;br /&gt;
def move_ball(arena, bid, x, y):&lt;br /&gt;
    bd = balldata()&lt;br /&gt;
    bd.state = BALL_ONMAP&lt;br /&gt;
    bd.x = x * 16&lt;br /&gt;
    bd.y = y * 16&lt;br /&gt;
    bd.xspeed = bd.yspeed = 0&lt;br /&gt;
    bd.carrier = None&lt;br /&gt;
    bd.freq = -1&lt;br /&gt;
    bd.time = current_ticks()&lt;br /&gt;
    balls.PlaceBall(arena, bid, bd)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Targets ===&lt;br /&gt;
Many of the module interfaces use Targets to specifiy which players should be affected by a function call.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# entire arena&lt;br /&gt;
tgt = arena&lt;br /&gt;
&lt;br /&gt;
# specific player&lt;br /&gt;
tgt = p&lt;br /&gt;
&lt;br /&gt;
# specific freq&lt;br /&gt;
tgt = (arena, freq)&lt;br /&gt;
&lt;br /&gt;
# entire zone&lt;br /&gt;
tgt = &amp;quot;zone&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# example interface function that requires a tgt&lt;br /&gt;
game.WarpTo(tgt, x, y)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Currently (asss 1.4.3) list targets are not supported.&lt;br /&gt;
&lt;br /&gt;
== Trouble shooting ==&lt;br /&gt;
If code won't run at all check to see if there is a mix of tabs and spaces used for indenting. If so convert all indents to the same type (tabs or spaces). It may not be necessary to do this for the entire module, just in affected functions.&lt;br /&gt;
&lt;br /&gt;
Look at the asss console for execution errors (at the time of writing not all errors are relayed to logged in staff), and if that doesn't help, add some chat.SendArenaMessage(ALLARENAS, &amp;quot;i'm at line ...&amp;quot;) type messages to locate the buggy piece of code.&lt;br /&gt;
&lt;br /&gt;
[[Category:Module]]&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Category:Discretion&amp;diff=5631</id>
		<title>Category:Discretion</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Category:Discretion&amp;diff=5631"/>
				<updated>2007-04-16T16:50:22Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: created page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Main article: [[Discretion]].&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Creating_and_Testing_a_Simple_Discretion_Module_in_MS_Visual_Studio&amp;diff=5617</id>
		<title>Creating and Testing a Simple Discretion Module in MS Visual Studio</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Creating_and_Testing_a_Simple_Discretion_Module_in_MS_Visual_Studio&amp;diff=5617"/>
				<updated>2007-04-16T16:49:28Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: added categories: Discretion, Guides&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a tutorial for module creation in [[Discretion]]. For other tutorials, see the [[Discretion Module Tutorial]].&lt;br /&gt;
&lt;br /&gt;
Making a module is easy pie once you know what to do, so let's get to it.&lt;br /&gt;
&lt;br /&gt;
==Windows with MSVC==&lt;br /&gt;
&lt;br /&gt;
First step: make a new VS.net C++ Project. &lt;br /&gt;
&lt;br /&gt;
1. File -&amp;gt; New Project&lt;br /&gt;
&lt;br /&gt;
2. Win32 Console Project&lt;br /&gt;
&lt;br /&gt;
3. Give your project a name (&amp;quot;TestModule&amp;quot; in the picture)&lt;br /&gt;
&lt;br /&gt;
4. Press Ok&lt;br /&gt;
&lt;br /&gt;
[[Image:disc_module1.PNG]]&lt;br /&gt;
&lt;br /&gt;
5. Click on application settings on the left &lt;br /&gt;
&lt;br /&gt;
6. Click DLL from the list of radio buttons&lt;br /&gt;
&lt;br /&gt;
7. Press the Empty Project checkbox&lt;br /&gt;
&lt;br /&gt;
8. Press Finish&lt;br /&gt;
&lt;br /&gt;
[[Image:disc_module2.PNG]]&lt;br /&gt;
&lt;br /&gt;
9. File -&amp;gt; Add New Item&lt;br /&gt;
&lt;br /&gt;
10. Select C++ Source File (.cpp)&lt;br /&gt;
&lt;br /&gt;
11. Name your source file (&amp;quot;testmodule.cpp&amp;quot; in the picture)&lt;br /&gt;
&lt;br /&gt;
12. Press Open&lt;br /&gt;
&lt;br /&gt;
[[Image:disc_module3.PNG]]&lt;br /&gt;
&lt;br /&gt;
13. Paste the following code into your source file&lt;br /&gt;
&amp;lt;pre&amp;gt;// Sample Discretion Module Source File&lt;br /&gt;
#include &amp;quot;Module.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
void* getClassInstance(void* _mm, LoadMode lm)&lt;br /&gt;
{&lt;br /&gt;
	if (lm == LOADMODE_Init)&lt;br /&gt;
		printf(&amp;quot;Test Module Initialized\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
extern &amp;quot;C&amp;quot; &lt;br /&gt;
{&lt;br /&gt;
	EXPORT void* getInstance(void* mm, LoadMode lm)&lt;br /&gt;
	{&lt;br /&gt;
		return getClassInstance(mm,lm);&lt;br /&gt;
	}&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
14. Right Click your project in the Solution Explorer and go to Properties (You can also access this through the Project Menu, Project -&amp;gt; Properties)&lt;br /&gt;
&lt;br /&gt;
[[Image:disc_module4.PNG]]&lt;br /&gt;
&lt;br /&gt;
15. In the properties window, from the drop down menu select &amp;quot;All Configurations&amp;quot;&lt;br /&gt;
&lt;br /&gt;
16. Select C++, General from the tree view on the left&lt;br /&gt;
&lt;br /&gt;
17. Type the directory to the Modules directory (the one with Module.h in it, not the one with only .dlls!) that comes with the full version of Discretion in the Additional Include Directory property (&amp;quot;E:/client/modules&amp;quot; in the picture)&lt;br /&gt;
&lt;br /&gt;
18. Press Ok&lt;br /&gt;
&lt;br /&gt;
[[Image:disc_module5.PNG]]&lt;br /&gt;
&lt;br /&gt;
19. Go to Buld -&amp;gt; Build &amp;lt;project name&amp;gt; (&amp;quot;TestModule&amp;quot; in the pictue)&lt;br /&gt;
&lt;br /&gt;
[[Image:disc_module6.PNG]]&lt;br /&gt;
&lt;br /&gt;
If all goes well, you code should compile and a .dll should be produced that is a Discretion module! Now let's put the module into Discretion to see it at work. &lt;br /&gt;
&lt;br /&gt;
20. Copy the produced .dll into your Discretion executable's Module folder (the one with the .dlls in it, not the one with Module.h in it).&lt;br /&gt;
&lt;br /&gt;
[[Image:disc_module7.PNG]]&lt;br /&gt;
&lt;br /&gt;
21. Edit conf/MAIN.CONF with a program such as Notepad&lt;br /&gt;
&lt;br /&gt;
22. Add the name of your dll to the Modules::Names setting (it's a comma seperated list of module names, order doesn't matter)&lt;br /&gt;
&lt;br /&gt;
23. Save the file&lt;br /&gt;
&lt;br /&gt;
[[Image:disc_module8.PNG]]&lt;br /&gt;
&lt;br /&gt;
24. Run Discretion, Select Practice Offline&lt;br /&gt;
&lt;br /&gt;
25. Observe your modules initialization in the console window&lt;br /&gt;
&lt;br /&gt;
[[Image:disc_module9.PNG]]&lt;br /&gt;
&lt;br /&gt;
Now you might say, rightfully so, that this module doesn't do anything. The way to do real things in Discretion is by using other modules. Want to react to user key presses? Use the KeyControls module. Want to display some images? Use the Graphics module. I'll gladly write additional tutorials for how to use each of these as needed. Tell me what you want to do and I'll write a tutorial with how to use the existing modules to accomplish what you want to do.&lt;br /&gt;
&lt;br /&gt;
[[Category:Discretion]]&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Discretion&amp;diff=5599</id>
		<title>Discretion</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Discretion&amp;diff=5599"/>
				<updated>2007-04-16T16:48:24Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: added category: Discretion&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:discretionss.PNG|thumb|A Screenshot of SubSpace Discretion.]]&lt;br /&gt;
&lt;br /&gt;
Discretion is a [[SubSpace]] client created by [[User:BaK|BaK]]. It is open source, like [[ASSS]], and is released under the [http://en.wikipedia.org/wiki/GPL GPL]. Discretion was developed because of the limitations of the in-use client, [[Continuum]]. Furthermore, the lack of development of Continuum led to a situation where limitations in the client would never be overcome. Making heavy use of [http://en.wikipedia.org/wiki/Simple_DirectMedia_Layer SDL], Discretion is cross-platform, and is currently supported under Windows and Linux, with Mac OS X support on the way. Discretion is intended to be secure through design, rather than through obscurity like Continuum. It is designed to make cheating is impossible, rather than just difficult.&lt;br /&gt;
&lt;br /&gt;
Since cheating is to be made impossible, the server must check the data players send it for cheating. This requires modifying the server, which rules out using [[Subgame]]. There is, however, a modified ASSS Server that allows Discretion clients to connect[http://rshl.org/bak/Server.zip].&lt;br /&gt;
&lt;br /&gt;
In order to encourage client development, Discretion is designed with a modular system similar to ASSS. There are interfaces which define actions for modules (such as &amp;quot;draw ship at 50,50&amp;quot;), and callbacks which signal when events occur (such as &amp;quot;player has been killed&amp;quot;). Where ever possible, magic values have been removed and are instead loaded from plain-text settings files. The goal of this is to eliminate any built-in constraints present in VIE SubSpace and Continuum. These magic values include the location / color of the FPS counter, 1024x1024 tiles in maps, each tile being 16x16 pixels, each ship image having 40 frames thus 9 degree turns, the number of fly over tiles, two sets of doors four tiles each per map, the 0x01 type packet cooresponding to an arena login, friendly players showing up yellow in the stat box, the colors in the font file, the number of frames in the wormhole animation, the text that shows up when you press ESC, the number of ships, as well as all the settings Conitnuum does allow you to change such as the ship images, the gameplay settings, and the controls. The server is intended to be able to modify most of these, thus giving [[Zone]] developers maximum creativity and flexibility.&lt;br /&gt;
&lt;br /&gt;
==Modules==&lt;br /&gt;
Discretion is divided up into several modules, dynamically linked into the main program much like ASSS. These modules are desired to be as generic as possible, with their Continuum-like actions coming from the settings, rather than the modules themselves. Thus Discretion is like a 2D grid game engine, with settings and graphics which make it look like SubSpace. The module interfaces are documented in the cooresponding header files using Javadoc-style documentation. There are currenly over 30 modules in the Discretion release. Some of the main ones are discussed below.&lt;br /&gt;
&lt;br /&gt;
===Settings Handler===&lt;br /&gt;
The '''SettingsHandler''' modules loads the settings from ini-like plain text files. The main settings file is located in conf/MAIN.CONF, which #includes many other settings files. All these settings files are plain text, meaning they can be edited using a utility like pico or notepad. Individual settings can be specified in several formats, depending on how they should be interpretted. Supported types include intergers (''50'', ''0x30'', ''0777''), strings (''hello person''), points/vectors/dimensions (''(100,200)''), rgb colors (''(255,255,255)'', ''(0,128,128)''), and [[lvz]]-style screen locations (''(C+50,50)'', ''(B-10,C+25)''). There also exists a helper function to parse comma seperated a list of strings from a single sting in shared/StringManip.h. This module interface also allows modules to load their own conf files, or save a group of settings to a file which the program can then read out of.&lt;br /&gt;
&lt;br /&gt;
The front end program, '''cskinviewer''' uses the saving capability of '''SettingsHandler''' to keep track of zone data between program executions.&lt;br /&gt;
&lt;br /&gt;
===Module Manager===&lt;br /&gt;
The '''Module Manger''' itself is a module which is loaded by the program, which then proceeds to load any other modules. This uses the setting Modules::Names which is a comma seperated list of strings to figure out which modules to load. It loades module files, '.dll's in Windows and '.so's in Linux, from the bin/ directory. Modules are loaded in stages. During the first stage, LOADMODE_Init, modules register their interface, if any, with the '''Module Manager''' and register any callbacks they want to listen for. During the next stage, LOADMODE_LoadInterfaces, modules load any interfaces they plan to use. Finally, during LOADMODE_PostLoadInterfaces, modules can use their loaded interfaces to other modules to initalize themselves. Upon sucessful program termination, LOADMODE_Unload is invoked which allows the module to free any data or resources it's using. The module manager also facilitates callbacks. Where possible, C++ exception handling is used to aid in catching errors in a non-fatal way and reports the cause of the problem.&lt;br /&gt;
&lt;br /&gt;
Note that some initialization tasks should not be done in LOADMODE_PostLoadInterfaces since they require modules be initialized in a specific order. For example, the '''Text''' module, which writes text to the screen should not be initialized before the ''Graphics'' module is, since it would be unable to load the text image. Thus some initilization tasks are be done in callbacks, CB_LOADIMAGES in this instance.&lt;br /&gt;
&lt;br /&gt;
===Graphics===&lt;br /&gt;
The '''Graphics''' module allows one to load images and draw them to the screen or map. When an image is loaded through the interface, an image handle is given to the calling module which is used to refer to the image. This handle can also be used to get the image size (taking into account that some images are framed animations), or free the image when it's no longer needed. Blank images can also be created and drawn on, thus allowing one to predraw complex images instead of redrawing them every frame. Images, when drawn to the screen, are drawn in layers. This allows several modules to queue up images to be drawn out of order and still result in a correct drawing. Some layers include L_Tiles, L_Weapons, L_AfterWeapons, L_Gauges, L_Chat and L_TopMost. Images can be drawn relative to the screen, or relative to the map. Images can also be blended such that they appear translucent, as long as the user has Graphics::UseBlending set to 1. Rectangles of a constant color can also be drawn to the screen or on to another image. The images are queued up to be drawn during the CB_PRERENDER callback.&lt;br /&gt;
&lt;br /&gt;
Although providing a basic interface, it is uncommon to '''Graphics''' module directly for loading images. Instand the '''UniqueImage''' module allows one to specify an image in the settings and refer to it in code by a name. This is much easier than loading the image yourself, and easily allows a single graphic to contain many different images, which is not uncommon in SubSpace images (the bullets image, for example, contains images for all sorts of bullets rather than just a single type). The '''UniqueImage''' module makes sure to only keep a single copy of the image in memory at all times. The '''UniqueImage''' module, in turn, is used by the '''Animations''' module to provide simple access to SubSpace-style animations. Thus, a programmer can code something like 'draw animation &amp;quot;bullet explosion&amp;quot; at 512,512' and it will handle loading the image, figuring out how many frames there are, the speed of the animation, and how long to display it for.&lt;br /&gt;
&lt;br /&gt;
===Controls===&lt;br /&gt;
The '''Controls''' module permits the programmer to provide actions(&amp;quot;move forward&amp;quot;), while the settings specify exactly what keyboard or joystick input they coorespond to(&amp;quot;up arrow key&amp;quot;). Controls should be registered in the CB_CONTROLSLOADED callback. Also, since this a generic module it does not capture any of the physical controls itself, instead relying on other modules to handle that aspect.&lt;br /&gt;
&lt;br /&gt;
The '''SDL Key Controls''' module handles capturing keyboard input and sending it to the '''Controls''' module. The '''Mouse''' module does not use the '''Controls''' module directly, instead providing its own interface which allows one to create mouse hotspots and be notified of mouse clicks or movements within these hotspots.&lt;br /&gt;
&lt;br /&gt;
===Timers===&lt;br /&gt;
Similar to how ASSS has timers implemented in the mainloop module, Discretion has a '''Timers''' module that provides a timer functionality. One can register a function to be called in X milliseconds, or every X milliseconds until it's cancelled. Discretion is currently not multithreaded beyond SDL, so that a timer in an infinite loop (or any piece of code that gets to run, for that matter), will result in the program freezing up. Thus you should not use blocking calls in timers or take up too much processing time which will degrade performance.&lt;br /&gt;
&lt;br /&gt;
The '''Net''' module uses a timer to send and receive packets.&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
The '''Text''' module provides an easy way to draw text on the screen. This is the standard subspace text and can be specfied by color. This module draws the text on one line for a single frame. Therefore, you must call the appropriate functions in this interface during CB_PRERENDER every frame for however long you wish to display the text. There is support for drawing text relative to the screen or to the map, as well as blending text and drawing on any layer.&lt;br /&gt;
&lt;br /&gt;
The '''Textbox''' module uses '''Text''' to draw its text, but provides additional features such as drawing textbox borders and allowing easy textbox loading from files. '''EscapeBox''' and '''PlayerList''', in turn, use '''Textbox'''. '''Chat''' also makes use of the '''Text''' module when it draws player chat to the screen. The '''Flash''' module, which handles messages similar to SubSpace's kill and prize messages, also uses the '''Text''' module. Pretty much anywhere you see text, the '''Text''' module is at work.&lt;br /&gt;
&lt;br /&gt;
===Physics===&lt;br /&gt;
The '''Physics''' module provides functions which can give you a particle's new position given its initial position, velocity, and time elapsed. This is used for ships as well as weapons. The position can be advanced in such a way that is affected by the map (such as bombs going around a wormhole), or not. Particles can bounce off the level or explode on contact.&lt;br /&gt;
&lt;br /&gt;
The '''SelfShip''' module uses '''Physics''' to compute the new position of the player over time. '''SS_Items''' uses '''Physics''' to find the position of a bullet after a certain amount of time.&lt;br /&gt;
&lt;br /&gt;
===PerPlayerData===&lt;br /&gt;
The '''PerPlayerData''' module provides a simple way to have data that is common to every player. This is similar to ASSS' PlayerData module in that a struct of memory can be allocated for every player and referred to using a key. The module also facilitates simple sharing of per player data between module such as &amp;quot;name&amp;quot;, &amp;quot;x&amp;quot;, or &amp;quot;y&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
The '''PlayerList''' module uses the sharing facility of '''PerPlayerData''' to get the names of the players on the player list.&lt;br /&gt;
&lt;br /&gt;
===Level===&lt;br /&gt;
The '''Level''' module provides a simple interface to possibly many different types of level formats. Modules can load levels through the interface, as well as get the map or tile size. Furthermore, forces on the level, such as wormholes, friction, or gravity can be applied through the interface.&lt;br /&gt;
&lt;br /&gt;
Currently, the only map format implemented is '''oldlvl''' which supports regular SubSpace [[LVL]] files. This provides a somewhat more generic implementation, which a customizable amount of doors or custom animation tiles (wormholes, space station, and asteriods), as well as having wormholes with different properties on the same map.&lt;br /&gt;
&lt;br /&gt;
===Front End===&lt;br /&gt;
The front end, not exactly a module, is implemented as its own program, '''cskinviewer''', contributed by [[User:Smong|Smong]]. This program allows one to download a list of ASSS servers from a [[Directory Server]], and choose one and login. It uses the '''SettingsHandler''' to save the current zone list to the settings. Custom zones can not be added through the interface yet, but can be added by hand by editing conf/profiles/ZoneList.conf. &lt;br /&gt;
&lt;br /&gt;
The front end executes '''in_game''', which in turn loads the '''Module Manager''' which runs '''Main SDL''' which runs callbacks to load the various SDL Subsystems and starts the program's main loop.&lt;br /&gt;
&lt;br /&gt;
==Contribute==&lt;br /&gt;
Development for Discretion is ongoing and everyone is encouraged to contribute. Graphics are always helpful, and if you have an idea feel free to make it. In the spirit of free software, it would be best if eventually all VIE owned graphics were replaced, as their copyright status is unknown. This includes the ships, bullets, default tileset, and all other graphics from VIE SubSpace or Continuum. Also, a Discretion [[skin]] is yet to be made for the front end (the format follows that of Continuum's, see the skins directory in your Continuum folder). Additionally, many features are in development or unimplemented. If one wanted to help out, just contact BaK (bak2007 [at] gmail [dot] com), or start working on graphics or a module. There is also a [[Discretion Module Tutorial]] which shows you how to create a simple module. Some planned modules include:&lt;br /&gt;
&lt;br /&gt;
====Star Background====&lt;br /&gt;
A '''StarBackground''' module that draws stars and planets similar to how Continuum does it. It would be great it this looked better than Continuum as it would really lead to the immersion necessary for a fun experience. This could also be used to draw all sorts of backgrounds, such as grass for earth-based zones, to provide an alternate to tiling LVZ all over the map. This would be a good module to make to get introduced to Discretion development.&lt;br /&gt;
&lt;br /&gt;
====LVZ====&lt;br /&gt;
A reverse compatible LVZ module is desired to allow current zones to easily switch over to Discretion without remaking their lvz files. This could provide additional functionality not present in current lvz such as lvz that depend on ship locations to allow animations within shipsets. The easier way to make this is probably to make a static image/animation module which uses the settings and '''UniqueImage''' and '''Animations''' to draw images on the map and screen. Then, an lvz compatibility layer module would be made which translates an lvz file into a .conf file and uses '''SettingsHandler''' to load in the images from the generated file.&lt;br /&gt;
&lt;br /&gt;
====Radar====&lt;br /&gt;
Subspace and Continuum include a radar for locating enemies. This will have to be implemented in Discretion. The users should also be able to make the radar bigger by pressing a key (alt).&lt;br /&gt;
&lt;br /&gt;
====File Transfer====&lt;br /&gt;
This module is currently being worked on. This will allow file transfer using STP (SubSpace Transfer Protocol) as well as HTTP. This will permit quicker downloads as servers can put their files on the net instead of forcing everyone to download off the slow servers. Files transferred will include the settings, maps, and lvz files.&lt;br /&gt;
&lt;br /&gt;
====Sound====&lt;br /&gt;
Sound provides immersion in video games and gives them an authentic feel. We need a way to play sounds when certain actions occur such as a bullet being fired or player bouncing off a wall. WAV sounds will have to be implemented for reverse compatibility, but mp3 is not out of the question for longer sounds such as victory music or just music in general. After this is done, a built in mp3 player could be made to allow players to change songs from within the game. SDL_mixer[http://www.libsdl.org/projects/SDL_mixer/] provides mp3 capabilities and may be used.&lt;br /&gt;
&lt;br /&gt;
====Weapons====&lt;br /&gt;
Currently, only non-bouncing bullets are implemented. There are many items SubSpace uses which must be implemented. Care must be taken here to prevent cheating. For example, it would not be difficult to write a program to detect right before a player is about to get hit and automatically portal out or repel. Thus, these items may have to be modified to be on a timer, so that using a portal might require your ship to take a second to &amp;quot;charge up&amp;quot; instead of instantly warping. Also, it would be great if weapons didn't have to follow boring straight lines and instead could turn. Thus I could specify in the settings the direction a weapon would travel if the ship were facing straight up and it would happen. So a straight line would be (0,t), a curvey shot may be (sin(t),t), a shot that speeds up over time may be (0,2^t).&lt;br /&gt;
&lt;br /&gt;
====Custom Client Side Code====&lt;br /&gt;
The server should be able to provide code that can be executed client side. There are two types of code that will be provided: updated versions of modules, and gameplay related code. This is especially dangerous since a malicious server owner should not be permitted to compromise players' computers. The module updates can be done by providing a RSA signature with the binary .dll or .so which can be checked before executing any downlaoded files. As for gameplay related code, a Java virtual machine could be used with a Security Manager that allows nothing beyond basic functions. Then, an interface could be provided to the game code that could be used by the code. Thus, binary .class file could be distributed for an arena that aren't allowed to delete files off your computer, but are allowed to access the gameplay relayed interface thus permitting graphics to be drawn or players to be warped around.&lt;br /&gt;
&lt;br /&gt;
==External links==&lt;br /&gt;
*[http://rshl.org/bak/client.php Main Discretion Website]&lt;br /&gt;
&lt;br /&gt;
[[Category: Clients]]&lt;br /&gt;
[[Category: Discretion]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Discretion_Commands_and_Displaying_Images&amp;diff=5607</id>
		<title>Discretion Commands and Displaying Images</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Discretion_Commands_and_Displaying_Images&amp;diff=5607"/>
				<updated>2007-04-16T16:47:53Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: added categories: Discretion, Guides&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a tutorial for module creation in [[Discretion]]. For other tutorials, see the [[Discretion Module Tutorial]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In this tutorial, you wil learn how to listen for chat commands using Discretion's Chat Module as well as how to load and display images on the screen using UniqueImage and Graphics.&lt;br /&gt;
&lt;br /&gt;
Topics covered: Listening for Callbacks, Using Interfaces, UniqueImage, Graphics&lt;br /&gt;
&lt;br /&gt;
We will make two commands, ?show and ?hide which will cause a graphic to appear and disappear on the screen.&lt;br /&gt;
&lt;br /&gt;
The first thing we'll do is make the graphic we want to display and put it in our Discretion/graphics folder. This can be done in a progam such as Paint. Here we saved the file as my_testimage.png.&lt;br /&gt;
[[Image:cg_1.PNG]]&lt;br /&gt;
&lt;br /&gt;
Now onto the code, make a module as specified in the [Simple Module Creation Tutorial]. The first thing we're going to do is listen to the callback when commands are sent through the chat. Callbacks in Discretion are similar to callbacks in AS3. They represent events that occur that you can react to. Callbacks are registered through the module manager.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
  * -	tells the module manager that you want to receive a callback&lt;br /&gt;
  * @param myVersion the version of the module requresting this callback, this is useful in&lt;br /&gt;
  * debugging if we were to cause a crash while we're in a callback&lt;br /&gt;
  * @param callbackName is a name string that will tell the module manager which callback you want &lt;br /&gt;
  * to receive &lt;br /&gt;
  * @param callbackVersion is the version string for the callback. If you use an antiquated version, &lt;br /&gt;
  * and a different version of the callback is called, an error will be recorded&lt;br /&gt;
  * @param func is a function pointer to a function that should be called when the callback occurs, &lt;br /&gt;
  * note that all callback functions are of the same form, but you can cast the parameter to a more &lt;br /&gt;
  * usable form. Donâ€™t change the param, as it must be used to call the other functions too&lt;br /&gt;
  */&lt;br /&gt;
void (*regCallback)(const char* myVersion, const char* callbackName, const char* callbackVersion, callbackFunc func);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here we pass in myVersion, which is used only if there's a problem with your callback handler, so make it something that you will be able to recognise when it's printed to the console, such as &amp;quot;show-hide graphic module&amp;quot; or the interface handle if you have an interface defined, or even the C preprocessor macro __FILE__ will work. callbackName and callbackVersion are unique to the callback, more on that in a moment, func is the function to call when the callback occurs. callbackFunc is typedefed to a function pointer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
typedef void (*callbackFunc)(void* param);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In general, you can figure out information about the callback in the file where it's defined. For the command callback we're interested in, we look in Chat.h:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// occurs when a possible internal command is sent, if you're processing this command set processed to TRUE&lt;br /&gt;
#define CB_INTERNALCOMMAND				&amp;quot;InternalCommand&amp;quot;&lt;br /&gt;
#define CB_INTERNALCOMMAND_VERSION		&amp;quot;1&amp;quot;&lt;br /&gt;
// the parameter is as follows, set processed to TRUE if you process it&lt;br /&gt;
struct InternalCommandParam&lt;br /&gt;
{&lt;br /&gt;
	const char* command; // the entire command line, with parameters and everything, but no command character&lt;br /&gt;
	BOOL processed; // set this to true if you process the command&lt;br /&gt;
&lt;br /&gt;
	// you can use this function to check if this command is yours, sets processed for you&lt;br /&gt;
	// setToParams points to whatever's after the command if successful, can be NULL if you don't care&lt;br /&gt;
	BOOL isCommand(const char* what, const char** setToParams)&lt;br /&gt;
	{&lt;br /&gt;
	...&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here the callback name is defined to CB_INTERNALCOMMAND and callback version is defined to CB_INTERNALCOMMAND_VERSION. The parameter to the callback, which is a anonymous pointer (void*) can be cast to a InternalCommandParam*. We then use the isCommand to check if this is the command we're interested in.&lt;br /&gt;
&lt;br /&gt;
So now to register the internal command callback with the module manager and print out a message to the console when we receive &amp;quot;?show&amp;quot; or &amp;quot;?hide&amp;quot;. Note that we have to #include &amp;quot;Chat/Chat.h&amp;quot; because that's where the callback is defined.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Commands - Graphics Tutorial Discretion Module&lt;br /&gt;
#include &amp;quot;Module.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Chat/Chat.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ModuleManager* mm = 0;&lt;br /&gt;
&lt;br /&gt;
void gotInternalCommand(void* param)&lt;br /&gt;
{&lt;br /&gt;
	InternalCommandParam* icp = (InternalCommandParam*)param;&lt;br /&gt;
&lt;br /&gt;
	if (icp-&amp;gt;isCommand(&amp;quot;show&amp;quot;,0))&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;Received Command: show\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	else if (icp-&amp;gt;isCommand(&amp;quot;hide&amp;quot;,0))&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;Received Command: hide\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void* getClassInstance(void* _mm, LoadMode lm)&lt;br /&gt;
{&lt;br /&gt;
	mm = (ModuleManager*)_mm;&lt;br /&gt;
&lt;br /&gt;
	if (lm == LOADMODE_Init)&lt;br /&gt;
	{&lt;br /&gt;
		mm-&amp;gt;regCallback(__FILE__, CB_INTERNALCOMMAND, CB_INTERNALCOMMAND_VERSION, gotInternalCommand);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
extern &amp;quot;C&amp;quot; &lt;br /&gt;
{&lt;br /&gt;
	EXPORT void* getInstance(void* mm, LoadMode lm)&lt;br /&gt;
	{&lt;br /&gt;
		return getClassInstance(mm,lm);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We should be able to make this module and see the effect when we type ?show and ?hide and press enter in the chat.&lt;br /&gt;
&lt;br /&gt;
[[Image:cg_2.PNG]]&lt;br /&gt;
&lt;br /&gt;
Now onto making an image display on the screen. There are two steps to this, loading the image, and drawing the image on the screen. Loading the image can be done in a few ways, the easiest is to use the UniqueImage module. The UniqueImage module loads settings from conf files, so you can refer to the image by name in the code. UniqueImage also ensures the image is only loaded once (it's unique), so that you can use the same image in different modules without worrying about wasting memory. Unique image will give you an image handle from an image name. An image handle is just an int, which we can pass to Graphics when we're drawing the image. First we'll define the image in the conf files. Open up Image.conf in conf/visual/ and add &amp;lt;Image Name&amp;gt;Path = &amp;lt;path to image&amp;gt; and &amp;lt;Image Name&amp;gt;Frames = (1, 1) to the bottom of the file. In the picture we use CommandsGraphicsTutorial as the name of our image... this is what we'll refer to the image in the code, just make sure it isn't the same as any of the other names. The Frams setting defines how many frames are in the image, for example ships are typcially defined in a single file with 40 images aranged 10 wide and 4 tall, so we'd use (10,4) for the frames if we had such an image. For our image though, we only use a single frame so (1, 1) is correct.&lt;br /&gt;
&lt;br /&gt;
[[Image:cg_3.PNG]]&lt;br /&gt;
&lt;br /&gt;
Now we have to get the UniqueImage interface and use it. Interfaces are generally loaded during LOADMODE_LoadInterfaces in getClassInstance. They are gotten using the interface identifier and the module manager. The interface identifier is defined in UniqueImage.h&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define I_UNIQUEIMAGE 	&amp;quot;UniqueImage-1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To use this constant we need to #include &amp;quot;UniqueImage/UniqueImage.h&amp;quot;. In getClassInstance, if lm is LOADMODE_LoadInterfaces, we use the module manager to load the interface using the getInterface function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
  * -	tells the module manager that you want an interface. If the interface is not loaded by the &lt;br /&gt;
		module manager, an error will result which the module manager takes care of &lt;br /&gt;
  * -	this should be called when getInstance(MODE_LoadInterfaces) is called&lt;br /&gt;
  * @param myVersion the version of the module calling this function&lt;br /&gt;
  * @param getVersion the version of the module we want to load&lt;br /&gt;
  * @return a void* pointing to the class interface of the loaded module&lt;br /&gt;
  */&lt;br /&gt;
void* (*getInterface)(const char* myVersion, const char *getVersion);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here getVersion is I_UNIQUEIMAGE, myVersion, as in callbacks, is only used in case of errors. We can use __FILE__ or an identfying string like &amp;quot;commands-graphics tutorial&amp;quot;. We save the pointer returned by getInterface. The question now is when should we call UniqueImage's getImageHandle function. We want to make sure that we do not call it too early, because the image loading system may not be initialized. This problem is solved through callbacks. For loading images, there is a callback that says &amp;quot;the image loading system is initialized, load your images now&amp;quot;. This callback is in Graphics.h, CB_LoadImages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
This LoadImage callback will be called when the images are to be loaded, there is no parameter&lt;br /&gt;
This is guarenteed to be in POSTLOAD_Interfaces&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#define CB_LOADIMAGES			&amp;quot;LoadImages&amp;quot;&lt;br /&gt;
#define CB_LOADIMAGES_VERSION	&amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So we register a callback for this function (and #include &amp;quot;Graphics/Graphics.h&amp;quot;), and load our image and save the image handle UniqueImage gives us.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Commands - Graphics Tutorial Discretion Module&lt;br /&gt;
#include &amp;quot;Module.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Chat/Chat.h&amp;quot;&lt;br /&gt;
#include &amp;quot;UniqueImage/UniqueImage.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Graphics/Graphics.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ModuleManager* mm = 0;&lt;br /&gt;
UniqueImage* ui = 0;&lt;br /&gt;
&lt;br /&gt;
int imageHandle = 0;&lt;br /&gt;
&lt;br /&gt;
void gotInternalCommand(void* param)&lt;br /&gt;
{&lt;br /&gt;
	InternalCommandParam* icp = (InternalCommandParam*)param;&lt;br /&gt;
&lt;br /&gt;
	if (icp-&amp;gt;isCommand(&amp;quot;show&amp;quot;,0))&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;Received Command: show\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	else if (icp-&amp;gt;isCommand(&amp;quot;hide&amp;quot;,0))&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;Received Command: hide\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loadImages(void* param)&lt;br /&gt;
{&lt;br /&gt;
	imageHandle = ui-&amp;gt;getImageHandle(&amp;quot;CommandsGraphicsTutorial&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void* getClassInstance(void* _mm, LoadMode lm)&lt;br /&gt;
{&lt;br /&gt;
	mm = (ModuleManager*)_mm;&lt;br /&gt;
&lt;br /&gt;
	if (lm == LOADMODE_Init)&lt;br /&gt;
	{&lt;br /&gt;
		mm-&amp;gt;regCallback(__FILE__, CB_INTERNALCOMMAND, CB_INTERNALCOMMAND_VERSION, gotInternalCommand);&lt;br /&gt;
		mm-&amp;gt;regCallback(__FILE__, CB_LOADIMAGES, CB_LOADIMAGES_VERSION, loadImages);&lt;br /&gt;
	}&lt;br /&gt;
	else if (lm == LOADMODE_LoadInterfaces)&lt;br /&gt;
	{&lt;br /&gt;
		ui = (UniqueImage*)mm-&amp;gt;getInterface(__FILE__,I_UNIQUEIMAGE);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
extern &amp;quot;C&amp;quot; &lt;br /&gt;
{&lt;br /&gt;
	EXPORT void* getInstance(void* mm, LoadMode lm)&lt;br /&gt;
	{&lt;br /&gt;
		return getClassInstance(mm,lm);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now that we have the image, we need to draw it on the screen. This is done using the Graphics interface. We get this interface similar to how we got the UniqueImage interface (in getClassInstance where lm == LOADMODE_LoadInterfaces). The function we're interested is one that draws images on the screen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/** Draw an image in the next frame, this is to be done in the prerender callback&lt;br /&gt;
  * This one draws relative to screen coordinates, rather than absolute coordinates, no bounds checking is done&lt;br /&gt;
  * @param imageHandle an image handle from the loadImage function&lt;br /&gt;
  * @param frame the frame of the image to draw on, for example the rotated ship graphic is 0-39&lt;br /&gt;
  * @param xPixel the xPixel to draw with, this in screen coordinates&lt;br /&gt;
  * @param yPixel the yPixel to draw with, this in screen coordinates&lt;br /&gt;
  * @param Layer the layer to draw on, probably from the enum Layer&lt;br /&gt;
  * @blend a number between 0 and 100 to determine how much blending is to be done for this image, &lt;br /&gt;
  *        so 0 is completely transparent and 100 is opaque&lt;br /&gt;
  */&lt;br /&gt;
void (*drawScreenImage)(int imageHandle, int xPixel, int yPixel, int frame, int layer, int blend);&lt;br /&gt;
void (*drawScreenImage2)(int imageHandle, int xPixel, int yPixel, int layer);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
imageHandle is the handle we got from UniqueImage, xPixel is the x pixel to use for the left part of the image, yPixel is the y pixel for the top of the image. (0, 0) is the upper left corner of the screen, with y increasing downward and x increasing rightward. Frame is the frame of the image to draw, for us this is 0 since we have only a single frame defined in our image. Layer is layer to draw on, some common ones are given in the enum Layer. Blend is the amount to blend the image, 100 for opaque images and fading to completely transparent when blend is 0. Here is the layer enum:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// The layer enum, note you can define your own layers between these ones if you want&lt;br /&gt;
enum Layer&lt;br /&gt;
{&lt;br /&gt;
	L_BelowAll = 50,&lt;br /&gt;
	L_Background = 100,&lt;br /&gt;
	L_AfterBackground = 150,&lt;br /&gt;
	L_Tiles = 200,&lt;br /&gt;
	L_AfterTiles = 250,&lt;br /&gt;
	L_Weapons = 300,&lt;br /&gt;
	L_AfterWeapons = 350,&lt;br /&gt;
	L_Ships = 400,&lt;br /&gt;
	L_AfterShips = 450,&lt;br /&gt;
	L_Gauges = 500,&lt;br /&gt;
	L_AfterGauges = 550,&lt;br /&gt;
	L_Chat = 600,&lt;br /&gt;
	L_AfterChat = 650,&lt;br /&gt;
	L_TopMost = 700&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The question now is when we should call drawScreenImage. The answer is, once again, in a callback. The callback in this case is in Graphics.h, PreRender:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// The parameter to the prerender callback&lt;br /&gt;
struct PrerenderParam&lt;br /&gt;
{&lt;br /&gt;
	PrerenderParam(int m, Rect* s) : milDif(m) , screen(s) {} &lt;br /&gt;
&lt;br /&gt;
	int milDif; // milliseconds since last prerender callback, or 0 on the first one&lt;br /&gt;
	Rect* screen; // the screen bounds, in pixels&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// The prerender callback&lt;br /&gt;
#define CB_PRERENDER			&amp;quot;Pre-render&amp;quot;&lt;br /&gt;
#define CB_PRERENDER_VERSION	&amp;quot;2&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
This callback occurs every frame, when we call drawScreenImage, it will get drawn for a single frame. We register the callback like we did for LoadImages and InternalCommand. We then call drawScreenImage based on whether the user has used ?show or not. The final version the code is below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Commands - Graphics Tutorial Discretion Module&lt;br /&gt;
#include &amp;quot;Module.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Chat/Chat.h&amp;quot;&lt;br /&gt;
#include &amp;quot;UniqueImage/UniqueImage.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Graphics/Graphics.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ModuleManager* mm = 0;&lt;br /&gt;
UniqueImage* ui = 0;&lt;br /&gt;
Graphics* g = 0;&lt;br /&gt;
&lt;br /&gt;
int imageHandle = 0;&lt;br /&gt;
bool showImage = false;&lt;br /&gt;
&lt;br /&gt;
void gotInternalCommand(void* param)&lt;br /&gt;
{&lt;br /&gt;
	InternalCommandParam* icp = (InternalCommandParam*)param;&lt;br /&gt;
&lt;br /&gt;
	if (icp-&amp;gt;isCommand(&amp;quot;show&amp;quot;,0))&lt;br /&gt;
	{&lt;br /&gt;
		showImage = true;&lt;br /&gt;
	}&lt;br /&gt;
	else if (icp-&amp;gt;isCommand(&amp;quot;hide&amp;quot;,0))&lt;br /&gt;
	{&lt;br /&gt;
		showImage = false;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loadImages(void* param)&lt;br /&gt;
{&lt;br /&gt;
	imageHandle = ui-&amp;gt;getImageHandle(&amp;quot;CommandsGraphicsTutorial&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void preRender(void* param)&lt;br /&gt;
{&lt;br /&gt;
	if (showImage)&lt;br /&gt;
	{&lt;br /&gt;
		g-&amp;gt;drawScreenImage2(imageHandle, 200, 200, L_TopMost);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void* getClassInstance(void* _mm, LoadMode lm)&lt;br /&gt;
{&lt;br /&gt;
	mm = (ModuleManager*)_mm;&lt;br /&gt;
&lt;br /&gt;
	if (lm == LOADMODE_Init)&lt;br /&gt;
	{&lt;br /&gt;
		mm-&amp;gt;regCallback(__FILE__, CB_INTERNALCOMMAND, CB_INTERNALCOMMAND_VERSION, gotInternalCommand);&lt;br /&gt;
		mm-&amp;gt;regCallback(__FILE__, CB_LOADIMAGES, CB_LOADIMAGES_VERSION, loadImages);&lt;br /&gt;
		mm-&amp;gt;regCallback(__FILE__, CB_PRERENDER, CB_PRERENDER_VERSION, preRender);&lt;br /&gt;
	}&lt;br /&gt;
	else if (lm == LOADMODE_LoadInterfaces)&lt;br /&gt;
	{&lt;br /&gt;
		ui = (UniqueImage*)mm-&amp;gt;getInterface(__FILE__,I_UNIQUEIMAGE);&lt;br /&gt;
		g = (Graphics*)mm-&amp;gt;getInterface(__FILE__,I_GRAPHICS);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
extern &amp;quot;C&amp;quot; &lt;br /&gt;
{&lt;br /&gt;
	EXPORT void* getInstance(void* mm, LoadMode lm)&lt;br /&gt;
	{&lt;br /&gt;
		return getClassInstance(mm,lm);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And when we run this module in Discretion we get the desired result:&lt;br /&gt;
&lt;br /&gt;
[[Image:cg_4.PNG]]&lt;br /&gt;
&lt;br /&gt;
Hopefully, by now you are comfortable with listening to callbacks and using interfaces as well as more familiar with the UniqueImage and Graphic modules. Here's a few things you can try to do:&lt;br /&gt;
&lt;br /&gt;
- Instead of drawing the image on the screen, draw it on the map at pixel 8200,8200, and make it so that you can fly over it with your ship.&lt;br /&gt;
&lt;br /&gt;
- Make your image have two frames instead of just a single one, and use a command &amp;quot;?switch&amp;quot; to change the frame of the image being displayed.&lt;br /&gt;
&lt;br /&gt;
- Add a command &amp;quot;?blend &amp;lt;int&amp;gt;&amp;quot; where &amp;lt;int&amp;gt; is an integer specifying the blend amount to use. Observe the effects of different blend values.&lt;br /&gt;
&lt;br /&gt;
[[Category:Discretion]]&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Listening_for_Key_Presses,_Displaying_Text,_and_Per_Player_Data&amp;diff=5630</id>
		<title>Listening for Key Presses, Displaying Text, and Per Player Data</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Listening_for_Key_Presses,_Displaying_Text,_and_Per_Player_Data&amp;diff=5630"/>
				<updated>2007-04-16T16:47:02Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: added categories: Discretion, Guides&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a tutorial for module creation in [[Discretion]]. For other tutorials, see the [[Discretion Module Tutorial]].&lt;br /&gt;
&lt;br /&gt;
The purpose of this tutorial is to explain how to 1) display text on the screen with the Text module, 2) show how to access shared per player data, 3) listen and act upon key presses in Discretion, and 4) show how to register and use local per player data. You are assumed to know how to create and load a basic module, as well as how to use interfaces and callbacks. If you don't know how to do this, do the corresponding [[Discretion Module Tutorial]].&lt;br /&gt;
&lt;br /&gt;
We shall construct a module that displays the currently ticked (in the playerlist) player's name, squad, or frequency. The user will be able to press the ALT key to cycle between these attributes. The module will also keep track of how many times the user has pressed alt for each player.&lt;br /&gt;
&lt;br /&gt;
So for example, consider a case where there's two players in the arena, tux(the user) on freq 0 and squad &amp;quot;Killers&amp;quot;, and BaK on freq 1 on squad &amp;quot;BakAttak&amp;quot;. Initially the player himself is ticked. The screen will say &amp;quot;Name: tux (Switched 0 times)&amp;quot;. The player can then select the next player on the playerlist using page down. After the user presses page down, the screen says &amp;quot;Name: BaK (Switched 0 times)&amp;quot;. The user can then press the alt key and the screen switches to &amp;quot;Squad: BakAttak (Switched 1 time)&amp;quot;. If the user than presses alt again it switched the text to &amp;quot;Freq: 1 (Switched 2 times)&amp;quot;. If the user presses page up it goes back to &amp;quot;Name: tux (Switched 0 times)&amp;quot;. Alt will then yield the text &amp;quot;Squad: Killers (Switched 1 time)&amp;quot;. Page down will go back to &amp;quot;Freq: 1 (Switched 2 times)&amp;quot;. Alt again will give us &amp;quot;Name: Bak (Switched 3 times)&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
So let's work off a basic module template:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Discretion Tutorial, goals:&lt;br /&gt;
// 1) display text on the screen with the Text module &lt;br /&gt;
// 2) show how to access shared per player data&lt;br /&gt;
// 3) listen and act upon key presses in Discretion&lt;br /&gt;
// 4) show how to register and use local per player data.&lt;br /&gt;
// April 2007&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;Module.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ModuleManager* mm = 0;&lt;br /&gt;
&lt;br /&gt;
void* getClassInstance(void* _mm, LoadMode lm)&lt;br /&gt;
{&lt;br /&gt;
	mm = (ModuleManager*)_mm;&lt;br /&gt;
&lt;br /&gt;
	if (lm == LOADMODE_Init)&lt;br /&gt;
	{&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
extern &amp;quot;C&amp;quot; &lt;br /&gt;
{&lt;br /&gt;
	EXPORT void* getInstance(void* mm, LoadMode lm)&lt;br /&gt;
	{&lt;br /&gt;
		return getClassInstance(mm,lm);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Let's display some text on the screen using the Text module. The text module can display text on the screen or on the map, on any layer. These layers are the same layers that are used to display images. The function we are interested in is displayTextScreen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Display this text for one frame, call during prerender, this in is screen coordinates&lt;br /&gt;
 * @param line the line of text to display&lt;br /&gt;
 * @param color the color string to display&lt;br /&gt;
 * @param layer the layer to display it on&lt;br /&gt;
 * @param topLeft the top left corner of where we should start drawing&lt;br /&gt;
 * @param blend how much to blend the text, 0 = transparent, 100 = opaque&lt;br /&gt;
 */&lt;br /&gt;
void (*displayTextScreen)(const char* line, const char* color, int layer, const Point* topLeft, int blend);&lt;br /&gt;
void (*displayTextScreen2)(const char* line, const char* color, int layer, const Point* topLeft);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So as in the images tutorial, we register a callback to CB_PRERENDER, which is when we call displayTextScreen2 to display the actual text. We also get the Text interface. Then, during the prerender callback, we call displayTextScreen2, which will display the text we want on the screen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Discretion Tutorial, goals:&lt;br /&gt;
// 1) display text on the screen with the Text module &lt;br /&gt;
// 2) show how to access shared per player data&lt;br /&gt;
// 3) listen and act upon key presses in Discretion&lt;br /&gt;
// 4) show how to register and use local per player data.&lt;br /&gt;
// April 2007&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;Module.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Text/Text.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Graphics/Graphics.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ModuleManager* mm = 0;&lt;br /&gt;
Text* t = 0;&lt;br /&gt;
&lt;br /&gt;
void preRender(void* param)&lt;br /&gt;
{&lt;br /&gt;
	Point topLeft(400,200);&lt;br /&gt;
&lt;br /&gt;
	t-&amp;gt;displayTextScreen2(&amp;quot;test string&amp;quot;, &amp;quot;yellow&amp;quot;, L_Chat, &amp;amp;topLeft);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void* getClassInstance(void* _mm, LoadMode lm)&lt;br /&gt;
{&lt;br /&gt;
	mm = (ModuleManager*)_mm;&lt;br /&gt;
&lt;br /&gt;
	if (lm == LOADMODE_LoadInterfaces)&lt;br /&gt;
	{&lt;br /&gt;
		t = (Text*)mm-&amp;gt;getInterface(__FILE__, I_TEXT);&lt;br /&gt;
&lt;br /&gt;
		mm-&amp;gt;regCallback(__FILE__,CB_PRERENDER, CB_PRERENDER_VERSION, &amp;amp;preRender);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
extern &amp;quot;C&amp;quot; &lt;br /&gt;
{&lt;br /&gt;
	EXPORT void* getInstance(void* mm, LoadMode lm)&lt;br /&gt;
	{&lt;br /&gt;
		return getClassInstance(mm,lm);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can see how we could use the text module to display various strings at various layers. Running this code makes the module display the string &amp;quot;test string&amp;quot; at position 400, 200:&lt;br /&gt;
&lt;br /&gt;
[[Image:Ss1.PNG]]&lt;br /&gt;
&lt;br /&gt;
Next, we want to be able to get data about the players. This data is stored as shared Per Player Data. This is gotten using the PerPlayerData interface's getSharedData function:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
  * Get data that was shared by other modules with registerSharedData&lt;br /&gt;
  * @param pid the player's id we're concerned with&lt;br /&gt;
  * @param dataName the unique name of the data we want&lt;br /&gt;
  * @return a void* to the data we want. See the module documentation for the correct name and type&lt;br /&gt;
  */&lt;br /&gt;
void* (*getSharedData)(int pid, const char* dataName);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The parameter dataName refers to the name of the data, in this case &amp;quot;name&amp;quot;, &amp;quot;squad&amp;quot;, and &amp;quot;freq&amp;quot;. There currently isn't a global list of common shared data anywhere, but such a list probably will be made at some point.&lt;br /&gt;
&lt;br /&gt;
We can get the ticked player's id number using the PlayerList interface. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Get the Pid of the currently targeted player&lt;br /&gt;
 * @return the pid of the player currently &amp;quot;ticked&amp;quot; in the player list box&lt;br /&gt;
 */&lt;br /&gt;
int (*getTargetPID)();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now once we get the shared data, we receive a void*, which is a pointer that can point to any type of data. Again, a global list of common shared data types isn't yet available, so trust me that getting &amp;quot;name&amp;quot; will give you data of type char*, &amp;quot;squad&amp;quot; will get you data of type char*, and &amp;quot;freq&amp;quot; gets you data of type int*. With a pointer to the data you can modify the data, and this is the mechanism for doing that. You should cast the void* to the proper type of pointer, then use that pointer to get/set the data as one would with a normal pointer.&lt;br /&gt;
&lt;br /&gt;
So in our tutorial, in our prerender callback, we get the ticked player's id from the playerlist, use that with PerPlayerData to get the name of the ticked player, and display that on the screen using the Text Module.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Discretion Tutorial, goals:&lt;br /&gt;
// 1) display text on the screen with the Text module &lt;br /&gt;
// 2) show how to access shared per player data&lt;br /&gt;
// 3) listen and act upon key presses in Discretion&lt;br /&gt;
// 4) show how to register and use local per player data.&lt;br /&gt;
// April 2007&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;Module.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Text/Text.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Graphics/Graphics.h&amp;quot;&lt;br /&gt;
#include &amp;quot;PerPlayerData/PerPlayerData.h&amp;quot;&lt;br /&gt;
#include &amp;quot;PlayerList/PlayerList.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ModuleManager* mm = 0;&lt;br /&gt;
PerPlayerData* ppd = 0;&lt;br /&gt;
PlayerList* pl = 0;&lt;br /&gt;
Text* t = 0;&lt;br /&gt;
&lt;br /&gt;
void preRender(void* param)&lt;br /&gt;
{&lt;br /&gt;
	Point topLeft(400,200);&lt;br /&gt;
	int ticked_pid = pl-&amp;gt;getTargetPID();&lt;br /&gt;
	char* playerName = (char*)ppd-&amp;gt;getSharedData(ticked_pid, &amp;quot;name&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	t-&amp;gt;displayTextScreen2(playerName, &amp;quot;yellow&amp;quot;, L_Chat, &amp;amp;topLeft);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void* getClassInstance(void* _mm, LoadMode lm)&lt;br /&gt;
{&lt;br /&gt;
	mm = (ModuleManager*)_mm;&lt;br /&gt;
&lt;br /&gt;
	if (lm == LOADMODE_LoadInterfaces)&lt;br /&gt;
	{&lt;br /&gt;
		t = (Text*)mm-&amp;gt;getInterface(__FILE__, I_TEXT);&lt;br /&gt;
		pl = (PlayerList*)mm-&amp;gt;getInterface(__FILE__, I_PLAYERLIST);&lt;br /&gt;
		ppd = (PerPlayerData*)mm-&amp;gt;getInterface(__FILE__, I_PERPLAYERDATA);&lt;br /&gt;
&lt;br /&gt;
		mm-&amp;gt;regCallback(__FILE__,CB_PRERENDER, CB_PRERENDER_VERSION, &amp;amp;preRender);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
extern &amp;quot;C&amp;quot; &lt;br /&gt;
{&lt;br /&gt;
	EXPORT void* getInstance(void* mm, LoadMode lm)&lt;br /&gt;
	{&lt;br /&gt;
		return getClassInstance(mm,lm);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When we run this code (you'll need to run a Discretion-compatible ASSS server to get a name), we get the expected result:&lt;br /&gt;
&lt;br /&gt;
[[Image:Ss2.PNG]]&lt;br /&gt;
&lt;br /&gt;
Now, in the tutorial, we will react to when the user presses alt to cycle through the name, squad, and freq. First, we modify our conf file to specify what keys correspond to our action. Throughout the code (and conf files) we refer to our action with a string. Let's use &amp;quot;cycle_data&amp;quot; as the name for our action. Then, we use the Controls module to specify a function to call when the key(s) for &amp;quot;cycle_data&amp;quot; are pressed. In this function, we will change the type of data we're displaying about the player in prerender.&lt;br /&gt;
&lt;br /&gt;
So first let's edit conf/modules/Controls.conf. Open this file (in notepad, for example), and add &amp;quot;cycle_data&amp;quot; to the list of controls in Controls::Name. Also, we set Controls::cycle_data to RALT. In general, the names of the controls (like &amp;quot;RALT&amp;quot; for us) are equal to the SDLK_ constants for the keys, which you can google for. Alternately, if you're curious, examine initKeys() at the bottom of Modules/KeyControls/SDL Key Controls/SDL_KeyControls.cpp. Usually they're pretty obvious, as was the case with &amp;quot;RALT&amp;quot;. If you wanted to allow either alt key to be pressed you could use &amp;quot;RALT, LALT&amp;quot;, or if you wanted both, &amp;quot;RALT + LALT&amp;quot;. There will eventually be a nice visual interface where the user can rebind all these keys to whatever values they want to use. Proceed to add the mentioned settings to the conf/modules/Controls.conf.&lt;br /&gt;
&lt;br /&gt;
[[Image:Ss3.PNG]]&lt;br /&gt;
&lt;br /&gt;
Now to figure out when the key is pressed, we need to tell the Controls module we're interested in a particular action (cycle_data). We first need to get the controls interface, and then register the callback CB_CONTROLSLOADED, which is when we should register key events.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// The controls loaded callback, parameter is null&lt;br /&gt;
// this callback occurs when we have loaded the controls bindings, at this point you can call regControlEvent&lt;br /&gt;
#define CB_CONTROLSLOADED			&amp;quot;CB_CONTROLSLOADED&amp;quot;&lt;br /&gt;
#define CB_CONTROLSLOADED_VERSION	&amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In that callback, we use regControlEvent from the Controls module to tell the Controls module what function to call when your action occurs (the user presses alt).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * tell the Controls modules you want a function to be called when a certain control is pressed,&lt;br /&gt;
 * down is true iff we want the function to be called when the key is pressed down, if itâ€™s false it will be&lt;br /&gt;
 * called iff the key combo is lifted up.&lt;br /&gt;
 *&lt;br /&gt;
 * call this function in your handler for the CB_CONTROLSLOADED callback&lt;br /&gt;
 *&lt;br /&gt;
 * @param keyString the keyString corresponding to the event, as defined in the settings (like &amp;quot;repel&amp;quot;)&lt;br /&gt;
 * @param funcToCall the function to call when the event occurs, down = true iff we're pressing the key combination&lt;br /&gt;
 */&lt;br /&gt;
void (*regControlEvent)(const char* controlString, void (*funcToCall)(bool down, const char* controlString));&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
To do this, we need a function to call when the control is pressed down or released. The type of the function is void function taking parameters (bool down, const char* controlString), so we add such a function to our module (we named it cycleDataPressed). When this function is called, we change a global variable in our module which changes what we display. &lt;br /&gt;
&lt;br /&gt;
Note that once we #include &amp;quot;Controls/Controls.h&amp;quot;, we need to add Modules/Shared/StringManip.cpp to our project to avoid unresolved external symbol linker errors. This is done by going to File -&amp;gt; Add Existing Item, then selecting Modules/Shared/StringManip.cpp.&lt;br /&gt;
&lt;br /&gt;
[[Image:Ss4.PNG]]&lt;br /&gt;
&lt;br /&gt;
The resultant code should now be:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Discretion Tutorial, goals:&lt;br /&gt;
// 1) display text on the screen with the Text module &lt;br /&gt;
// 2) show how to access shared per player data&lt;br /&gt;
// 3) listen and act upon key presses in Discretion&lt;br /&gt;
// 4) show how to register and use local per player data.&lt;br /&gt;
// April 2007&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;Module.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Text/Text.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Graphics/Graphics.h&amp;quot;&lt;br /&gt;
#include &amp;quot;PerPlayerData/PerPlayerData.h&amp;quot;&lt;br /&gt;
#include &amp;quot;PlayerList/PlayerList.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Controls/Controls.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ModuleManager* mm = 0;&lt;br /&gt;
PerPlayerData* ppd = 0;&lt;br /&gt;
PlayerList* pl = 0;&lt;br /&gt;
Text* t = 0;&lt;br /&gt;
Controls* c = 0;&lt;br /&gt;
&lt;br /&gt;
// 0 = name, 1 = squad, 2 = freq&lt;br /&gt;
int dataState = 0;&lt;br /&gt;
&lt;br /&gt;
void cycleDataPressed(bool down, const char* controlString)&lt;br /&gt;
{&lt;br /&gt;
	// if the key is pressed down (rather than released)&lt;br /&gt;
	if (down)&lt;br /&gt;
		dataState = (dataState + 1) % 3;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// callback below&lt;br /&gt;
void keyControlsLoaded(void* param)&lt;br /&gt;
{&lt;br /&gt;
	c-&amp;gt;regControlEvent(&amp;quot;cycle_data&amp;quot;,cycleDataPressed);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void preRender(void* param)&lt;br /&gt;
{&lt;br /&gt;
	Point topLeft(400,200);&lt;br /&gt;
	int ticked_pid = pl-&amp;gt;getTargetPID();&lt;br /&gt;
	&lt;br /&gt;
	char buf[128];&lt;br /&gt;
&lt;br /&gt;
	if (dataState == 0)&lt;br /&gt;
	{&lt;br /&gt;
		char* playerName = (char*)ppd-&amp;gt;getSharedData(ticked_pid, &amp;quot;name&amp;quot;);&lt;br /&gt;
		snprintf(buf,sizeof(buf),&amp;quot;Name: %s&amp;quot;,playerName);&lt;br /&gt;
	}&lt;br /&gt;
	else if (dataState == 1)&lt;br /&gt;
	{&lt;br /&gt;
		char* squadName = (char*)ppd-&amp;gt;getSharedData(ticked_pid, &amp;quot;squad&amp;quot;);&lt;br /&gt;
		snprintf(buf,sizeof(buf),&amp;quot;Squad: %s&amp;quot;,squadName);&lt;br /&gt;
	}&lt;br /&gt;
	else &lt;br /&gt;
	{&lt;br /&gt;
		int freq = *(int*)ppd-&amp;gt;getSharedData(ticked_pid, &amp;quot;freq&amp;quot;);&lt;br /&gt;
		snprintf(buf,sizeof(buf),&amp;quot;Freq: %i&amp;quot;,freq);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	t-&amp;gt;displayTextScreen2(buf, &amp;quot;yellow&amp;quot;, L_Chat, &amp;amp;topLeft);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// interface functions below&lt;br /&gt;
void* getClassInstance(void* _mm, LoadMode lm)&lt;br /&gt;
{&lt;br /&gt;
	mm = (ModuleManager*)_mm;&lt;br /&gt;
&lt;br /&gt;
	if (lm == LOADMODE_LoadInterfaces)&lt;br /&gt;
	{&lt;br /&gt;
		t = (Text*)mm-&amp;gt;getInterface(__FILE__, I_TEXT);&lt;br /&gt;
		pl = (PlayerList*)mm-&amp;gt;getInterface(__FILE__, I_PLAYERLIST);&lt;br /&gt;
		ppd = (PerPlayerData*)mm-&amp;gt;getInterface(__FILE__, I_PERPLAYERDATA);&lt;br /&gt;
		c = (Controls*)mm-&amp;gt;getInterface(__FILE__, I_CONTROLS);&lt;br /&gt;
&lt;br /&gt;
		mm-&amp;gt;regCallback(__FILE__,CB_PRERENDER, CB_PRERENDER_VERSION, &amp;amp;preRender);&lt;br /&gt;
		mm-&amp;gt;regCallback(__FILE__,CB_CONTROLSLOADED, CB_CONTROLSLOADED_VERSION, &amp;amp;keyControlsLoaded);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
extern &amp;quot;C&amp;quot; &lt;br /&gt;
{&lt;br /&gt;
	EXPORT void* getInstance(void* mm, LoadMode lm)&lt;br /&gt;
	{&lt;br /&gt;
		return getClassInstance(mm,lm);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With this module, when we press the right alt key (assuming you used RALT in the conf file), it should cycle through the ticked player's data:&lt;br /&gt;
&lt;br /&gt;
[[Image:Ss5.PNG]]&lt;br /&gt;
&lt;br /&gt;
Finally, let's use some local per player data to count how many times we've toggled the state for each player. Our data will keep track of the current information we're displaying for each player, as well as how many times alt was pressed for the player.&lt;br /&gt;
&lt;br /&gt;
Each module is allowed to allocate one structure of per player data for local use. We are interested in the number of times the player presses alt, as well as the current data we're displaying. We also provide the PerPlayerData module with two functions, one to initialize the data, and one to deinitialize the data. You can skip either of these functions. In our case, we want to set the initial number of times the user pressed alt to 0, and set the initial display to 0 (which is the name). The function we make has to accept a void* which we cast to be a pointer to our structure. Here is our structure and initialization function:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
struct MyPlayerData&lt;br /&gt;
{&lt;br /&gt;
	int dataState;&lt;br /&gt;
	int count;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void initMyPlayerData(void* param)&lt;br /&gt;
{&lt;br /&gt;
	MyPlayerData* mpd = (MyPlayerData*)param;&lt;br /&gt;
&lt;br /&gt;
	mpd-&amp;gt;count = 0;&lt;br /&gt;
	mpd-&amp;gt;dataState = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We now have to tell the PerPlayerData module we want it to keep track of data for us. This is done during CB_LOADPERPLAYERDATA, which we listen for. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
When this callback occurs, you should register the per player data for your module&lt;br /&gt;
*/&lt;br /&gt;
#define CB_LOADPERPLAYERDATA		&amp;quot;Load Per Player Data&amp;quot;&lt;br /&gt;
#define CB_LOADPERPLAYERDATA_VERSION	&amp;quot;1&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
During this callback we want to call the interface function in PerPlayerData, reserveData. This allocates some space for every player. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
  * Call this during CB_LOADPERPLAYERDATA to reserve some per player data for your module.&lt;br /&gt;
  * @param interfaceName the I_ interface name that you're using&lt;br /&gt;
  * @param size the number of bytes to allocate, use sizeof(YourDataStruct)&lt;br /&gt;
  * @param initer the function to call with the data as the argument after we allocate (can be null)&lt;br /&gt;
  * @param deiniter the function to call with the data as the argument before we free (can be null)&lt;br /&gt;
  * @return key the key to use in GetData when we want to change / use the data&lt;br /&gt;
  */&lt;br /&gt;
int (*reserveData)(const char* interfaceName, unsigned int size, &lt;br /&gt;
								void (*initer)(void* data), void (*deiniter)(void* data));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this function, the interface name is the name of the interface, as when we're registering callbacks. Using __FILE__ like we have been will work. The size parameter should be set to the size of our data structure, we'll use sizeof(MyPlayerData) here. This function returns a key which we keep track of in order to get the data later on. To get the data, we use the GetData interface function from PerPlayerData:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
  * Get the Data which we've previously reserved with ReserveData for a particular player&lt;br /&gt;
  * @param pid the player id of the player whose data we want (often sent in packets)&lt;br /&gt;
  * @param key the key returned by ReserveData which we use to tell your data apart from a different module's&lt;br /&gt;
  */&lt;br /&gt;
void* (*getData)(int pid, int key);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This returns a void* which we can cast to be a pointer to our structure. We put getData into our CB_PRERENDER to get the state and number of times alt was pressed for the targeted player, and display that. We also increment the number of times alt was pressed every time cycleDataPressed is called when a key is pressed down.&lt;br /&gt;
&lt;br /&gt;
The final code is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Discretion Tutorial, goals:&lt;br /&gt;
// 1) display text on the screen with the Text module &lt;br /&gt;
// 2) show how to access shared per player data&lt;br /&gt;
// 3) listen and act upon key presses in Discretion&lt;br /&gt;
// 4) show how to register and use local per player data.&lt;br /&gt;
// April 2007&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;Module.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Text/Text.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Graphics/Graphics.h&amp;quot;&lt;br /&gt;
#include &amp;quot;PerPlayerData/PerPlayerData.h&amp;quot;&lt;br /&gt;
#include &amp;quot;PlayerList/PlayerList.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Controls/Controls.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ModuleManager* mm = 0;&lt;br /&gt;
PerPlayerData* ppd = 0;&lt;br /&gt;
PlayerList* pl = 0;&lt;br /&gt;
Text* t = 0;&lt;br /&gt;
Controls* c = 0;&lt;br /&gt;
&lt;br /&gt;
int myPlayerDataKey = 0;&lt;br /&gt;
&lt;br /&gt;
struct MyPlayerData&lt;br /&gt;
{&lt;br /&gt;
	// 0 = name, 1 = squad, 2 = freq&lt;br /&gt;
	int dataState;&lt;br /&gt;
	int count;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void initMyPlayerData(void* param)&lt;br /&gt;
{&lt;br /&gt;
	MyPlayerData* mpd = (MyPlayerData*)param;&lt;br /&gt;
&lt;br /&gt;
	mpd-&amp;gt;count = 0;&lt;br /&gt;
	mpd-&amp;gt;dataState = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void cycleDataPressed(bool down, const char* controlString)&lt;br /&gt;
{&lt;br /&gt;
	// if the key is pressed down (rather than released)&lt;br /&gt;
	if (down)&lt;br /&gt;
	{&lt;br /&gt;
		int ticked_pid = pl-&amp;gt;getTargetPID();&lt;br /&gt;
&lt;br /&gt;
		MyPlayerData* data = (MyPlayerData*)ppd-&amp;gt;getData(ticked_pid, myPlayerDataKey);&lt;br /&gt;
&lt;br /&gt;
		data-&amp;gt;dataState = (data-&amp;gt;dataState + 1) % 3;&lt;br /&gt;
		++(data-&amp;gt;count);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// callbacks below&lt;br /&gt;
void keyControlsLoaded(void* param)&lt;br /&gt;
{&lt;br /&gt;
	c-&amp;gt;regControlEvent(&amp;quot;cycle_data&amp;quot;,cycleDataPressed);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loadPerPlayerData(void* param)&lt;br /&gt;
{&lt;br /&gt;
	myPlayerDataKey = ppd-&amp;gt;reserveData(__FILE__, sizeof(MyPlayerData), initMyPlayerData, 0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void preRender(void* param)&lt;br /&gt;
{&lt;br /&gt;
	Point topLeft(400,200);&lt;br /&gt;
	int ticked_pid = pl-&amp;gt;getTargetPID();&lt;br /&gt;
	MyPlayerData* data = (MyPlayerData*)ppd-&amp;gt;getData(ticked_pid, myPlayerDataKey);&lt;br /&gt;
	&lt;br /&gt;
	char buf[128];&lt;br /&gt;
&lt;br /&gt;
	if (data-&amp;gt;dataState == 0)&lt;br /&gt;
	{&lt;br /&gt;
		char* playerName = (char*)ppd-&amp;gt;getSharedData(ticked_pid, &amp;quot;name&amp;quot;);&lt;br /&gt;
		snprintf(buf,sizeof(buf),&amp;quot;Name: %s (Switched %i times)&amp;quot;, playerName, data-&amp;gt;count);&lt;br /&gt;
	}&lt;br /&gt;
	else if (data-&amp;gt;dataState == 1)&lt;br /&gt;
	{&lt;br /&gt;
		char* squadName = (char*)ppd-&amp;gt;getSharedData(ticked_pid, &amp;quot;squad&amp;quot;);&lt;br /&gt;
		snprintf(buf,sizeof(buf),&amp;quot;Squad: %s  (Switched %i times)&amp;quot;, squadName, data-&amp;gt;count);&lt;br /&gt;
	}&lt;br /&gt;
	else &lt;br /&gt;
	{&lt;br /&gt;
		int freq = *(int*)ppd-&amp;gt;getSharedData(ticked_pid, &amp;quot;freq&amp;quot;);&lt;br /&gt;
		snprintf(buf,sizeof(buf),&amp;quot;Freq: %i  (Switched %i times)&amp;quot;, freq, data-&amp;gt;count);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	t-&amp;gt;displayTextScreen2(buf, &amp;quot;yellow&amp;quot;, L_Chat, &amp;amp;topLeft);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// interface functions below&lt;br /&gt;
void* getClassInstance(void* _mm, LoadMode lm)&lt;br /&gt;
{&lt;br /&gt;
	mm = (ModuleManager*)_mm;&lt;br /&gt;
&lt;br /&gt;
	if (lm == LOADMODE_LoadInterfaces)&lt;br /&gt;
	{&lt;br /&gt;
		t = (Text*)mm-&amp;gt;getInterface(__FILE__, I_TEXT);&lt;br /&gt;
		pl = (PlayerList*)mm-&amp;gt;getInterface(__FILE__, I_PLAYERLIST);&lt;br /&gt;
		ppd = (PerPlayerData*)mm-&amp;gt;getInterface(__FILE__, I_PERPLAYERDATA);&lt;br /&gt;
		c = (Controls*)mm-&amp;gt;getInterface(__FILE__, I_CONTROLS);&lt;br /&gt;
&lt;br /&gt;
		mm-&amp;gt;regCallback(__FILE__,CB_PRERENDER, CB_PRERENDER_VERSION, &amp;amp;preRender);&lt;br /&gt;
		mm-&amp;gt;regCallback(__FILE__,CB_CONTROLSLOADED, CB_CONTROLSLOADED_VERSION, &amp;amp;keyControlsLoaded);&lt;br /&gt;
		mm-&amp;gt;regCallback(__FILE__,CB_LOADPERPLAYERDATA, CB_LOADPERPLAYERDATA_VERSION, &amp;amp;loadPerPlayerData);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
extern &amp;quot;C&amp;quot; &lt;br /&gt;
{&lt;br /&gt;
	EXPORT void* getInstance(void* mm, LoadMode lm)&lt;br /&gt;
	{&lt;br /&gt;
		return getClassInstance(mm,lm);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And we're done!&lt;br /&gt;
&lt;br /&gt;
[[Image:Ss6.PNG]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Discretion]]&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Discretion_Module_Tutorial&amp;diff=5606</id>
		<title>Discretion Module Tutorial</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Discretion_Module_Tutorial&amp;diff=5606"/>
				<updated>2007-04-16T16:46:37Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: added categories: Discretion, Guides&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This tutorial is divided into a few pieces. If you're completely new to Discretion, you can view them in order, otherwise you can skip to the one you're interested in.&lt;br /&gt;
&lt;br /&gt;
[[Creating and Testing a Simple Discretion Module]]&lt;br /&gt;
&lt;br /&gt;
[[Discretion Commands and Displaying Images]] (Also covers listening for callbacks and using interfaces)&lt;br /&gt;
&lt;br /&gt;
[[Listening for Key Presses, Displaying Text, and Per Player Data]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Discretion]]&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Writing_Modules_In_Python&amp;diff=4196</id>
		<title>Writing Modules In Python</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Writing_Modules_In_Python&amp;diff=4196"/>
				<updated>2007-04-16T08:42:55Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: /* Moving Balls */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Basic python module ==&lt;br /&gt;
I have tried to comment what is going on in the source. This module demonstrates callbacks, commands and using interfaces.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# demo asss python module&lt;br /&gt;
# dec 28 2004 smong&lt;br /&gt;
&lt;br /&gt;
# nearly always use this&lt;br /&gt;
from asss import *&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# get some interfaces&lt;br /&gt;
# see chat.h for where I_CHAT comes from, see other .h files for more (fx:&lt;br /&gt;
#  game.h)&lt;br /&gt;
chat = get_interface(I_CHAT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# a callback&lt;br /&gt;
# this function is called when a player enters/leaves, see core.h for PA_???&lt;br /&gt;
#  constants&lt;br /&gt;
def paction(p, action, arena):&lt;br /&gt;
    # start indenting&lt;br /&gt;
    if action == PA_ENTERARENA:&lt;br /&gt;
        # see chat.h for the names of more functions like SendMessage&lt;br /&gt;
        chat.SendMessage(p, &amp;quot;hello &amp;quot; + p.name)&lt;br /&gt;
&lt;br /&gt;
# tell asss to call 'paction' when CB_PLAYERACTION is signalled&lt;br /&gt;
# see .h files for CB_??? names&lt;br /&gt;
cb1 = reg_callback(CB_PLAYERACTION, paction)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# a command&lt;br /&gt;
# see cmdman.h for what each parameter does&lt;br /&gt;
def c_moo(cmd, params, p, targ):&lt;br /&gt;
# help text (?help moo)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;\&lt;br /&gt;
Module: &amp;lt;py&amp;gt; demo&lt;br /&gt;
Targets: none&lt;br /&gt;
a sample command.&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    chat.SendMessage(p, &amp;quot;moo cows&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# tell asss to call 'c_moo' when a player types ?moo&lt;br /&gt;
# note: add cmd_moo to conf/groupdef.dir/default so players have permission to&lt;br /&gt;
#  use this command.&lt;br /&gt;
cmd1 = add_command(&amp;quot;moo&amp;quot;, c_moo)&lt;br /&gt;
&lt;br /&gt;
# setting chat (or other interfaces), cb* or cmd* to None is equivalent to&lt;br /&gt;
#  unregistering that item.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Save this in bin/demo.py. Then ingame make sure pymod is loaded by using ?lsmod and ?insmod. Then add this module with the following command: ?insmod &amp;lt;py&amp;gt; demo. Re-entering the arena and typing ?moo should do some stuff.&lt;br /&gt;
&lt;br /&gt;
== Code snippets ==&lt;br /&gt;
The bread and butter of most custom modules.&lt;br /&gt;
=== Callbacks ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from asss import *&lt;br /&gt;
&lt;br /&gt;
chat = get_interface(I_CHAT)&lt;br /&gt;
&lt;br /&gt;
def goal(arena, p, bid, x, y):&lt;br /&gt;
    chat.SendArenaMessage(arena, &amp;quot;goal.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
cb1 = reg_callback(CB_GOAL, goal) &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Commands ===&lt;br /&gt;
Useful for controlling events, fx: ?elim start. In this case the command is ?t1.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from asss import *&lt;br /&gt;
&lt;br /&gt;
chat = get_interface(I_CHAT)&lt;br /&gt;
&lt;br /&gt;
# cmd = the name of the command, fx: elim&lt;br /&gt;
# params = any parameters, fx: start&lt;br /&gt;
# p = who sent the command&lt;br /&gt;
# targ = player or arena&lt;br /&gt;
def c_mycmd(cmd, params, p, targ):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;\&lt;br /&gt;
some help text&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if isinstance(targ, ArenaType):&lt;br /&gt;
        chat.SendMessage(p, &amp;quot;command sent to public chat&amp;quot;)&lt;br /&gt;
    elif isinstance(targ, PlayerType):&lt;br /&gt;
        chat.SendMessage(p, &amp;quot;command sent as priv msg to %s&amp;quot; % targ.name)&lt;br /&gt;
&lt;br /&gt;
cmd1 = add_command(&amp;quot;t1&amp;quot;, c_mycmd)&lt;br /&gt;
#where the &amp;quot;t1&amp;quot; is located would be the name of the command, ex: ?t1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can parse integers from the params using the following code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
try:&lt;br /&gt;
    val = int(params)&lt;br /&gt;
except ValueError:&lt;br /&gt;
    # here the conversion of params from a string to an int failed.&lt;br /&gt;
    # change the next line to 'pass' to silently ignore the conversion error,&lt;br /&gt;
    # 'return' to exit the function, or 'val = 0' to set a default value to val.&lt;br /&gt;
    chat.SendMessage(p, &amp;quot;Integer parameter required.&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manipulating built-in stats (such as kills/points) ===&lt;br /&gt;
This example makes it so team kills don't effect the wins/losses of both players involved.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
stats = get_interface(I_STATS)&lt;br /&gt;
&lt;br /&gt;
def kill(arena, killer, killed, bty, flags, pts, green):&lt;br /&gt;
    # This checks to see if the killer killed someone on the same team.&lt;br /&gt;
    # If so then it will take away a kill from the killer and take away a death from the killed player.&lt;br /&gt;
    # The scores are updated right away and the stats appear as if you never died.&lt;br /&gt;
&lt;br /&gt;
    if killer.freq == killed.freq:&lt;br /&gt;
        # stats can be incremented...&lt;br /&gt;
        stats.IncrementStat(killer, STAT_KILLS, -1)&lt;br /&gt;
&lt;br /&gt;
        # ...or set to an absolute value&lt;br /&gt;
        deaths = stats.GetStat(killed, STAT_DEATHS, INTERVAL_RESET)&lt;br /&gt;
        stats.SetStat(killed, STAT_DEATHS, INTERVAL_RESET, deaths - 1)&lt;br /&gt;
&lt;br /&gt;
        # SendUpdates must be called so everyone's F2 box shows the correct values&lt;br /&gt;
        stats.SendUpdates()&lt;br /&gt;
    &lt;br /&gt;
    return pts, green&lt;br /&gt;
&lt;br /&gt;
cb1 = reg_callback(CB_KILL, kill)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
More STAT_* types can be found in statcodes.h. If you look at stats.h you can see there is also an IncrementStat function&lt;br /&gt;
&lt;br /&gt;
=== Per-player/arena data ===&lt;br /&gt;
Use this to store game state, player score, etc.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def shipchange(p, newship, newfreq):&lt;br /&gt;
    # prefix mymod_ an abbreviation of your module name to the variable&lt;br /&gt;
    #  so that it doesn't clash with other modules. per arena data works&lt;br /&gt;
    #  in exactly the same way.&lt;br /&gt;
    p.mymod_lastship = p.ship&lt;br /&gt;
&lt;br /&gt;
cb1 = reg_callback(CB_SHIPCHANGE, shipchange)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Persistent per-player data ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;color: red; font-weight: bold; border: thin solid; padding: 5px 5px 5px 5px&amp;quot;&amp;gt;Note this has changed since 1.4.2. See bin/fg_turf.py for the latest implementation. Or the example at: http://forums.minegoboom.com/viewtopic.php?p=63321#63321&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ASSS has built in mechanisms for saving data per player and per arena across sessions (users logging off or server restarting).&lt;br /&gt;
&lt;br /&gt;
You need to provide three functions that will be called by ASSS to save, restore and clear the data. The example below is a complete module.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# each player can save a note that only they can see&lt;br /&gt;
&lt;br /&gt;
from asss import *&lt;br /&gt;
&lt;br /&gt;
chat = get_interface(I_CHAT)&lt;br /&gt;
&lt;br /&gt;
# show and store a note&lt;br /&gt;
def c_note(cmd, params, p, targ):&lt;br /&gt;
    if params:&lt;br /&gt;
        p.note = params&lt;br /&gt;
    if p.note:&lt;br /&gt;
        chat.SendMessage(p, &amp;quot;note: %s&amp;quot; % p.note)&lt;br /&gt;
    else:&lt;br /&gt;
        chat.SendMessage(p, &amp;quot;no note set&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
cmd1 = add_command(&amp;quot;note&amp;quot;, c_note)&lt;br /&gt;
&lt;br /&gt;
# return the data to save for player p&lt;br /&gt;
# returning None means &amp;quot;don't store a record in the database,&lt;br /&gt;
# and delete any record that's there already&amp;quot;.&lt;br /&gt;
def getpd(p):&lt;br /&gt;
    return p.note&lt;br /&gt;
&lt;br /&gt;
# restore the data for player p&lt;br /&gt;
def setpd(p, d):&lt;br /&gt;
    p.note = d&lt;br /&gt;
&lt;br /&gt;
# reset/clear the data for player p&lt;br /&gt;
def clearpd(p):&lt;br /&gt;
    p.note = None&lt;br /&gt;
&lt;br /&gt;
mypd = reg_player_persistent(&lt;br /&gt;
	7890, INTERVAL_FOREVER, PERSIST_GLOBAL,&lt;br /&gt;
	getpd, setpd, clearpd)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ideally you should load the module when the server starts. Alternatively if you load it dynamically you can kick everyone (not desirable) or alter the code to catch AttributeError when it attempts to read from the per player data ''.note''.&lt;br /&gt;
&lt;br /&gt;
Taking a look at ''reg_player_persistent'' the number ''7890'' is arbitrary, but must be unique for every module using persistent data. Low numbers are reserved for the core modules. ''INTERVAL_FOREVER'' is how long this data will be kept for. Interestingly the INTERVAL_* constants are defined in statcodes.h, not persist.h. ''PERSIST_GLOBAL'' is defined in persist.h. Here are the respective code extracts (as of Feb 7 2005).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* these are the possible intervals */&lt;br /&gt;
enum interval_t&lt;br /&gt;
{&lt;br /&gt;
	/* pyconst: enum, &amp;quot;INTERVAL_*&amp;quot; */&lt;br /&gt;
&lt;br /&gt;
	/* these are shared between arenas with the same arenagrp */&lt;br /&gt;
	INTERVAL_FOREVER = 0,&lt;br /&gt;
	INTERVAL_RESET,&lt;br /&gt;
	INTERVAL_MAPROTATION,&lt;br /&gt;
	/* these are not shared between arenas */&lt;br /&gt;
	INTERVAL_GAME = 5,&lt;br /&gt;
	INTERVAL_FOREVER_NONSHARED&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
typedef enum persist_scope_t&lt;br /&gt;
{&lt;br /&gt;
	/* pyconst: enum, &amp;quot;PERSIST_*&amp;quot; */&lt;br /&gt;
&lt;br /&gt;
	PERSIST_ALLARENAS,&lt;br /&gt;
	/* using this for scope means per-player data in every arena */&lt;br /&gt;
	/* using this for scope means per-arena data will be stored&lt;br /&gt;
	 * per-arena */&lt;br /&gt;
&lt;br /&gt;
	PERSIST_GLOBAL&lt;br /&gt;
	/* using this for scope means per-player data shared among all arenas */&lt;br /&gt;
	/* using this for scope means per-arena data will be shared among&lt;br /&gt;
	 * all arenas (so it will effectively be global data). */&lt;br /&gt;
} persist_scope_t;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: ASSS must be compiled with the berkeleydb option for persistent data to be available.&lt;br /&gt;
&lt;br /&gt;
=== Attach/Detach ===&lt;br /&gt;
Attaching and detaching is similar to load/unload in a C module except it is arena specific. So you can use it to initialise per-arena data.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def mm_attach(arena):&lt;br /&gt;
    # do stuff with arena&lt;br /&gt;
def mm_detach(arena):&lt;br /&gt;
    # undo stuff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Looping over all players ===&lt;br /&gt;
This example counts the number of players in an arena.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def count_players(arena):&lt;br /&gt;
    # a list must be used as all other variables are immutable to&lt;br /&gt;
    #  nested functions.&lt;br /&gt;
    players = [0]&lt;br /&gt;
    def cb_count(p):&lt;br /&gt;
        if p.arena == arena:&lt;br /&gt;
            players[0] = players[0] + 1&lt;br /&gt;
    for_each_player(cb_count)&lt;br /&gt;
    return players[0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Timers ===&lt;br /&gt;
Good for checking if a game is over yet. '''A reference to the timer is returned and must be retained''' (you can use per-arena data to store it). Losing the reference will cancel the timer.&lt;br /&gt;
&lt;br /&gt;
''initial'' is the time in 1/100th's of a second before the nested function timer() will be called, you can cancel the timer before it is called. ''interval'' is the time gap, again in 1/100th's of a second between all future calls of timer(). So make_hello_timer(100, 200, arena) will make it send the arena message &amp;quot;hello&amp;quot; every 2 seconds starting from 1 second after make_hello_timer() was called.&lt;br /&gt;
&lt;br /&gt;
The third argument to set_timer (''interval'') can be omitted and it will be assumed to be the same as ''initial''.&lt;br /&gt;
&lt;br /&gt;
The parameter ''arena'' is needed in this case because SendArenaMessage() requires an arena parameter.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def make_hello_timer(initial, interval, arena):&lt;br /&gt;
    def timer():&lt;br /&gt;
        # announce&lt;br /&gt;
        chat.SendArenaMessage(arena, &amp;quot;hello&amp;quot;)&lt;br /&gt;
        # non-repeating timer. return 1 for it to be called after the next interval&lt;br /&gt;
        return 0&lt;br /&gt;
    return set_timer(timer, initial, interval)&lt;br /&gt;
&lt;br /&gt;
def somefunc(arena):&lt;br /&gt;
    # create a hello timer that will execute after 1 second, and then every&lt;br /&gt;
    #  2 seconds until cancelled. timers can cancel themselves, see above.&lt;br /&gt;
    myref = make_hello_timer(100, 200, arena)&lt;br /&gt;
&lt;br /&gt;
    # cancel the timer by losing the reference to it&lt;br /&gt;
    myref = None&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Regions ===&lt;br /&gt;
This is untested but it should go something like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mapdata = get_interface(I_MAPDATA)&lt;br /&gt;
&lt;br /&gt;
# regionname is a string, x and y are map tile coords.&lt;br /&gt;
def region_contains(arena, regionname, x, y):&lt;br /&gt;
    success = 0&lt;br /&gt;
&lt;br /&gt;
    rgn = mapdata.FindRegionByName(arena, regionname)&lt;br /&gt;
&lt;br /&gt;
    if rgn != None and mapdata.Contains(rgn, x, y):&lt;br /&gt;
        success = 1&lt;br /&gt;
&lt;br /&gt;
    return success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
It is a good idea to cache ''rgn'' within [[#Per-player.2Farena_data|per-arena data]] so you don't add unecessary load to the server looking it up everytime.&lt;br /&gt;
&lt;br /&gt;
You might come across a region callback when browsing the .h files. This is currently (1.4.2) not available in python.&lt;br /&gt;
&lt;br /&gt;
=== Moving Balls ===&lt;br /&gt;
This is untested but it should go something like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
balls = get_interface(I_BALLS)&lt;br /&gt;
&lt;br /&gt;
# xy are in tiles&lt;br /&gt;
# bid is ball id (0-7, depends how many balls are in the arena)&lt;br /&gt;
def move_ball(arena, bid, x, y):&lt;br /&gt;
    bd = balldata()&lt;br /&gt;
    bd.state = BALL_ONMAP&lt;br /&gt;
    bd.x = x * 16&lt;br /&gt;
    bd.y = y * 16&lt;br /&gt;
    bd.xspeed = bd.yspeed = 0&lt;br /&gt;
    bd.carrier = None&lt;br /&gt;
    bd.freq = -1&lt;br /&gt;
    bd.time = current_ticks()&lt;br /&gt;
    balls.PlaceBall(arena, bid, bd)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Targets ===&lt;br /&gt;
Many of the module interfaces use Targets to specifiy which players should be affected by a function call.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# entire arena&lt;br /&gt;
tgt = arena&lt;br /&gt;
&lt;br /&gt;
# specific player&lt;br /&gt;
tgt = p&lt;br /&gt;
&lt;br /&gt;
# specific freq&lt;br /&gt;
tgt = (arena, freq)&lt;br /&gt;
&lt;br /&gt;
# entire zone&lt;br /&gt;
tgt = &amp;quot;zone&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# example interface function that requires a tgt&lt;br /&gt;
game.WarpTo(tgt, x, y)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Currently (asss 1.4.3) list targets are not supported.&lt;br /&gt;
&lt;br /&gt;
== Trouble shooting ==&lt;br /&gt;
Look at the asss console for execution errors (at the time of writing not all errors are relayed to logged in staff), and if that doesn't help, add some chat.SendArenaMessage(ALLARENAS, &amp;quot;i'm at line ...&amp;quot;) type messages to locate the buggy piece of code.&lt;br /&gt;
&lt;br /&gt;
[[Category:Module]]&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Writing_Modules_In_Python&amp;diff=4190</id>
		<title>Writing Modules In Python</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Writing_Modules_In_Python&amp;diff=4190"/>
				<updated>2007-04-16T08:41:26Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: /* Code snippets */ added moving balls and info on targets&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Basic python module ==&lt;br /&gt;
I have tried to comment what is going on in the source. This module demonstrates callbacks, commands and using interfaces.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# demo asss python module&lt;br /&gt;
# dec 28 2004 smong&lt;br /&gt;
&lt;br /&gt;
# nearly always use this&lt;br /&gt;
from asss import *&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# get some interfaces&lt;br /&gt;
# see chat.h for where I_CHAT comes from, see other .h files for more (fx:&lt;br /&gt;
#  game.h)&lt;br /&gt;
chat = get_interface(I_CHAT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# a callback&lt;br /&gt;
# this function is called when a player enters/leaves, see core.h for PA_???&lt;br /&gt;
#  constants&lt;br /&gt;
def paction(p, action, arena):&lt;br /&gt;
    # start indenting&lt;br /&gt;
    if action == PA_ENTERARENA:&lt;br /&gt;
        # see chat.h for the names of more functions like SendMessage&lt;br /&gt;
        chat.SendMessage(p, &amp;quot;hello &amp;quot; + p.name)&lt;br /&gt;
&lt;br /&gt;
# tell asss to call 'paction' when CB_PLAYERACTION is signalled&lt;br /&gt;
# see .h files for CB_??? names&lt;br /&gt;
cb1 = reg_callback(CB_PLAYERACTION, paction)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# a command&lt;br /&gt;
# see cmdman.h for what each parameter does&lt;br /&gt;
def c_moo(cmd, params, p, targ):&lt;br /&gt;
# help text (?help moo)&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;\&lt;br /&gt;
Module: &amp;lt;py&amp;gt; demo&lt;br /&gt;
Targets: none&lt;br /&gt;
a sample command.&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    chat.SendMessage(p, &amp;quot;moo cows&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# tell asss to call 'c_moo' when a player types ?moo&lt;br /&gt;
# note: add cmd_moo to conf/groupdef.dir/default so players have permission to&lt;br /&gt;
#  use this command.&lt;br /&gt;
cmd1 = add_command(&amp;quot;moo&amp;quot;, c_moo)&lt;br /&gt;
&lt;br /&gt;
# setting chat (or other interfaces), cb* or cmd* to None is equivalent to&lt;br /&gt;
#  unregistering that item.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Save this in bin/demo.py. Then ingame make sure pymod is loaded by using ?lsmod and ?insmod. Then add this module with the following command: ?insmod &amp;lt;py&amp;gt; demo. Re-entering the arena and typing ?moo should do some stuff.&lt;br /&gt;
&lt;br /&gt;
== Code snippets ==&lt;br /&gt;
The bread and butter of most custom modules.&lt;br /&gt;
=== Callbacks ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from asss import *&lt;br /&gt;
&lt;br /&gt;
chat = get_interface(I_CHAT)&lt;br /&gt;
&lt;br /&gt;
def goal(arena, p, bid, x, y):&lt;br /&gt;
    chat.SendArenaMessage(arena, &amp;quot;goal.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
cb1 = reg_callback(CB_GOAL, goal) &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Commands ===&lt;br /&gt;
Useful for controlling events, fx: ?elim start. In this case the command is ?t1.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from asss import *&lt;br /&gt;
&lt;br /&gt;
chat = get_interface(I_CHAT)&lt;br /&gt;
&lt;br /&gt;
# cmd = the name of the command, fx: elim&lt;br /&gt;
# params = any parameters, fx: start&lt;br /&gt;
# p = who sent the command&lt;br /&gt;
# targ = player or arena&lt;br /&gt;
def c_mycmd(cmd, params, p, targ):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;\&lt;br /&gt;
some help text&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if isinstance(targ, ArenaType):&lt;br /&gt;
        chat.SendMessage(p, &amp;quot;command sent to public chat&amp;quot;)&lt;br /&gt;
    elif isinstance(targ, PlayerType):&lt;br /&gt;
        chat.SendMessage(p, &amp;quot;command sent as priv msg to %s&amp;quot; % targ.name)&lt;br /&gt;
&lt;br /&gt;
cmd1 = add_command(&amp;quot;t1&amp;quot;, c_mycmd)&lt;br /&gt;
#where the &amp;quot;t1&amp;quot; is located would be the name of the command, ex: ?t1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can parse integers from the params using the following code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
try:&lt;br /&gt;
    val = int(params)&lt;br /&gt;
except ValueError:&lt;br /&gt;
    # here the conversion of params from a string to an int failed.&lt;br /&gt;
    # change the next line to 'pass' to silently ignore the conversion error,&lt;br /&gt;
    # 'return' to exit the function, or 'val = 0' to set a default value to val.&lt;br /&gt;
    chat.SendMessage(p, &amp;quot;Integer parameter required.&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manipulating built-in stats (such as kills/points) ===&lt;br /&gt;
This example makes it so team kills don't effect the wins/losses of both players involved.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
stats = get_interface(I_STATS)&lt;br /&gt;
&lt;br /&gt;
def kill(arena, killer, killed, bty, flags, pts, green):&lt;br /&gt;
    # This checks to see if the killer killed someone on the same team.&lt;br /&gt;
    # If so then it will take away a kill from the killer and take away a death from the killed player.&lt;br /&gt;
    # The scores are updated right away and the stats appear as if you never died.&lt;br /&gt;
&lt;br /&gt;
    if killer.freq == killed.freq:&lt;br /&gt;
        # stats can be incremented...&lt;br /&gt;
        stats.IncrementStat(killer, STAT_KILLS, -1)&lt;br /&gt;
&lt;br /&gt;
        # ...or set to an absolute value&lt;br /&gt;
        deaths = stats.GetStat(killed, STAT_DEATHS, INTERVAL_RESET)&lt;br /&gt;
        stats.SetStat(killed, STAT_DEATHS, INTERVAL_RESET, deaths - 1)&lt;br /&gt;
&lt;br /&gt;
        # SendUpdates must be called so everyone's F2 box shows the correct values&lt;br /&gt;
        stats.SendUpdates()&lt;br /&gt;
    &lt;br /&gt;
    return pts, green&lt;br /&gt;
&lt;br /&gt;
cb1 = reg_callback(CB_KILL, kill)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
More STAT_* types can be found in statcodes.h. If you look at stats.h you can see there is also an IncrementStat function&lt;br /&gt;
&lt;br /&gt;
=== Per-player/arena data ===&lt;br /&gt;
Use this to store game state, player score, etc.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def shipchange(p, newship, newfreq):&lt;br /&gt;
    # prefix mymod_ an abbreviation of your module name to the variable&lt;br /&gt;
    #  so that it doesn't clash with other modules. per arena data works&lt;br /&gt;
    #  in exactly the same way.&lt;br /&gt;
    p.mymod_lastship = p.ship&lt;br /&gt;
&lt;br /&gt;
cb1 = reg_callback(CB_SHIPCHANGE, shipchange)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Persistent per-player data ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;color: red; font-weight: bold; border: thin solid; padding: 5px 5px 5px 5px&amp;quot;&amp;gt;Note this has changed since 1.4.2. See bin/fg_turf.py for the latest implementation. Or the example at: http://forums.minegoboom.com/viewtopic.php?p=63321#63321&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ASSS has built in mechanisms for saving data per player and per arena across sessions (users logging off or server restarting).&lt;br /&gt;
&lt;br /&gt;
You need to provide three functions that will be called by ASSS to save, restore and clear the data. The example below is a complete module.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# each player can save a note that only they can see&lt;br /&gt;
&lt;br /&gt;
from asss import *&lt;br /&gt;
&lt;br /&gt;
chat = get_interface(I_CHAT)&lt;br /&gt;
&lt;br /&gt;
# show and store a note&lt;br /&gt;
def c_note(cmd, params, p, targ):&lt;br /&gt;
    if params:&lt;br /&gt;
        p.note = params&lt;br /&gt;
    if p.note:&lt;br /&gt;
        chat.SendMessage(p, &amp;quot;note: %s&amp;quot; % p.note)&lt;br /&gt;
    else:&lt;br /&gt;
        chat.SendMessage(p, &amp;quot;no note set&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
cmd1 = add_command(&amp;quot;note&amp;quot;, c_note)&lt;br /&gt;
&lt;br /&gt;
# return the data to save for player p&lt;br /&gt;
# returning None means &amp;quot;don't store a record in the database,&lt;br /&gt;
# and delete any record that's there already&amp;quot;.&lt;br /&gt;
def getpd(p):&lt;br /&gt;
    return p.note&lt;br /&gt;
&lt;br /&gt;
# restore the data for player p&lt;br /&gt;
def setpd(p, d):&lt;br /&gt;
    p.note = d&lt;br /&gt;
&lt;br /&gt;
# reset/clear the data for player p&lt;br /&gt;
def clearpd(p):&lt;br /&gt;
    p.note = None&lt;br /&gt;
&lt;br /&gt;
mypd = reg_player_persistent(&lt;br /&gt;
	7890, INTERVAL_FOREVER, PERSIST_GLOBAL,&lt;br /&gt;
	getpd, setpd, clearpd)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ideally you should load the module when the server starts. Alternatively if you load it dynamically you can kick everyone (not desirable) or alter the code to catch AttributeError when it attempts to read from the per player data ''.note''.&lt;br /&gt;
&lt;br /&gt;
Taking a look at ''reg_player_persistent'' the number ''7890'' is arbitrary, but must be unique for every module using persistent data. Low numbers are reserved for the core modules. ''INTERVAL_FOREVER'' is how long this data will be kept for. Interestingly the INTERVAL_* constants are defined in statcodes.h, not persist.h. ''PERSIST_GLOBAL'' is defined in persist.h. Here are the respective code extracts (as of Feb 7 2005).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* these are the possible intervals */&lt;br /&gt;
enum interval_t&lt;br /&gt;
{&lt;br /&gt;
	/* pyconst: enum, &amp;quot;INTERVAL_*&amp;quot; */&lt;br /&gt;
&lt;br /&gt;
	/* these are shared between arenas with the same arenagrp */&lt;br /&gt;
	INTERVAL_FOREVER = 0,&lt;br /&gt;
	INTERVAL_RESET,&lt;br /&gt;
	INTERVAL_MAPROTATION,&lt;br /&gt;
	/* these are not shared between arenas */&lt;br /&gt;
	INTERVAL_GAME = 5,&lt;br /&gt;
	INTERVAL_FOREVER_NONSHARED&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
typedef enum persist_scope_t&lt;br /&gt;
{&lt;br /&gt;
	/* pyconst: enum, &amp;quot;PERSIST_*&amp;quot; */&lt;br /&gt;
&lt;br /&gt;
	PERSIST_ALLARENAS,&lt;br /&gt;
	/* using this for scope means per-player data in every arena */&lt;br /&gt;
	/* using this for scope means per-arena data will be stored&lt;br /&gt;
	 * per-arena */&lt;br /&gt;
&lt;br /&gt;
	PERSIST_GLOBAL&lt;br /&gt;
	/* using this for scope means per-player data shared among all arenas */&lt;br /&gt;
	/* using this for scope means per-arena data will be shared among&lt;br /&gt;
	 * all arenas (so it will effectively be global data). */&lt;br /&gt;
} persist_scope_t;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: ASSS must be compiled with the berkeleydb option for persistent data to be available.&lt;br /&gt;
&lt;br /&gt;
=== Attach/Detach ===&lt;br /&gt;
Attaching and detaching is similar to load/unload in a C module except it is arena specific. So you can use it to initialise per-arena data.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def mm_attach(arena):&lt;br /&gt;
    # do stuff with arena&lt;br /&gt;
def mm_detach(arena):&lt;br /&gt;
    # undo stuff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Looping over all players ===&lt;br /&gt;
This example counts the number of players in an arena.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def count_players(arena):&lt;br /&gt;
    # a list must be used as all other variables are immutable to&lt;br /&gt;
    #  nested functions.&lt;br /&gt;
    players = [0]&lt;br /&gt;
    def cb_count(p):&lt;br /&gt;
        if p.arena == arena:&lt;br /&gt;
            players[0] = players[0] + 1&lt;br /&gt;
    for_each_player(cb_count)&lt;br /&gt;
    return players[0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Timers ===&lt;br /&gt;
Good for checking if a game is over yet. '''A reference to the timer is returned and must be retained''' (you can use per-arena data to store it). Losing the reference will cancel the timer.&lt;br /&gt;
&lt;br /&gt;
''initial'' is the time in 1/100th's of a second before the nested function timer() will be called, you can cancel the timer before it is called. ''interval'' is the time gap, again in 1/100th's of a second between all future calls of timer(). So make_hello_timer(100, 200, arena) will make it send the arena message &amp;quot;hello&amp;quot; every 2 seconds starting from 1 second after make_hello_timer() was called.&lt;br /&gt;
&lt;br /&gt;
The third argument to set_timer (''interval'') can be omitted and it will be assumed to be the same as ''initial''.&lt;br /&gt;
&lt;br /&gt;
The parameter ''arena'' is needed in this case because SendArenaMessage() requires an arena parameter.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def make_hello_timer(initial, interval, arena):&lt;br /&gt;
    def timer():&lt;br /&gt;
        # announce&lt;br /&gt;
        chat.SendArenaMessage(arena, &amp;quot;hello&amp;quot;)&lt;br /&gt;
        # non-repeating timer. return 1 for it to be called after the next interval&lt;br /&gt;
        return 0&lt;br /&gt;
    return set_timer(timer, initial, interval)&lt;br /&gt;
&lt;br /&gt;
def somefunc(arena):&lt;br /&gt;
    # create a hello timer that will execute after 1 second, and then every&lt;br /&gt;
    #  2 seconds until cancelled. timers can cancel themselves, see above.&lt;br /&gt;
    myref = make_hello_timer(100, 200, arena)&lt;br /&gt;
&lt;br /&gt;
    # cancel the timer by losing the reference to it&lt;br /&gt;
    myref = None&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Regions ===&lt;br /&gt;
This is untested but it should go something like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mapdata = get_interface(I_MAPDATA)&lt;br /&gt;
&lt;br /&gt;
# regionname is a string, x and y are map tile coords.&lt;br /&gt;
def region_contains(arena, regionname, x, y):&lt;br /&gt;
    success = 0&lt;br /&gt;
&lt;br /&gt;
    rgn = mapdata.FindRegionByName(arena, regionname)&lt;br /&gt;
&lt;br /&gt;
    if rgn != None and mapdata.Contains(rgn, x, y):&lt;br /&gt;
        success = 1&lt;br /&gt;
&lt;br /&gt;
    return success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
It is a good idea to cache ''rgn'' within [[#Per-player.2Farena_data|per-arena data]] so you don't add unecessary load to the server looking it up everytime.&lt;br /&gt;
&lt;br /&gt;
You might come across a region callback when browsing the .h files. This is currently (1.4.2) not available in python.&lt;br /&gt;
&lt;br /&gt;
=== Moving Balls ===&lt;br /&gt;
This is untested but it should go something like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# xy are in tiles&lt;br /&gt;
# bid is ball id (0-7, depends how many balls are in the arena)&lt;br /&gt;
def move_ball(arena, bid, x, y):&lt;br /&gt;
    bd = balldata()&lt;br /&gt;
    bd.state = BALL_ONMAP&lt;br /&gt;
    bd.x = x * 16&lt;br /&gt;
    bd.y = y * 16&lt;br /&gt;
    bd.xspeed = bd.yspeed= 0&lt;br /&gt;
    bd.carrier = None&lt;br /&gt;
    bd.freq = -1&lt;br /&gt;
    bd.time = current_ticks()&lt;br /&gt;
    balls.PlaceBall(arena, bid, bd)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Targets ===&lt;br /&gt;
Many of the module interfaces use Targets to specifiy which players should be affected by a function call.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# entire arena&lt;br /&gt;
tgt = arena&lt;br /&gt;
&lt;br /&gt;
# specific player&lt;br /&gt;
tgt = p&lt;br /&gt;
&lt;br /&gt;
# specific freq&lt;br /&gt;
tgt = (arena, freq)&lt;br /&gt;
&lt;br /&gt;
# entire zone&lt;br /&gt;
tgt = &amp;quot;zone&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# example interface function that requires a tgt&lt;br /&gt;
game.WarpTo(tgt, x, y)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Currently (asss 1.4.3) list targets are not supported.&lt;br /&gt;
&lt;br /&gt;
== Trouble shooting ==&lt;br /&gt;
Look at the asss console for execution errors (at the time of writing not all errors are relayed to logged in staff), and if that doesn't help, add some chat.SendArenaMessage(ALLARENAS, &amp;quot;i'm at line ...&amp;quot;) type messages to locate the buggy piece of code.&lt;br /&gt;
&lt;br /&gt;
[[Category:Module]]&lt;br /&gt;
[[Category:Guides]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Talk:Server.ini&amp;diff=5267</id>
		<title>Talk:Server.ini</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Talk:Server.ini&amp;diff=5267"/>
				<updated>2007-04-08T15:11:09Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: /* Directory Servers */ ok&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Oh yes, and sorry about the weird mistakes in here. RegEx's make me lazy. Also, I'm giving information on all the settings I know about, and all the settings Priit has added with explanations in the changelog, but some I have no clue (like most of Comms and Permission) --[[User:Cyan~Fire|Cyan~Fire]]&lt;br /&gt;
&lt;br /&gt;
==TOC==&lt;br /&gt;
&lt;br /&gt;
gerbils, that TOC looks ''really'' ugly. --[[User:Cyan~Fire|Cyan~Fire]]&lt;br /&gt;
&lt;br /&gt;
[[User:I88gerbils|i88gerbils]]: Put it on the left side though it's refreshing to find a Table of Contents on the right.  Better than having it ontop.&lt;br /&gt;
&lt;br /&gt;
[[User:Mine GO BOOM|Mine GO BOOM]]: I like it better on the right than anywhere else. On top is too long, on the left just pushes the page too far over. If you want to get fancy, put it in a floating div box on either side, so the rest of the page wraps around it. Should look better then (though I still think better on the right).&lt;br /&gt;
&lt;br /&gt;
Floating boxes are so annoying to get right. Can't we just take advantage of the &amp;quot;Hide&amp;quot; feature? --[[User:Cyan~Fire|Cyan~Fire]]&lt;br /&gt;
&lt;br /&gt;
[[User:I88gerbils|i88gerbils]]: I told you it looked purrty! :d&lt;br /&gt;
&lt;br /&gt;
== Directory Servers ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[User:Doc Flabby|Doc Flabby]]:  Are the ones in the wiki correct?&lt;br /&gt;
&lt;br /&gt;
    sscentral.subspace.inet.fi,ssdir.playsubspace.com&lt;br /&gt;
&lt;br /&gt;
I thought it was     &lt;br /&gt;
    sscentral.sscuservers.net,ssdir.playsubspace.com&lt;br /&gt;
&lt;br /&gt;
[[User:Smong|Smong]]: You are correct, I have updated the article.&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Server.ini&amp;diff=5277</id>
		<title>Server.ini</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Server.ini&amp;diff=5277"/>
				<updated>2007-04-08T15:10:06Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: /* IP */ updated recommended dirservs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;server.ini is the initialization file for [[subgame]] that controls all of the global settings. Individual arena's settings are stored in arenaname.cfg. The following are the various sections in the server.ini.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right; margin-left: 20px&amp;quot;&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Validation ==&lt;br /&gt;
&lt;br /&gt;
See [[Validation]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Custom ==&lt;br /&gt;
These settings configure custom arenas. (I think?)&lt;br /&gt;
&lt;br /&gt;
=== ArenaMode ===&lt;br /&gt;
''Datatype:'' Enumeration.&lt;br /&gt;
&lt;br /&gt;
This controls the ownership of private arenas. By &amp;quot;own a new subarena&amp;quot;, it means that if the selected level of player creates a new subarena with ?go, and the arena does not have settings associated yet, subgame will create settings for that arena and assign [[arena ownership|ownership]] to the creating player. If the player creating the arena is below the selected level, subgame will still create settings for the arena, but will not grant ownership.&lt;br /&gt;
#Any player can own a new subarena.&lt;br /&gt;
#Mods+ can own a new subarena.&lt;br /&gt;
#Smods+ can own a new subarena.&lt;br /&gt;
#Sysops can own a new subarena.&lt;br /&gt;
#''Special:'' New subarenas will just use spawn.cfg. (That is, a new cfg must be placed in the server directory manually to give an arena its own settings.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Arena ==&lt;br /&gt;
These settings configure default arena settings.&lt;br /&gt;
&lt;br /&gt;
=== ArenaMaxPlayers ===&lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
Number of players allowed in any arena. (This can be overridden in the [[Misc Settings]] for an arena.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ArenaDesiredPlayers ===&lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
Subgame will create a new arena for entering players once an arena hits this population. This is different from the above setting in that users can still manually enter an arena with this population.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ArenaMinimumPlayers ===&lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
Minimum number of players in a public arena before subgame automatically sends a message advising players to move on.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SpawnKeepScores ===&lt;br /&gt;
''Datatype:'' Boolean (1=yes,0=no).&lt;br /&gt;
&lt;br /&gt;
Whether player-spawned arenas keep track of scores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MaxArenas ===&lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
The maximum number of arenas subgame will allow.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MaxArenasMemory ===&lt;br /&gt;
''Datatype:'' Bytes.&lt;br /&gt;
&lt;br /&gt;
The maximum amount of memory subgame will allocate for arena data. Normally the default should suffice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Comms ==&lt;br /&gt;
Communication (networking) settings.&lt;br /&gt;
&lt;br /&gt;
=== MaxQueueToLogin ===&lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
Maximum number of clients waiting to login. Any that try when this limit is exceeded will receive the message &amp;quot;The server is busy handling other login requests. Please try again in a few moments. If problem persists, seek help at the Tech Support Forums found at www.subspacehq.com&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PacketHistoryMax ===&lt;br /&gt;
&lt;br /&gt;
=== IncomingBufferSize ===&lt;br /&gt;
&lt;br /&gt;
=== OutgoingBufferSize ===&lt;br /&gt;
&lt;br /&gt;
=== EncryptMode ===&lt;br /&gt;
&lt;br /&gt;
=== UnreliableBufferSize ===&lt;br /&gt;
&lt;br /&gt;
=== TransportBufferSize ===&lt;br /&gt;
&lt;br /&gt;
=== FlushTime ===&lt;br /&gt;
''Datatype:'' Milliseconds.&lt;br /&gt;
&lt;br /&gt;
Subgame will queue position packets for this amount of time before sending them. ''Setting this too high will severly lag your zone.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== BandwithIdleTime ===&lt;br /&gt;
''Datatype:'' Seconds.&lt;br /&gt;
&lt;br /&gt;
Subgame will stop sending position packets to a spectator after this time of inactivity. Useful for saving bandwidth.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SelectTime ===&lt;br /&gt;
''Datatype:'' Milliseconds.&lt;br /&gt;
&lt;br /&gt;
Time delay subgame should wait for incoming packets before continuing on. This is recommended over CPU:SleepTime.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Misc ==&lt;br /&gt;
Miscellaneous settings.&lt;br /&gt;
&lt;br /&gt;
=== DisableShareware ===&lt;br /&gt;
&lt;br /&gt;
=== RegisterKickShareware ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
Should subgame kick shareware users in favor of registered users when server is full? (Leave set to 0.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MaxSharewarePlayers ===&lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
Maximum number of shareware players allowed on server. ''Special Value:'' -1 = unlimited.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MaxPlayers ===&lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
Maximum total players allowed in zone.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MaxSharewareTime ===&lt;br /&gt;
&lt;br /&gt;
=== DisableSharewareNames ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
Disables the ability for demo players to have customized names. The default displayed name will just be &amp;quot;~Demo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DisableSharewareShips ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
Disables the ability for demo players to use ships 5-8.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DisableSharewareScores ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
Disables the ability for demo players to retain their scores between sessions. ''Note:'' Scores will always be disabled if the players do not have a name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MenuKickOutDelay ===&lt;br /&gt;
''Datatype:'' Hundredths of seconds.&lt;br /&gt;
&lt;br /&gt;
Amount of time a player may take logging in before server disconnects client.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== NoAntiInSafe ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
If enabled, subgame will ignore [[AntiWarp]] of a player in a safe zone.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LockFreqs ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
Determines whether [[Commands#Arena Management|locking]] an arena locks freqs as well as ships. (1.34.3+)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PositionDataAccess ===&lt;br /&gt;
''Datatype:'' Enumeration.&lt;br /&gt;
&lt;br /&gt;
Determines staff level that will receive extra position data when speccing. Useful if [[Misc Settings#ExtraPositionData]] is disabled.&lt;br /&gt;
*0=Sysop (default)&lt;br /&gt;
*1=SMod+&lt;br /&gt;
*2=Mod+&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AlertCommand ===&lt;br /&gt;
''Datatype:'' Comma-delimited list.&lt;br /&gt;
&lt;br /&gt;
If a player types any of these commands preceeded by a '?' followed by a message, subgame will send the message to all online staff. This is a replacement to the BanG ?cheater command. (1.34.3+)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AllowPubScorereset ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
If enabled, players in public arenas may use the ?scorereset command.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AllowPvtScorereset ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
If enabled, players in private arenas may use the ?scorereset command.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TimerDropFlagTerritoryRadius ===&lt;br /&gt;
''Datatype:'' Tiles.&lt;br /&gt;
&lt;br /&gt;
All flags dropped when timer expires (non-neutral) will drop this radius from the ship, overriding [[Flag Settings#FlagTerritoryRadius]]. This is useful for respawning neuted flags (set FlagTerritoryRadius to 0). ''Special value:'' 0 = always use FlagTerritoryRadius.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ShipTypeSwitchResetPeriod ===&lt;br /&gt;
''Datatype:'' Milliseconds (?).&lt;br /&gt;
&lt;br /&gt;
Determines length of time for [[Security Settings#MaxShipTypeSwitchCount]]. ''Special Value:'' 0 = disabled.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== CheckWeapons ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
If enabled, any of the following conditions will trigger a security violation. The checks do not apply to SMod+.&lt;br /&gt;
* Bullet fired with level &amp;gt; [ship]MaxGuns + [Flag]FlaggerGunUpgrade&lt;br /&gt;
* Bouncing bullet fired and [PrizeWeight]BouncingBullets is 0 and [Cost]Bounce  is 0&lt;br /&gt;
* Bomb fired with level &amp;gt; [ship]MaxBombs + [Flag]FlaggerBombUpgrade&lt;br /&gt;
* Prox bomb fired and [PrizeWeight]Proximity is 0 and [Cost]Prox is 0&lt;br /&gt;
* Bomb fired with shrap &amp;gt; [ship]ShrapnelMax&lt;br /&gt;
* Bomb fired with bouncing shrap and [PrizeWeight]BouncingBullets is 0 and  [Cost]Bounce is 0&lt;br /&gt;
* Mine is fired and [ship]MaxMines is 0&lt;br /&gt;
* A prize is picked up and [PrizeWeight] of that prize is 0&lt;br /&gt;
* Stealth is turned on and [ship]StealthStatus is 0&lt;br /&gt;
* Cloak is turned on and [ship]CloakStatus is 0&lt;br /&gt;
* XRadar is turned on and [ship]XRadarStatus is 0&lt;br /&gt;
* Anti-Warp is turned on and [ship]AntiWarpStatus is 0&lt;br /&gt;
* Player uses UFO&lt;br /&gt;
&lt;br /&gt;
=== CheckFastBombing ===&lt;br /&gt;
''Datatype:'' Bitfield.&lt;br /&gt;
&lt;br /&gt;
*1 - Send sysop alert when fastbombing is detected&lt;br /&gt;
*2 - Filter out fastbombs&lt;br /&gt;
*4 - Kick fastbombing player off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== FastBombingThreshold ===&lt;br /&gt;
See above.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LocalChat ===&lt;br /&gt;
''Datatype:'' Comma-delimited list.&lt;br /&gt;
&lt;br /&gt;
Listed chat channels are local to the zone.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ForceObsceneCheck ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
Forces players to have obscene checking on.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== NoFlagRewardLimit ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
Disables the default reward multiplier limit of 2 for [[Flag Settings#FlagRewardMode]].&lt;br /&gt;
&lt;br /&gt;
=== LogPoints ===&lt;br /&gt;
=== PointUpdateDiff ===&lt;br /&gt;
''Datatype:'' Points.&lt;br /&gt;
&lt;br /&gt;
Number of points that will trigger a score update sent to clients.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== JackpotBroadcastPoints ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
If enabled, subgame will broadcast the jackpot points to all zones on the [[billing server]]. Not recommended.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ServerLog ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
If enabled, server will keep a text file log of events.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== KeepAliveDelay ===&lt;br /&gt;
''Datatype:'' Milliseconds.&lt;br /&gt;
&lt;br /&gt;
Delay between keepalive packets sent to clients. Should not be changed.&lt;br /&gt;
&lt;br /&gt;
=== DefaultLevelFile ===&lt;br /&gt;
''Datatype:'' String.&lt;br /&gt;
&lt;br /&gt;
Level file (such as _bzw.lvl) that zone will use for public arenas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Port ===&lt;br /&gt;
''Datatype:'' Short.&lt;br /&gt;
&lt;br /&gt;
Game port that subgame will user. Keep it above 1000 to avoid interference with other networking applications. This needs to be different for every zone running on the same server.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AllowVIEClients ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
Determines whether VIE [[SubSpace]] users are allowed to enter zone at all.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== StaffChat ===&lt;br /&gt;
''Datatype:'' Comma-delimited list.&lt;br /&gt;
&lt;br /&gt;
These chat channels are only joinable by Mods+.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ForceContinuumOnly ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
Determines whether only [[Continuum]] users are allowed to play.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ServerIP ===&lt;br /&gt;
''Datatype:'' IP Address.&lt;br /&gt;
&lt;br /&gt;
WAN IP address of server computer. This can be found using http://www.whatismyip.com/ (easiest), ipconfig, or a router's status page.&lt;br /&gt;
&lt;br /&gt;
== CPU ==&lt;br /&gt;
These settings determine subgame's CPU usage. Usually it performs well, so these should not be changed.&lt;br /&gt;
&lt;br /&gt;
If you don't want subgame to take large amounts of CPU use these settings (or similar):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProcessMaxTime=4&lt;br /&gt;
SleepPerIteration=1&lt;br /&gt;
SleepTime=10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LoopDelay ===&lt;br /&gt;
=== ProcessMaxTime ===&lt;br /&gt;
How long in CPU.&lt;br /&gt;
=== SleepPerIteration ===&lt;br /&gt;
Turns sleep on.&lt;br /&gt;
=== SlowIterationWarningLevel ===&lt;br /&gt;
=== SleepTime ===&lt;br /&gt;
How long until next in CPU.&lt;br /&gt;
&lt;br /&gt;
== Permission ==&lt;br /&gt;
These settings restrict which clients may connect to your zone.&lt;br /&gt;
&lt;br /&gt;
=== AllowBadMachineId ===&lt;br /&gt;
=== AllowLowBandwidth ===&lt;br /&gt;
=== MinimumSecondsToLogin ===&lt;br /&gt;
=== PermissionMaxPoints ===&lt;br /&gt;
=== PermissionMode ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
If enabled, only allows player names listed in permit.txt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AutoPermissionPoints ===&lt;br /&gt;
=== AutoPermissionIDList ===&lt;br /&gt;
=== AutoPermissionMessage ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Password ==&lt;br /&gt;
Passwords for various player levels. Change to your heart's content.&lt;br /&gt;
&lt;br /&gt;
=== SysopPassword ===&lt;br /&gt;
=== EnergyPassword ===&lt;br /&gt;
=== ModeratorPassword ===&lt;br /&gt;
=== SuperModeratorPassword ===&lt;br /&gt;
=== VIPPassword ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Billing ==&lt;br /&gt;
Configures subgame's interaction with the [[biller]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LogMessages ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
Enables &amp;quot;logging&amp;quot; of commands to the biller. It is recommended to turn this off, as it normally just wastes bandwidth.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== IP ===&lt;br /&gt;
''Datatype:'' IP/DNS address.&lt;br /&gt;
&lt;br /&gt;
The address of the biller. If you are running the biller on the same computer as subgame, set this to &amp;lt;tt&amp;gt;localhost&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Password ===&lt;br /&gt;
''Datatype:'' String.&lt;br /&gt;
&lt;br /&gt;
The password to connect to the biller. Normally, this should be the same as subbill.ini's Misc:Password.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ServerName ===&lt;br /&gt;
''Datatype:'' String.&lt;br /&gt;
&lt;br /&gt;
The name of the zone that will be sent to the biller upon connection. This will also be sent to the directory server.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Port ===&lt;br /&gt;
''Datatype:'' Integer.&lt;br /&gt;
&lt;br /&gt;
The port to connect to the biller, which should be equal to subbill.ini's Misc:Port.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ServerId ===&lt;br /&gt;
''Datatype:'' Integer.&lt;br /&gt;
&lt;br /&gt;
The ServerID sent to the biller. This is not often used and should be equal to Misc:Port.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GroupId ===&lt;br /&gt;
''Datatype:'' Integer.&lt;br /&gt;
&lt;br /&gt;
The group this server will join on the biller. This has to do with group operators, and is recommended to leave set to &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ScoreId ===&lt;br /&gt;
''Datatype:'' Integer.&lt;br /&gt;
&lt;br /&gt;
The ScoreID of the server which the biller will use to identify your server between connections. This should normally be the same as Misc:Port.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ReconnectTime ===&lt;br /&gt;
Seems to have no effect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AttemptTime ===&lt;br /&gt;
''Datatype:'' Hundredths of seconds.&lt;br /&gt;
&lt;br /&gt;
How long subgame will attempt unsuccessfully to connect to the biller before it gives up.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Advertise ==&lt;br /&gt;
These settings control subgame's built-in advertisement capability. To use advertisements, just create bitmaps in the SS Palette and save them in the subgame directory as ad0.bmp,ad1.bmp, etc. Prefix the name with &amp;quot;s_&amp;quot; to send to shareware players, with &amp;quot;r_&amp;quot; to send to registered players, and &amp;quot;b_&amp;quot; to send to both. For example, &amp;quot;b_ad0.bmp&amp;quot;. Subgame will then randomly pick advertisements to display to players.&lt;br /&gt;
&lt;br /&gt;
=== SendMode ===&lt;br /&gt;
''Datatype:'' Sum (bitfield).&lt;br /&gt;
&lt;br /&gt;
Determines when advertisements are sent.&lt;br /&gt;
*1 = send them when the player enters the zone.&lt;br /&gt;
*2 = send them when player dies.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DisplayMode ===&lt;br /&gt;
''Datatype:'' Enumeration.&lt;br /&gt;
&lt;br /&gt;
*0 = at top of screen behind all other graphics.&lt;br /&gt;
*1 = at top of screen on top of all other graphics.&lt;br /&gt;
*2 = floating around like a backdrop.&lt;br /&gt;
&lt;br /&gt;
=== Duration ===&lt;br /&gt;
''Datatype:'' Milliseconds.&lt;br /&gt;
&lt;br /&gt;
Length of time an advertisement is displayed. ''Special Value:'' 0 = always on.&lt;br /&gt;
&lt;br /&gt;
== Directory ==&lt;br /&gt;
These settings configure subgame's interaction with the [[directory server]].&lt;br /&gt;
&lt;br /&gt;
=== IP ===&lt;br /&gt;
''Datatype:'' IP/DNS list.&lt;br /&gt;
&lt;br /&gt;
List of directory servers subgame will send its entry to. As of April 2007, the following list is recommended:&lt;br /&gt;
&amp;lt;pre&amp;gt;sscentral.sscuservers.net,ssdir.playsubspace.com&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- note: many hostnames point to the same dirserv which is run by priitk, only one of these needs to be in the list. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Description ===&lt;br /&gt;
''Datatype:'' String.&lt;br /&gt;
&lt;br /&gt;
This description will be sent to the directory server to be associated with your zone. Include an ss:// DNS address to have Continuum keep your IP up to date (see [[Server_Configuration_Faq#What_does_the_ss:.2F.2Fsome.dns_mean_in_zone_description.3F|Server Configuration FAQ]]). You are advised not to use the &amp;quot;&amp;amp;&amp;quot; character inside the description, it displays incorrectly on some clients.&lt;br /&gt;
&lt;br /&gt;
=== NamePassword ===&lt;br /&gt;
''Datatype:'' String.&lt;br /&gt;
&lt;br /&gt;
The password associated with the zone's server prefix. All zones with the same prefix must have the same NamePassword or the Directory server will not list them.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Port ===&lt;br /&gt;
''Datatype:'' Integer.&lt;br /&gt;
&lt;br /&gt;
Leave this set to &amp;lt;tt&amp;gt;4991&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Category:Settings]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Talk:Writing_Modules_In_C&amp;diff=4228</id>
		<title>Talk:Writing Modules In C</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Talk:Writing_Modules_In_C&amp;diff=4228"/>
				<updated>2007-04-08T15:05:09Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: /* Bug? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The example given for how to use the FOR_EACH_PLAYER macro doesn't show '''why''' you need a Link pointer named link!&lt;br /&gt;
&lt;br /&gt;
The example just declares the variable, without initializing it to any value, and '''doesn't do anything with the Link pointer after that'''.&lt;br /&gt;
&lt;br /&gt;
quote from article:&lt;br /&gt;
&amp;quot;''There is an ASSS macro, FOR_EACH_PLAYER, that will help us loop through every player. To use this macro we need: a Player* '''and a Link* named link.'''''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[User:Mine GO BOOM|Mine GO BOOM]] 15:56, Oct 3, 2006 (PDT): In player.h, the macro FOR_EACH_PLAYER is defined as the following. The for line assumes a '''Link*''' variable named '''link''' for it to work correctly. Under C++, you could initalize the '''link''' variable in the '''for''' loop but you cannot in C. A slightly better method would have the '''Link*''' variable name be include in the macro's definition instead of assuming a variable named '''link'''.&lt;br /&gt;
&amp;lt;pre&amp;gt;#define FOR_EACH_PLAYER(p) \&lt;br /&gt;
        for ( \&lt;br /&gt;
                        link = LLGetHead(&amp;amp;pd-&amp;gt;playerlist); \&lt;br /&gt;
                        link &amp;amp;&amp;amp; ((p = link-&amp;gt;data, link = link-&amp;gt;next) || 1); )&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Bug? ===&lt;br /&gt;
&lt;br /&gt;
So looking back on this tutorial I think&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	if (action == MM_LOAD)&lt;br /&gt;
	{&lt;br /&gt;
		mm = mm_;&lt;br /&gt;
&lt;br /&gt;
		chat = mm-&amp;gt;GetInterface(I_CHAT,ALLARENAS);&lt;br /&gt;
		aman = mm-&amp;gt;GetInterface(I_ARENAMAN, ALLARENAS);&lt;br /&gt;
		pd = mm-&amp;gt;GetInterface(I_PLAYERDATA,ALLARENAS);&lt;br /&gt;
&lt;br /&gt;
		if (!chat || !aman || !pd) // check interfaces&lt;br /&gt;
			rv = MM_FAIL;&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			// allocate data&lt;br /&gt;
			arenaKey = aman-&amp;gt;AllocateArenaData(sizeof(MyArenaData));&lt;br /&gt;
			playerKey = pd-&amp;gt;AllocatePlayerData(sizeof(MyPlayerData));&lt;br /&gt;
&lt;br /&gt;
			if (!arenaKey || !playerKey) // check if we ran out of memory&lt;br /&gt;
			{&lt;br /&gt;
				rv = MM_FAIL;&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{ // declare callbacks, commands, and timers&lt;br /&gt;
				mm-&amp;gt;RegCallback(CB_SHIPCHANGE, ShipChange, ALLARENAS);&lt;br /&gt;
				rv = MM_OK;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fails to release the interfaces when there's an error, which will create problems when modules unload. After &amp;quot;rv = MM_FAIL;&amp;quot;, in both instances, I think it's necessary to add&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mm-&amp;gt;releaseInterface(chat);&lt;br /&gt;
mm-&amp;gt;releaseInterface(aman);&lt;br /&gt;
mm-&amp;gt;releaseInterface(pd);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also, the modules shouldn't be listening for MM_ATTACH AND MM_DETACH if it's never using those guys (or the tutorial should cover what they do).&lt;br /&gt;
&lt;br /&gt;
Let me know if I'm wrong. [[User:BaK|BaK]]&lt;br /&gt;
&lt;br /&gt;
Yes the interfaces and allocated arena/player data should be freed properly. However since modules are usually loaded at startup if any module fails to load the server will exit, so any leaks would not matter. [[User:Smong|Smong]] 08:05, Apr 8, 2007 (PDT)&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Server.ini&amp;diff=4168</id>
		<title>Server.ini</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Server.ini&amp;diff=4168"/>
				<updated>2007-03-28T09:40:48Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: /* CPU */ http://forums.minegoboom.com/viewtopic.php?p=70689#70689&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;server.ini is the initialization file for [[subgame]] that controls all of the global settings. Individual arena's settings are stored in arenaname.cfg. The following are the various sections in the server.ini.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right; margin-left: 20px&amp;quot;&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Validation ==&lt;br /&gt;
&lt;br /&gt;
See [[Validation]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Custom ==&lt;br /&gt;
These settings configure custom arenas. (I think?)&lt;br /&gt;
&lt;br /&gt;
=== ArenaMode ===&lt;br /&gt;
''Datatype:'' Enumeration.&lt;br /&gt;
&lt;br /&gt;
This controls the ownership of private arenas. By &amp;quot;own a new subarena&amp;quot;, it means that if the selected level of player creates a new subarena with ?go, and the arena does not have settings associated yet, subgame will create settings for that arena and assign [[arena ownership|ownership]] to the creating player. If the player creating the arena is below the selected level, subgame will still create settings for the arena, but will not grant ownership.&lt;br /&gt;
#Any player can own a new subarena.&lt;br /&gt;
#Mods+ can own a new subarena.&lt;br /&gt;
#Smods+ can own a new subarena.&lt;br /&gt;
#Sysops can own a new subarena.&lt;br /&gt;
#''Special:'' New subarenas will just use spawn.cfg. (That is, a new cfg must be placed in the server directory manually to give an arena its own settings.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Arena ==&lt;br /&gt;
These settings configure default arena settings.&lt;br /&gt;
&lt;br /&gt;
=== ArenaMaxPlayers ===&lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
Number of players allowed in any arena. (This can be overridden in the [[Misc Settings]] for an arena.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ArenaDesiredPlayers ===&lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
Subgame will create a new arena for entering players once an arena hits this population. This is different from the above setting in that users can still manually enter an arena with this population.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ArenaMinimumPlayers ===&lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
Minimum number of players in a public arena before subgame automatically sends a message advising players to move on.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SpawnKeepScores ===&lt;br /&gt;
''Datatype:'' Boolean (1=yes,0=no).&lt;br /&gt;
&lt;br /&gt;
Whether player-spawned arenas keep track of scores.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MaxArenas ===&lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
The maximum number of arenas subgame will allow.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MaxArenasMemory ===&lt;br /&gt;
''Datatype:'' Bytes.&lt;br /&gt;
&lt;br /&gt;
The maximum amount of memory subgame will allocate for arena data. Normally the default should suffice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Comms ==&lt;br /&gt;
Communication (networking) settings.&lt;br /&gt;
&lt;br /&gt;
=== MaxQueueToLogin ===&lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
Maximum number of clients waiting to login. Any that try when this limit is exceeded will receive the message &amp;quot;The server is busy handling other login requests. Please try again in a few moments. If problem persists, seek help at the Tech Support Forums found at www.subspacehq.com&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PacketHistoryMax ===&lt;br /&gt;
&lt;br /&gt;
=== IncomingBufferSize ===&lt;br /&gt;
&lt;br /&gt;
=== OutgoingBufferSize ===&lt;br /&gt;
&lt;br /&gt;
=== EncryptMode ===&lt;br /&gt;
&lt;br /&gt;
=== UnreliableBufferSize ===&lt;br /&gt;
&lt;br /&gt;
=== TransportBufferSize ===&lt;br /&gt;
&lt;br /&gt;
=== FlushTime ===&lt;br /&gt;
''Datatype:'' Milliseconds.&lt;br /&gt;
&lt;br /&gt;
Subgame will queue position packets for this amount of time before sending them. ''Setting this too high will severly lag your zone.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== BandwithIdleTime ===&lt;br /&gt;
''Datatype:'' Seconds.&lt;br /&gt;
&lt;br /&gt;
Subgame will stop sending position packets to a spectator after this time of inactivity. Useful for saving bandwidth.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SelectTime ===&lt;br /&gt;
''Datatype:'' Milliseconds.&lt;br /&gt;
&lt;br /&gt;
Time delay subgame should wait for incoming packets before continuing on. This is recommended over CPU:SleepTime.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Misc ==&lt;br /&gt;
Miscellaneous settings.&lt;br /&gt;
&lt;br /&gt;
=== DisableShareware ===&lt;br /&gt;
&lt;br /&gt;
=== RegisterKickShareware ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
Should subgame kick shareware users in favor of registered users when server is full? (Leave set to 0.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MaxSharewarePlayers ===&lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
Maximum number of shareware players allowed on server. ''Special Value:'' -1 = unlimited.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MaxPlayers ===&lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
Maximum total players allowed in zone.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MaxSharewareTime ===&lt;br /&gt;
&lt;br /&gt;
=== DisableSharewareNames ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
Disables the ability for demo players to have customized names. The default displayed name will just be &amp;quot;~Demo&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DisableSharewareShips ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
Disables the ability for demo players to use ships 5-8.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DisableSharewareScores ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
Disables the ability for demo players to retain their scores between sessions. ''Note:'' Scores will always be disabled if the players do not have a name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MenuKickOutDelay ===&lt;br /&gt;
''Datatype:'' Hundredths of seconds.&lt;br /&gt;
&lt;br /&gt;
Amount of time a player may take logging in before server disconnects client.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== NoAntiInSafe ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
If enabled, subgame will ignore [[AntiWarp]] of a player in a safe zone.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LockFreqs ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
Determines whether [[Commands#Arena Management|locking]] an arena locks freqs as well as ships. (1.34.3+)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PositionDataAccess ===&lt;br /&gt;
''Datatype:'' Enumeration.&lt;br /&gt;
&lt;br /&gt;
Determines staff level that will receive extra position data when speccing. Useful if [[Misc Settings#ExtraPositionData]] is disabled.&lt;br /&gt;
*0=Sysop (default)&lt;br /&gt;
*1=SMod+&lt;br /&gt;
*2=Mod+&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AlertCommand ===&lt;br /&gt;
''Datatype:'' Comma-delimited list.&lt;br /&gt;
&lt;br /&gt;
If a player types any of these commands preceeded by a '?' followed by a message, subgame will send the message to all online staff. This is a replacement to the BanG ?cheater command. (1.34.3+)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AllowPubScorereset ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
If enabled, players in public arenas may use the ?scorereset command.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AllowPvtScorereset ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
If enabled, players in private arenas may use the ?scorereset command.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TimerDropFlagTerritoryRadius ===&lt;br /&gt;
''Datatype:'' Tiles.&lt;br /&gt;
&lt;br /&gt;
All flags dropped when timer expires (non-neutral) will drop this radius from the ship, overriding [[Flag Settings#FlagTerritoryRadius]]. This is useful for respawning neuted flags (set FlagTerritoryRadius to 0). ''Special value:'' 0 = always use FlagTerritoryRadius.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ShipTypeSwitchResetPeriod ===&lt;br /&gt;
''Datatype:'' Milliseconds (?).&lt;br /&gt;
&lt;br /&gt;
Determines length of time for [[Security Settings#MaxShipTypeSwitchCount]]. ''Special Value:'' 0 = disabled.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== CheckWeapons ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
If enabled, any of the following conditions will trigger a security violation. The checks do not apply to SMod+.&lt;br /&gt;
* Bullet fired with level &amp;gt; [ship]MaxGuns + [Flag]FlaggerGunUpgrade&lt;br /&gt;
* Bouncing bullet fired and [PrizeWeight]BouncingBullets is 0 and [Cost]Bounce  is 0&lt;br /&gt;
* Bomb fired with level &amp;gt; [ship]MaxBombs + [Flag]FlaggerBombUpgrade&lt;br /&gt;
* Prox bomb fired and [PrizeWeight]Proximity is 0 and [Cost]Prox is 0&lt;br /&gt;
* Bomb fired with shrap &amp;gt; [ship]ShrapnelMax&lt;br /&gt;
* Bomb fired with bouncing shrap and [PrizeWeight]BouncingBullets is 0 and  [Cost]Bounce is 0&lt;br /&gt;
* Mine is fired and [ship]MaxMines is 0&lt;br /&gt;
* A prize is picked up and [PrizeWeight] of that prize is 0&lt;br /&gt;
* Stealth is turned on and [ship]StealthStatus is 0&lt;br /&gt;
* Cloak is turned on and [ship]CloakStatus is 0&lt;br /&gt;
* XRadar is turned on and [ship]XRadarStatus is 0&lt;br /&gt;
* Anti-Warp is turned on and [ship]AntiWarpStatus is 0&lt;br /&gt;
* Player uses UFO&lt;br /&gt;
&lt;br /&gt;
=== CheckFastBombing ===&lt;br /&gt;
''Datatype:'' Bitfield.&lt;br /&gt;
&lt;br /&gt;
*1 - Send sysop alert when fastbombing is detected&lt;br /&gt;
*2 - Filter out fastbombs&lt;br /&gt;
*4 - Kick fastbombing player off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== FastBombingThreshold ===&lt;br /&gt;
See above.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LocalChat ===&lt;br /&gt;
''Datatype:'' Comma-delimited list.&lt;br /&gt;
&lt;br /&gt;
Listed chat channels are local to the zone.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ForceObsceneCheck ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
Forces players to have obscene checking on.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== NoFlagRewardLimit ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
Disables the default reward multiplier limit of 2 for [[Flag Settings#FlagRewardMode]].&lt;br /&gt;
&lt;br /&gt;
=== LogPoints ===&lt;br /&gt;
=== PointUpdateDiff ===&lt;br /&gt;
''Datatype:'' Points.&lt;br /&gt;
&lt;br /&gt;
Number of points that will trigger a score update sent to clients.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== JackpotBroadcastPoints ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
If enabled, subgame will broadcast the jackpot points to all zones on the [[billing server]]. Not recommended.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ServerLog ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
If enabled, server will keep a text file log of events.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== KeepAliveDelay ===&lt;br /&gt;
''Datatype:'' Milliseconds.&lt;br /&gt;
&lt;br /&gt;
Delay between keepalive packets sent to clients. Should not be changed.&lt;br /&gt;
&lt;br /&gt;
=== DefaultLevelFile ===&lt;br /&gt;
''Datatype:'' String.&lt;br /&gt;
&lt;br /&gt;
Level file (such as _bzw.lvl) that zone will use for public arenas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Port ===&lt;br /&gt;
''Datatype:'' Short.&lt;br /&gt;
&lt;br /&gt;
Game port that subgame will user. Keep it above 1000 to avoid interference with other networking applications. This needs to be different for every zone running on the same server.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AllowVIEClients ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
Determines whether VIE [[SubSpace]] users are allowed to enter zone at all.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== StaffChat ===&lt;br /&gt;
''Datatype:'' Comma-delimited list.&lt;br /&gt;
&lt;br /&gt;
These chat channels are only joinable by Mods+.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ForceContinuumOnly ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
Determines whether only [[Continuum]] users are allowed to play.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ServerIP ===&lt;br /&gt;
''Datatype:'' IP Address.&lt;br /&gt;
&lt;br /&gt;
WAN IP address of server computer. This can be found using http://www.whatismyip.com/ (easiest), ipconfig, or a router's status page.&lt;br /&gt;
&lt;br /&gt;
== CPU ==&lt;br /&gt;
These settings determine subgame's CPU usage. Usually it performs well, so these should not be changed.&lt;br /&gt;
&lt;br /&gt;
If you don't want subgame to take large amounts of CPU use these settings (or similar):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ProcessMaxTime=4&lt;br /&gt;
SleepPerIteration=1&lt;br /&gt;
SleepTime=10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LoopDelay ===&lt;br /&gt;
=== ProcessMaxTime ===&lt;br /&gt;
How long in CPU.&lt;br /&gt;
=== SleepPerIteration ===&lt;br /&gt;
Turns sleep on.&lt;br /&gt;
=== SlowIterationWarningLevel ===&lt;br /&gt;
=== SleepTime ===&lt;br /&gt;
How long until next in CPU.&lt;br /&gt;
&lt;br /&gt;
== Permission ==&lt;br /&gt;
These settings restrict which clients may connect to your zone.&lt;br /&gt;
&lt;br /&gt;
=== AllowBadMachineId ===&lt;br /&gt;
=== AllowLowBandwidth ===&lt;br /&gt;
=== MinimumSecondsToLogin ===&lt;br /&gt;
=== PermissionMaxPoints ===&lt;br /&gt;
=== PermissionMode ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
If enabled, only allows player names listed in permit.txt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AutoPermissionPoints ===&lt;br /&gt;
=== AutoPermissionIDList ===&lt;br /&gt;
=== AutoPermissionMessage ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Password ==&lt;br /&gt;
Passwords for various player levels. Change to your heart's content.&lt;br /&gt;
&lt;br /&gt;
=== SysopPassword ===&lt;br /&gt;
=== EnergyPassword ===&lt;br /&gt;
=== ModeratorPassword ===&lt;br /&gt;
=== SuperModeratorPassword ===&lt;br /&gt;
=== VIPPassword ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Billing ==&lt;br /&gt;
Configures subgame's interaction with the [[biller]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LogMessages ===&lt;br /&gt;
''Datatype:'' Boolean.&lt;br /&gt;
&lt;br /&gt;
Enables &amp;quot;logging&amp;quot; of commands to the biller. It is recommended to turn this off, as it normally just wastes bandwidth.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== IP ===&lt;br /&gt;
''Datatype:'' IP/DNS address.&lt;br /&gt;
&lt;br /&gt;
The address of the biller. If you are running the biller on the same computer as subgame, set this to &amp;lt;tt&amp;gt;localhost&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Password ===&lt;br /&gt;
''Datatype:'' String.&lt;br /&gt;
&lt;br /&gt;
The password to connect to the biller. Normally, this should be the same as subbill.ini's Misc:Password.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ServerName ===&lt;br /&gt;
''Datatype:'' String.&lt;br /&gt;
&lt;br /&gt;
The name of the zone that will be sent to the biller upon connection. This will also be sent to the directory server.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Port ===&lt;br /&gt;
''Datatype:'' Integer.&lt;br /&gt;
&lt;br /&gt;
The port to connect to the biller, which should be equal to subbill.ini's Misc:Port.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ServerId ===&lt;br /&gt;
''Datatype:'' Integer.&lt;br /&gt;
&lt;br /&gt;
The ServerID sent to the biller. This is not often used and should be equal to Misc:Port.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GroupId ===&lt;br /&gt;
''Datatype:'' Integer.&lt;br /&gt;
&lt;br /&gt;
The group this server will join on the biller. This has to do with group operators, and is recommended to leave set to &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ScoreId ===&lt;br /&gt;
''Datatype:'' Integer.&lt;br /&gt;
&lt;br /&gt;
The ScoreID of the server which the biller will use to identify your server between connections. This should normally be the same as Misc:Port.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ReconnectTime ===&lt;br /&gt;
Seems to have no effect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AttemptTime ===&lt;br /&gt;
''Datatype:'' Hundredths of seconds.&lt;br /&gt;
&lt;br /&gt;
How long subgame will attempt unsuccessfully to connect to the biller before it gives up.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Advertise ==&lt;br /&gt;
These settings control subgame's built-in advertisement capability. To use advertisements, just create bitmaps in the SS Palette and save them in the subgame directory as ad0.bmp,ad1.bmp, etc. Prefix the name with &amp;quot;s_&amp;quot; to send to shareware players, with &amp;quot;r_&amp;quot; to send to registered players, and &amp;quot;b_&amp;quot; to send to both. For example, &amp;quot;b_ad0.bmp&amp;quot;. Subgame will then randomly pick advertisements to display to players.&lt;br /&gt;
&lt;br /&gt;
=== SendMode ===&lt;br /&gt;
''Datatype:'' Sum (bitfield).&lt;br /&gt;
&lt;br /&gt;
Determines when advertisements are sent.&lt;br /&gt;
*1 = send them when the player enters the zone.&lt;br /&gt;
*2 = send them when player dies.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DisplayMode ===&lt;br /&gt;
''Datatype:'' Enumeration.&lt;br /&gt;
&lt;br /&gt;
*0 = at top of screen behind all other graphics.&lt;br /&gt;
*1 = at top of screen on top of all other graphics.&lt;br /&gt;
*2 = floating around like a backdrop.&lt;br /&gt;
&lt;br /&gt;
=== Duration ===&lt;br /&gt;
''Datatype:'' Milliseconds.&lt;br /&gt;
&lt;br /&gt;
Length of time an advertisement is displayed. ''Special Value:'' 0 = always on.&lt;br /&gt;
&lt;br /&gt;
== Directory ==&lt;br /&gt;
These settings configure subgame's interaction with the [[directory server]].&lt;br /&gt;
&lt;br /&gt;
=== IP ===&lt;br /&gt;
''Datatype:'' IP/DNS list.&lt;br /&gt;
&lt;br /&gt;
List of directory servers subgame will send its entry to. As of June 2006, the following list is recommended:&lt;br /&gt;
&amp;lt;pre&amp;gt;sscentral.subspace.inet.fi,ssdir.playsubspace.com&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- note: many hostnames point to the same dirserv which is run by priitk, only one of these needs to be in the list. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Description ===&lt;br /&gt;
''Datatype:'' String.&lt;br /&gt;
&lt;br /&gt;
This description will be sent to the directory server to be associated with your zone. Include an ss:// DNS address to have Continuum keep your IP up to date (see [[Server_Configuration_Faq#What_does_the_ss:.2F.2Fsome.dns_mean_in_zone_description.3F|Server Configuration FAQ]]). You are advised not to use the &amp;quot;&amp;amp;&amp;quot; character inside the description, it displays incorrectly on some clients.&lt;br /&gt;
&lt;br /&gt;
=== NamePassword ===&lt;br /&gt;
''Datatype:'' String.&lt;br /&gt;
&lt;br /&gt;
The password associated with the zone's server prefix. All zones with the same prefix must have the same NamePassword or the Directory server will not list them.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Port ===&lt;br /&gt;
''Datatype:'' Integer.&lt;br /&gt;
&lt;br /&gt;
Leave this set to &amp;lt;tt&amp;gt;4991&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Category:Settings]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Talk:Hosts&amp;diff=4199</id>
		<title>Talk:Hosts</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Talk:Hosts&amp;diff=4199"/>
				<updated>2007-03-26T14:32:43Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: sso updates&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[User:CypherJF|CypherJF]]: Actually I don't think SSN is run by L Chance anymore. I'm not sure the history of it but the latest back I can remember was Altec . running it with Sideburn? Spring/Summer of 2004, Altec . and L Chance brought back SSN using Lord Maucaub's biller system. They shut it back down after HALO switched back to SSZ; and now I believe Dark Mistress / TheBest999 / Cospar / MS-DOS; someone is running it.&lt;br /&gt;
&lt;br /&gt;
[[User:Smong|Smong]]: I think NTC has it now. They keep changing tags which is annoying. For the record I remember them with SSDM and TNT too if you want to stick that in a 'most annoying network decisions ever' page.&lt;br /&gt;
&lt;br /&gt;
[[User:CypherJF|CypherJF]]: Yeah NTC is the Dark Mistress / TheBest999 / Cospar / MS-DOS network.&lt;br /&gt;
&lt;br /&gt;
[[User:Smong|Smong]]:Someone add NTC and SSDT at least. Also I think this page should be called Networks, but that is more jargon I guess and could easily be confused.&lt;br /&gt;
&lt;br /&gt;
[[User:D1st0rt|D1st0rt]]:Whoa 17th is near me? Trench still has a lower ping&lt;br /&gt;
&lt;br /&gt;
== Category? ==&lt;br /&gt;
&lt;br /&gt;
There's already a category called ''Servers'', don't you think this should belong there? I know you couldn't have the short descriptions, but they're kinda hard to keep track of and not that useful. --[[User:Cyan~Fire|Cyan~Fire]]&lt;br /&gt;
&lt;br /&gt;
Well, hmm. We could always make each server its own category, the short desc goes on the category desc, and each zone is added to the specific server category they are on. [[User:Pests|Pests]]&lt;br /&gt;
&lt;br /&gt;
[[User:Smong|Smong]]: I don't think search looks at categories (I feel like I am typing that several times a day).&lt;br /&gt;
&lt;br /&gt;
I wasn't saying remove the page, just saying get rid of the server list, since it'll soon become outdated and is redundant. But, whatever, no biggie. --[[User:Cyan~Fire|Cyan~Fire]]&lt;br /&gt;
&lt;br /&gt;
== Combine Pages? ==&lt;br /&gt;
&lt;br /&gt;
Since there's actually not all that much info to put about each of these servers, how would you feel about me merging all of the individual server pages here? This page could be divided up into Active and Inactive servers, if that's a problem. --[[User:Cyan~Fire|Cyan~Fire]]&lt;br /&gt;
&lt;br /&gt;
[[User:Smong|Smong]]: SSZ Subspace Network? I think that needs changing. SSN is still run by L. Chance? Also who nicked the css for the wiki?&lt;br /&gt;
&lt;br /&gt;
== Cleanup ==&lt;br /&gt;
&lt;br /&gt;
[[User:Smong|Smong]]:&lt;br /&gt;
I don't like the look of this page. First Servers, I would prefer a page called Hosts or Networks.&lt;br /&gt;
&lt;br /&gt;
Next a table of active networks, columns are: tag, owners + contact, website, billing (yes, own billing/yes, tag of other biller/no biller) and location. &amp;lt;s&amp;gt;A network is considered active if it has its own menu on [http://stats.17thparallel.com stats.17thparallel.com].&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:Smong|Smong]] 16:10, Mar 11, 2007 (PDT): A network is any tag with more than 1 zone or has been up for a noticeable period of time.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=1&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Tag&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Operators&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Website&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Billing&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Location&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;CSSS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;unknown&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;unknown&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, Central&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PSS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Doc Flabby&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;[http://www.playsubspace.com/ www.playsubspace.com]&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;unknown&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, West&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSCC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Freakmonger&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, East&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSCE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Luminate &amp;lt;luminate rshl.org&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, East&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSCI&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Argyle&amp;lt;br&amp;gt;Death+ &amp;lt;dxexaxtxh gmail.com&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, Central&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSCU&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PriitK &amp;lt;priitk trenchwars.org&amp;gt;&amp;lt;br&amp;gt;Argyle&amp;lt;br&amp;gt;Death+ &amp;lt;dxexaxtxh gmail.com&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, Multiple&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSCX&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PriitK &amp;lt;priitk trenchwars.org&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, East&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSDC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;blackjayde &amp;lt;support xtremegaming.net&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;[http://ssdc.xtremegaming.net/ ssdc.xtremegaming.net]&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSDC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, East&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSEO&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cybersnipe, contempt&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;http://www.ssenetwork.com/&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, East&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSL&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Steigerwald&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, Central&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSO&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;cybersnipe, contempt&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;http://www.ssenetwork.com/&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, East&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SST&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Confess &amp;lt;confess321 yahoo.com&amp;gt;&amp;lt;br&amp;gt;Top Gun. &amp;lt;ajchuck achosting.net&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;[http://www.ssthosting.net www.ssthosting.net]&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SST&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, East&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;T3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Mecbot+&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, East&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The purpose of this table is to serve as a summary of active hosts and so people can quickly find contact details of who is operating them.&lt;br /&gt;
&lt;br /&gt;
Next, a seperate section (or possibly page) containing a history of the networks, start/end dates, ownership, comments (reason for creation/closure, generally accepted reputation).&lt;br /&gt;
&lt;br /&gt;
[[User:I88gerbils|i88gerbils]]: Why not give a brief 1-line summary of TAG, host, web site making the tag a wiki link to description + contact information?  Kind of like the corporation info bar on wikipedia.&lt;br /&gt;
&lt;br /&gt;
{{host|Tag=SSCX|ServerName=SubSpace X|Contact=Xalimar|Email=}}?  {{zone}}?&lt;br /&gt;
&lt;br /&gt;
Agreed with basically all of this. I'll change the name now, and probably separate this at least into current and historical. --[[User:Cyan~Fire|Cyan~Fire]]&lt;br /&gt;
&lt;br /&gt;
[[User:Smong|Smong]]: There's a long way yet to go. I'm still making my way through the recent changes and may start rewriting this page later.&lt;br /&gt;
&lt;br /&gt;
--[[User:I88gerbils|i88gerbils]] 16:24, Mar 10, 2006 (EST): I like my style better.  It's pretty easy to just add a standard wiki template to add an entry.  And probably easier to add CSS for just that template to pretty it up if MGB wants.&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Talk:Hosts&amp;diff=4161</id>
		<title>Talk:Hosts</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Talk:Hosts&amp;diff=4161"/>
				<updated>2007-03-11T23:10:22Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: added pss&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[User:CypherJF|CypherJF]]: Actually I don't think SSN is run by L Chance anymore. I'm not sure the history of it but the latest back I can remember was Altec . running it with Sideburn? Spring/Summer of 2004, Altec . and L Chance brought back SSN using Lord Maucaub's biller system. They shut it back down after HALO switched back to SSZ; and now I believe Dark Mistress / TheBest999 / Cospar / MS-DOS; someone is running it.&lt;br /&gt;
&lt;br /&gt;
[[User:Smong|Smong]]: I think NTC has it now. They keep changing tags which is annoying. For the record I remember them with SSDM and TNT too if you want to stick that in a 'most annoying network decisions ever' page.&lt;br /&gt;
&lt;br /&gt;
[[User:CypherJF|CypherJF]]: Yeah NTC is the Dark Mistress / TheBest999 / Cospar / MS-DOS network.&lt;br /&gt;
&lt;br /&gt;
[[User:Smong|Smong]]:Someone add NTC and SSDT at least. Also I think this page should be called Networks, but that is more jargon I guess and could easily be confused.&lt;br /&gt;
&lt;br /&gt;
[[User:D1st0rt|D1st0rt]]:Whoa 17th is near me? Trench still has a lower ping&lt;br /&gt;
&lt;br /&gt;
== Category? ==&lt;br /&gt;
&lt;br /&gt;
There's already a category called ''Servers'', don't you think this should belong there? I know you couldn't have the short descriptions, but they're kinda hard to keep track of and not that useful. --[[User:Cyan~Fire|Cyan~Fire]]&lt;br /&gt;
&lt;br /&gt;
Well, hmm. We could always make each server its own category, the short desc goes on the category desc, and each zone is added to the specific server category they are on. [[User:Pests|Pests]]&lt;br /&gt;
&lt;br /&gt;
[[User:Smong|Smong]]: I don't think search looks at categories (I feel like I am typing that several times a day).&lt;br /&gt;
&lt;br /&gt;
I wasn't saying remove the page, just saying get rid of the server list, since it'll soon become outdated and is redundant. But, whatever, no biggie. --[[User:Cyan~Fire|Cyan~Fire]]&lt;br /&gt;
&lt;br /&gt;
== Combine Pages? ==&lt;br /&gt;
&lt;br /&gt;
Since there's actually not all that much info to put about each of these servers, how would you feel about me merging all of the individual server pages here? This page could be divided up into Active and Inactive servers, if that's a problem. --[[User:Cyan~Fire|Cyan~Fire]]&lt;br /&gt;
&lt;br /&gt;
[[User:Smong|Smong]]: SSZ Subspace Network? I think that needs changing. SSN is still run by L. Chance? Also who nicked the css for the wiki?&lt;br /&gt;
&lt;br /&gt;
== Cleanup ==&lt;br /&gt;
&lt;br /&gt;
[[User:Smong|Smong]]:&lt;br /&gt;
I don't like the look of this page. First Servers, I would prefer a page called Hosts or Networks.&lt;br /&gt;
&lt;br /&gt;
Next a table of active networks, columns are: tag, owners + contact, website, billing (yes, own billing/yes, tag of other biller/no biller) and location. &amp;lt;s&amp;gt;A network is considered active if it has its own menu on [http://stats.17thparallel.com stats.17thparallel.com].&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[User:Smong|Smong]] 16:10, Mar 11, 2007 (PDT): A network is any tag with more than 1 zone or has been up for a noticeable period of time.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=1&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Tag&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Operators&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Website&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Billing&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Location&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;CSSS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;unknown&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;unknown&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, Central&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;PSS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Doc Flabby&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;[http://www.playsubspace.com/ www.playsubspace.com]&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;unknown&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, West&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSCC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Freakmonger&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, East&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSCE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Luminate &amp;lt;luminate rshl.org&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, East&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSCI&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Argyle&amp;lt;br&amp;gt;Death+ &amp;lt;dxexaxtxh gmail.com&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, Central&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSCU&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PriitK &amp;lt;priitk trenchwars.org&amp;gt;&amp;lt;br&amp;gt;Argyle&amp;lt;br&amp;gt;Death+ &amp;lt;dxexaxtxh gmail.com&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, Multiple&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSCX&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PriitK &amp;lt;priitk trenchwars.org&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, East&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSDC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;blackjayde &amp;lt;support xtremegaming.net&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;[http://ssdc.xtremegaming.net/ ssdc.xtremegaming.net]&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSDC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, East&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSEO&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;unknown&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;unknown&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, East&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSL&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Steigerwald&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, Central&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SST&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Confess &amp;lt;confess321 yahoo.com&amp;gt;&amp;lt;br&amp;gt;Top Gun. &amp;lt;ajchuck achosting.net&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;[http://www.ssthosting.net www.ssthosting.net]&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SST&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, East&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;T3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Mecbot+&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, East&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The purpose of this table is to serve as a summary of active hosts and so people can quickly find contact details of who is operating them.&lt;br /&gt;
&lt;br /&gt;
Next, a seperate section (or possibly page) containing a history of the networks, start/end dates, ownership, comments (reason for creation/closure, generally accepted reputation).&lt;br /&gt;
&lt;br /&gt;
[[User:I88gerbils|i88gerbils]]: Why not give a brief 1-line summary of TAG, host, web site making the tag a wiki link to description + contact information?  Kind of like the corporation info bar on wikipedia.&lt;br /&gt;
&lt;br /&gt;
{{host|Tag=SSCX|ServerName=SubSpace X|Contact=Xalimar|Email=}}?  {{zone}}?&lt;br /&gt;
&lt;br /&gt;
Agreed with basically all of this. I'll change the name now, and probably separate this at least into current and historical. --[[User:Cyan~Fire|Cyan~Fire]]&lt;br /&gt;
&lt;br /&gt;
[[User:Smong|Smong]]: There's a long way yet to go. I'm still making my way through the recent changes and may start rewriting this page later.&lt;br /&gt;
&lt;br /&gt;
--[[User:I88gerbils|i88gerbils]] 16:24, Mar 10, 2006 (EST): I like my style better.  It's pretty easy to just add a standard wiki template to add an entry.  And probably easier to add CSS for just that template to pretty it up if MGB wants.&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Talk:Hosts&amp;diff=4160</id>
		<title>Talk:Hosts</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Talk:Hosts&amp;diff=4160"/>
				<updated>2007-03-11T22:58:57Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: updated hosts table&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[User:CypherJF|CypherJF]]: Actually I don't think SSN is run by L Chance anymore. I'm not sure the history of it but the latest back I can remember was Altec . running it with Sideburn? Spring/Summer of 2004, Altec . and L Chance brought back SSN using Lord Maucaub's biller system. They shut it back down after HALO switched back to SSZ; and now I believe Dark Mistress / TheBest999 / Cospar / MS-DOS; someone is running it.&lt;br /&gt;
&lt;br /&gt;
[[User:Smong|Smong]]: I think NTC has it now. They keep changing tags which is annoying. For the record I remember them with SSDM and TNT too if you want to stick that in a 'most annoying network decisions ever' page.&lt;br /&gt;
&lt;br /&gt;
[[User:CypherJF|CypherJF]]: Yeah NTC is the Dark Mistress / TheBest999 / Cospar / MS-DOS network.&lt;br /&gt;
&lt;br /&gt;
[[User:Smong|Smong]]:Someone add NTC and SSDT at least. Also I think this page should be called Networks, but that is more jargon I guess and could easily be confused.&lt;br /&gt;
&lt;br /&gt;
[[User:D1st0rt|D1st0rt]]:Whoa 17th is near me? Trench still has a lower ping&lt;br /&gt;
&lt;br /&gt;
== Category? ==&lt;br /&gt;
&lt;br /&gt;
There's already a category called ''Servers'', don't you think this should belong there? I know you couldn't have the short descriptions, but they're kinda hard to keep track of and not that useful. --[[User:Cyan~Fire|Cyan~Fire]]&lt;br /&gt;
&lt;br /&gt;
Well, hmm. We could always make each server its own category, the short desc goes on the category desc, and each zone is added to the specific server category they are on. [[User:Pests|Pests]]&lt;br /&gt;
&lt;br /&gt;
[[User:Smong|Smong]]: I don't think search looks at categories (I feel like I am typing that several times a day).&lt;br /&gt;
&lt;br /&gt;
I wasn't saying remove the page, just saying get rid of the server list, since it'll soon become outdated and is redundant. But, whatever, no biggie. --[[User:Cyan~Fire|Cyan~Fire]]&lt;br /&gt;
&lt;br /&gt;
== Combine Pages? ==&lt;br /&gt;
&lt;br /&gt;
Since there's actually not all that much info to put about each of these servers, how would you feel about me merging all of the individual server pages here? This page could be divided up into Active and Inactive servers, if that's a problem. --[[User:Cyan~Fire|Cyan~Fire]]&lt;br /&gt;
&lt;br /&gt;
[[User:Smong|Smong]]: SSZ Subspace Network? I think that needs changing. SSN is still run by L. Chance? Also who nicked the css for the wiki?&lt;br /&gt;
&lt;br /&gt;
== Cleanup ==&lt;br /&gt;
&lt;br /&gt;
[[User:Smong|Smong]]:&lt;br /&gt;
I don't like the look of this page. First Servers, I would prefer a page called Hosts or Networks.&lt;br /&gt;
&lt;br /&gt;
Next a table of active networks, columns are: tag, owners + contact, website, billing (yes, own billing/yes, tag of other biller/no biller) and location. A network is considered active if it has its own menu on [http://stats.17thparallel.com stats.17thparallel.com].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=1&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Tag&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Operators&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Website&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Billing&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Location&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;CSSS&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;unknown&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;unknown&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, Central&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSCC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Freakmonger&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, East&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSCE&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Luminate &amp;lt;luminate rshl.org&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, East&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSCI&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Argyle&amp;lt;br&amp;gt;Death+ &amp;lt;dxexaxtxh gmail.com&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, Central&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSCU&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PriitK &amp;lt;priitk trenchwars.org&amp;gt;&amp;lt;br&amp;gt;Argyle&amp;lt;br&amp;gt;Death+ &amp;lt;dxexaxtxh gmail.com&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, Multiple&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSCX&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;PriitK &amp;lt;priitk trenchwars.org&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, East&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSDC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;blackjayde &amp;lt;support xtremegaming.net&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;[http://ssdc.xtremegaming.net/ ssdc.xtremegaming.net]&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSDC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, East&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSEO&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;unknown&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;unknown&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, East&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SSL&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Steigerwald&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, Central&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;SST&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Confess &amp;lt;confess321 yahoo.com&amp;gt;&amp;lt;br&amp;gt;Top Gun. &amp;lt;ajchuck achosting.net&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;[http://www.ssthosting.net www.ssthosting.net]&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SST&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;T3&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Mecbot+&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;SSC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;USA, East&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The purpose of this table is to serve as a summary of active hosts and so people can quickly find contact details of who is operating them.&lt;br /&gt;
&lt;br /&gt;
Next, a seperate section (or possibly page) containing a history of the networks, start/end dates, ownership, comments (reason for creation/closure, generally accepted reputation).&lt;br /&gt;
&lt;br /&gt;
[[User:I88gerbils|i88gerbils]]: Why not give a brief 1-line summary of TAG, host, web site making the tag a wiki link to description + contact information?  Kind of like the corporation info bar on wikipedia.&lt;br /&gt;
&lt;br /&gt;
{{host|Tag=SSCX|ServerName=SubSpace X|Contact=Xalimar|Email=}}?  {{zone}}?&lt;br /&gt;
&lt;br /&gt;
Agreed with basically all of this. I'll change the name now, and probably separate this at least into current and historical. --[[User:Cyan~Fire|Cyan~Fire]]&lt;br /&gt;
&lt;br /&gt;
[[User:Smong|Smong]]: There's a long way yet to go. I'm still making my way through the recent changes and may start rewriting this page later.&lt;br /&gt;
&lt;br /&gt;
--[[User:I88gerbils|i88gerbils]] 16:24, Mar 10, 2006 (EST): I like my style better.  It's pretty easy to just add a standard wiki template to add an entry.  And probably easier to add CSS for just that template to pretty it up if MGB wants.&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=TCP_Billing_FAQ&amp;diff=5048</id>
		<title>TCP Billing FAQ</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=TCP_Billing_FAQ&amp;diff=5048"/>
				<updated>2007-02-11T15:14:29Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: added two new questions, deleted old unanswered question&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== What's so special about TCP billers? ==&lt;br /&gt;
TCP billers use a new simpler protocol compared to the original UDP billers.&lt;br /&gt;
&lt;br /&gt;
== Can I use subgame with a TCP biller? ==&lt;br /&gt;
No, currently only ASSS can connect to a TCP biller. It is possible to use proxy to convert between the UDP and TCP protocols to allow subgame.&lt;br /&gt;
&lt;br /&gt;
== Why is there no ability for the billing server to shutdown/restart a server? ==&lt;br /&gt;
The ability of the billing servers to shutdown a zone server is a relic from the old system. The biller is no longer an administrative and control server, but simply a validation system used to control passwords for player names and bans.&lt;br /&gt;
&lt;br /&gt;
== Are there any TCP billers available for public download? ==&lt;br /&gt;
Yes, but only unfinished ones.&lt;br /&gt;
&lt;br /&gt;
* Two different versions of [[POCoB]] written by [[User:Smong|Smong]] are available at http://toktok.sscentral.com/ss-pocob.php.&lt;br /&gt;
* [[SkyBill]] written by [[User:Doc flabby|Doc Flabby]] is available at http://playsubspace.com.&lt;br /&gt;
&lt;br /&gt;
[[Category: FAQ]]&lt;br /&gt;
[[Category: Protocol]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=TCP_Billing_FAQ&amp;diff=4147</id>
		<title>TCP Billing FAQ</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=TCP_Billing_FAQ&amp;diff=4147"/>
				<updated>2007-02-11T15:07:47Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: /* Are there any TCP billers available for public download? */ grammar&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Why is there no ability for the billing server to shutdown/restart a server? ==&lt;br /&gt;
The ability of the billing servers to shutdown a zone server is a relic from the old system. The biller is no longer an administrative and control server, but simply a validation system used to control passwords for player names and bans.&lt;br /&gt;
&lt;br /&gt;
== Are there any TCP billers available for public download? ==&lt;br /&gt;
Yes, but only unfinished ones.&lt;br /&gt;
&lt;br /&gt;
* Two different versions of [[POCoB]] written by [[User:Smong|Smong]] are available at http://toktok.sscentral.com/ss-pocob.php.&lt;br /&gt;
* [[SkyBill]] written by [[User:Doc flabby|Doc Flabby]] is available at http://playsubspace.com.&lt;br /&gt;
&lt;br /&gt;
== Why should I use a TCP biller instead of something like SSC? ==&lt;br /&gt;
- answer me -&lt;br /&gt;
&lt;br /&gt;
[[Category: FAQ]]&lt;br /&gt;
[[Category: Protocol]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=TCP_Billing_FAQ&amp;diff=4146</id>
		<title>TCP Billing FAQ</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=TCP_Billing_FAQ&amp;diff=4146"/>
				<updated>2007-02-11T15:07:20Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: /* Are there any TCP billers available for public download? */ ew, cleaned this up.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Why is there no ability for the billing server to shutdown/restart a server? ==&lt;br /&gt;
The ability of the billing servers to shutdown a zone server is a relic from the old system. The biller is no longer an administrative and control server, but simply a validation system used to control passwords for player names and bans.&lt;br /&gt;
&lt;br /&gt;
== Are there any TCP billers available for public download? ==&lt;br /&gt;
Yes, but only unfinished ones.&lt;br /&gt;
&lt;br /&gt;
* Two different versions of [[POCoB]] written by [[User:Smong|Smong]] is available at http://toktok.sscentral.com/ss-pocob.php.&lt;br /&gt;
* [[SkyBill]] written by [[User:Doc flabby|Doc Flabby]] is available at http://playsubspace.com.&lt;br /&gt;
&lt;br /&gt;
== Why should I use a TCP biller instead of something like SSC? ==&lt;br /&gt;
- answer me -&lt;br /&gt;
&lt;br /&gt;
[[Category: FAQ]]&lt;br /&gt;
[[Category: Protocol]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Talk:Biller&amp;diff=5605</id>
		<title>Talk:Biller</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Talk:Biller&amp;diff=5605"/>
				<updated>2007-02-11T15:00:32Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;quot;Today, the name Billing Server is confusing as it is just a user database.&amp;quot;&lt;br /&gt;
How is that so? -L.C.&lt;br /&gt;
&lt;br /&gt;
Because no one is &amp;quot;billed&amp;quot; for playing this game. Today its primary function is storing user accounts. -Smong&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Zone.dat&amp;diff=5602</id>
		<title>Zone.dat</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Zone.dat&amp;diff=5602"/>
				<updated>2007-01-15T10:12:43Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: fixed category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Zone.dat format ==&lt;br /&gt;
&lt;br /&gt;
For each zone an entry like this must exist.&lt;br /&gt;
&lt;br /&gt;
The last field indicates that [[Continuum]] will not warn you are entering a non-[[SSC]] zone.  This is changed to 1 if you tick the box do not warn me again in Continuum.  The unknown field often seems to contain a dns name for some zones such as &amp;quot;server.trenchwars.org&amp;quot; for Trench Wars.&lt;br /&gt;
&amp;lt;Warn non-SSC zone&amp;gt; value is ignored by Continuum if the zone is an SSC zone.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Zone name&amp;gt;,&amp;lt;Zone ip&amp;gt;,&amp;lt;Zone port&amp;gt;,&amp;lt;unknown dns (can be left blank)&amp;gt;,&amp;lt;Warn non-SSC zone&amp;gt;&lt;br /&gt;
#&amp;lt;description&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSCU Trench Wars,66.36.241.110,5400,server.trenchwars.org,0&lt;br /&gt;
#SSCU Trench Wars - Sysops: DoCk&amp;gt; and PriitK - http://www.trenchwars.org ss://server.trenchwars.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tips and Tricks ==&lt;br /&gt;
&lt;br /&gt;
In the zone description you can prefix URLs with a name in brackets like so:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
(Zone Website)http://zone.website/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then in the &amp;quot;Web Links &amp;amp; News&amp;quot; menu you can name your links.&lt;br /&gt;
&lt;br /&gt;
[[Category: Formats]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Zone.dat&amp;diff=4111</id>
		<title>Zone.dat</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Zone.dat&amp;diff=4111"/>
				<updated>2007-01-15T10:11:33Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: /* Tips and Tricks */ added naming links tip&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Category Formats]]&lt;br /&gt;
&lt;br /&gt;
== Zone.dat format ==&lt;br /&gt;
&lt;br /&gt;
For each zone an entry like this must exist.&lt;br /&gt;
&lt;br /&gt;
The last field indicates that [[Continuum]] will not warn you are entering a non-[[SSC]] zone.  This is changed to 1 if you tick the box do not warn me again in Continuum.  The unknown field often seems to contain a dns name for some zones such as &amp;quot;server.trenchwars.org&amp;quot; for Trench Wars.&lt;br /&gt;
&amp;lt;Warn non-SSC zone&amp;gt; value is ignored by Continuum if the zone is an SSC zone.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Zone name&amp;gt;,&amp;lt;Zone ip&amp;gt;,&amp;lt;Zone port&amp;gt;,&amp;lt;unknown dns (can be left blank)&amp;gt;,&amp;lt;Warn non-SSC zone&amp;gt;&lt;br /&gt;
#&amp;lt;description&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSCU Trench Wars,66.36.241.110,5400,server.trenchwars.org,0&lt;br /&gt;
#SSCU Trench Wars - Sysops: DoCk&amp;gt; and PriitK - http://www.trenchwars.org ss://server.trenchwars.org&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tips and Tricks ==&lt;br /&gt;
&lt;br /&gt;
In the zone description you can prefix URLs with a name in brackets like so:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
(Zone Website)http://zone.website/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then in the &amp;quot;Web Links &amp;amp; News&amp;quot; menu you can name your links.&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=Misc_Settings&amp;diff=4092</id>
		<title>Misc Settings</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=Misc_Settings&amp;diff=4092"/>
				<updated>2006-11-30T17:08:14Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: /* VictoryMusic */ redefinition, at least for asss&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[Misc] These settings determine various arena properties that (supposedly) didn't fit in any other section.&lt;br /&gt;
&lt;br /&gt;
=== FrequencyShipTypes === &lt;br /&gt;
''Datatype:'' Boolean (1=yes, 0=no).&lt;br /&gt;
&lt;br /&gt;
Whether ships are frequency-specific (freq0 uses warbird, freq1 uses javelin, and so on).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== WarpPointDelay ===&lt;br /&gt;
''Datatype:'' Hundredths of seconds.&lt;br /&gt;
&lt;br /&gt;
How long a Portal point is active.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DecoyAliveTime === &lt;br /&gt;
''Datatype:'' Hundredths of seconds.&lt;br /&gt;
&lt;br /&gt;
Time before a decoy disappears. Note that decoy will instantly disappear if owner enters safe zone.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== BounceFactor ===&lt;br /&gt;
''Datatype:'' Factor.&lt;br /&gt;
&lt;br /&gt;
How bouncy the walls are. ''Formula:'' SpeedAfter = SpeedBefore * (16 / BounceFactor).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SafetyLimit ===&lt;br /&gt;
''Datatype:'' Hundredths of seconds. (90000 = 15 mins)&lt;br /&gt;
&lt;br /&gt;
Time a player can spend in the safe zone before getting kicked. Use this to encourage users to spec when AFK.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TickerDelay === &lt;br /&gt;
''Datatype:'' Hundredths of seconds.&lt;br /&gt;
&lt;br /&gt;
Time between ticker help messages.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== WarpRadiusLimit ===&lt;br /&gt;
''Datatype:'' Tiles.&lt;br /&gt;
&lt;br /&gt;
Ships randomly placed on the map can be a maximum of this far from the map's center. Note that 1024 will cover the entire map.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ActivateAppShutdownTime ===&lt;br /&gt;
''Datatype:'' Hundredths of seconds.&lt;br /&gt;
&lt;br /&gt;
Time a ship is shutdown when user reactivates client application (when user comes back from Windows mode).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== NearDeathLevel ===&lt;br /&gt;
''Datatype:'' Energy.&lt;br /&gt;
&lt;br /&gt;
Energy that constitutes a near-death experience. The server will reduce the ship's bounty by 1 when this occurs. (Used for dueling zones.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== VictoryMusic ===&lt;br /&gt;
''Datatype:'' Boolean (1=yes, 0=no).&lt;br /&gt;
&lt;br /&gt;
Whether the zone plays the victory music when a team is winning a flag game.&lt;br /&gt;
&lt;br /&gt;
In ASSS (1.4.3) victory music will always be played when a team is winning (provided you are using the default fg_wz module). I set to 1 this setting instead has the effect of disallowing staff from forcefully starting the victory music by typing %100.&lt;br /&gt;
&lt;br /&gt;
=== BannerPoints ===&lt;br /&gt;
''Datatype:'' Points.&lt;br /&gt;
&lt;br /&gt;
Points required for a player to display a banner.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MaxLossesToPlay ===&lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
Deaths before a player is forced into spectator mode. ''Special Value:'' 0 = no limit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SpectatorQuiet === &lt;br /&gt;
''Datatype:'' Boolean (1=yes, 0=no).&lt;br /&gt;
&lt;br /&gt;
Whether spectators can talk to active players.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MaxPlaying ===&lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
Maximum number of players that can be playing (not spectating) at one time. ''Special Value:'' 0 = no limit (but still obeys maximum players in arena). Staff can bypass this limit. Also this setting really means MaxPlaying-1=..., so MaxPlaying=7 actually allows 8 players.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TimedGame ===&lt;br /&gt;
''Datatype:'' Hundredths of a second.&lt;br /&gt;
&lt;br /&gt;
Time in a timed game (like speed zone). ''Special Value:'' 0 = not a timed game.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ResetScoreOnFrequencyChange ===&lt;br /&gt;
''Datatype:'' Boolean (1=yes, 0=no).&lt;br /&gt;
&lt;br /&gt;
Whether a player changing frequency resets his score. (Used primarily for timed games like soccer.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SendPositionDelay ===&lt;br /&gt;
''Datatype:'' Hundredths of a second (0 to 20).&lt;br /&gt;
&lt;br /&gt;
Time between position packets sent by clients. Do not modify this setting without a good reason.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SlowFrameCheck === &lt;br /&gt;
''Datatype:'' Boolean (1=yes, 0=no).&lt;br /&gt;
&lt;br /&gt;
Whether to check for slow frames on the client (possible cheat technique). '''Warning:''' flawed on some machines, do not use.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SlowFrameRate ===&lt;br /&gt;
''Datatype:'' Frames per second (0 to 35).&lt;br /&gt;
&lt;br /&gt;
A frame rate less than this setting is considered slow by the above setting.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AllowSavedShips === &lt;br /&gt;
''Datatype:'' Boolean (1=yes, 0=no).&lt;br /&gt;
&lt;br /&gt;
Whether ships' stats are saved between arenas and after lagouts. Do not enable this if subarenas have different ship settings.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== FrequencyShift ===&lt;br /&gt;
''Datatype:'' Hertz (0 to 10000).&lt;br /&gt;
&lt;br /&gt;
Random frequency shift applied to sounds to make them more realistic.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ExtraPositionData === &lt;br /&gt;
''Datatype:'' Boolean (1=yes, 0=no).&lt;br /&gt;
&lt;br /&gt;
Whether regular players receive sysop data about a ship. Leave this off.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SheepMessage ===&lt;br /&gt;
''Datatype:'' String.&lt;br /&gt;
&lt;br /&gt;
Message that appears when a player types ?sheep, in commemoration of the first sheep cloning. Sound 24 '[http://wiki.minegoboom.com/upload/sounds/bong24.wav baa]' is sent with the message.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MaxPlayers ===&lt;br /&gt;
''Datatype:'' Count.&lt;br /&gt;
&lt;br /&gt;
Maximum amount of players in this arena. Will override server.ini's max arena setting.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GreetMessage ===&lt;br /&gt;
''Datatype:'' String.&lt;br /&gt;
&lt;br /&gt;
This message will be sent when a player enters the arena. Note that if the arena is public, then it will essentially be a zone-enter message.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PeriodicMessage0 ===&lt;br /&gt;
''Datatype:'' Mixed.&lt;br /&gt;
&lt;br /&gt;
This setting and the following set automatically repeating arena messages. Must be set to this format: [Repeat Delay] [Delay before start after arena creation] [Message]. Delays are in minutes. Prefix [Message] with '*' to make the message zone-wide. ''Special Value:'' 0 = no message.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PeriodicMessage1 === &lt;br /&gt;
''Datatype:'' Mixed.&lt;br /&gt;
&lt;br /&gt;
See above.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PeriodicMessage2 === &lt;br /&gt;
''Datatype:'' Mixed.&lt;br /&gt;
&lt;br /&gt;
See above.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PeriodicMessage3 === &lt;br /&gt;
''Datatype:'' Mixed.&lt;br /&gt;
&lt;br /&gt;
See above.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== PeriodicMessage4 === &lt;br /&gt;
''Datatype:'' Mixed.&lt;br /&gt;
&lt;br /&gt;
See above.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MaxXRes ===&lt;br /&gt;
''Datatype:'' Resolution.&lt;br /&gt;
&lt;br /&gt;
Max X-res allowed. ''Special Value:'' 0 = no limit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MaxYRes ===&lt;br /&gt;
''Datatype:'' Resolution.&lt;br /&gt;
&lt;br /&gt;
Max Y-res allowed. ''Special Value:'' 0 = no limit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ContinuumOnly ===&lt;br /&gt;
''Datatype:'' Boolean (1=yes, 0=no).&lt;br /&gt;
&lt;br /&gt;
Enable to allow VIE clients only to spec, and not to play.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== LevelFiles ===&lt;br /&gt;
''Datatype:'' Filename list.&lt;br /&gt;
&lt;br /&gt;
Files used by arena, seperated by commas, that will be downloaded via client. A '+' in front of a file will make it optional. Put LVZs here.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MinUsage ===&lt;br /&gt;
''Datatype:'' Hours.&lt;br /&gt;
&lt;br /&gt;
Total usage required to play in this arena.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== StartInSpec ===&lt;br /&gt;
''Datatype:'' Boolean (1=yes, 0=no).&lt;br /&gt;
&lt;br /&gt;
Enable to make all players enter in spec, no matter what ship they choose on the menu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MaxTimerDrift ===&lt;br /&gt;
''Datatype:'' Tenths of a percent.&lt;br /&gt;
&lt;br /&gt;
Percentage of how much client timer is allowed to differ from server timer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DisableScreenshot ===&lt;br /&gt;
''Datatype:'' Boolean (1=yes, 0=no).&lt;br /&gt;
&lt;br /&gt;
Only allows spectators to take screenshots.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AntiWarpSettleDelay ===&lt;br /&gt;
''Datatype:'' Hundredths of seconds.&lt;br /&gt;
&lt;br /&gt;
Delay after a player warps/portals/attaches before he can warp/portal/attach again. (Acts like a personal antiwarp.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SaveSpawnScore ===&lt;br /&gt;
''Datatype:'' Boolean (1=yes, 0=no).&lt;br /&gt;
&lt;br /&gt;
Whether to save spawn scores to arenaname.scr. Disable to prevent creation of large amounts of *.scr files in the server directory.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TeamKillPoints ===&lt;br /&gt;
''Datatype:'' Boolean (1=yes, 0=no).&amp;lt;br&amp;gt;&lt;br /&gt;
''Compatibility:'' ASSS.&lt;br /&gt;
&lt;br /&gt;
Whether points are awarded for a team-kill.&lt;br /&gt;
&lt;br /&gt;
[[Category: Settings]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	<entry>
		<id>http://wiki.minegoboom.com/index.php?title=MERVBot&amp;diff=4963</id>
		<title>MERVBot</title>
		<link rel="alternate" type="text/html" href="http://wiki.minegoboom.com/index.php?title=MERVBot&amp;diff=4963"/>
				<updated>2006-11-22T17:19:22Z</updated>
		
		<summary type="html">&lt;p&gt;Smong: fixed link to catids site&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MERVBot is an open source bot core written by [[catid]] in C++. It is modular, meaning that you can download user made plugins that will perform a desired action (such as Elim, or Lag Checking).&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[http://catid.ssihosting.com/files/MERVBot.rar Latest Version]&lt;br /&gt;
*A [[MERVBot_script|script for running MERVBot inside linux]].&lt;br /&gt;
&lt;br /&gt;
Here is a rather dubious link to a rar unpacker for those of you that don't like the rar icon ftp://ftp.externet.hu/pub/mirror/sac/pack/unpacker.zip&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
*[http://catid.sscontinuum.com Homepage]&lt;br /&gt;
*[[MERVBot Tutorial]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Bots]]&lt;/div&gt;</summary>
		<author><name>Smong</name></author>	</entry>

	</feed>