*******************************************************
*                                                     *
* Q2Admin DLL v0.96 Alpha for Quake2                  *
* (c) Shane Powell 1998                               *
*                                                     *
* Date: 13 January 1999                               *
*                                                     *
* Win32 / Linux / Solaris releases                    *
*                                                     *
* http://homepages.ihug.co.nz/~swpowell/alpha/        *
*                                                     *
*******************************************************

NOTE: this is an ALPHA release so don't give this away.


Q2 Admin is a transparent proxy mod that adds many admin
functions plus ZBot detection (including hacked bots) to
Quake2.  It works with all Quake2 mods transparently by
filtering communication between the server and the primary
mod it is running on top of.



Contents:

1. Install.

1.1. Windows Install.

1.2. Linux Install.

1.3. Solaris Install.

2. Admin Commands and Setup.

2.1. Admin Commands.

2.2. q2admin.cfg setup.

2.3. Quake2 client admin.

2.4. Quake2 Server admin.

2.5. Admin command reference.

2.6. Impulses explained.

2.7. Advanced admin commands.

2.7.1. Max Rate / Max fps.

2.7.2. IP / Nick Banning.

2.7.3. Limited rcon.

2.8. play_all, play_team, play_person and say_person.

2.9. Message of the Day (MOTD).

3. Logging explained.

4. Credits.

5. Copyright and Distribution Permissions.

6. Release History.





1. Install
----------

1.1. Windows Install
--------------------

Installation for servers running Quake2 v3.20

1. Shut down the Quake2 Server.

2. Create a directory off the Quake2 root directory called 
'release'

3. Copy the gamex86.dll into the 'release' directory.

4. Copy the q2admin.cfg into the Quake2 root directory 
(wherever Quake2.exe is). 

5. Start the server as usual.


The  Q2Admin  prints it's version number out just before 
the standard "==== InitGame ====" when the server starts.


To enable overflow detection you must set logfile to 2 or
3 on the server.  This is best done by adding it to your
server.cfg file.




Installation for servers running Quake2 up to v3.19

1. Shut down the Quake2 Server.

2. Copy the gamex86.dll and q2admin.cfg into the Quake2 root
directory (wherever Quake2.exe is). You shouldn't 
be overwriting any mod files unless you already have a 
seamless dll installed for another mod (I believe there is 
a camera mod that is seamless).  You can only run one 
seamless dll at a time.

3. Start the server as usual.


The  Q2Admin  prints it's version number out just before 
the standard "==== InitGame ====" when the server starts.

To enable overflow detection you must set logfile to 2 or
3 on the server.  This is best done by adding it to your
server.cfg file.




1.2. Linux Install
------------------

1. Shut down the Quake2 Server.

2. Uncompress q2admin-0.96.tar.gz into the Quake2 root
directory.  e.g. "tar zxf q2admin-0.96.tar.gz"

3. For each mod that you want to protect, copy the 
following files into the mod directory.
    install
    q2admin.so
    q2admin.cfg*

*Optional. Use only if you want to customize the Q2Admin
config for this particular mod rather than use the global
Q2Admin config.

4. Run "install" once. (e.g. ". ./install")

5. Start the server as usual.

The Q2Admin prints it's version number out just before 
the standard "==== InitGame ====" when the server starts.


The "install" script moves the old gamei386.so to 
gamei386.real.so and moves q2admin.so gamei386.so.  
If the install script is run again the files are moved 
back to there original names.  This can be used to 
uninstall or enable / disable the detect bot code.

To enable overflow detection you must set logfile to 2 or
3 on the server.  This is best done by adding it to your
server.cfg file (v3.20 only).




1.3. Solaris Install
--------------------

The Solaris port is done by the SolarEclipse.  Go check 
them out for ports of other Quake2 mods to Solaris OS.

http://www.planetquake.com/eclipse


Intel Solaris OS:
----------------

1. Shut down the Quake2 Server.

2. Uncompress q2admin_096_solx86.tar.gz into the Quake2 root
directory.  e.g. "tar zxf q2admin_096_solx86.tar.gz"

3. For each mod that you want to protect, copy the 
following files into the mod directory.
    install.ksh
    q2admin.so
    q2admin.cfg*

*Optional. Use only if you want to customize the Q2Admin
config for this particular mod rather than use the global
Q2Admin config.

4. Run "install" once. (e.g. ". ./install")

5. Start the server as usual.

The Q2Admin prints it's version number out just before 
the standard "==== InitGame ====" when the server starts.


The "install" script moves the old gamei386.so to 
gamei386.real.so and moves q2admin.so gamei386.so.  
If the install script is run again the files are moved 
back to there original names.  This can be used to 
uninstall or enable / disable the detect bot code.

To enable overflow detection you must set logfile to 2 or
3 on the server.  This is best done by adding it to your
server.cfg file (v3.20 only).



Sparc Solaris OS:
----------------

1. Shut down the Quake2 Server.

2. Uncompress q2admin_096_sparc.tar.gz into the Quake2 root
directory.  e.g. "tar zxf q2admin_096_sparc.tar.gz"

3. For each mod that you want to protect, copy the 
following files into the mod directory.
    install.ksh
    q2admin.so
    q2admin.cfg*

*Optional. Use only if you want to customize the Q2Admin
config for this particular mod rather than use the global
Q2Admin config.

4. Run "install" once. (e.g. ". ./install")

5. Start the server as usual.

The Q2Admin prints it's version number out just before 
the standard "==== InitGame ====" when the server starts.


The "install" script moves the old gamesparc.so to 
gamesparc.real.so and moves q2admin.so gamesparc.so.  
If the install script is run again the files are moved 
back to there original names.  This can be used to 
uninstall or enable / disable the detect bot code.


To enable overflow detection you must set logfile to 2 or
3 on the server.  This is best done by adding it to your
server.cfg file (v3.20 only).




2. Admin commands and Setup
---------------------------


2.1. Admin commands
-------------------

There are 3 ways to use admin commands.

1. In the q2admin.cfg for initial configuration.
2. In a Quake2 client connected to a server running Q2Admin.
3. On the server console.



2.2. q2admin.cfg setup
-------------------------

The configuration file is automatically read from two places.
It first reads q2admin.cfg from the Quake2 directory then
from the mod directory.

Anyone wanting to make a configuration specific to a mod 
can copy the q2admin.cfg into the mod directory and 
modify it for the requirements of that mod.

q2admin.cfg SHOULD NOT BE "EXEC"ED IN Quake2.  Doing so will
cause problems.


The format for the .cfg file is as follows:

Lines beginning with a ';' are comment lines and are 
ignored. e.g.

; this is a comment line.


The standard layout for a config command is as follows:

<command> "<value>"

Note the value must always be in quotes.  e.g.

adminpassword "secret"

For string values there are some special commands.  To have 
a double quote in a value, you either use '\"' or '\q'.  To
use a newline in a string you use '\n'.  To use a '\' in a 
string you use '\\'.  e.g.

customservercmd "error \"Get off my server, ZBot user!\""

For a list of configuration commands see section 2.5.




2.3. Quake2 client admin
------------------------

By default the Quake2 client admin is disabled. To enable it
you must provide a password. Edit the q2admin.cfg file 
and add a default password.

All remote admin commands must be prefixed with a '!'.  

Before you can use any of the remote admin commands you
must login.  Logging in puts the user in admin mode where 
he/she can run admin commands. Admin mode lasts until
the level changes, the server is shut down or the player
disconnects from the server.  There can be multiple 
admins logged in at the same time.


To log into admin mode, from the Quake2 client use the 
command '!setadmin' with the admin password that was 
set in q2admin.cfg file.

e.g.

!setadmin secret

The server will print the 'q2admin Admin mode active'.

Once set you can begin to use admin commands. If you try to
setadmin again the server will tell you that you are already
in admin mode.

For string values there are some special commands.  To have 
a double quote in a value, you must use '\q'.  To use a 
new line in a string you use '\n'.  To use a '$' in a string
you use a '\d'. To use a '\' in a string you use '\\'.  
e.g.

!customservercmd "error \qGet off my server, ZBot user!\q"

or

!ban + name re ^VK-.*\d password duck


When typing in a command on the client console you
don't have to type the whole command in most cases, you just 
need to type in enough of the command to make it unique.
e.g. 
!customs "error \qGet off my server, ZBot user!\q"

For a list of admin commands see section 2.5.




2.4. Quake2 Server admin
------------------------

All admin commands run from the server console must be
prefixed with 'sv !'.

e.g.
'sv !ban name blank'


For string values there are some special commands.  To have 
a double quote in a value, you must use '\q'.  To use a 
newline in a string you use '\n'.  To use a '$' in a string
you use a '\d'. To use a '\' in a string you use '\\'.  
e.g.

sv !customservercmd "error \qGet off my server, ZBot user!\q"

or

sv !ban + name re ^VK-.*\d password duck


When typing in a command on the server console you
don't have to type the whole command in most cases, you just 
need to type in enough of the command to make it unique.
e.g. 
sv !customs "error \qstuff off ZBot user\q"

For a list of server admin commands see section 2.5.




2.5. Admin command reference
----------------------------

Command:	"adminpassword"
Value:		String
Where Allowed:	q2admin.cfg, server console.

  Sets the password used in activating admin mode 
  for a Quake2 client.


Command:	"ban"
Where Allowed:	client console, server console.

  See section 2.7.2.

Command:	"banonconnect"
Value:		Yes/No
Where Allowed:	q2admin.cfg, client console, server console.

  Ban on client connect (YES) or ban on client begin (NO).  
  When banning on client connect the banned player will not 
  use up a client position at all BUT no ban message is 
  displayed.  Ban on client begin will use a player position 
  for the length of the client map load then be kicked.  But 
  client will get a BAN message before getting kicked.
  See section 2.7.2.


Command:	"chatban"
Where Allowed:	client console, server console.

  See section 2.7.2.


Command:	"chatbanning_enable"
Where Allowed:	client console, server console.

  Enable chat banning.
  See section 2.7.2.


Command:	"clearlogfile <lognum>"
Value:		none
Where Allowed:	client console, server console.

  Where lognum is 1 to 32.  
  Deletes the Q2Admin lognum log file if it is setup.


Command:	"clientsidetimeout"
Value:		Number (seconds)
Where Allowed:	q2admin.cfg, client console, server console.

  Mainly used for internal development testing. Don't touch.


Command:	"customclientcmd"
Value:		String
Where Allowed:	q2admin.cfg, client console, server console.

  Custom client console command to run on ZBot bot detect.
  (run after the client messages and before the disconnect)


Command:	"customclientcmdconnect"
Value:		String
Where Allowed:	q2admin.cfg, client console, server console.

  Custom client console command that runs when a client connects.


Command:	"customservercmd"
Value:		String
Where Allowed:	q2admin.cfg, client console, server console.

  Custom server console command to run on ZBot bot detect.
  (run after the log file update)

  There is a special variable you can pass to this command.  
  %c will get translated to the clients connection number.


Command:	"defaultbanmsg"
Value:		String
Where Allowed:	q2admin.cfg, client console, server console.

  The default ban message for logging and displaying when someone 
  is banned.


Command:	"defaultchatbanmsg"
Value:		String
Where Allowed:	q2admin.cfg, client console, server console.

  The default chat ban message for logging and displaying when someone 
  has typed in a banned word.


Command:	"delban"
Value:		Ban Number
Where Allowed:	client console, server console.

  Deletes a ban from memory (not from the q2adminban.txt file tho).
  See section 2.7.2.


Command:	"delchatban"
Value:		Ban Number
Where Allowed:	client console, server console.

  Deletes a chat ban from memory (not from the q2adminban.txt file tho).
  See section 2.7.2.


Command:	"disconnectuser"
Value:		Yes/No
Where Allowed:	q2admin.cfg, client console, server console.

  Disconnect a bot user when detected.


Command:	"disconnectuserimpulse"
Value:		Yes/No
Where Allowed:	q2admin.cfg, client console, server console.

  Disconnect user if generating an impulse.


Command:	"displayimpulses"
Value:		Yes/No
Where Allowed:	q2admin.cfg, client console, server console.

  Display when impulses are generated / used 
  This is a future-proof thing that will display messages 
  when impulses are used.  The reason is if the ZBot 
  person has a ZBot hack to get around the "normal" detect 
  this will display when he is sending commands.  Sort of 
  like a back-up method of detecting ZBot users.  The only 
  problem is that normal clients can generate impulses as 
  well and I don't know if this is for commanding the ZBot
  or something that a normal q2 mod uses.  Only 1 q2 mod 
  that I know off uses impulses though so chances are that 
  it's a ZBot user.
  
  ZBot impulses:
  - Impulse 169 : toggle menu
  - Impulse 170 : move up (menu)
  - Impulse 171 : move down (menu)
  - Impulse 172 : increase item (menu)
  - Impulse 173 : decrease item (menu)
  - Impulse 174 : toggles bot on/off 
  - Impulse 175 : toggles scanner display
 
  Note: I display a message when ANY impulse is used just 
	to be safe...


Command:	"displaylogfile <lognum>"
Value:		none
Where Allowed:	client console

  Where lognum is 1 to 32.
  Displays the contents of lognum logfile to the console.


Command:	"displaynamechange"
Value:		Yes/No
Where Allowed:	q2admin.cfg, client console, server console.

  Display name changes so everybody knows someones changed there name...


Command:	"displayZBotuser"
Value:		Yes/No
Where Allowed:	q2admin.cfg, client console, server console.

  Display user is a ZBot to the rest of the server.


Command:	"impulsestokickon"
Value:		List of numbers
Where Allowed:	q2admin.cfg, client console, server console.

  What impulses do we want to kick people on??  disconnectuserimpulse 
  must be set to 'Yes' for this to take action.  Commenting this 
  command out of the q2admin.cfg will select all impulses.

  Running this command in the server console or the client console will
  ADD the impulses already added.


Command:	"ipbanning_enable"
Value:		Yes/No
Where Allowed:	q2admin.cfg, client console, server console.

  Enable ip banning.  For bans that use both IP and Name, it then just 
  uses the name.
  See section 2.7.2.


Command:	"kickonnamechange"
Value:		Yes/No
Where Allowed:	q2admin.cfg, client console, server console.

  Kick uses for changing to banned names.  If No the name is not allowed 
  to change.
  See section 2.7.2.


Command:	"listbans"
Value:		Nope
Where Allowed:	client console, server console.

  Lists all the bans loaded into memory.
  See section 2.7.2.


Command:	"listchatbans"
Value:		Nope
Where Allowed:	client console, server console.

  Lists all the chat bans loaded into memory.
  See section 2.7.2.


Command:	"listlrcons"
Value:		Nope
Where Allowed:	client console, server console.

  Lists all the lrcons loaded into memory.
  See section 2.7.3.


Command:	"maxfps"
Value:		Number
Where Allowed:	q2admin.cfg, client console, server console.

  Sets the maximum cl_maxfps that a client may have.  
  See section 2.7.1.
  To disable set to 0.


Command:	"maxrate"
Value:		Number
Where Allowed:	q2admin.cfg, client console, server console.

  Sets the maximum rate that a client may have.
  See section 2.7.1.
  To disable set to 0.


Command:	"namechangefloodprotect"
Value:		<number of messages> <in x seconds> <silence in seconds>
Where Allowed:	q2admin.cfg, client console, server console.

   Name changing flood protection so that a name change macro 
   does not flood the server and other clients.
   [sv] !namechangefloodprotect <number of messages> <in x seconds> <silence in seconds>
   if <silence in seconds> is 0 then the person is kicked.
   to disable change to:
   [sv] !namechangefloodprotect disable


Command:	"namechangefloodprotectmsg"
Value:		String
Where Allowed:	q2admin.cfg, client console, server console.

  Name change flood protection message.


Command:	"nickbanning_enable"
Value:		Yes/No
Where Allowed:	q2admin.cfg, client console, server console.

  Enable nick banning.  For bans that use both IP and Name, it 
  then just uses the IP.
  See section 2.7.2.


Command:	"numofdisplays"
Value:		Number
Where Allowed:	q2admin.cfg, client console, server console.

  Message to display that the using is using a abot.
  NOTE: must have 1 and only 1 '%s' in the line
  %s will print the users name


Command:	"play_all_enable"
Value:		Yes/No
Where Allowed:	q2admin.cfg, client console, server console.

  Enable play_all command.
  Plays a wav file for each person in the game.


Command:	"play_team_enable"
Value:		Yes/No
Where Allowed:	q2admin.cfg, client console, server console.

  Enable play_team command (may not work %100 with each mod, 
  depends on how the mod teams are implemented).
  Plays a wav file on each person that is in your team.


Command:        "play_person_enable"
Value:		Yes/No
Where Allowed:	q2admin.cfg, client console, server console.

  Enable play_person command.
  Plays a wav file for 1 person in the game.


Command:	"Quake2dirsupport"
Value:		Yes/No
Where Allowed:	q2admin.cfg.

  Only for use in windows.
  This tells the Q2Admin dll that it is running in the Quake2 
  directory (or the release directory for v3.20+).  When set to 
  'No' the dll is being loaded from the mod directory like the 
  linux / solaris versions. For win32 the old mod dll must be 
  called 'gamex86.real.dll' for this to work.


Command:	"randomwaitreporttime"
Value:		Number (seconds)
Where Allowed:	q2admin.cfg, client console, server console.

  When ZBotdetectactivetimeout is -1 this value is used to 
  generate a random time between 5 seconds to 5 seconds + 
  randomwaitreporttime seconds.
  e.g. 55 means 5 seconds to 60 seconds


Command:	"reloadbanfile"
Value:		None
Where Allowed:	client console, server console.

  Deletes all the current ban's and reloads the banfile.


Command:	"reloadlrconfile"
Value:		None
Where Allowed:	client console, server console.

  Deletes all the current lrcon's and reloads the lrcon command 
  list file.


Command:        "say_person_enable"
Value:		Yes/No
Where Allowed:	q2admin.cfg, client console, server console.

  Enable say_person command.
  Send a message to 1 person in the game.


Command:	"serverinfoenable"
Value:		Yes/No
Where Allowed:	q2admin.cfg, client console, server console.

  Sets 'set Bot "No Bots" s' on the server.


Command:	"setadmin"
Value:		String
Where Allowed:	client console.

  Sets the admin mode for Quake2 clients.


Command:	"version"
Value:		none
Where Allowed:	client console, server console.

  Displays the UQSA version number.  Also works in the Quake2 
  console if your not in admin mode.


Command:	"zbotdetect"
Value:		Yes/No
Where Allowed:	q2admin.cfg, client console, server console.

  Enable/disable main ZBot detection.


Command:	"ZBotdetectactivetimeout"
Value:		Number (seconds)
Where Allowed:	q2admin.cfg, client console, server console.

  Once a ZBot is detected, how long to wait before actioning it.
  -1 will generate a random timeout between 5 seconds to 5 
  seconds + randomwaitreporttime seconds.


Command:	"setmotd"
Value:		String (filename)
Where Allowed:	q2admin.cfg, client console, server console.

  MOTD file to display at client connect (and also happens on 
  level changed as well) 
  For the console versions of the command, if you don't supply
  a filename, the MOTD is cleared. If you do the MOTD is loaded.
  NOTE: by default the MOTD is read from the Quake2 directory.
  If you want to use a mod motd you must supply the directory 
  name. e.g. sv !setmotd "ctf/mymotd.txt"
  Also a any qauke2 client connected to the server may redisplay
  the motd by typing 'motd' into the console.


Command:	"zbotuserdisplay"
Value:		String
Where Allowed:	q2admin.cfg, client console, server console.

  Message to display that the using is using a ZBot.
  NOTE: must have 1 and only 1 '%s' in the line
  %s will print the users name





2.6. Impulses explained
-----------------------

The ZBot has two types of commands for the client to communicate 
with the ZBot proxy.  One is special Quake2 console commands
and the other is the Quake2 impulse command.  The Quake2 impulse 
command is basically the same as the Quake impulse command and is
not used in Quake2. Because Quake2 doesn't use the impulse 
command it just ignores it.  What the detector does it monitor the
impulse commands that are generated by a Quake2 client and 
log / display / kick (if you wish) when an impulse is generated.
The problem with detecting impulses is that ANY Quake2 client can
generate an impulse.  This can lead to false detections if you kick
people generating impulses.  I leave it up to the server admin to
decide how to handle impulses.

Impulse detection is included as a backup for of detection in case
the main ZBot detection fails.  Most admins can ignore 
impulses unless they are being regularly generated. If they are
then there is a chance that that person is using a hacked or
modified ZBot that can gets around the main detection.

Reasons for clients generating impulses:

1. They are using a hacked ZBot.
2. They have used a ZBot before and have exceed ZBot.cfg that
   comes with the ZBot and the binded keys have been saved to 
   there config.cfg file. Then they press the keys by accident
   during play.
3. The mod uses impulses (I don't know of any other mod that
   uses them though).
4. They think they are in Quake for some reason!!





2.7. Advanced admin commands
----------------------------


2.7.1. Max Rate / Max fps
-------------------------

The maxrate command clips a players rate so that it can't be 
changed to greater than the maxrate setting.  Setting maxrate to
0 turns it off.

The maxfps command is a bit different.  When you set maxfps, ALL
clients will be set to that value when they first connect.  After
being set Q2Admin can then tell if the user is changing the maxfps
setting.  Setting the maxfps doesn't have a noticable effect unless
the player is used to having a fast computer on a show connection.
If you want to set cl_maxfps I would suggest ranges from 31 to 41.
The other problem with this is there is a chance that it will not
work with all mods.  You can tell it's not working correctly when
player names start to get truncated.


This was the taken from the UQSA forum's:

Whatz Up With "Rate" 
After all the hoopla concerning the "rate" setting and how it 
affects the server and client, Brett Jacobs decided to email 
Zoid and ask him just "whatz up with dat rate stuff?" Below 
is his reply to Brett's question. Brett's main reason for 
emailing him was because a server kicked Brett for having his 
"rate" set to 15,000.

Hi Zoid,
It seems the server fad now is to disallow too high of a "rate" 
setting for clients. Can you explain to me how a client's high 
"rate" setting can affect the server and also what affect will 
it have on other players on that server. Also does my clients 
"rate" setting affect other players differently depending on 
whether they have a high or low bandwidth connection?


Zoid's Reply:

Rate simply controls the amount of data a server will send to 
you. It has no effect on other players, since every player has 
his own independent data stream. What is sent to the player is 
calculated individually, so a player with rate 25000 does not 
affect a player with rate 2500. It seems to be a common 
misunderstanding to this.

It is not rate that beats the crap out of the servers, but the 
client's framerate. The client sends a packet every frame. Even 
if you had a rate of 2500, you could still be sending up to 72 
packets/second, which is why low bandwidth connections should 
lower their cl_maxfps, since at 72 packets/second, they could 
lag themselves with the outgoing bandwidth.

The only way I could see rate affecting players is if the 
server _itself_ was running out of bandwidth. This could happen 
if the server was running on a low bandwidth line (cable modem) 
and there were lots of players. The majority of servers run on a 
decent connections tho (such as T1), so this is probably not an 
issue.

Also note that rate is simply an indicator of the _maximum_ the 
server will send. If you are standing a room with one other player, 
there isn't that much to send--you wouldn't hit the 25000 limit. 
The average byte/second on a player on a server is about 2k to 3k. 
Of course, busy rooms bump that up (such as CTF--you get a lot of 
fights in the bases with lots of players).

I think what is happening is players get in a busy room (such as a 
heavy attack on a CTF base) and low bandwidth guys start starving, 
since their rate setting starts clipping pretty heavily to make 
sure they don't start falling behind by being overrun with data. 
This would happen regardless as to the rate of the other players. 
A busy room is a busy room and higher bandwidth players (not 
necessary lower ping, in this case, it's bandwidth that matters) 
will have an advantage since they won't get as much data clipped 
out by rate.

Back in the days when we didn't have rate settings, I imagine many 
people remember being on e1m7 on a NetQuake server and finding 
their ping had gone to like 3000 or so--this is because they 
were in essentially one room with lots of other players and the 
server was sending them more data then they could handle. This is 
why rate was added in the first place, to cut down on the amount 
of data being sent and keep you from lagging behind. Now, Quake2 
is MUCH more efficient than NetQuake (it uses almost 2/3rds less 
bandwidth than NetQuake did), it still sends out a lot of data in 
a very busy room.

-----

/// Zoid.





2.7.2. IP / Nick Banning
------------------------

Banning can be enabled and disabled by the 'nickbanning_enable', 
'ipbanning_enable' and 'chatbanning_enable' commands.  The 
permanent ban list, q2adminban.txt, is loaded from the Quake2 directory and
then the mod directory in that order.

The format for q2adminban.txt is a simple text file.  

In q2adminban.txt there are 3 types of lines:
 
1. comments which are ingored.
2. nick / ip ban's which the line begins with 'BAN:'
3. chat bans which the line begins with 'CHATBAN


1. Comments:
Lines beginning with ';' are comments.


2. P and Name Banning:

The format for a ban is:

BAN: [+/-(-)] [ALL/[NAME [LIKE/RE] "name"/BLANK/ALL(ALL)] [IP xxx[.xxx(0)[.xxx(0)[.xxx(0)]]][/yy(32)]] [PASSWORD "xxx"] [MAX 0-xxx(0)] [MSG "xxx"]

[+/-(-)] 

Exclude or include ban.
- (default) refuses access ban.
+ allows access ban.

The first ban that fits the connecting player profile is acted on. 
Ban's are checked from the last added to the first added.  So the 
first bans to be checked are bans added manually at the console 
then the mod ban list (last to first) then the Quake2 ban list 
(last to first).



[NAME [LIKE/RE] "name"/BLANK/ALL(ALL)]

This is the format for a name ban. 

LIKE means that the only part of a players name must match the 
banned name for the ban rule to apply.  Like only applies to 
specified names, not BLANK or ALL.

RE means regular expression.  If you don't know what regular
expressions are leave it alone. If you wish to use '\' commands
in names you MUST do a '\\' for every '\' you want passed to 
regular expression.  e.g. a '\' in the search you be '\\\\'.
This is because of the '\' commands in names that I preprocess
for.

"name" is the nick or part nick to ban.

BLANK will pickup any name that is blank i.e. all spaces.

ALL is the default, meaning all names.  This is default so that 
when you specify a IP without a name it's applies to all names.


Example Name Bans:

BAN: - NAME BLANK
BAN: NAME LIKE "fuck"



[IP xxx[.xxx(0)[.xxx(0)[.xxx(0)]]/yy(32)]

This is the format for a IP ban.

The /yy value says how many bits are fixed on the IP, i.e. a IP mask value.  
Basically the first x number of bits to compare to the connecting players 
IP.

0 = apply to all IPs. 
(0.0.0.0 mask)

8 = compare first number only. e.g. IP 192.168.1.10/8 would 
only compare  the '192' part of the IP. 
(255.0.0.0 mask)

16 = compare first two numbers only. e.g.	192.168.1.10/16 
would only compare the '192.168' part of the IP. 
(255.255.0.0 mask)

24 = compare first three numbers only e.g. 192.168.1.10/24
would only compare the '192.168.1' part of the IP.
(255.255.255.0 mask)

32(default) = compare the whole IP.
(255.255.255.255 mask)

If you don't specify an IP then the default IP of 'IP 0.0.0.0/0'
is used.


Examples of IP Bans:

BAN: - IP 192.168.1.10
BAN: + IP 192.10.1.1
BAN: - IP 192.168.1.10/24


[ALL]

Because the default BAN command allows for a default banning 
of everybody, I've disallowed banning all using the NAME / 
IP combo.  To ban everybody you must use the ALL command e.g.

BAN: ALL MSG "Server down for maintenance"
BAN: + ALL MAX 10


[PASSWORD "xxx"]

This applies only to allow access bans (+) and only allows users 
that have the correct password set in the client.

The password must be set on the client in the following manner before 
connecting or renaming:
set pw xxx u
where xxx is the password.  The password can't be bigger than 20 
characters and is case sensitive.

e.g.
say you had a ban:
ban + name re "^VK-.*$" password "duck" msg "Name reserved for Clan VK"

the client must have the password set like:
set pw duck u
to connect or rename to a name beginning with "VK-". e.g.
name "VK-Test"

NOTE:  because of the way Quake2 works in the area of servers seeing
client side variables, the password feature may NOT work with some mods.
If it does not you will start to see values being truncated. e.g. the 
clients name.  You can try to reduce the size of the password (within 
reason).


[MAX 0-xxx(0)] 

This applies only to allow access bans (+).  This allows up to xxx 
connections before refusing (banning) connections.  A MAX of 0 means 
unlimited connections and is the default.

e.g.
BAN: + IP 192.168/16 MAX 10

Will allow up to only 10 players to connect with ip of 192.168.x.x

e.g.
BAN: + ALL MAX 15
BAN: + IP 192.168/16 MAX 30

Will allow up to 30 from 192.168.* but only 15 with any other IP.


[MSG "xxx"]

This is the message to display in the log and displayed to the user.
Messages are only displayed to the user when a user changes their
name. Players ejected on connect can't be displayed a message.

e.g.
BAN: NAME BLANK MSG "No blank names allowed."


You can combine name and ip bans.  Say you want to only allow 1 
player with the name duck from a known IP.

e.g.
BAN: NAME "duck"
BAN: + NAME "duck" IP 234.231.34.154 MAX 2

(NOTE: the reason for MAX 2 is allow for crashes and reconnect so that 
duck doesn't have to wait for the Q2 server to kick the old player off)


Console Bans:

The ban format is the same as banfile format with some added extras.

[sv] !BAN [+/-(-)] [ALL/[NAME [LIKE/RE] name/%p x/BLANK/ALL(ALL)] [IP [xxx[.xxx(0)[.xxx(0)[.xxx(0)]]]/%p x][/yy(32)]] [PASSWORD xxx] [MAX 0-xxx(0)]] [MSG xxx] [TIME 1-xxx(mins)] [SAVE [MOD]] [NOCHECK]


The ban will only last until a level change or the server is shut down 
unless you use the save option.

Running it from the quake console 'sv !ban xxx' or from the 
client console in admin mode '!ban xxx'.

New options:

NAME [LIKE/RE] %p x

Where x is a client connection number.  It uses the name of the 
client as the ban name.

e.g.

sv !ban name %p 1


IP %p x[/yy]

Where x is a client connection number.  It uses the ip of the client 
as the ban IP.

e.g.

sv !ban ip %p 1


TIME 1-xxx(mins)

The ban will only last for x minutes, until the level changes or 
the server is shutdown.



SAVE [MOD]

"SAVE" by itself will cause the ban to be added last to the q2adminban.txt
in the Quake2 directory.  

e.g.

sv !ban name blank save


"SAVE MOD" will cause the ban to be added last to the q2adminban.txt in
the mod directory.

e.g.

sv !ban name blank save mod



NOCHECK

When a ban is added in either the client or the server console, all
connected clients are checked against all current bans.
If you supply 'NOCHECK' then the ban checking is not executed.



Banning detected ZBot users:


This is how you would ban a ZBot player on detect for 5 minutes. In the 
q2admin.cfg file change the setting for customservercmd to something 
like:

customservercmd "sv !ban ip %p %c msg \"ZBot user ban\" time 5"

The above command applies an IP ban on the players ip for 5 min's.


From the server or client console you can list all the loaded bans
by using the 'listbans' command.
e.g.
sv !listbans
Start Ban List:
 (2, Temporary) BAN: NAME LIKE "test" TIME 9.831666
 (1, Temporary) BAN: + NAME RE "^VK-.*$" PASSWORD "duck"
 (0, Permanent) BAN: NAME BLANK
End Ban List



From the server or client console you can delete a ban from 
memory.  NOTE: this only deletes the ban from memory not from
the q2adminban.txt file.

The command is 'delban' and you have to know the ban number. 
To get the ban number do a 'listbans' command and it will
display the ban number.  e.g. the ban number of 
BAN: + NAME RE "^VK-.*$" PASSWORD "duck"
is 1.

To delete this ban from memory you run delban like this:

sv !delban 1



Name changing:
The way name changing is handled when a player changes to a banned 
name depends on the 'kickonnamechange' setting.  If it is set to
"No" then the name change is disallowed and the ban msg (default
or ban message) is dispalyed.  If it is set to "Yes" then the user
is displayed the ban msg and is kicked.



3. Chat Banning:

The q2adminban.txt format is:

CHATBAN: [LIKE/RE(LIKE)] "xxx" [MSG "xxx"]

This is the format for a name ban. 


[LIKE/RE(LIKE)] "xxx"

LIKE means that the only part of a message text must match the 
banned text for the ban rule to apply.  

RE means regular expression.  If you don't know what regular
expressions are leave it alone. If you wish to use '\' commands
in names you MUST do a '\\' for every '\' you want passed to 
regular expression.  e.g. a '\' in the search you be '\\\\'.
This is because of the '\' commands in names that I preprocess
for.

"xxx" is the chat text to ban.


[MSG "xxx"]

Not working for the moment.


The chat banner is writen in such a way that it will pick up
any chat message going to a client and not print them.  It
doesn't matter what special message features a mod may have 
it will work.  The problem with this method is that I don't know 
who generated the message.  



Reloading q2adminban.txt:

From the server or client console you can delete all the bans
in memory and reload the q2adminban.txt file using the
'reloadbanfile' command. e.g.

sv !reloadbanfile





2.7.3. Limited rcon
-------------------

Limited rcon is for admins that need to give out rcon to clans for 
competitions.

Limited rcon only allows specified commands to be executed.

The file q2adminlrcon.txt is read from the Quake2 directory and then the mod 
directory.  This allows server admins to set up global and 
mod specific lrcon commands.

The passwords are case sensitive but the command compare is not.

The format for q2adminlrcon.txt is as follows:

Lines beginning with a ';' are comments.

lrcon command format:
<lrcontype><password> <command to allow>

 <lrcontype> can be one of three values:
 'SW:'  Starts with match.
 'EX:'  Exact match.
 'RE:'  Regular Expression match. 

e.g.
SW:secret map
SW:secret timelimit
SW:secret fraglimit
EX:top fraglimit 100
EX:top fraglimit 50
RE:tip ^map q2dm[1258]$

You can even specify extact commands that are allowed e.g. say you want 
lrcon password 'duck' only to be able to change maps to q2dm1, q2dm2 and
q2dm8.  The q2adminlrcon.txt would look like:

EX:duck map q2dm1
EX:duck map q2dm2
EX:duck map q2dm8

or use a regular expression like this:
RE:duck ^map q2dm[128]$


To run lrcon from the client console is the same as running rcon.
e.g.

lrcon duck map q2dm1

or

lrcon secret timelimit 40


There is a limit of 1024 lrcon password commands.

The only prerequisite for running lrcon is that the Quake2 server 
rcon_password must be set to *SOMETHING*. It doesn't matter what, 
it just has to be set.

Also, if the client has rcon_password set, lrcon will not work.
Note: there is no lrcon_password, so the password must be typed every 
the time.


From the server or client console you can list all the loaded lrcons
by using the 'listlrcons' command.
e.g.
sv !listlrcons
Start lrcon's List:
SW:"bad" "map"
SW:"bad" "timelimit"
SW:"bad" "farglimit"
EX:"test" "map q2dm1"
RE: "tip" "^map q2dm[128]$"
End lrcon's List


From the server or client console you can delete all the lrcons
in memory and reload the q2adminlrcon.txt file using the
'reloadbanfile' command. e.g.

sv !reloadlrconfile




2.8. play_all, play_team, play_person and say_person
----------------------------------------------------

play_all, play_team and play_person commands are not server admin 
commands as such. They have added functionality to play wave files.

play_all <wavefile>
play_all will play the wave file on all the clients machines (if they
have the wave file).

play_team <wavefile>
play_team will play the wave file on all the team client machines.  
This command will work the same as the say_team command.  This command
may not work for all team mods though.  It all depends on how the teams 
are programmed in the mod.  Try it, if it works, it works.

play_person [LIKE/RE] <playername> <wavefile>
play_person will play the wave file on a specific players client.
play_person will only play the wave for the specified player.  
If more than 1 player name matches then no wave is played.

The play_team, play_all and play_person works the same as the play command 
so you can play wave files that are in pak files.

play_all can be enabled / disabled with the play_all_enable admin 
command.

play_team can be enabled / disabled with the play_team_enable admin 
command.

play_person can be enabled / disabled with the play_person_enable admin
command.


say_person [LIKE/RE] <playername> <message>
say_person command is not a server admin.  It allows a player to send a
private message to another player.  The message is recorded to the server 
console so it will be recorded in the qconsole.log if logged is turned on.
say_person will only send a message to one player.  If more than 1 player
name matches then no message is sent.

say_person can be enabled / disabled with the say_person_enable admin
command.




2.9. Message of the Day (MOTD)
---------

The MOTD feature in the Q2Admin is very very simple.  There isn't 
much to it and is meant to do two things:

1. Provide a simple MOTD features for mods that don't have a MOTD.
2. Provide a global MOTD for admin's that want a global MOTD.

The setmotd command is used to set name of the MOTD file.  This file is
loaded from the Quake2 directory. If you wish to have a unique MOTD per 
mod then I suggest you add a following line into you server startup 
config and leave the setmotd in the q2admin.cfg file blank.

sv !setmotd "xxx\motd.txt"
where xxx is the mod directory.

The MOTD file is reloaded with every level change.
The MOTD file can be reloaded with the above command as well.

Clients can re-view the MOTD at any time by using the "motd"
command at the client console.




3. Logging explained
--------------------

Logging is all controlled by one file, "q2adminlog.txt".  
There can be up to 32 log files and one log event can go to
any of the 32 log files (including one/some/all of them).

The layout for the file is split into two parts.  One is
setting of the log files.  This must go at the start of 
the file before any of the logevents can be setup.

The format for log file setup is:
LOGFILE: LogNum [MOD] "LogFileName"

LogNum: is a number between 1 to 32.
MOD: means the log file is saved into the mod directory 
     instead of the Quake2 directory.
     "LogFileName": is the log file name.  This can include 
     directories.

e.g.

LOGFILE: 1 "q2admin.log"
LOGFILE: 2 MOD "q2admin.log"



The second part is setting up the log events layout themselves.  
Each log event can only be set up once and log events not set up 
are assumed to be not logged.

The format for a log event is:

[logtype]: YES/NO lognum [+ lognum [+ lognum ...]] "format"

logtype:  is the specific log event that we are logging.
YES/NO:   log this event or not.
lognum:   is a number between 1 to 32.  Says which log file(s) to 
          log this event to.  Multiple log files can be assigned by
          using the '+' sign. e.g. 1 + 2 + 3 + 4
"format": the string to print to the log file.  This can have a number
          of replacement fields.  


Log types:

Here is the list of log types that can be used:

ZBOT

Logged when a ZBot user is detected.

ZBOTIMPULSES

Logged when someone uses ZBot impulses.

IMPULSES

Logged when someone uses impulses other than ZBot impulses.

NAMECHANGE

Logged when someone changes there name.

CHATBAN

Logged when a message is banned.

CLIENTCONNECT

Logged on client connect.

CLIENTBEGIN

Logged on client begin.

CLIENTDISCONNECT

Logged on client disconnect.

CLIENTKICK

Logged when the Q2Admin dll kicks someone for any reason.

CLIENTCMDS

Logged when a client sends a command to the server.

BAN

Logged when a client is banned (ip or name)

CHAT

Logged when chat messages are used.  Note: this feature
can not detect which client sent the chat message.

SERVERSTART

Logged when the server is started.

SERVERINIT

Logged when the server is inited.

SERVEREND

Logged when the server is shutdown.

INTERNALWARN

Logged when the Q2Admin dll generates certain types of 
internal warning.  Used for internal testing of problems.


"format" can include the following replacements:

#n = Client Name
#p = Client Ping
#i = Client IP
#r = Client Rate
#s = Client Skin
#t = Date / Time
#m = Impulse Message (ZBot impulse only)
#e = Impulse Number (impulse and ZBot impulse only)
#e = Internal ZBot detect number (ZBot detect only)
#e = Internal warning number (internal warning only)
#m = Internal warning message (internal warning only)
#m = Old Name (name change only)
#m = Kick Reason (kick only)
#m = Banned chat (chat ban only)
#m = Client command (Client commands only)
#m = ban message (ban only)
#m = chat message (chat only)

Examples of event log setups are:

ZBOT: YES 1 "ZBOT User: Time \"#t\" name \"#n\" Ping \"#p\" IP \"#i\" I(#e)"
ZBOTIMPULSES: YES 1 "ZBOT Impulse: Time \"#t\" Impulse \"#n generated a impulse #m\" Ping \"#p\" IP \"#i\""
IMPULSES: YES 1 "Impulse: Time \"#t\" Impulse \"#n generated a impulse #e\"  Ping \"#p\" IP \"#i\""
NAMECHANGE: YES 1 "Name: Time \"#t\" \"#m -->> #n\"  Ping \"#p\" IP \"#i\""
CLIENTCONNECT: YES 1 "Connect: Time \"#t\" Name \"#n\"  Ping \"#p\" IP \"#i\" SKIN \"#s\""
CLIENTBEGIN: YES 1 "Player Begin: Time \"#t\" Name \"#n\"  Ping \"#p\" IP \"#i\""
CLIENTDISCONNECT: YES 1 "Disconnect: Time \"#t\" Name \"#n\"  Ping \"#p\" IP \"#i\""
INTERNALWARN: YES 1 "Internal Warning(#e): Time \"#t\" Name \"#n\"  Ping \"#p\" IP \"#i\" #m"
CHATBAN: YES 1 "chat ban :#n  \"#m\""
CLIENTKICK: YES 1 "kick #n"
CLIENTCMDS: YES 1 "cmd #n \"#m\""
BAN: YES 1 "ban #n \"#m\""
CHAT: YES 2 "chat \"#m\""
SERVERSTART: YES 1 + 2 "Server Startup #t"
SERVERINIT: YES 1 "Server Init #t"
SERVEREND: YES 1 + 2 "Server Shutdown #t"







4. Credits
----------

Writen by Shane Powell (KillerBee) 
killerbee@Quake2.bitstreet.net
http://www.teamevolve.com


Mike (McNasty) for beta testing and for bugging me enough 
to write this dll in the first place.

#Cookie for input and advice.

Mentor for allowing me to beta-test on his server.

ElectricMonk for programming advice and input.

Matt (Fisty) for porting to linux.
HeKTik for letting me use his linux machine for compiling 
on demand.

Chief Bastard for linux server testing.

The Solaris port is done by the SolarEclipse.  Go check 
them out for ports of other Quake2 mod's to Solaris OS.
http://www.planetquake.com/eclipse

For the many many server admin's and users that have reported 
problems and made feature suggestions.







5. Copyright and Distribution Permissions
-----------------------------------------

This program is freely distributable provided that this 
readme.txt is distributed with it as well and remains unchanged.

All code is Copyright Shane Powell 1998.

DISCLAIMER:  This program is 100% safe, tested, and FDA 
approved, so you should have no trouble with it. But if 
you do.. its not our fault.

DLL's always carry an inherent risk for servers!






6. Release History
------------------

v0.92 beta  - 19 October     - First public release for Win32 version
v0.93 beta  - 21 October     - First public release for Linux version
v0.94 beta  - 22 October     - Fixed bug with normal dm servers not 
                               loading. Win32 version only atm, linux 
                               update soon.
v0.94 beta  - 23 October     - Renamed to 'UQSA ZBOT Detector' and moved 
                               to a new web site and the release of the 
                               linux release.
v0.95 beta  - 26 October     - Added Quake2dirsupport for windows version 
                               only in ZBotdetect.cfg.
                             - Added customclientcmdconnect to ZBotdetect.cfg
                             - Improved performance.
                             - Fixed command overflow problem.
v0.96 Alpha - 01 November    - Fixed blank IP's in log file.
                             - Log and display name changes now.
                             - Kick on client impulse generate option 
                               (default off).
                             - "!version" command added.  Can be used by any 
                               client you don't have to be in admin mode to run.
                             - Added support for double quotes '\"' and newlines 
                               '\n' in command strings. 
                               e.g. customclientcmd "error \"Fuck off ZBOT User\""
                             - Use log file in mod dir option added (default set 
                               to Quake2 directory)
                             - Added ZBotmotd option, this is a file that is 
                               printed to each client on connect and reconnect 
                               (level change).
                             - Checks for overflow now, to do this I force 
                               "logfile 2" on servers.
                             - Added 'play_team' command and 'play_team_enable' 
                               option.
                             - Added 'play_all' command and 'play_all_enable' 
                               option.
                             - Added serverinfoenable with tells the dll to set 
                               the server variable Bot "No Bots".
v0.96 Alpha - 16 November    - Added server console admin interface.
                             - Added support for string admin commands in the 
                                   server console and client console. Added '\q' for 
                               inserting quotes in strings in the console.
                             - Added support for detecting hacked ZBots.
                             - Changed the 1/0 settings to Yes/No for easier to
                               understand admin commands.
                             - Added IP and Name banning.
                             - Added rate and maxfps capping.
                             - Added limited rcon.
                             - Added conned / disconnect logging.
                             - Added selectable impulses to kick on.
                             - Rewrote the readme.txt
v0.96 Alpha - 23 November    - Break logclientconnects into 3 options.
                             - Added BAN ALL command.
                             - Changed BAN IP MASK format to /yy format
                             - Added ZBotmotd command to server & client console.
                             - Prints out the ZBot version on server startup.
                             - Fixed problem with 'gamemap' command (e.g. timelimit,
                               fraglimit)
                             - Added reload ban list command.
                             - Added reload lrcon list command.
                             - Added motd client command to redisplay motd.
                             - Fixed long pauses before certain commands would
                               complete.
                             - Disable client admin console command (NO by default)
                             - Fixed bug with incorrect game dll being loaded in
                               rare cases.
                             - Changed format for some of the logging output to make
                               it nicer I hope :)
                             - Added displaylogfile to server console commands.
                             - Added command to display bans in memory.
                             - Added command to display lrcons in memory.
                             - Added command to delete ban.
                             - Added option (banonconnect) on how banned connecting 
                               players are handled.
                             - Changed name changing to disallow instead of kicking
                               when changing to a banned name.
                             - Adding a ban at the console now reruns all the bans on
                               currently connected clients.
                             - Added nocheck to ban console to NOT rerun the ban on
                               currently connected clients.
                             - Added option to protect against name change flooding.
                             - Added regular expressions to ban names.
                             - extended lrcons format with exact match and regular
                               expression matching.
                             - Added passwords option to include bans.
v0.96 Alpha B4 - 27 November - Fixed MSG message for bans with passwords not displaying.
                             - Fix ip banning disabled and name banning enabled problem. 
                               (Disabled now ignores ip bans with a subnet mask greater 
                               than 0) 
                             - Added build number to version string.
                             - Fixed server crash if banonconnect yes set to 'No' and 
                               the user cash banned. Only some types of mod's will be 
                               effected by this bug namely lmctf. 
                             - Fixed "ban all" bans loading incorrectly from ZBotban.txt 
                               file. 
                             - Fixed problem with "internal error" and the false detection 
                               that can go with it. 
                             - Setting the user admin password (adminpassword) to nothing 
                               will disable client side admin console.   This replaces the 
                               separate variable what was in the Build 3.
                             - Option added to kick on name change to banned name. 
                             - Change flood protection to be more like quakeword (number 
                               time seconds). 
                             - Chat filter. 
v0.96 Alpha B5 - 9 December  - Fixed some small bugs with the detection methods causes 
                               internal errors.
                             - Fixed the linux crashing problem.
                             - Improved detection method be allowing for more cases and 
                               increased the retry count.
                             - ZBotdetect.cfg is now loaded from the Quake2 directory AND then 
                               the mod directory.
                             - Removed the setting of the logfile and recommend setting it to two 
                               or 3 in the readme.txt.
v0.96 Alpha B6 - 14 December - Fixed bug in build 5 where banonconnect set to no didn't kick 
                               the person.
                             - Fixed up some internal error (4)'s from happening.
                             - Fixed up a big code 'doh' for not catching times when internal 
                               errors could happen. 
v0.96 Alpha B7 - 17 December - Changed the 'ZBotmotd' command to 'setmotd'.
                             - Changed the 'ZBotdetect.cfg' file to 'q2admin.cfg'.
                             - Changed the name from ZBot detector to q2admin. 
                             - Changed the file 'ZBotban.txt' to 'q2adminban.txt'.
v0.96 Alpha B8 - 23 December - Finished off the chat banning so that MSG part of the chat ban 
                               works now.
                             - Added advanced logging.
                             - Deleted all the old logging commands as they are not needed any 
                               more.
                             - play_person [LIKE/RE] <playername> <wavefile> command added.  
                             - say_person [LIKE/RE] <playername> <message> command added.  
v0.96 Alpha B9 - 29 December - Fixed bug that caused a server crash when players changed names 
                               to names longer than 15 characters.
v0.96 Alpha B10- 11 January  - Fixed bug where setmotd command from the server or client 
                               console would not load the motd file correctly.  Also stuffed 
                               up the motd client command.
                             - lrcon.txt file renamed to q2adminlrcon.txt.
                             - lrcon password now made case sensitive.  Because the password is 
                               now seperate from the command, the RE command format doesn't begin 
                               with a '^' before the password any more. 
                               e.g. "RE: ^duck2 map q2dm[128]$" is now "RE: duck2 ^map q2dm[128]$"
                             - Fixed bug where client console commands (e.g. motd or lrcon or 
                               admin command !) didn't work for up to a second after connecting.
                             - ban passwords are now case sensitive.
                             - readme.txt worked over by -=Phil to correct my english.
                             - Fixed linux crash in Build 9.
                             - Fixed problem with internal error (1) comming up for no reason.
                             - Changed name from internal error to internal warning.
                             - Allowing running from a moddir which doesn't have a game dll or so.
                               (i.e. the loading now defaults to baseq2 if the game dll/so doesn't
                               exist in the mod directory)
v0.96 Alpha B10- 13 January  - Fixed problem with linux and created a test server code to test the 
                               linux version before releases.  
                             - Re-released the linux build 10.

