--withbots
switch? Why isn't this default?
This file is part of »Nexuizsstats«. Copyright © 2016 Martin Wohlauer.
Nexuiz is an open source first person shooter in the fashion of Quake 3 Arena or Unreal Tournament, written in Freebasic. As with most games of this type, one can do extensive analysis of players achievements respectively game playing skills. However, in contradiction with the official Nexuiz documentation files (eventlog.txt
) from October 2009, Nexuiz only supports logging game events to event logs but up to today doesn't provide the required tools to analyze these log files. Nexuizstats is filling this gap. The tool is meant to be used on computers hosting Nexuiz servers with version 2.5.2. It is controlled via command line parameters. The functions of the tool and how they are meant to be used, will be described in the below paragraphs. Nexuizstats and all of the files accompanying it come with ABSOLUTELY NO WARRANTY. Nexuizstats is free software, and you are welcome to redistribute it under the terms of the GPLv3. For details, see the section Licensing. This version of the documentation has last been changed on 2016-06-28-14-42 and is meant for version 0.34 of Nexuizstats.
This file is intended for use as a user and a programmer, working with and on Nexuizstats. Whoever may decide to change Nexuizstats, be it as an improvement, an extension with new features of inclusion into other projects, should keep this file up to date and if necessary, include it's contents into the documentation of another project, using Nexuizstats. Parts written with a code-Tag, like this
are meant literally or as a text example, like command line switches, paths and filenames or script examples. Please keep it this way, as it makes it a little more recognizable, what's meant as descriptive text and what's meant as an exact expression.
As described in the Preface, the tool only analyzes the log files created by Nexuiz servers. By default, Nexuiz servers don't create the necessary event logs, unless told so with config parameters set, when running them. Two cvars must be set, in order to get Nexuiz to log gaming events:
sv_eventlog 1
activates the event logging. Default is 0, so by default, there won't be any events logged.
However, in order to get it to actually log events to dedicated log files (not just to the console log file), that's not quite enough. For this to work, you also need this cvar set:
sv_eventlog_files 1
sets the server to write into the files.
There's another thing you should keep in mind. As Nexuizstats uses the time stamps, put into the log files by the Nexuiz server, in order to make filtering by time possible, you need to keep the time stamps turned on. So do not set sv_eventlog_files_timestamps 0
(default is 1), as it would render the time filtering function useless and make the last time seen column be filled with zeros. On the other hand, the cvars sv_eventlog_files_namesuffix
, sv_eventlog_files_nameprefix
, sv_eventlog_files_counter
and sv_logscores_bots
can be set to your liking. In fact you will need them, if your server is restarted every once in a while (see below). If you intend for various servers to be run logged and then analyzed parallel, it's recommended to use the suffix settings, to distinguish logs from different servers. In case of the name suffix and prefix, you must remind yourself to that, when telling Nexuizstats, which files should be analyzed.
And one other thing: When starting a Nexuiz server, by default it won't check, whether there are already some event logs present or not. It will simply start counting with 1, in turn overwriting already existing files, except, when you use the sv_eventlog_files_counter
-variable. You can set the sv_eventlog_files_counter
variable manually, when starting, either in the config file or as command line parameter nexuiz-dedicated +sv_eventlog_files_counter 123
. But as this is not very handy, there are other ways to keep Nexuiz servers from overwriting older event log files. Under Linux, there's the means of including date and time into the prefix, automatically. Create a script (or even better, an init script) that starts the server like this:
#!/bin/sh
TIMESTAMP=$(date +%Y%m%d%H%M)
COMMANDLINE_PARAMETERS="-dedicated +serverconfig configfile.cfg +sv_eventlog_files_nameprefix" whateveryouwantinfront$TIMESTAMPandmaybesomethingafterthetimestamp %*"
nexuiz ${COMMANDLINE_PARAMETERS}
Be adviced, that this only works, when the sv_eventlog_files_nameprefix
variable is not set inside the config file. If you used it there as well, you will have to delete or comment that line inside the config file. Every time the server is started with that script, you will get a new and probably unique prefix (if you don't start it more than once a minute... but if you did, it's not very likely, anyone is seriously playing during that time, anyways), so the old files will remain untouched. You will have to use the --filefilter
switch accordingly, in order to use it with these newly named log files.
If there's an evenly easy way to achieve this under Windows, please let the author know.
The program is written in Freebasic. In order to compile it, you will need the Freebasic compiler. It's available for Windows and Linux (and also DOS, but it's unlikely you will need that...) here. You might also need some libraries in order to get the compiler to work. On Ubuntu that is the libncurses-dev
package. On Linux, the make
command should then be all you need, if you have installed the build-essential
-package. On Windows you will have to adapt and run the make.bat
. You might need to adapt the path to fbc.exe
in the make.bat
, in case your Freebasic compiler folder has not been added to the path
variable. In any case, a simple <paththofreebasiccompiler>\fbc.exe -exx nexuizstats.bas
on the console in the folder of the source file should do the trick as well.
In principle, there are no inputs required, when the tool is placed into the log file directory (~/.nexuiz/data/data/
on Linux) and simply started. The default log file names, that will be taken into account, are those matching nexuiz????????.log
. The question marks are wild cards at the position, the server will set it's log file numbering. It doesn't necessarily need to be eight of them. But by default, Nexuiz uses this file name pattern, to create event logs. By default, frags involving bots are not included, as well as ctf events are not included into the output file. The default output format is HTML and the default file name therefore is nexuiz.html
. The result is a HTML table containing the columns »Plc« placing of the player, »Nick« for the nickname used by this player, »Kills« for frags done by the player, »Frgd« for the frags inflicted on the player, »Acc« for accidents of the player (e. g. falling of a map), »Suic« for suicides (e. g. blowing himself up with the rocket launcher), »Deaths« for the former three columns added up, »TKs« for team kills (are not counted as »kills«), »Rat.« for ratio (kills divided by deaths), »Eff.« for Efficiency (kills divided by (kills + deaths)) and »LTS« for last time seen. The ordering of the placing is done by ratio. It only exports a HTML table with the analysis results. No <html>
or <body>
environments will be used. This way, one can design the surrounding HTML file entirely custom and only import the table, for example using PHP:
<?php include("nexuiz.html"); ?>
This way, you can use CSS in the surrounding HTML file for styling and place the table anywhere you like within it. But you will require some means to include the HTML-Table, like PHP. For other formats available for export, see the options table.
You can override settings or activate further functions by the switches listed in the following table. Some switches require a second parameter, like a filename after the --outname
switch. Some don't require a second parameter. A few of the latter can override previously used parameters. The time filter switches, format switches and sorting switches will override any previously used time, format, or sorting switches. E. g. --text
used after --xml
will override the --xml
switch and set the output format to text. Same goes for a --onemonth
switch after a --oneyear
switch, or the other way around, as well as --ctfsort
after --effsort
. Always the last switch of it's group will take effect. Some switches require another one to be present, like the --ctfsort
switch, requiring the --ctf
switch to be used as well. Be aware, that all switches are case sensitive.
Switch | Description |
---|---|
--help
|
This switch causes the program to show a similar information like this table. If present, all other parameters will be ignored and the program will do nothing else than showing the help information. |
--logdir
|
This switch tells the program, where to look for the log files. By default, it searches in the folder, the program is started from. The expected path parameter can be a full path or a relative path. Folder names containing spaces must mask them either with quotation marks surrounding the entire path, or backslashes before the space (on Linux). |
--filefilter
|
With this switch one can change the default filter for log file names (nexuiz????????.log ). Nexuiz uses eight positions for the numbering of the log files. However, the filter doesn't necessarily need to include exactly eight question marks. If you want to see only the files matching nexuiz1???????.log , nexuizdm????????.log or nexuiz*.log , this will also be valid. You can even enter one specific file name (e. g. nexuiz00000312.log ), if you want the tool to only analyze this one file. The file filter function is particularly useful, when running several servers simultaneously, that should be analyzed for themselves. When changing the prefixes or suffixes of the log files, one can distinguish the logs of different servers and with the --filefilter switch, thereby only analyze the logs of the desired server. By this means, one can create statistical tables for various servers parallel. File filters containing spaces must mask them either with quotation marks surrounding the entire file filter, or backslashes before the space (on Linux).
|
--outname
|
Changes the default output file name from nexuiz.html , nexuiz.txt , nexuiz.csv or nexuiz.xml to the one provided by the command line parameter. Filenames containing spaces must mask them either with quotation marks surrounding the entire file name, or backslashes before the space (on Linux). It can also by an absolute or relative pathname.
|
--statssave
|
This switch saves the accumulated data from the log files into one single text file. This is useful for loading and continuing the analysis with new files, without having to go through all files from scratch. It contains the list of names of already analyzed and there for included log files. There is always all information of the analysis saved to the file, including ctf values, but excluding the values only calculated from other values, like ratio and efficiency. For more detailes information on that, see section Format of the stats save files. If the file doesn't exist, it will be created. If the file does exist, it will be loaded, new values added (if there are any) and the old file be overwritten with the new results. Filenames containing spaces must mask them either with quotation marks surrounding the entire file name, or backslashes before the space (on Linux). It can also by an absolute or relative pathname. |
--text
|
By default, the program exports it's analysis results in a HTML table. This switch exports it into a text file. There's one difference to the HTML's column order: The nick name is set at the very last of each line, as only this way, the original nickname can be read entirely, without compromising any parsing algorithms. The default file name is set to nexuiz.txt , when using this switch.
|
--csv
|
By default, the program exports it's analysis results in a HTML table. This switch exports it into a CSV format text file. This can easily be imported/opened with usual spread sheet software, e. g. Microsoft Excel or LibreOffice Calc. |
--xml
|
By default, the program exports it's analysis results in a HTML table. This switch exports it into a XML file. There's one difference regarding nick names: As there are certain limitations to what characters can be used in an XML file, some nickname characters will be removed. If the character is not allowed/defined in ISO 8859-1 character set, it will be left out. |
--ctf
|
This switch activates the CTF analysis output. By default, CTF related events are also included into the analysis, but not exported to a HTML output file. This switch adds the following columns to the output data: »Steals«, how often the player took the enemies flag from their flag spot, »Drps«, drops, how often did the player drop the enemies flag (e. g., was killed during carrying), »Pick« picked up, how often the player picked up a dropped enemy flag, »Capt.«, captures, how often the player managed to get the enemies flag to the own flag spot, with the own flag present there, as well, »Ret.«, returns, how often the player returned the own flag, »CTF-rat.«, CTF-ratio (captures divided by steals and pickups). By default there's no sorting with regard to the CTF-ratio. Use the --ctfsort in order to sort the table by CTF ratio. The CTF data is always added in the other formats, so this switch only has an effect, when the output format is default HTML.
|
--notks
|
Setting this switch, team kills will be counted but not exported into the HTML file, so there won't be a column »TKs« included. Does not take effect, when the output format is set to XML, CVS or plain text. The use of this switch becomes obvious, when a Nexuizs server doesn't run matches with team modes at all. For example, when running a deathmatch only server, there will be no teams. So of course, there won't be any team kills, either. So the export of that column becomes useless, as every entry would be zero. As there are servers, which choose the game type dynamically by the type of map loaded, it's not sufficient to let Nexuizstats decide, whether the TK column shall be included, as with the very next map, TKs may be of interest. So it's up to the user, to decide. |
--effsort
|
Instead of the default sort order by ratio, the rows will be exported ordered by efficiency. |
--ctfsort
|
Instead of the default sort order by ratio, the rows will be exported ordered by CTF ratio. This switch requires the use of the --ctf switch.
|
--onemonth
|
All events are logged, regardless of how long ago the events took place. Usually, all records are exported as well. This switch causes Nexuizstats to only output records of players, which were active during the last 30 days. |
--onemonth
|
All events are logged, regardless of how long ago the events took place. Usually, all records are exported as well. This switch causes Nexuizstats to only output records of players, which were active during the last 30 days. |
--onequarter
|
All events are logged, regardless of how long ago the events took place. Usually, all records are exported as well. This switch causes Nexuizstats to only output records of players, which were active during the last 90 days. |
--oneyear
|
All events are logged, regardless of how long ago the events took place. Usually, all records are exported as well. This switch causes Nexuizstats to only output records of players, which were active during the last 365 days. |
--withbots
|
By default, frags and team kills involving bots (actively and passively) are not counted and records of bots are not exported. When using this switch, all frags and team kills are counted and bots are included into the table and also written to stats save files. Without this switch used, they are not counted, therefore they also won't be included in stats save files. Keep that in mind, when deciding to change the analysis mode with this switch and using an already existing stats save file. In this case the statistics will not be accurate, as there's messup with differently created analysis results. |
--lastchange
|
This switch causes Nexuizstats to ignore files that haven't reached a certain age since last change of them. They will be included into analysis, once the last change of them is at least as far in the past, as stated by the given parameter. It requires the time span in minutes to have passed, since the last change, before including the data of this file. By default, it is set to 0 minutes. This switch is particularly useful, when using Nexuizstats on a bunch of log files, while the server creating them, is still active and at the same time, you are using the --statssave switch. When using 0 minutes, the log file currently written by the server for the running match, will be read and included in analysis. In older versions, files then were marked as already read and therefore were ignored in future runs of Nexuiz stats, even when there was new data added to them by the Nexuiz server, later. In these cases, the new data was missing in analysis. From version 0.34 on, this is not the case, any more. Nexuizstats rechecks already read files' filesizes. If the filesize has increased, the additional lines will be read and integrated into anylsis ans stats save files, as well. Therefore, this switch is rather redundant, but kept working for compatibility reasons. It's not harmful, so if anyone would want files not to be included right way, it could still be useful for some users.
|
Although the program usually prints error messages in human readable form, it also returns error codes, that can be processed by any calling program or script. Here's the list of used error codes and their most likely cause:
Code | Meaning |
---|---|
0 | Nothing went wrong, the program did it's job as intended. |
1 | The command line parameters entered contained some typos or a parameter was missing. Double check them. Some require a second parameter, like a file name. See also the options list above. |
2 | The directory path provided to search in for the logs, can't be accessed or doesn't exist. |
3 |
The provided stats save file has the wrong format. Either it's from an older version of Nexuizstats, or the file was messed with, or it never was a stats save file, to begin with. Event log files are no substitute for stats save files and cannot be used as such. If you want just one particular event log file to be analyzed, use the --filefilter switch to make the filter fit the filename exactly.
|
4 | The stats save file could not be written. Either you don't have the privileges to write a file/overwrite this file in this folder, or the folder doesn't exist at all. Or the drive is full. |
5 | One of the event log files in the log folder could not be opened for reading. Check whether you have the necessary access rights. |
6 | The output file could not be written. Either you don't have the privileges to write a file/overwrite this file in this folder, or the folder doesn't exist at all. Or the drive is full. |
7 |
Sorting by CTF ratio without exporting CTF column is not possible. Use the --ctf switch, too, in order to use this sorting mode.
|
8 |
File time filter value not valid, must be a positive integer. The --lastchange switch requires the minimum age of a log file to be integrated into analysis as an integer value. As the default value of this is zero, only parameters higher than zero are reasonable, and only integer values are allowed.
|
The actual beauty of this program comes to light, when it's used automated, meaning, the computer the Nexuiz server is running on, or some other computer, that has access to its logs, is starting the stats file generation process automatically in certain intervals of time. There are some additional tips here, to ensure the best experience, when using Nexuizstats automated.
On Windows as well as on Linux, you can start any process automated. However, the former doesn't exactly give you a means to run a command in intervals of 10 minutes or something like it. At least not with the means, Windows provides by itself. Only intervals of at least one day are possible, or event triggered runs. There may be other ways to get Windows to run commands on a regular basis within a smaller time span. If there is, please let the author know, to include it in here.
Linux makes implementing these things a lot easier. You can edit the /etc/crontab
. You can set up a task there, to let the stats analysis be run regularly.
The easiest way is, to create a shell script, that starts the according Nexuizstats runs one after another. This way, you won't run into trouble with to high load due to parallel running instances. But then you'd still better run this script as a user, not as root.
Here's an example, how to get Nexuizstats to analyze the logs in a specific folder, run from a specific place with a few options, once every ten minutes as user »nexuiz«:
*/10 * * * * nexuiz /home/nexuiz/.nexuiz/data/nexuizstats --logdir /home/nexuiz/.nexuiz/data/data --outname /home/nexuiz/.nexuiz/data/ctf.html --filefilter nexuizctf????????.log --ctf >/dev/null
The part */10 * * * * nexuiz
makes the cronjob be run once every ten minutes after boot, with the privileges of the user »nexuiz«. As well as the Nexuiz server itself, the Nexuizstats should not be run as root for security reasons, and to make things a little more easy, regarding reading permissions of the log files.
The part /home/nexuiz/.nexuiz/data/nexuizstats
is the actual Nexuizstats binary. It can be placed anywhere, the user »nexuiz;« has reading and execution permissions of the file. When you place it inside a folder, where Linux searches for binaries by default, you may even neglect the path to the binary.
The rest are ordinary Nexuizstats option switches and corresponding information. Please note the >/dev/null
at the end of the line. This is not part of the actual switches intended for Nexuizstats. This sees to it, that every output of the Nexuizstats program is dropped. If done without this, you may receive an email, every time Nexuizstats is run, as this is the default behavior of cron, when a command outputs text to the console. As Nexuizstats does that, giving certain information about the used switches and the process itself, you have to redirect the output to /dev/null
in order to avoid unnecessary status emails. You can also enter a shell script here, that starts the actual Nexuizstats runs.
One piece of advice for slower machines: The process of analyzing may take some time, especially CPU time. That's usually no problem, when only one instance of Nexuiz stats is running at the same time or if the computer can handle the load easily. But when doing several analysis runs parallel on a slower server, you might experience performance issues on the Nexuiz server itself, as the resources the Nexuizstats is using, aren't available for the game server. This can result in lags and even connection drops, when things are really bad. So in some cases it might be advisable, to delay the analysis runs by a few seconds to each other. This can be achieved by a simple sleep
command, right before the actual Nexuiz stats command. An example may look like this:
*/10 * * * * nexuiz nexuizstats --logdir /home/nexuiz/.nexuiz/data/data --outname /home/nexuiz/.nexuiz/data/ctf.html --filefilter nexuizctf????????.log --ctf >/dev/null
*/10 * * * * nexuiz sleep 10 && nexuizstats --logdir /home/nexuiz/.nexuiz/data/data --outname /home/nexuiz/.nexuiz/data/dm.html --filefilter nexuizdm????????.log >/dev/null
*/10 * * * * nexuiz sleep 20 && nexuizstats --logdir /home/nexuiz/.nexuiz/data/data --outname /home/nexuiz/.nexuiz/data/dmwithbots.html --filefilter nexuizdm????????.log --withbots >/dev/null
This delays the start of second instance of Nexuizstats by 10 seconds and the third one by 20 seconds. This way they all start 10 seconds deferred to each another. 10 seconds is not much of a difference for people to read the HTML file (probably there aren't that much events on the Nexuiz servers, during that time), but it's plenty of time to do an analysis, as they usually don't need that long, especially when using the --statssave
switch. This way you can easily avoid lags on slower machines. But the easier way is a shell script, that runs the log analysis one run at a time. Just be sure, it's not taking so long as that the next cron interval will start a second instance of the script. Set the cron time interval accordingly. And use the --statssave
switch to keep runtime as low as possible.
When using the --statssave
option, Nexuizstats saves all statistical data collected in a text file. This file hat the following structure:
Nexuiz stats save file, revision 2
. There are no spaces before or after allowed. The revision number may change upwards in the future, if there is any change of the format of save files. Older revisions will only be allowed, when compatible. Otherwise, Nexuizstats will reject those files and abort the analysis run.
Do not mess up this file!
(which is meant the way it sounds...) It's actually not checked, whether this line was changed. It's only dropped.
Timestamp:
. It's actually not checked, whether this line was changed. It's only dropped.
Number of read log files:
. It's actually not checked, whether this line was changed. It's only dropped.
Number of found players:
. It's actually not checked, whether this line was changed. It's only dropped.
Note, that calculated values such as ratio or all deaths are not included. There isn't much use for these values in the save file, as the calculations are done again anyways, most of the time. This saves up hard disk space, as all needed data is already present, this way and will be recalculated anyways. Not also, that the format of the line break characters depends on the operating system, the Nexuizstats were compiled on. On Linux it's ASCII code 10 (0x0A). On Windows it's two characters, 13 and 10 (0x0D, 0x0A).
This program is licenced under the GNU GPLv3. This means, you are entirely free, to distribute the program, read its source code, compile it or change it to your own needs. The details are explained in the licensing section. But there are still some guidelines, that'd better be followed, to make improving/reading the code easier for others:
Docs
inside the Archive, containing all sorts of information. (It's not necessarily included, when installing Nexuiz via Linux' package repositories.) Especially the file eventlog.txt
is of interest, when it comes to properly parsing the log files.
open
-command, without checking, whether it was successfull, or not. But this can lead to all sorts of problems. So better make the program check that.
-exx
switch of the Freebasic compiler, to ensure, the compiled program will report any of them, when they occur. Otherwise you might end up with a whole lot of strange behaviours, that apparently don't seem to trigger any crashes or errormessages but still mess up everything.
--withbots
switch? Why isn't this default?
Q: Why doesn't the tool (also) analyze console logs?
A: At the beginning of this project, this was actually the only thing that got analyzed. But as the log files will grow rapidly and the process of analyzing gets really bulky (using a lot of CPU time and taking quite a while) this was disturbing server performance, leading to lagging Nexuiz servers as the computer was to busy, analyzing the console log. And more important: The format of the event logs is far more suitable for this task, as every event is clearly stated in a standardized way, while for example in the console log, the various strings indicating frags and suicides must be taken into account. And for example, if there is even one weapon added by a mod, that gives a new console notification (something like »...got shred to pieces by $players sword« for a melee weapon »sword«), this event will not be counted. Also it's not that easy, to make sure, someone with a strange nick doesn't mess up the parsing. So technically, it's more sound to just use the event logs, instead of the console logs. In consequence, the console log analyzing was dropped all together and only the event logs are analyzed.
Q: Why is there this --withbots
switch? Why isn't this default?
A: Usually people want statistical analysis like this tool provides, for some sort of ranking. But »skill« is a rather relative thing, not one universal fact. It's always reflecting the skill of players relative to each other. While a pair of evenly good players will have a ratio and efficiency of round about 0.50 each, and another pair with also two times the same skill, will also end up around 0.50, each. But they will not necessarily have the same results, when you switch one player of a pairs with one of the other pair. Then the skill will likely be quite different (unless you had the rare opportunity to find four players of even skill...) Now let's get to the bots: It makes a whole lot of difference, if the statistical data of players kills and deaths is influenced by the players skill alone, or whether bots' skill as well. The latter aren't necessarily homogeneous »players«, as you can vary the bot's level of difficulty. So there's not much of a point, to try to compare a players skill in relation with bots, if you don't know the bots skill setting. If you set the bots skill level to 1 (really really easy), most players, playing often on this server, will have a rather high ratio and efficiency, regardless if they are good in comparison with real players. If you exclude the bot frags, you will see the skill of the players in relation to the other players. (Unless someone has quite extensive suicide and accident records amounted in games against bots only.) The same thing would go the other way around, if you set the bots to a rather high level. Most players will have almost equally bad skill values, even if they would be relatively divers in their skill, compared to each other. And this is, why bots are included optionally. They tend to hide the actual players abilities. Only if you really wanna know, how bots influence the results, just to have a comparison, you should use the --withbots
switch.
Q: Why are the ctf values not included by default?
A: Because they wouldn't make much sense on a pure dm or rune-server. It's only useful, if there are actually ctf games taking place on that server. On a dm server, that'd give only rows with a lot of zeros in it. No one would want that. CTF events only occur, when the game type of the server is set to ctf, at server start or dynamically, by map type. There are also mods out there, where the game type can be switched by the type of the map, that is loaded. So only when actually running CTF matches, the --ctf
switch becomes useful. In this case, the --ctfsort
switch can be useful, as well.
Q: What is the time filter of players useful for?
A: Well, especially when easy bots are included, it sometimes happens, that someone strikes a really big score, let's say, 100 kills, no deaths, which puts him high in the sky in terms of the ranking, almost uncatchable. This also happens easily with lower values, let's say, 10 kills no deaths. But the longer time goes, the more likely it gets that the player will face a death of some kind (accident, frag, suicide). But if this was just one of those casual gamers, visiting the server once and never turning back, there's possibly only little chance for other players, to ever reach that ratio and overtake this player. So in a certain way, one can gain a really big score, being placed very high for a long time (essentially caused only by statistics), even when (in comparison) he actually lacks the skill, to remain there. In terms of the first example: Let's consider an evenly good player, who turns up and frags the guy 20 times (=one map), the statistical skill will melt to around 5, instead of 100, within few minutes. But in order for this to happen, the guy would have to reappear on the server, which sometimes never happens. If you don't filter such a onetime skiller, it's not very fair to players, who play there frequently, and got skill values not only caused by statistics and chance. But to totally exclude them, wouldn't be fair, either, as there must be a chance for the player, to actually gain high placing, at least for a while. So this is why it's reasonable, to take time as the limiting factor. Also you don't necessarily want to include nominal members forever, as (especially on announced Internet servers) the list of players can grow quite extensively. It's also kind of limiting to the essentials: The really active players of that server.
Q: Why is my nick incomplete in the XML file?
A: As stated in the description of the --xml
switch, in this case, the nick contains characters, which have no representation in ISO-8859-1 character set. In order to be »well formed« XML files, these characters must not be included into the XML file. Sorry about that, but implementing a whole Unicode conversion subroutine was a little bit much to ask, for such a small tool. But if anyone likes to solve this problem, be my guest. =)
Q: Why are some of the nicknames colored in the HTML table? This messes up my design.
A: As you might know, Nexuiz as like many other shooters of the quake genre, support coloring names or texts in general. This is intended and part of the nick. The control sequences used in order to achieve this, aren't written in plain into the HTML, but interpreted in the way, Nexuiz would interpret them and therefore the colors are set accordingly. If this looks bad on your website design, thank the player for not considering the impact of his choice of nick on your website. Sorry, but this time, it's actually not a bug, it's really a feature. ;-)
Q: Why use Freebasic, instead of, for example, C oder C++?
A: To be blunt: Because it's easier. If you see the stunts done with arrays and strings in there, you will see, that these constant memory allocations 'n stuff are a pain in the ass, especially when dealing with strings in arrays. Sure, one could be doing this project in C or C++ as well, but the original author (Martin Wohlauer) was interested in having an easily maintainable program, quickly written and doing the job it is intended for. That's what Freebasic does. And the compiler is under the (L)GPL, available for the two mainly used server operating systems (Windows and Linux), so there's no reason not to use it.
Version | Changes |
---|---|
0.34 |
|
0.33 |
|
0.32 |
|
0.31 |
|
0.3 |
|
0.2 |
|
0.1 |
|
Version 3, 29 June 2007
Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
The GNU General Public License is a free, copyleft license for software and other kinds of works.
The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.
When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.
Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and modification follow.
»This License« refers to version 3 of the GNU General Public License.
»Copyright« also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.
»The Program« refers to any copyrightable work licensed under this License. Each licensee is addressed as »you«. »Licensees« and »recipients« may be individuals or organizations.
To »modify« a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a »modified version« of the earlier work or a work »based on« the earlier work.
A »covered work« means either the unmodified Program or a work based on the Program.
To »propagate« a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.
To »convey« a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays »Appropriate Legal Notices« to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.
The »source code« for a work means the preferred form of the work for making modifications to it. »Object code« means any non-source form of a work.
A »Standard Interface« means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.
The »System Libraries« of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A »Major Component«, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.
The »Corresponding Source« for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.
The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.
The Corresponding Source for a work in source code form is that same work.
All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.
No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.
When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.
You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.
You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:
A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an »aggregate« if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.
You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:
A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.
A »User Product« is either (1) a »consumer product«, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, »normally used« refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.
»Installation Information« for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.
If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).
The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.
»Additional permissions« are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:
All other non-permissive additional terms are considered »further restrictions« within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.
You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).
However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.
Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.
You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.
Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.
An »entity transaction« is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.
A »contributor« is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's »contributor version«.
A contributor's »essential patent claims« are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, »control« includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.
In the following three paragraphs, a »patent license« is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To »grant« such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.
If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. »Knowingly relying« means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.
A patent license is »discriminatory« if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.
If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.
Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.
The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License »or any later version« applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.
If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.
Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM »AS IS« WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the »copyright« line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.> Copyright (C) <year> <name of author> This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author> This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an »about box«.
You should also get your employer (if you work as a programmer) or school, if any, to sign a »copyright disclaimer« for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see <http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>.