rewrote the tmserver container to only host tmserver and not xaseco

This commit is contained in:
Hendrik Boll 2019-05-12 11:07:07 +02:00
parent 50dd3690ee
commit 1579b016fd
195 changed files with 73 additions and 53531 deletions

View File

@ -1,19 +1,17 @@
FROM fanyx/php:5.6 FROM fanyx/php:5.6
RUN mkdir /opt/tmserver /opt/xaseco RUN mkdir /opt/tmserver
COPY tmserver/ /opt/tmserver/ COPY tmserver/ /opt/tmserver/
COPY xaseco/ /opt/xaseco/ COPY ./entrypoint-tmserver.sh /
COPY ./entrypoint.sh /
RUN apt update \ RUN apt update \
&& apt install pwgen && apt install pwgen
RUN groupadd trackmania RUN groupadd trackmania
RUN useradd -M -g trackmania trackmania RUN useradd -M -g trackmania trackmania
RUN chown -R trackmania:trackmania /opt/tmserver RUN chown -R trackmania:trackmania /opt/tmserver
RUN chown -R trackmania:trackmania /opt/xaseco RUN chown trackmania:trackmania /entrypoint-tmserver.sh
RUN chown trackmania:trackmania /entrypoint.sh
USER trackmania USER trackmania
WORKDIR /opt/tmserver WORKDIR /opt/tmserver
CMD ["bash"] CMD ["/entrypoint-tmserver.sh"]

View File

@ -22,6 +22,7 @@ version: '3'
ports: ports:
- "8080:80" - "8080:80"
tmserver: tmserver:
build: .
image: fanyx/tmserver image: fanyx/tmserver
container_name: trackmania_tmserver container_name: trackmania_tmserver
depends_on: depends_on:
@ -30,10 +31,6 @@ version: '3'
environment: environment:
- SERVER_LOGIN= - SERVER_LOGIN=
- SERVER_LOGIN_PASSWORD= - SERVER_LOGIN_PASSWORD=
- DB_HOST=db
- DB_NAME=trackmania
- DB_LOGIN=trackmania
- DB_LOGIN_PASSWORD=
- SERVER_PORT=2350 - SERVER_PORT=2350
- SERVER_P2P_PORT=3450 - SERVER_P2P_PORT=3450
- SERVER_SA_PASSWORD= - SERVER_SA_PASSWORD=
@ -41,12 +38,9 @@ version: '3'
- SERVER_NAME=Trackmania Server - SERVER_NAME=Trackmania Server
- SERVER_COMMENT=This is a Trackmania Server - SERVER_COMMENT=This is a Trackmania Server
- SERVER_PASSWORD= - SERVER_PASSWORD=
volumes:
- /xaseco:/opt/xaseco
- /tmserver:/opt/tmserver
ports: ports:
- "2350" - "2350:2350"
- "2350/udp" - "2350:2350/udp"
- "3450" - "3450:3450"
- "3450/udp" - "3450:3450/udp"

View File

@ -3,6 +3,11 @@
set -e set -e
if [[ -e /etc/tmserver/env ]]
then
. /etc/tmserver/env
fi
# Evaluate all the available environment variables # Evaluate all the available environment variables
if [[ -z "${SERVER_LOGIN}" ]]; then if [[ -z "${SERVER_LOGIN}" ]]; then
echo "Server account login is missing. Server cannot start." echo "Server account login is missing. Server cannot start."
@ -12,22 +17,6 @@ if [[ -z "${SERVER_LOGIN_PASSWORD}" ]]; then
echo "Server account password is missing. Server cannot start." echo "Server account password is missing. Server cannot start."
exit 9 exit 9
fi fi
if [[ -z "${DB_HOST}" ]]; then
echo "MySQL database host was not set. Defaulting to 'db' for the docker-compose configuration"
DB_HOST="db"
fi
if [[ -z "${DB_NAME}" ]]; then
echo "No database name was set. Defaulting to 'trackmania' for the docker-compose configuration"
DB_NAME="trackmania"
fi
if [[ -z "${DB_LOGIN}" ]]; then
echo "No database user was set. Defaulting to 'trackmania' for th docker-compose configuration"
DB_LOGIN="trackmania"
fi
if [[ -z "${DB_LOGIN_PASSWORD}" ]]; then
echo "No database user password was set. The server cannot connect to the database. Aborting"
exit 9
fi
if [[ -z "${SERVER_PORT}" ]]; then if [[ -z "${SERVER_PORT}" ]]; then
echo "No server port was set. Defaulting to port 2350" echo "No server port was set. Defaulting to port 2350"
SERVER_PORT="2350" SERVER_PORT="2350"
@ -60,21 +49,7 @@ fi
# Evaluation over # Evaluation over
# Commencing substition in config files # Commencing substition in config files
#Xaseco files
cd /opt/xaseco
pwd
sed -i -e "s/--\$SERVER_SA_PASSWORD--/$SERVER_SA_PASSWORD/" /opt/xaseco/config.xml
sed -i -e "s/--\$DB_HOST--/$DB_HOST/" \
-e "s/--\$DB_LOGIN--/$DB_LOGIN/" \
-e "s/--\$DB_LOGIN_PASSWORD--/$DB_LOGIN_PASSWORD/" \
-e "s/--\$DB_NAME--/$DB_NAME/" \
/opt/xaseco/localdatabase.xml
#Trackmania Files #Trackmania Files
cd /opt/tmserver
pwd
sed -i -e "s/--\$SERVER_SA_PASSWORD--/$SERVER_SA_PASSWORD/" \ sed -i -e "s/--\$SERVER_SA_PASSWORD--/$SERVER_SA_PASSWORD/" \
-e "s/--\$SERVER_ADM_PASSWORD--/$SERVER_ADM_PASSWORD/" \ -e "s/--\$SERVER_ADM_PASSWORD--/$SERVER_ADM_PASSWORD/" \
@ -85,5 +60,6 @@ sed -i -e "s/--\$SERVER_SA_PASSWORD--/$SERVER_SA_PASSWORD/" \
-e "s/--\$SERVER_PASSWORD--/$SERVER_PASSWORD/" \ -e "s/--\$SERVER_PASSWORD--/$SERVER_PASSWORD/" \
-e "s/--\$SERVER_PORT--/$SERVER_PORT/" \ -e "s/--\$SERVER_PORT--/$SERVER_PORT/" \
-e "s/--\$SERVER_P2P_PORT--/$SERVER_P2P_PORT/" \ -e "s/--\$SERVER_P2P_PORT--/$SERVER_P2P_PORT/" \
/opt/tmserver/GameData/Config/default.txt /opt/tmserver/GameData/Config/config.txt
exec "/opt/tmserver/TrackmaniaServer" "/nodaemon" "/internet" "/game_settings=MatchSettings/playlist.txt" "/dedicated_cfg=config.txt"

View File

@ -70,7 +70,7 @@
<p2p_cache_size>600</p2p_cache_size> <p2p_cache_size>600</p2p_cache_size>
<xmlrpc_port>--$SERVER_XMLRPC_PORT--</xmlrpc_port> <xmlrpc_port>5000</xmlrpc_port>
<xmlrpc_allowremote>True</xmlrpc_allowremote> <!-- If you specify an ip adress here, it'll be the only accepted adress. this will improve security. --> <xmlrpc_allowremote>True</xmlrpc_allowremote> <!-- If you specify an ip adress here, it'll be the only accepted adress. this will improve security. -->
<blacklist_url></blacklist_url> <blacklist_url></blacklist_url>

Binary file not shown.

View File

@ -0,0 +1,16 @@
[2019/05/12 10:20:20] Initializing...
[2019/05/12 10:20:20] Loading system configuration...
[2019/05/12 10:20:20] ...ERROR: No configuration file.
...Could not load the system configuration
[2019/05/12 10:20:20] Loading cache...
[2019/05/12 10:20:20] ...OK
[2019/05/12 10:20:20] Listening for xml-rpc commands on port 5000.
[2019/05/12 10:20:20] No match settings file
[2019/05/12 10:20:20] Server not started: no ServerName specified.
[2019/05/12 10:20:20] Connecting to master server...
[2019/05/12 10:20:21] ...OK
[2019/05/12 10:20:21] Identifying on master server...
[2019/05/12 10:20:21] ...ERROR: invalid login
[2019/05/12 10:20:21] Please wait, loading...
[2019/05/12 10:20:23] Server not running, exiting.
[2019/05/12 10:20:24] Exiting...

View File

@ -61,7 +61,7 @@ case "$1" in
fi fi
cd $TMDIR cd $TMDIR
./TrackmaniaServer /internet /game_settings=${GAME_SETTINGS} /dedicated_cfg=${DEDICATED_CFG} & ./TrackmaniaServer /nodaemon /internet /game_settings=${GAME_SETTINGS} /dedicated_cfg=${DEDICATED_CFG} &
PID=$! PID=$!
ps -p ${PID} > /dev/null 2>&1 ps -p ${PID} > /dev/null 2>&1
if [[ "$?" -ne "0" ]] if [[ "$?" -ne "0" ]]

View File

@ -1,3 +0,0 @@
#!/bin/sh
php aseco.php TMN </dev/null >aseco.log 2>&1 &
echo $!

View File

@ -1,208 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<TITLE>TrackMania Nations - ASECO/RASP new features v0.8</TITLE>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<META NAME="author" CONTENT="Frans P. de Vries">
<META NAME="generator" CONTENT="vi :)">
<style type="text/css">
body { width: 960px; margin-left: 30px; font-family: Arial,Helvetica,sans-serif; font-size: 15px; }
li,div { padding: 3px; }
code,pre { font-size: 14px; }
pre { width: 90%; margin: 3px 0px; padding: 3px 0px 3px 12px; background-color: #F0F0F0; }
</style>
<META NAME="keywords" CONTENT="TrackMania, Nations, Original, Sunrise, racing, games, ASECO, RASP, Jfreu, plugins, records, jukebox">
<META NAME="description" CONTENT="Information on the ASECO/RASP system for TrackMania Nations (and Original/Sunrise), a racing game by Nadeo">
</HEAD>
<BODY TEXT="#000000" LINK="#ff0000" VLINK="#0000ff" ALINK="#00ff00" BGCOLOR="#ffffff">
<P ALIGN="center">
<A TARGET="_blank" HREF="http://eswc.trackmanianations.com/"><IMG SRC="banner.jpg" ALT="TrackMania Nations" BORDER="0" WIDTH="590" HEIGHT="149"></A>
<HR>
<H3>New features and other changes in the v0.8 release of ASECO/RASP:</H3>
<UL>
<LI><b>FAST-like records handling</b>:<br>
with every new/improved record, players see the old place and the time difference compared to their old record
<LI>show <u>secured</u> records (incremental improvements of the same place) and <u>equaled</u> records to all players
<LI><b>FAST-like record reports</b>:<br>
<u>before</u> each track (optionally) show the places &amp; times of the first 8 (configurable) players, along with those of all other online players;<br>
<u>after</u> each track show the places &amp; times of the first 8 (configurable) players, along with any new/improved records, and the total count of new/improved records;<br>
also, all online players are shown in <i>italics</i>
<LI>the record report <u>before</u> a track is also shown to a newly connecting player
<LI>enhanced <b>/recs</b> command to display <u>all</u> records (paginated) on current track, not just the first 5
<LI>new <b>/newrecs</b> command to show newly driven records so far on current track
<LI>new <b>/liverecs</b> command to show the top-6 (configurable) records and records of online players on the current track, whether new or not
<LI>new <b>/firstrec</b> and <b>/lastrec</b> commands to quickly show the best and worst ranked records on a track (without browsing /recs)
<LI>new <b>/diffrec</b> command to quickly show the time difference between your /pb and the /firstrec on a track
<LI>new <b>/nextrec</b> command to quickly show the next better ranked record (compared to your /pb) to beat on a track
<LI>new <b>/recrange</b> command to show the time difference between the first and last ranked records on a track
<LI><b>FAST-like rounds reports</b>:<br>
after each run show the places &amp; times of the first 8 (configurable) players, and just the places of the rest;<br>
new/improved records are highlighted and always shown with the time
<LI>created an <u>EndRound event</u> in the events handling for the aforementioned rounds reports
<LI>connect <b>new player</b> message (via Jfreu plugin) enhanced to show <b>nation, ladder rank &amp; server rank</b><br>
(also, if connecting player is an admin, show 'Admin' instead of 'New Player')
<LI>new <b>/list</b> options to complement /list nofinish:<br>
<b>/list norank</b> displays all tracks the player finished but doesn't have a ranked record on<br>
<b>/list nogold</b> displays all tracks the player finished but didn't beat the Gold time on
<LI>new <b>/jukebox display</b> option to display tracks &amp; requesters in a pop-up
<LI>new <b>/jukebox drop</b> option to allow a player to drop his/her track in order to jukebox a different one
<LI>new <b>/jukebox help</b> option to display all jukebox facilities
<LI>new <b>/best</b> &amp; <b>/worst</b> commands allowing players to display their records sorted in best or worst order
<LI>new <b>/summary</b> command to show the total number of ranked records, and the top 3 of the best ones
<LI>new <b>/toprecs</b> command to display the top-100 of players with the most ranked records
<LI>/top5 command replaced by <b>/top10</b> command, and new <b>/top100</b> command added to display the server ranks of many more players than just the first 5
<LI>enhanced <b>/stats</b> command to display lots more details about the player (supersedes /infos command from Jfreu plugin)
<LI>moved Jfreu's /write_list command functionality to <b>/jfreu writelists</b>
<LI>new <b>/server</b> command to display lots of details about the server, including the admin contact<br>
(if you'd like to display more contact details, better use slly's chat.contact.php plugin)
<LI>new <b>/nations</b> command to display the top-10 nations with the most visiting players
<LI>new <b>/ranks</b> command to display the server ranks of all online players
<LI>new <b>/clans</b> command to display which clans all online players belong to
<LI>new <b>/topclans</b> command to display top-10 of all clans (determined by averaging the ranks of all players in each clan)
<LI>new <b>/wins</b> command to quickly show the player's win count
<LI>new <b>/topwins</b> command to display the top-100 of players with the most wins
<LI>new <b>/active</b> command to display the top-100 players that spent the most time on the server
<LI>new <b>/track</b> command to show details about the current track
<LI>new <b>/history</b> command to show the 10 most recently played tracks
<LI>new <b>/playtime</b> command to show the time the current track has been playing
<LI>optional showing of <b>total playtime</b> at the end of the track (only in Rounds &amp; Team modes - playtime is fixed in Time Attack &amp; Laps)
<LI>new <b>/time</b> command to show the current time and date on the server
<LI>new <b>/bootme</b> command so the player can leave (kick himself) without using the Escape menu
<LI>/msg command renamed to <b>/pm</b> (private message) and updated to show who's sending the message to whom
<LI>new <b>/pma</b> command so an admin can send private message to a player and also to all other online admins (ie. like carbon-copy in mails)
<LI>new admin command: <b>/admin pm</b> to send private message from one admin to all other online admins
<LI>enhancement of <b>/players</b> command: now shows column of <b>player IDs</b>, which can subsequently be used with /pm (for all users) and /pma (for admins) instead of logins (which are sometimes hard to type);<br>
also shows <b>Nations</b> of all players
<LI>added shortcuts for common admin commands:<br>
/admin nextmap or <b>/admin next</b><br>
/admin restartmap or <b>/admin res</b><br>
/admin cancel or <b>/admin can</b><br>
/admin clearjukebox or <b>/admin cjb</b>
<LI>new admin command: <b>/admin endround</b> (or shortcut <b>/admin er</b>) forces end of a round without restarting the whole track
<LI>new admin command: <b>/admin replaymap</b> (or shortcut <b>/admin replay</b>) to requeue the current track at the start of the jukebox so it will play again, after it ends and ladder points have been awarded
<LI>new admin command: <b>/admin dropjukebox #</b> (shortcut <b>/admin djb</b>) to drop any track from the jukebox
<LI>new admin commands: <b>/admin showbanlist</b> and <b>/admin showblacklist</b> to display the lists of banned and blacklisted player(s)
<LI>new admin commands: <b>/admin writeblacklist</b> and <b>/admin readblacklist</b> to write/read the player blacklist to/from disk
<LI>enhancement of /admin warn, /admin kick, /admin ban &amp; /admin black to accept <b>player IDs</b> from /players command
<LI>new admin command: <b>/admin kickghost</b> to kick a partially disconnected player without checking for valid login (doesn't work with player ID)
<LI>enhancement of /admin warn,kick,kickghost,ban,black,er,res,next,can,cjb commands to show <b>nickname of the admin</b> performing them
<LI>more <b>admin powers for the jukebox</b>: admins can jukebox a track that was recently played (players have to wait until it expires from the track history), and admins can add multiple tracks (players can add only one)
<LI><b>other admin powers</b>: admin can use <b>player logins or IDs</b> with /stats, /best, /worst, /summary
<LI>new option <b>$allowpublickarma</b> to disable public karma votes (so that only /++ and /-- work)
<LI>new option <b>$feature_jukebox</b> to disable actual jukebox-ing of tracks, while leaving /list enabled (as long as plugin remains included)
<LI>new option <b>$jukebox_skipleft</b> to enable skipping of a jukebox-ed track after its requester left
<LI>new option <b>$prune_records_times</b> to enable pruning at start-up of records/rs_times for deleted tracks (recommended so they don't clutter up the /best &amp; /worst lists)
<LI>new option to <b>log all player chat</b>, not just use of chat commands
<LI>various other logging enhancements
<LI>enhanced <b>Idle-kick plugin by Mistral</b>: kicks AFK players after two tracks, except speccers (configurable)
<LI>tracks downloaded from TMX are saved by track name, not TMX ID
<LI>new general chat commands: <b>/gr</b>, <b>/bgm</b>, <b>/thx</b>, <b>/brb</b>, <b>/afk</b>
<LI>new <b>/helpall</b> command to display complete paginated help overview of all commands, and also pagination of /admin help &amp; /jfreu help
<LI>numerous cosmetic tweaks, e.g. consistent formatting of all messages to players, and improved contrast in all pop-ups
<LI>improved <b>stripColors function</b> based on Bilge/AM's TMU stripFormatting function
<LI><b>many bug fixes</b>, e.g. in /list help, the original records handling, in /nextmap, player connects, and more (see below)
<LI>numerous code optimizations and layout tweaks, including a <b>consistent Tab-based layout</b> that's customizable with vim's modeline settings while preserving correct indentation throughout the entire code base
<LI>Jfreu's up-to-date check at start-up is disabled due to timeouts on the link
<LI>Jfreu's childish /fake command has been disabled ;) as well as the non-functional /password command
</UL>
<H3>Bug fixes in the v0.8 release of ASECO/RASP:</H3>
<UL>
<LI><b>player connect</b>: very rarely a player connects to the server but the player data is not received in ASECO, resulting in a sort of zombie player. Despite several different approaches, this couldn't be fixed. So instead, to prevent further problems for such a player (like records not being stored), an explanation is displayed (in chat and pop-up) and the player is kicked in order to re-join.
<LI><b>/players &lt;string&gt;</b>: using a string with the /players command allows you to search for a specific player with that string in the login and/or nickname. This string didn't match if it occurred at the beginning of the player's login/nickname &ndash; fixed.
<LI><b>/list help</b>: after using /list help, further /list commands would not always work properly &ndash; fixed.
<LI><b>/nextmap</b>: this didn't work if the current track was the last one in the set, and for servers with more than 300 tracks if the current track was beyond that 300th track &ndash; fixed.
<LI><b>minimum records</b>: the minimum number of ranked records required for a server rank was actually $minrecs+1 instead of $minrecs &ndash; fixed
<LI><b>special characters</b>: very rarely a player nickname contains a special character that could prevent it from being stored into the database &ndash; fixed by consistently quoting all strings sent to the database
<LI><b>records</b>: messages about new records were inconsistent ("claimed", "took") &ndash; fixed.
<LI><b>server messages</b>: inconsistent indications whether a server message was broadcast to all players or sent to one &ndash; fixed, all broadcasts start with "&gt;&gt;" and all messages to the player with "&gt;".
</UL>
<HR>
<ADDRESS>
Copyright &copy; 2007-2013 &ndash; Frans P. de Vries <A HREF="mailto:tm&#64;&#103;&#97;&#109;&#101;&#114;&#115;&#46;&#111;&#114;&#103;">&lt;tm&#64;&#103;&#97;&#109;&#101;&#114;&#115;&#46;&#111;&#114;&#103;&gt;</A>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
Last updated 24-Oct-2007
</ADDRESS>
</BODY>
</HTML>

View File

@ -1,890 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<TITLE>TrackMania Nations - ASECO/RASP release notes v0.95</TITLE>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<META NAME="author" CONTENT="Frans P. de Vries">
<META NAME="generator" CONTENT="vi :)">
<style type="text/css">
body { width: 960px; margin-left: 30px; font-family: Arial,Helvetica,sans-serif; font-size: 15px; }
li,div { padding: 3px; }
code,pre { font-size: 14px; }
pre { width: 90%; margin: 3px 0px; padding: 3px 0px 3px 12px; background-color: #F0F0F0; }
</style>
<META NAME="keywords" CONTENT="TrackMania, Nations, Original, Sunrise, racing, games, ASECO, RASP, Jfreu, plugins, records, jukebox">
<META NAME="description" CONTENT="Information on the ASECO/RASP system for TrackMania Nations (and Original/Sunrise), a racing game by Nadeo">
</HEAD>
<BODY TEXT="#000000" LINK="#ff0000" VLINK="#0000ff" ALINK="#00ff00" BGCOLOR="#ffffff">
<P ALIGN="center">
<A TARGET="_blank" HREF="http://eswc.trackmanianations.com/"><IMG SRC="banner.jpg" ALT="TrackMania Nations" BORDER="0" WIDTH="590" HEIGHT="149"></A>
<HR>
<H3>New features and other changes in the v0.95 release of ASECO/RASP:</H3>
<UL>
<LI>new <b>Dedimania world records</b> support (derived from FAST) with the following features:
<UL>
<LI>Dedimania is an online World Records database for all TrackMania games with the official site at <A TARGET="_blank" HREF="http://www.dedimania.com/">http://www.dedimania.com/</A> and its records database at <A TARGET="_blank" HREF="http://www.dedimania.com/tmstats/?do=stat">http://www.dedimania.com/tmstats/?do=stat</A> ; it maintains 30 records for each track in any game (TMO/TMS/TMN/TMU) and any mode (TimeAttack, Rounds, Team, Laps)
<LI>the Dedimania system consists of two new plugins: <b>plugin.dedimania.php</b> which handles all communication with the central Dedimania server (together with new includes <b>GbxRemote.response.php</b>, <b>xmlrpc_db.inc.php</b>, <b>web_access.inc.php</b> and <b>urlsafebase64.php</b>) and keeps track of new records, and <b>chat.dedimania.php</b> which provides a variety of commands to show records and their relations on the current track
<LI>the following new commands are available for Dedimania world records, analogous to the existing local records commands:
<UL>
<LI><b>/helpdedi</b>: Displays info about the Dedimania records system (alias: <b>/dedihelp</b>)
<LI><b>/dedirecs</b>: Displays all Dedimania records on current track
<LI><b>/dedinew</b>: Shows new Dedimania records on current track
<LI><b>/dedilive</b>: Shows Dedimania records of online players
<LI><b>/dedipb</b>: Shows your Dedimania personal best on current track
<LI><b>/dedifirst</b>: Shows first Dedimania record on current track
<LI><b>/dedilast</b>: Shows last Dedimania record on current track
<LI><b>/dedinext</b>: Shows next better Dedimania record to beat
<LI><b>/dedidiff</b>: Shows your difference to first Dedimania record
<LI><b>/dedirange</b>: Shows difference first to last Dedimania record
</UL>
<LI>new, improved, secured and equalled Dedimania records are shown via chat messages just like local records, as are the record reports before and after each track, with configuration options identical to those for local records
<LI>the new <b>dedimania.xml</b> configuration file defines various Dedimania parameters and record display settings (akin to config.xml), the server's account (from dedicated.cfg), and all Dedimania messages
<LI>the Dedimania system communicates with the central Dedimania server over port 8003 by default, so you must open that port on your firewall/router; if that's not possible the system falls back on port 80 (http)
<LI>the Dedimania system requires plugin.checkpoints.php (the checkpoints tracking plugin) to be included in plugins.xml, <u>before</u> plugin.dedimania.php
<LI>new <b><CODE>&lt;dedimsg&gt;</CODE></b> and <b><CODE>&lt;dedimsg&gt;</CODE></b> colors are defined in config.xml and used in all relevant Dedimania messages so that they can easily be customized
<LI>a new <b>onEverySecond event</b> (which, as the name implies, is triggered once every second) is defined in aseco.php to act as a "heart beat" in communicating with the central Dedimania server
<LI>Laps mode is <u>not</u> supported due to the way checkpoints and laps information is supplied by the TM server
<LI>LAN logins (with IP and port) are ignored by the Dedimania system
<LI>mega thanks to Slig for his generous help in building this system <FONT FACE="Wingdings">&#74;</FONT>
</UL>
<br>
<LI>the <i>/tmxinfo</i> output now includes the Awards count for a TMX track
<LI>the <i>/tmxinfo</i> and <i>/tmxrecs</i> commands use cached TMX data for the current track to avoid sending multiple requests to the TMX site
<LI>updated the <i>TMXInfoFetcher class</i> to time out when the TMX site is down, and to return several more info fields including the awards count
<LI>updated the <i>TMNDataFetcher class</i> to time out when the master/ladder servers are down
<LI>the minimum number of ranked players that's included in the computation of the <i>/topclans</i> ranking is now configurable via new config.xml setting <b><CODE>&lt;topclans_minplayers&gt;</CODE></b> (default: 2)
<LI>new <b>/admin setgamemode</b> command (parameter: ta, rounds, team, laps, stunts) to change the game mode for the next track into the specified mode
<LI>rewrote <i>/admin prev</i> to consult the server's track list instead of maintaining a track filename variable
<LI><i>/admin replay</i> will now check whether the currect track is already in the jukebox to get replayed, and if so, not queue it again
<LI>the pop-up window displayed by the <i>/admin mta/wall</i> command now starts with the title and nickname of the admin sending the message
<LI>new <b>/admin shutdown</b> command to shut down the TM server and ASECO/RASP
<LI>it is now possible to have chat-based voting commands temporarily disabled while an admin (of any tier) is online (configured via <b><CODE>$disable_upon_admin</CODE></b> in votes.config.php)
<LI>added <b>/votehelp</b> alias for <i>/helpvote</i>
<LI>the <CODE>&lt;limit&gt;</CODE> configuration setting in localdatabase.xml restricts the highest records that are shown to all players since v0.85, but now higher records are still shown to the pertaining player only
<LI>updated the <i>GBXDataFetcher class</i> to handle all known Challenge variants, including Forever
<LI>updated RASP's getChallengeData() function to use the <i>GBXDataFetcher class</i>
<LI>added extra check for 'SuperAdmin' login before connecting to the TM server
<LI>added extra check for TM server build '2006-05-30' during start-up
<LI>added a server Name entry to the start-up header in the log
<LI>improved speed of <i>/server</i> and <i>/nextrank</i> commands
<LI>adjusted some timeouts in the GbxRemote module (thanks Slig and Assembler Maniac)
<LI>an alternate (but untested) GbxRemote.bem.php module is included for big-endian machines (thanks again AM)
</UL>
<H3>Bug fixes in the v0.95 release of ASECO/RASP:</H3>
<UL>
<LI>occasionally an ASECO warning could come up during the jukeboxing & track switching process &ndash; fixed by the <i>/admin prev</i> rewrite above
<LI>the <i>/list norecent</i> output includes tracks that are no longer present on the server &ndash; fixed
<LI>a harmless "Start index out of bound" warning would be logged when the server has exactly 300 tracks (or a multiple thereof) &ndash; fixed
<LI>case-sensitivity in a part of the <i>/add</i> and <i>/admin add</i> code could cause a problem loading a track with a case-insensitive duplicate filename &ndash; fixed
<LI>renaming tracks downloaded from TMX into a sanitized filename with a unique sequence number (as introduced in v0.91) could still lead to a problem loading a different track with a duplicate filename into the TM server &ndash; fixed, the filename now also includes the TMX ID
<LI><i>/tmxrecs</i> displays an almost empty pop-up when a track has no TMX records &ndash; fixed, an error message is shown instead
<LI>the <i>TMXInfoFetcher class</i> doesn't handle tracks with 26-character UIDs &ndash; fixed
</UL>
<HR>
<H3>New features and other changes in the v0.93 release of ASECO/RASP:</H3>
<UL>
<LI>new <b>checkpoints tracking</b> support (via plugin.checkpoints.php) with the following features:
<UL>
<LI>all checkpoints and finishes are now tracked internally
<LI>new <b>/cps</b> command to enable/disable displaying the checkpoint passages (since the TM client has it built in for TimeAttack mode, this is only useful in Rounds/Team modes)
<LI>the first run on a track only stores all checkpoint passages (as long as the finish is reached)
<LI>if <i>/cps</i> is enabled, subsequent runs will display a small pop-up window at each checkpoint for two seconds (just as long as the TM client displays the checkpoint time), containing the time and the difference to the best run so far
<LI>if a run has a better finish time, it's stored together with those checkpoints as the new best run
<LI>the finish is also a checkpoint, but no pop-up is displayed there
<LI>the checkpoints are only remembered for the duration of each track, not stored in the database
<LI>a player's display setting is remembered until the next ASECO/RASP restart
</UL>
<br>
<LI>new <b>TMX information</b> support (based on the new <b>TMXInfoFetcher class</b>) with the following features:
<UL>
<LI>new <b>/tmxinfo</b> command to display the TMX information on the current track or, when given a track ID (from <i>/list</i>) or a TMX ID, any other track; note that with a TMX ID, the UID field in the output remains empty
<LI>new <b>/tmxrecs</b> command to display the TMX top-10 world records on the current track or, when given a track ID (from <i>/list</i>) or a TMX ID, any other track
<LI>optionally show the TMX World Record at the start of a new track (configurable via new config.xml setting <b><CODE>&lt;show_tmxrec&gt;</CODE></b>)
</UL>
<br>
<LI>new <b>/song</b> command (based on the new <b>GBXDataFetcher class</b>) to show the (file)name for the current track's song; no method is currently known to decode the title/artist from the song file
<LI>new <b>/admin prev</b> (alias <b>/admin previous</b>) command to quickly revisit the previous track
<LI>new <i>/list</i> option: <b>/list oldest #</b> displays the # oldest tracks added to the server (default: 10) to complement <i>/list newest</i>
<LI>the <i>/statsall</i> output now includes the Wins/Losses (W/L) ratio
<LI>the rounds reports now also work in Team mode
<LI>finalized the optimization (in v0.92) of the jukeboxing & track switching process
<LI>when a TMX <i>/add</i> or chat-based vote is cancelled by the server during the Tab scoreboard, that reset is also logged
<LI>documented the dependencies of all plugins in their respective headers
</UL>
<H3>Bug fixes in the v0.93 release of ASECO/RASP:</H3>
<UL>
<LI>when using jfreu.plugin.php (not jfreu.lite.php), if rank limiting is off then newly connected players are not properly entered into the internal players list &ndash; fixed
<LI>at ASECO/RASP start-up, authentication errors are ignored (oops) &ndash; fixed
<LI>if the same track is <i>/add</i>-ed or <i>/admin add</i>-ed multiple times, multiple files are created in the 'GameData/Tracks/Challenges/TMX/' or 'GameData/Tracks/Challenges/TMXtmp/' directories &ndash; fixed, duplicate files for identical tracks are prevented
<LI>if a file already exists in the 'GameData/Tracks/Challenges/TMXtmp/' directory for a <i>/add</i>-ed track and that track is then <i>/add</i>-ed again, the file (with an incremented name) is stored in the 'GameData/Tracks/Challenges/TMX/' directory instead &ndash; fixed
<LI>in the TMNDataFetcher, if the serverlogin for an online player starts with a non-alphanumeric character (e.g. '-') then the servernation isn't found &ndash; fixed
<LI>if plugin.matchsave.php is not included in plugins.xml (which is the default), <i>/admin match begin</i> crashes the system &ndash; fixed, a warning is shown if the plugin is not included
<LI>the administrator check for the <i>chat_tc_listen</i> ability doesn't work &ndash; fixed
</UL>
<HR>
<H3>New features and other changes in the v0.92b release of ASECO/RASP:</H3>
<UL>
<LI>all temporary bans are now stored in a dynamic bans file, configurable via <b><CODE>$bans_file</CODE></b> in jfreu.config.php (default: <b>plugins/jfreu/jfreu.bans.xml</b>), and automatically restored after an ASECO/RASP restart
</UL>
<H3>Bug fixes in the v0.92b release of ASECO/RASP:</H3>
<UL>
<LI>sometimes when a player connects, the TeamName is not available to store in the 'players' table, and thus it doesn't show up in the <i>/clans</i> command &ndash; fixed this long-standing issue (which had become worse due to the faster GbxRemote module) with a TMNDataFetcher call
<LI>the <i>/jfreu unban</i> command doesn't properly clear the ban &ndash; fixed
<LI>there are some minor formatting glitches in the output of <i>/stats</i>, <i>/statsall</i> and <i>/jfreu listbans</i> &ndash; fixed
</UL>
<HR>
<H3>New features and other changes in the v0.92 release of ASECO/RASP:</H3>
<UL>
<LI>new <b>/statsall</b> command to display any player's world stats (based on an updated <b>TMNDataFetcher class</b> by F*ckfish); you can use a player ID when the player is online on the current server, and otherwise any login (even of players that never visited the current server)
<LI>a new version of GbxRemote.inc.php not only addresses some low-level communication problems on AMD64 systems, but more importantly speeds up communication with the TM server &ndash; and therefore the responsiveness of all commands &ndash; very significantly (thanks Xerrez & Slig); the effect that the small chat window goes blank for a little while is also reduced
<LI>optimized calculation of all players' server ranks after each track
<LI>more optimization of the jukeboxing &amp; track switching process to (hopefully definitively) prevent stuck tracks
<LI>the <i>/nextrank</i> command now optionally shows the difference in record positions (RP), i.e. the combined number of positions that your records need to be improved in order to catch up with the next better ranked player (configured via <b><CODE>$nextrank_show_rp</CODE></b> in rasp.settings.php)
<LI>by appending an 'h' (case-insensitive) to the time parameter of <i>/jfreu banfor</i>, the specified value is converted from minutes into hours (e.g. <i>/jfreu banfor 4H &lt;login&gt;</i> for a four-hour ban)
<LI>correspondingly, all temporary ban messages now show the remaining time as "X hours XX mins" if it's more than an hour
<LI>new <b>/jfreu unban</b> command to cancel the temporary ban, from the badword filter and <i>/jfreu banfor</i>, of a player (login or ID)
<LI>new <b>/jfreu listbans</b> command to display the list of temporarily banned players; if the remaining time of a ban is more than an hour, it's shown as XhXX
<LI>the <i>/stats</i> output now includes the last online information (like <i>/laston</i>)
<LI>the <i>/laston</i> command can now be used without a parameter (however little use that has)
<LI>added a server Version entry to the start-up header in the log
<LI>the commands list (in <A HREF="aseco_commands.html">HTML</A> and <A HREF="aseco_commands.doc">Word</A>) now includes all <i>/admin</i> and <i>/jfreu</i> commands as well
</UL>
<H3>Bug fixes in the v0.92 release of ASECO/RASP:</H3>
<UL>
<LI>when a player equals his/her record, it's still stored in the 'records' table with the new date/time, in effect changing (increasing) its position if there are other players with the exact same time driven after that record's original date/time (ugly oops) &ndash; fixed, equalled records are not stored again; to repair the records that were affected by this bug, you can use <a href="scripts/repairrecs.zip">this PHP script</a>
<LI>when using jfreu.plugin.php (not jfreu.lite.php), if a player is banned by the badword filter or <i>/jfreu banfor</i> command, then the "left the game" message is still shown &ndash; fixed
<LI>also when using jfreu.plugin.php, if a player is kicked once by the ranklimit system, badword filter or <i>/jfreu banfor</i> command, which skip the "left the game" message, then that message would no longer be shown when that player leaves normally again after a subsequent visit &ndash; fixed
<LI>Player_IDs are not accepted when the pertaining player is offline, even when that would make sense (e.g. <i>/admin unban &lt;x&gt;</i> after <i>/admin listbans</i>) &ndash; fixed
<LI>when two (or more) players have the exact same Avg value, they receive the same server rank &ndash; fixed
<LI>when the Avg value shown by <i>/rank</i>, <i>/top10</i>, <i>/top100</i>, etc. rounds to a whole number, the ".0" decimal isn't shown &ndash; fixed
<LI>the v0.91 overhaul of the full Jfreu plugin warranted a version update to 0.14 &ndash; fixed
</UL>
<HR>
<H3>New features and other changes in the v0.91 release of ASECO/RASP:</H3>
<UL>
<LI>enhancements and fixes for the <b>full Jfreu plugin</b> (jfreu.plugin.php &amp; jfreu.chat.php):<br><br>
<UL>
<LI>the <b>jfreu.config.php</b> file was moved from the plugins/ directory to the more appropriate <b>includes/</b> directory
<LI>the player join message shows the administrator title (if appropriate) and the server rank when rank limiting is enabled
<LI>new command <b>/jfreu listlimits</b> to display all rank-limiting related settings in one convenient overview
<LI>new commands <b>/jfreu writeconfig</b> and <b>/jfreu readconfig</b> to write and read the actual Jfreu config settings to/from a new dynamic config file, configurable via <b><CODE>$conf_file</CODE></b> in jfreu.config.php (default: <b>plugins/jfreu/jfreu.config.xml</b>)
<UL>
<LI>the settings managed this way include all the variables in jfreu.config.php, except <CODE>$message_start</CODE>, all the actual info messages, and <CODE>$badwordslist</CODE>
<LI>changing any setting will cause the jfreu.config.xml file to be rewritten with the current values, so that after an ASECO/RASP restart it can be read back to restore those settings (it is however not read automatically)
<LI><i>/jfreu readconfig</i> shows the current servername after reading the settings, in case that was changed via the autoranking mechanism
</UL>
<LI>new commands <b>/jfreu listvips</b> and <b>/jfreu listvipteams</b> to display the lists of VIPs and VIP_Teams, respectively
<LI>new command <b>/jfreu readlists</b> to read in the lists of VIPs and VIP_Teams, complementing <i>/jfreu writelists</i>
<LI>new command <b>/jfreu badwordsnum</b> to set the badwords limit, complementing <i>/jfreu badwords</i> and <i>/jfreu badwordsban</i>
<LI>new command <b>/jfreu badword</b> to increment the badword count for a player (login or ID) who 'creatively' and intentionally circumvents the badword filter
<LI>new command <b>/jfreu autochangename</b> to enable or disable automatically changing the servername when the rank limit is updated
<LI>new command <b>/jfreu infomessages</b> to enable or disable the info messages
<LI>new <b><CODE>$unspecvote</CODE></b> setting in jfreu.config.php, and new command <b>/jfreu unspecvote</b> to allow or disallow SpecOnly players to use the <i>/unspec</i> command
<LI>exchanged the functionality of <i>/jfreu setrank</i> and <i>/jfreu setlimit</i>: now <i>setrank</i> enables/disables the rank limit system (just like <i>autorank</i> for the autoranking feature) while <i>setlimit</i> sets the rank limit value itself (similar to <i>hardlimit</i> for the overall hard limit value)
<LI>corrected <i>/jfreu addteamvip</i> into <i>/jfreu addvipteam</i>, and <i>/jfreu removeteamvip</i> into <i>/jfreu removevipteam</i> (along with all corresponding variables)
<LI>corrected <i>/jfreu autorankminplayer</i> into <i>/jfreu autorankminplayers</i>, and <CODE>$autorankminplayer</CODE> into <CODE>$autorankminplayers</CODE> in jfreu.config.php (proper plural)
<LI>the <i>/jfreu addvip</i>, <i>/jfreu removevip</i>, <i>/jfreu unspec</i>, <i>/jfreu banfor</i> and <i>/jfreu player</i> commands are now able to use player IDs (in addition to logins)
<LI>added clearer descriptions to the <i>/jfreu helpall</i> output
<LI>all relevant <i>/jfreu</i> commands now show the title and nickname of the admin performing those actions
<LI>added more logging of <i>/jfreu</i> commands usage, and of all the various kick reasons
<LI>an invalid value specified to <i>/jfreu setlimit</i>, <i>/jfreu hardlimit</i>, <i>/jfreu offset</i>, <i>/jfreu autorankminplayers</i>, <i>/jfreu maxplayers</i> and <i>/jfreu kickworst</i> produces an appropriate error message
<LI>a login specified to <i>/jfreu unspec</i> that isn't SpecOnly produces an appropriate error message
<LI>the <i>/jfreu setlimit</i> command without a value now shows the current rank limit
<LI>the jfreu.unspec.php plugin is integrated into jfreu.plugin.php: spectators that manage to start racing without getting unSpec-ed are kicked after passing a checkpoint; the original kick_player_spec() function is therefore redundant and was disabled
<LI>the NoVote feature (automatic cancellation of CallVotes) and the <i>/jfreu cancel</i> command are inactive when chat-based votes are enabled
<LI>fixed and re-enabled the <b>/password</b> command to show the server's player/spectator password to a player or spectator/SpecOnly, respectively
<LI>fixed <i>/jfreu setlimit on</i> to not change the servername if <CODE>$autochangename</CODE> is off
<LI>fixed <i>/jfreu message</i> to use the actual servername instead of the initial one, in case that was changed via the autoranking mechanism
<LI>fixed SpecOnly player's rank to get checked against the rank limit instead of 0 if <CODE>$autorank</CODE> is off
<LI>fixed players with rank 0 (vanilla account) to not get kicked if <CODE>$hardlimit</CODE> is disabled
<LI>fixed players with rank 0 (vanilla account) to get considered by the kick_hirank and kick_worst features before other high ranks
<LI>fixed player with rank higher than <CODE>$hardlimit</CODE> to still get shown an explanation message before being kicked
<LI>fixed spectator whose team is in the VIP_Teams list to get marked as VIP instead of SpecOnly
<LI>fixed inclusion (also in jfreu.lite.php) of wrong jfreu.config.php in case of multiple Aseco installs (for multiple TM servers on the same machine)
<LI>general code clean-up, including proper use of booleans for all variables that used only 1/0 values, message corrections, redundant code removal, and lots more
</UL>
<br>
<LI>new <b>/laston</b> command to show when a player (login or ID) was last online on the server
<LI>new <b>/admin players</b> command to display the list of all known players, and search for offline players via a (part of a) login or nickname with <i>/admin players &lt;string&gt;</i> (just like <i>/players &lt;string&gt;</i> to search for online players)
<LI>tracks downloaded via <i>/add</i> are now saved to the new 'GameData/Tracks/Challenges/TMXtmp/' directory as they are added only temporarily to the server's track list, while tracks downloaded via <i>/admin add</i> are saved to the 'GameData/Tracks/Challenges/TMX/' directory and added permanently to the server's track list, as before
<LI>the <i>/admin add</i> command now optionally also adds the downloaded track to the jukebox (configured via <b><CODE>$jukebox_adminadd</CODE></b> in rasp.settings.php)
<LI>new <b>/admin addthis</b> command to permanently add the current track to the server's track list if it is playing through a TMX <i>/add</i> vote; this will also move the track file from the 'GameData/Tracks/Challenges/TMXtmp/' directory into the 'GameData/Tracks/Challenges/TMX/' one
<LI>the <i>/add trackref</i> command now creates trackref.txt files in both TMX and TMXtmp directories
<LI>tracklists created by <i>/admin writetracklist</i> now include a &lt;random_map_order&gt; filter section so that <i>/admin readtracklist</i> of such files randomizes the track list again (configurable via new config.xml setting <b><CODE>&lt;writetracklist_random&gt;</CODE></b>)
<LI><i>/admin black</i> and <i>/admin unblack</i> now automatically perform a <i>writeblacklist</i>, and <i>/admin addguest</i> and <i>/admin removeguest</i> a <i>writeguestlist</i>, so that the blacklist.txt and guestlist.txt files are always in sync in case of a server restart
<LI>on TMO/TMS, <i>/nextmap</i> will also show the environment of the next track
<LI>the chat-based voting configuration options were lifted out of plugin.rasp_votes.php into the new <b>includes/votes.config.php</b> file
<LI>a new <A HREF="quickstart.html">TMN &amp; ASECO/RASP quick start guide</A> is included in the DOCS/ directory
</UL>
<H3>Bug fixes in the v0.91 release of ASECO/RASP:</H3>
<UL>
<LI>a track added to the jukebox via TMX <i>/add</i> vote is temporarily added to the server's track list while playing it, but if multiple tracks are <i>/add</i>-ed right behind eachother, only the last one would be removed from the track list again &ndash; fixed, each track is immediately removed from the server's track list after having been loaded successfully for its (single) turn
<LI><i>/admin setservername</i> uses only the first specified word to set the servername &ndash; fixed, all words are now used
<LI><i>/admin setservername</i>, <i>/admin setmaxplayers</i> and <i>/admin match</i> don't show the nickname of the admin performing those actions &ndash; fixed
<LI><i>/server</i> always shows the initial servername &ndash; fixed, it now displays the actual servername, in case that was changed via the autoranking mechanism
<LI>because tracks downloaded from TMX are renamed to filenames derived from the tracks' (sanitized) names, it is possible for tracks with identical names to get mixed up &ndash; fixed, the (sanitized) filename is now made unique with a sequence number, if necessary
</UL>
<HR>
<H3>New features and other changes in the v0.90 release of ASECO/RASP:</H3>
<UL>
<LI>new and comprehensive <b>player muting</b> support with the following features:<br><br>
<UL>
<LI>player muting (preventing players to chat) automatically becomes available when plugin.muting.php is enabled (uncommented) in plugins.xml
<LI>muting can be done <b>globally</b> (by admins with sufficient permissions):
<UL>
<LI>a player can be added to the global mute list with <b>/admin mute</b> and removed again with <b>/admin unmute</b>
<LI>admins can view the global mute list with <b>/admin mutelist</b> (alias <b>/admin listmutes</b>)
<LI>the global mute list is not stored so an ASECO/RASP restart will result in an empty list &ndash; consider it an opportunity for redemption of muted players
<LI>all normal chat by a player on the global mute list is muted for all other players
<LI>a player on the global mute list is also not allowed to use the <i>/me</i>, <i>/hi</i>, <i>/bye</i>, etc. chat commands (which result in global messages), in order to prevent circumventing the normal chat mute (or possible spamming in retaliation)
<LI>admins will probably find it more effective and efficient to warn and kick a troublesome player than to mute him/her
<LI>the admin muting commands are always listed in the help, but disabled if the muting plugin is not included
<LI>the adminops.xml file has corresponding new entries <b><CODE>&lt;mute&gt;</CODE></b>, <b><CODE>&lt;unmute&gt;</CODE></b>, <b><CODE>&lt;mutelist&gt;</CODE></b> and <b><CODE>&lt;listmutes&gt;</CODE></b>
</UL>
<LI>...or <b>individually</b> by any player:
<UL>
<LI>a player can add another player to his/her individual mute list with <b>/mute</b> and remove a player again with <b>/unmute</b>
<LI>players can view their individual mute list with <b>/mutelist</b>
<LI>the individual mute list is not stored so leaving the server will result in an empty list upon joining &ndash; consider it another opportunity for redemption of muted players
<LI>all normal chat by a player on another player's mute list is muted only for that other player
<LI>a muted player's use of the <i>/me</i>, <i>/hi</i>, <i>/bye</i>, etc. chat commands will still be seen by the player who muted him/her
<LI>players cannot mute admins of any tier (MasterAdmin, Admin &amp; Operator)
</UL>
<LI>all muted players' normal chat can still be read in <i>/chatlog</i>, and is logged as usual (if <CODE>&lt;log_all_chat&gt;</CODE> in config.xml is enabled)
<LI>directly and completely muting a player is not possible because the TM server first sends out a normal chat line to all other players before ASECO/RASP receives it
<LI>therefore a mute buffer of the size of the large chat window (18 lines) is maintained for each individual player, containing the global server messages (e.g. records, track changes, votes, etc.) as well as the chat lines from all unmuted players; this buffer also stores any private messages a player sent and received (via <i>/pm</i>, <i>/pma</i> &amp; <i>/admin pm</i>), but not the local messages from most chat commands (e.g. <i>/help</i>, <i>/pb</i>, <i>/wins</i>, <i>/recrange</i>, etc.) nor any error messages
<LI>whenever a muted player enters a chat line, that line is not appended but instead the individual buffers are sent back as fast as possible to any players that muted him/her, in effect pushing the muted player's line out of the chat window
<LI>while this is the best possible approach to muting, given the TM server's limitations, it does have a few problems:
<UL>
<LI>since local and error messages are not buffered, a muted player entering a chat line will cause those messages to be lost for any players that muted him/her as their buffers are sent back to the chat window; for this reason a global mute may be too confusing and an admin warn/kick more practical
<LI>because of the delay between the TM server sending chat lines directly to all players and the mute buffers of some (or all) players being sent back to them, a chat line by a muted player is usually visible for a short time; that timing issue is inherent to this approach
<LI>because of the above timing problem, it's also possible that an unmuted player enters a chat line in between a muted player's line and sending out any mute buffers, which causes that unmuted line to get pushed out of the chat window as well; it is still stored in the mute buffers though, and will be restored to the chat window the next time a muting action occurs
<LI>to speed up that restore, players who notice they're missing a chat line from an unmuted player can use the new <b>/refresh</b> command to restore their chat window
</UL>
</UL>
<br>
<LI>new <i>idlekick</i> features in mistral.idlekick.php:<br>
if spectator kicking is enabled (<CODE>$kickSpecToo = true</CODE>), a separate idle challenge count is in effect, called <b><CODE>$kickSpecAfter</CODE></b> (default: 4);<br>
the idle kicking system now takes tiered admins and their player/spectator status into account:
<UL>
<LI>MasterAdmins are never idle kicked
<LI>Admins and Operators are not kicked if they're in player mode and the new <b><CODE>&lt;noidlekick_play&gt;</CODE></b> ability in their respective ability lists (in adminops.xml) is enabled
<LI>Admins and Operators are not kicked if they're in spectator mode and the new <b><CODE>&lt;noidlekick_spec&gt;</CODE></b> ability in their respective ability lists is enabled
</UL>
<br>
<LI>new <i>/list</i> options:<br>
<b>/list longest/shortest</b> display the longest and shortest tracks as determined by Author time<br>
<b>/list newest #</b> displays the # newest tracks added to the server (default: 10)
<LI>in all <i>/list</i> output, recently played tracks (as defined by <CODE>$buffersize</CODE> in rasp.settings.php) are now shown in light grey to indicate they cannot be jukeboxed yet again
<LI>long lines in the output of <i>/chatlog</i>, <i>/pmlog</i> and <i>/admin pmlog</i> are now cleanly wrapped on words, instead of breaking off in the middle of words
<LI>new <b>/admin wall</b> (alias <b>/admin mta</b>) command to display a message as a pop-up window to all players (familiar from the *nix <i>wall</i> command); the default message color is red but all color and attribute tags can be used, and the adminops.xml file has corresponding new entries <b><CODE>&lt;wall&gt;</CODE></b> and <b><CODE>&lt;mta&gt;</CODE></b>
<LI>the warning message sent via <i>/admin warn</i> can now be customized via a new <b><CODE>&lt;warning&gt;</CODE></b> message in config.xml
<LI>the output of <i>/admin</i> commands that generate a list of players (<i>listbans</i>, <i>listblacks</i>, <i>listguests</i>, <i>listmasters</i>, <i>listadmins</i>, <i>listops</i>) now uses the same blue color for the logins as the <i>/players</i> output
<LI>a new <b><CODE>&lt;karma&gt;</CODE></b> color is defined in config.xml and used in all relevant karma messages so that they can easily be customized
<LI>the aforementioned light grey and blue colors are defined in config.xml too, as <b><CODE>&lt;grey&gt;</CODE></b> and <b><CODE>&lt;login&gt;</CODE></b> respectively; the red color used for nickname headers in all pop-up windows is also configurable, via the new <b><CODE>&lt;nick&gt;</CODE></b> color
<LI>showing the records range before, during (with <i>/liverecs</i>) and after a track if there are no new records, is now optional via new config.xml setting <b><CODE>&lt;show_recs_range&gt;</CODE></b>; if <CODE>False</CODE>, no range is shown
<LI>the messages for new, improved, secured and equaled records (in localdatabase.xml) have been shortened to reduce wrapping in the small chat window
<LI>if showing the total playtime at the end of each track is enabled, that <i>playtime</i> is also logged
<LI>the MySQL connection can become lost on servers that remain empty for a long time (the default <CODE>wait_timeout</CODE> is 8 hours), therefore when that happens an <b>automatic MySQL reconnect</b> is now performed (thanks Dagobert)
<LI>renaming the blacklist, guestlist and tracklist extensions into ".xml" in v0.89 was not such a good idea (because the TMN server will create an empty blacklist and guestlist upon starting if it doesn't find the ".txt" versions), so they have been reverted to ".txt"
<LI>added logging of more <i>/admin</i> commands
</UL>
<H3>Bug fixes in the v0.90 release of ASECO/RASP:</H3>
<UL>
<LI>when using a track ID with <i>/karma</i>, it still reports "Current Track Karma" &ndash; fixed, now the pertaining track name is shown
<LI>spectators are never idle-kicked even if <CODE>$kickSpecToo</CODE> in mistral.idlekick.php is <CODE>true</CODE> (ugly oops) &ndash; fixed
<LI>if a <i>/replay</i> vote passes, another could be started and if it passes too, the same track is queued twice in the jukebox &ndash; fixed, <i>/replay</i> is no longer allowed after the track is queued once
<LI>if a track fails to load twice from the jukebox and is dropped, the corresponding chat message is empty &ndash; fixed
<LI><i>/list karma 0</i> shows the entire track list &ndash; fixed, it now shows only tracks with karma less than or equal to 0
<LI>messages sent via <i>/pma</i> show up twice in the sending admin's <i>/pmlog</i> output &ndash fixed
<LI>the <CODE>&lt;skipmap&gt;</CODE> and <CODE>&lt;skip&gt;</CODE> abilities are missing from the adminops.xml file &ndash; fixed
<LI>in a new installation, the very first line written to logfile.txt is actually lost &ndash; fixed
</UL>
<HR>
<H3>New features and other changes in the v0.89 release of ASECO/RASP:</H3>
<UL>
<LI>info on <b>actual karma votes</b>: the karma messages can optionally show each player's actual votes, or lack thereof (configured via <b><CODE>$karma_show_votes</CODE></b> in rasp.settings.php)
<LI><b>requiring finishes before karma voting</b>: a player can optionally be required to finish a track a minimum number of times before being allowed to karma vote for it (configured via <b><CODE>$karma_require_finish</CODE></b> in rasp.settings.php); this is the total number of finishes since the first day a player tried a track, not the number in the current session
<LI>the <i>/karma</i> command now accepts an optional track ID (from your last <i>/list</i> output) to display the karma of that track instead of the current one
<LI>when changing your already existing karma vote, instead of "Vote Successful" the message now is "Vote Changed"
<LI>new <b>/pmlog</b> command to display the most recent 30 (default) lines of your own private messages (both sent and received) in a pop-up window
<LI><i>/list &lt;xxx&gt;</i> now allows searching for track names/authors with multiple words (previously one word was required, otherwise the entire list was displayed)
<LI>the <i>/admin help</i> command now shows the command list in the chat window, while the new <b>/admin helpall</b> command displays the list with descriptions in a pop-up as before; similarly for <i>/jfreu help</i> and the new <b>/jfreu helpall</b> command &ndash; this makes them consistent with the user <i>/help</i> and <i>/helpall</i> commands
<LI>the jfreu.player.php plugin has been renamed to <b>jfreu.lite.php</b>, containing the <b>info messages</b> system and (as before) the <i>player join/leave messages</i>, but nothing else of the full Jfreu plugin functionality
<LI>in the <i>/players</i> output, strip wide font ($w) from nicknames so that the window width isn't stretched out too far by players with long wide nicks and long logins
<LI>wide fonts are also stripped from the sender and receiver nicknames in <i>/pm</i>, <i>/pma</i> and <i>/admin pm</i>
<LI>when showing records before (<CODE>&lt;show_recs_before&gt;</CODE> is <CODE>True</CODE>), after (<CODE>&lt;show_recs_after&gt;</CODE> is <CODE>True</CODE>) or during (<i>/liverecs</i>) a track and there are no new records, the record range is included instead
<LI>the last page in a multi-page pop-up now uses an 'OK' button (instead of 'Close'), for consistency with all single-page pop-ups
<LI>if an admin (with the <i>chat_jb_recent</i> ability) jukeboxes a recently played track, a warning about the repeat track is shown but it's still jukeboxed again
<LI>the <i>/replay</i> message was changed from "Replay Track upon Completion" into "Replay Track after Finish", which is hopefully easier to understand for non-English speaking players
<LI>all chat-based and TMX <i>/add</i> votes are now cancelled by the server during the Tab scoreboard before the next track is fetched from the jukebox, to prevent interference from a <i>/replay</i> vote passing at the last possible moment
<LI>the default percentage of a track after which a <i>/skip</i> vote is no longer allowed, was reduced from 70% to 50%
<LI>the <i>/admin writetracklist</i> command now accepts an optional filename parameter to write the current match settings to another file than the default
<LI>new <b>/admin readtracklist</b> command for reading the default match settings file, or an alternate one specified with an optional filename parameter, to complement <i>/admin writetracklist</i>; it shows the number of tracks loaded from the file
<LI>the default filename used for the above match settings file is shortened from "rasp-tracklist.txt" to "tracklist.xml", and it's written to and read from the more appropriate "GameData/Tracks/MatchSettings/" directory (previously in "GameData/Tracks/")
<LI>the extension of the blacklist, guestlist and tracklist files (as read and written by the pertaining <i>/admin</i> commands) is updated from ".txt" to the more relevant ".xml"
<LI>the <i>/match load</i> command in plugin.matchsave.php was disabled as it's now redundant with <i>/admin readtracklist</i>
<LI>the <i>/admin acdl</i> command now takes "ON" or "OFF" (case-insensitive) as parameter instead of "Yes"/"No", for consistency with all other boolean (<i>/jfreu</i>) admin commands
<LI>a new <b><CODE>&lt;admin&gt;</CODE></b> color is defined in config.xml and used in all relevant <i>/admin</i> messages so that they can easily be customized
<LI>if you still use the old <i>chat.vote.php</i> plugin, that will now show the current score when a track is loaded
<LI>the <CODE>&lt;account&gt;</CODE> field in the <CODE>&lt;tmserver&gt;</CODE> section of config.xml became redundant, and was removed
<LI>an <b>/ad</b> shortcut for <i>/admin</i> and a <b>/jb</b> shortcut for <i>/jukebox</i> become available by uncommenting the appropriate two lines at the start of chat.admin.php and plugin.rasp_jukebox.php, respectively
<LI>aseco.php now determines whether it's running on Win* or *nix operating systems, so it's no longer necessary to define the <i>CRLF</i> constant manually
<LI>lots of code optimization and clean-up, like more efficient handling of TM server calls (thanks Assembler Maniac), better error handling throughout the entire system, and other tid bits
</UL>
<H3>Bug fixes in the v0.89 release of ASECO/RASP:</H3>
<UL>
<LI><i>/kick</i> votes are denied when there's no vote in progress, and allowed to start when another vote already is (oops) &ndash; fixed
<LI><i>/admin ban</i> produces an RPC error in the log from the Kick call because the Ban call already kicks the player &ndash; fixed by removing the Kick call
<LI>if a track is deleted before pruning its records (<i>/admin prunerecs</i>), those are still counted in players' <i>/summary</i> results (though not <i>/topsums</i>) &ndash; fixed
<LI><i>/pm</i> and <i>/pma</i> send a message even if it's empty &ndash; fixed, empty messages are ignored
<LI>in <i>/add</i> and <i>/admin add</i>, after renaming the numeric filename to a (sanitized) track filename, multiple spaces and underscores are not properly reduced to single ones &ndash; fixed
<LI>in the original v0.88 zip file (which was fixed one day after release), <i>/jfreu</i> didn't work for any admin tier &ndash; fixed
</UL>
<HR>
<H3>New features and other changes in the v0.88 release of ASECO/RASP:</H3>
<UL>
<LI>new, flexible and fully integrated <b>tiered administration</b> support with the following features:<br><br>
<UL>
<LI>there are three tiers of administrators: MasterAdmins, Admins and Operators
<LI>all three tiers of administrators can see who is in each tier with the new <b>/admin listmasters</b>, <b>/admin listadmins</b> and <b>/admin listops</b> commands
<LI>if a player is in more than one tier, the highest one takes precedence
<LI>MasterAdmins have no restrictions to their abilities, while the abilities of Admins and Operators can be defined per individual command
<LI>the list of MasterAdmins is fixed in the <b><CODE>&lt;masteradmins&gt;</CODE></b> section in config.xml; the lists of Admins and Operators, and their respective abilities, are stored in the new <b>adminops.xml</b> file (configurable via new config.xml setting <b><CODE>&lt;adminsops_file&gt;</CODE></b>) and automatically restored after an ASECO/RASP restart
<LI>MasterAdmins can add and remove Admins dynamically, using the new <b>/admin addadmin</b> and <b>/admin removeadmin</b> commands
<LI>both MasterAdmins and Admins can add and remove Operators dynamically, using the new <b>/admin addop</b> and <b>/admin removeop</b> commands
<LI>MasterAdmins can dynamically enable and disable all abilities for Admins and Operators &ndash; even their ability to change their own abilities, if you so desire &ndash; using the new <b>/admin adminability</b> and <b>/admin opability</b> commands
<LI>the ability lists also define (non-/admin) chat commands where Admins and Operators have additional capabilities that users don't
<LI>the <i>/admin help</i> command dynamically lists only the available commands for each tier depending on their allowed abilities
<LI>the new <b>/admin listabilities</b> command displays which non-/admin abilities (if any) are available to Admins and Operators, with a description; for MasterAdmins, <i>/admin listabilities {admin/op}</i> displays the abilities of the pertaining administrator tier
<LI>there are no separate commands (e.g. /op), all tiers use the same <i>/admin</i> commands (so there's no code duplication)
<LI>all <i>/admin</i> chat and log messages show whether a MasterAdmin, Admin or Operator performed the pertaining action
<LI>the player join message from jfreu.plugin.php (or jfreu.player.php) shows the appropriate administrator title
<LI>the titles with which MasterAdmins, Admins and Operators are shown in chat and join messages, are configurable via the <b><CODE>&lt;titles&gt;</CODE></b> section in adminops.xml
<LI>if e.g. Operators do not have the ability to use <i>/pma</i> and <i>/admin pm</i>, they will also not receive such private messages when sent by (Master)Admins
<LI>any server owner's LAN logins (with IP and port) should be in the <CODE>&lt;masteradmins&gt;</CODE> section of config.xml and will be skipped by the <i>/admin listmasters</i> command
<LI>all Jfreu admin commands can be used by MasterAdmins and Admins, but not Operators; also, the <i>/jfreu addadmin</i> command was disabled, and the corresponding <CODE>&lt;admin_list&gt;</CODE> section from plugins/jfreu/jfreu.vips.xml (previously jfreu.lists.xml) was removed
<LI>servers that don't need Admins and Operators can simply leave those login lists in adminops.xml empty, and not have the tiered system interfere (phew <FONT FACE="Wingdings">&#74;</FONT>)
<LI>see this table for the <A HREF="admin_abilities.html">default list of abilities</A>
</UL>
<br>
<LI>new <b>karma details</b>: details about the vote counts and percentages can optionally be shown with karma messages (configured via <b><CODE>$karma_show_details</CODE></b> in rasp.settings.php)
<LI>new <b>/admin listdupes</b> command to display a list of duplicate tracks on the server (ready for <i>/admin remove/erase</i>)
<LI>new <b>/admin prunerecs</b> command to delete the records/rs_times database entries for a specific track (by track ID from <i>/list</i>, so you must prune recs for a track before removing/erasing it, otherwise you can't <i>/list</i> it anymore)
<LI>the number of rounds (in Rounds/Team modes) or seconds (in TimeAttack/Laps/Stunts modes) by which a vote expires can now be configured per individual type of TMX <i>/add</i> and chat-based vote (<CODE>$r_expire_limit</CODE> and <CODE>$ta_expire_limit</CODE> in plugin.rasp_votes.php)
<LI>the output from <i>/list</i> and <i>/list &lt;xxx&gt;</i> now includes the corresponding ranked records, just like <i>/list norecent</i>
<LI>the <i>/best</i> and <i>/worst</i> commands are now also available via <b>/list best</b> and <b>/list worst</b>
<LI>the <i>/server</i> output now shows the total playing time of all players combined
<LI>the <i>/best</i>, <i>/worst</i>, <i>/summary</i>, <i>/stats</i>, <i>/admin ban</i> and <i>/admin black</i> commands can now also be used on offline logins (only by admins as defined by their abilities)
<LI>moved all jukebox and <i>/add</i> related message strings into rasp.xml for easy customization and localization
<LI>the all-caps UNRANKED text for unranked records in the <i>/pb</i> message is now in narrow font to make it less intrusive
<LI>in Jfreu's player join messages and the <i>/stats</i> output, the ladder ranks are now formatted with spaces between the thousands (like in the Tab scoreboard)
<LI>if Jfreu's info messages are disabled, the "Messages: OFF" reminder isn't shown anymore
<LI>the Jfreu plugin "Loaded" message is no longer shown to a connecting player (only on ASECO/RASP start-up)
<LI>the name of Jfreu's vip/team_vip file is now configurable via <b><CODE>$vips_file</CODE></b> in jfreu.config.php (default: plugins/jfreu/jfreu.vips.xml)
<LI>some code clean-up, like more efficient formatColors and resetRanks functions, a non-looping <i>/nextmap</i> (thanks Assembler Maniac), and other tid bits
<LI>all documentation files included in the .zip are now grouped together in their own DOCS subdirectory
</UL>
<H3>Bug fixes in the v0.88 release of ASECO/RASP:</H3>
<UL>
<LI>if the jukebox is empty and the current track is deleted (<i>/admin removethis/erasethis</i>), <i>/nextmap</i> hangs up the ASECO/RASP system &ndash; fixed by the non-looping rewrite above
<LI>the karma reminders at every finish (<CODE>$remind_karma = 2</CODE>) could occasionally produce an RPC error in the log &ndash; fixed
<LI>there is a typo in plugin.rasp_irc.php causing the IRC connection to fail &ndash; fixed
<LI>a couple of <i>/jfreu</i> commands are not shown in the <i>/jfreu help</i> overview &ndash; fixed
<LI><i>/admin removethis/erasethis</i> does not properly log the name of the deleted track &ndash; fixed
<LI>the second line of the default Welcome message text was shown without the shadow attribute &ndash; fixed
</UL>
<HR>
<H3>New features and other changes in the v0.86 release of ASECO/RASP:</H3>
<UL>
<LI>new <i>/list</i> options to complement <i>/list nogold</i>:<br>
<b>/list noauthor</b> displays all tracks the player finished but didn't beat the Author time on<br>
<b>/list norecent</b> displays all tracks the player finished but didn't race recently (includes ranked records)
<LI>the output from <i>/list nogold</i> and <i>/list noauthor</i> now shows how much your time is over the track's Gold and Author time, respectively
<LI>new <b>karma vote reminders</b>: if a player (but not a spectator) hasn't karma voted for a track, an optional reminder can be sent upon every finish or at the end of the track (configured via <b><CODE>$remind_karma</CODE></b> in rasp.settings.php)
<LI>new <b>/admin pass</b> command to force any TMX <i>/add</i> and chat-based vote to pass
<LI>the <i>/topclans</i> output now shows how many clan members were counted to compute the clan's average server rank
<LI>the chat-based voting plugin has two new options (<b><CODE>$allow_spec_startvote</CODE></b> and <b><CODE>$allow_spec_voting</CODE></b>) to allow or disallow spectators to start votes and/or to vote <i>/y</i> themselves; this also applies to TMX <i>/add</i> votes, but admins are always allowed to vote <i>/y</i>
<LI>the track history is now written to a file that is automatically restored upon ASECO/RASP start-up; this prevents players from jukeboxing a recently played track after a restart (a frequent event on my server when developing <FONT FACE="Wingdings">&#74;</FONT>)
<LI>moved more message strings into config.xml and rasp.xml for easy customization and localization
<LI>some code clean-up, like removing duplicate getPlayerId functions, adding an <i>isSpectator</i> function, and other tid bits
</UL>
<H3>Bug fixes in the v0.86 release of ASECO/RASP:</H3>
<UL>
<LI>when adding from TMX via <i>/add</i> or <i>/admin add</i>, a track with special characters (besides '?' and '*') in its filename could cause it to not load and get stuck in the jukebox &ndash; fixed by changing most special characters into '_' (underscore)
<LI>the special 'trackref' parameter to <i>/add</i> doesn't work &ndash; fixed parameter processing and made it an admin-only option; also fixed non-existent 'tracktype' field in the trackref.txt file into 'environment'
<LI>a replayed track is entered multiple times into the track history &ndash; fixed
<LI>if a track failed to load from the jukebox, the next track from the server's track list that would get loaded in its place isn't entered into the track history &ndash; fixed
<LI>if an admin forces a replay (<i>/admin replay</i>) during a <i>/replay</i> vote, that vote isn't cancelled, potentially allowing a double replay &ndash; fixed
<LI>the XML parser changes '+' characters in message strings into spaces &ndash; fixed
</UL>
<HR>
<H3>New features and other changes in the v0.85 release of ASECO/RASP:</H3>
<UL>
<LI>new <b>/topsums</b> command (short for: top summaries) to display the top-100 of players with the most top-3 ranked records (i.e. of <i>/summary</i> results)
<LI>updated <b>/best</b> and <b>/worst</b> commands to include an track ID column so that tracks can be jukeboxed directly (without going through <i>/list</i>)
<LI>new <b>/admin removethis</b> and <b>/admin erasethis</b> commands to quickly remove the current track from rotation and, if erasethis, also delete the track file
<LI>new <b>up-to-date check</b> at start-up (optional) and <b>/admin uptodate</b> command to check for the current version of ASECO/RASP; consequently, Jfreu's <i>/uptodate</i> command was disabled
<LI>new <b><CODE>&lt;limit&gt;</CODE></b> configuration setting in localdatabase.xml to restrict the highest records that are still displayed
<LI>computation of the required number of votes for TMX <i>/add</i> and chat-based votes adjusted for low player counts
<LI>the informational <i>/helpvote</i> messages sent to all players or just a new player can now be turned off completely
<LI>an extra check for a "stuck" track in the jukebox is done when loading the next one, and if it fails to load twice it's dropped
<LI>if <CODE>&lt;show_recs_before&gt;</CODE> in config.xml is <CODE>true</CODE>, the original Current Record message is redundant with the top-8 records list, and no longer shown
<LI>if <CODE>&lt;show_recs_before&gt;</CODE> in config.xml is <CODE>true</CODE> and the player has a ranked record, then the Personal Best message can optionally be skipped via <b><CODE>$always_show_pb = false</CODE></b> in rasp.settings.php
</UL>
<H3>Bug fixes in the v0.85 release of ASECO/RASP:</H3>
<UL>
<LI>in determining the required number of votes, spectators are still included for TMX <i>/add</i> votes &ndash; fixed
<LI>when adding from TMX via <i>/add</i> or <i>/admin add</i>, a track with a '?' or '*' in its filename causes it to not load and get stuck in the jukebox &ndash; fixed by changing all occurrences of '?' and '*' into '_'
<LI>in very rare conditions (running on WinXP with a buggy PHP time functions library in a country using 8-bit characters) the <i>/server</i> and <i>/stats</i> commands could fail silently because the 'strftime' system call returns a bogus timezone &ndash; fixed by changing to 'date' system calls
<LI>using '$g$m' to clear text attributes after track names and player nicknames in various messages could result in inconsistencies with italics &ndash; fixed by replacing '$g$m' with '$z$s' (or occasionally '$z$s$i')
</UL>
<HR>
<H3>New features and other changes in the v0.84 release of ASECO/RASP:</H3>
<UL>
<LI>new and sophisticated <b>chat-based voting</b>; by including plugin.rasp_votes.php and setting <b><CODE>$feature_votes</CODE></b> in rasp.settings.php to <CODE>true</CODE>, normal CallVotes are disabled and the following features become available:<br><br>
<UL>
<LI>new <b>/helpvote</b> command to display usage info and the actual voting ratios for the new voting commands
<LI>new <b>/endround</b> vote to end a round (only enabled in Rounds/Team modes)
<LI>new <b>/ladder</b> vote to restart the current track immediately when the ladder is down
<LI>new <b>/replay</b> vote to replay the current track after it's done (prepends it to jukebox)
<LI>new <b>/skip</b> vote to skip the current track immediately
<LI>new <b>/kick</b> vote to kick a player
<LI>new <b>/cancel</b> command for a player to cancel his/her own vote (also works with TMX <i>/add</i> votes; admins can <i>/cancel</i> any vote)
<LI>extensive <b>configuration options</b> in the new <b>votes.config.php</b> file:<br><br>
<UL>
<LI>separate voting ratios per type of vote, so e.g. a kick vote is harder to pass than an endround vote
<LI>option to enable <i>/kick</i> vote (default: on) and enable kicking of admins (default: off); if disabled, <i>/kick</i> also isn't listed in the <i>/helpvote</i> output
<LI>option to perform <i>/ladder</i> restart via quick ChallengeRestart or by prepending track to jukebox and doing NextChallenge
<LI>option to automatically vote for the vote starter, otherwise the old way remains where the starter also has to vote <i>/y</i>
<LI>vote expiration options:
<br>in Rounds/Team modes all votes (except <i>/endround</i>) expire within 3 rounds (default);
<br>in TimeAttack/Laps/Stunts modes all votes expire after approximately 120 seconds / 2 minutes (default);
<br>expiration is necessary, otherwise unpassed votes will linger on until the end of the track, preventing players from starting another vote
<LI>vote reminder options:
<br>in Rounds/Team modes a reminder can be shown after every round until the vote passes or expires;
<br>in TimeAttack/Laps/Stunts modes a reminder can be shown approximately every 30 seconds (default) until the vote passes or expires;
<br>reminders help players not forget about ongoing votes after the last vote message has scrolled out of the chat window
<LI>optional limits to the number of <i>/ladder</i>, <i>/replay</i> &amp; <i>/skip</i> votes per track (default max: 2); if a limit is 0, that particular vote is disabled
<LI>optional limits to when <i>/ladder</i>, <i>/replay</i> &amp; <i>/skip</i> votes are allowed in Rounds and TimeAttack mode:
<br>in Rounds the limit is based on the number of points that the first player already has, compared to the server's points limit;
<br>in TimeAttack the limit is based on the time the track is already running, compared to the server's time limit;
<br><i>/ladder</i> is disabled <u>after</u> 40%, <i>/replay</i> is disabled <u>before</u> 50%, and <i>/skip</i> is disabled <u>after</u> 50% of those limits (all percentages configurable)
<LI>the rationale behind these optional limits is that it's: annoying to go through the same type of vote more than twice; annoying to go through a ladder restart vote when the track is already a few minutes under way; too early to decide whether to play a track again if when it's not even halfway done; and annoying to go through a skip vote when a track is close to completion
<LI>there's no limit to the number of endround and kick votes per track, because you may need more than a few of them <FONT FACE="Wingdings">&#74;</FONT>
<LI>there are no <i>/ladder</i>, <i>/replay</i> &amp; <i>/skip</i> limits in Team, Laps &amp; Stunts modes
</UL>
<br>
<LI>there's no <i>/ban</i> vote command because IMHO only admins should be able to ban
<LI>in determining the required number of votes, spectators are not included; this now also applies to TMX <i>/add</i> votes
<LI>if chat-based voting is enabled, the <i>/server</i> output will show a pointer to <i>/helpvote</i> instead of the CallVote timeout and ratio
<LI>in Rounds/Team modes a running <i>/endround</i> vote is automatically terminated by the EndRound event, i.e. when all players 'Enter' as yet or by an <i>/admin endround/er</i> command
<LI>the vote expiration and reminder options, and the automatic vote for starter option, also work with TMX <i>/add</i> votes
<LI>all votes terminate automatically at the start of a new track
<LI>when a new player connects, an explanatory message that chat-based voting is in effect is shown to that player, or optionally to all players; you can use the latter during an introduction period until most players are familiar with the new voting system
<LI>integrates properly with TMX <i>/add</i> votes whether or not those are enabled, and whether or not chat-based votes are enabled
<LI>voting messages use a new <b>pink color</b> (<b><CODE>&lt;vote&gt;</CODE></b> in config.xml) that's sufficiently distinct from the colors of all other message types (but <i>/add</i> related messages retain their normal orange color)
<LI>for further understanding of the features and configuration options, study the detailed comments in <i>function init_votes()</i> in plugins.rasp_votes.php
</UL>
<br>
<LI>new <b>/admin pmlog</b> command to display the most recent 30 (default) lines of admin pm's in a pop-up window
<LI>updated <b>/admin cancel</b> to cancel TMX &amp; chat votes too
<LI>added more aliases to <i>/admin nextmap</i> command, for consistency with the <i>/skip</i> vote: <b>/admin skipmap</b> and <b>/admin skip</b>
<LI>long lines in the <i>/chatlog</i> pop-up window are now split up with a continuation symbol (...) at the start of the second and following parts
<LI>if <CODE>&lt;log_all_chat&gt;</CODE> is <CODE>true</CODE>, non-existent chat commands &ndash; lines starting with '/' that cannot be executed &ndash; are also logged (but they're not shown in <i>/chatlog</i>)
<LI>(almost) all function <u>calls</u> were updated to remove the deprecated pass-by-reference '&amp;' from parameters
<LI>tweaked various jukebox related messages
</UL>
<H3>Bug fixes in the v0.84 release of ASECO/RASP:</H3>
<UL>
<LI>in the <i>/chatlog</i> output, strip wide font ($w) from nicknames so that the window width isn't stretched out too far by players with long wide nicks and lengthy chat lines
<LI>with a large number of long chat lines in the <i>/chatlog</i> output, it could hang up the TMN client &ndash; fixed
<LI>all player tests w.r.t. jukebox/add actions are done against nickname, potentially causing conflicts between players with identical nicknames &ndash; fixed by changing those tests to logins
<LI>if a player voted <i>/y</i> in one TMX <i>/add</i> vote, he/she wasn't be able to vote for another <i>/add</i> vote during the same track &ndash; fixed
<LI>if a player tries to <i>/add</i> an existing track, the preceding track in the server's track list is jukeboxed instead of that requested one &ndash; fixed
<LI>if a player tries to <i>/add</i> the same track that was just <i>/add</i>-ed (but not yet loaded), another vote is started &ndash; fixed
<LI><i>/add</i> doesn't properly insert the track into the jukebox such that it can be dropped again &ndash; fixed
<LI>if <i>/add</i> finds the requested track is already present on the server, the temporary track file wouldn't be deleted &ndash; fixed
<LI>using '$z' to clear text attributes after track names and player nicknames in various messages would also turn off the default 'shadowed' style for the remainder of those messages &ndash; fixed by replacing '$z' with '$g$m'
</UL>
<HR>
<H3>New features and other changes in the v0.82 release of ASECO/RASP:</H3>
<UL>
<LI>new <b>/nextrank</b> command to show the next better ranked player
<LI>new <b>/admin unban</b> and <b>/admin unblack</b> commands to remove players from the ban and black lists; you can use the player IDs from the <i>/admin showbanlist</i> and <i>/admin showblacklist</i> output, respectively, as well as any valid logins
<LI>new <b>/admin addguest</b> and <b>/admin removeguest</b> commands to add players to and remove from the guest list (even offline ones); with addguest you can use player IDs from the <i>/players</i> output, with removeguest from <i>/admin showguestlist</i>, as well as any valid logins
<LI>new <b>/admin cleanbanlist</b>, <b>/admin cleanblacklist</b> and <b>/admin cleanguestlist</b> commands to completely clean the ban, black and guest lists
<LI>added aliases for admin commands: <i>/admin showbanlist</i> or <b>/admin listbans</b>, <i>/admin showblacklist</i> or <b>/admin listblacks</b>, and <i>/admin showguestlist</i> or <b>/admin listguests</b>
<LI>the IP address of a connecting player is now logged along with the rest of the 'join' message
<LI>the <b>updated Matchsave</b> plugin (plugin.matchsave.php, matchsave.xml) by F*ckfish is now part of the standard distribution, although by default not included in plugins.xml
<LI>all function <u>declarations</u> were updated to remove the deprecated pass-by-reference '&amp;' from parameters
</UL>
<H3>Bug fixes in the v0.82 release of ASECO/RASP:</H3>
<UL>
<LI>if <CODE>$prune_records_times</CODE> is enabled and there is a syntax error in rasp.xml, there is a possibility for the records/times of all tracks to be deleted &ndash; fixed, a syntax error will no longer invoke pruning
<LI>fields 2 &amp; 3 in <CODE>&lt;record_first&gt;</CODE> in config.xml are out of order &ndash; fixed, although it isn't visible anyway as the same (and correct) message from localdatabase.xml supersedes it
<LI>the <i>/admin showbanlist/showblacklist/showguestlist</i> commands are not properly storing the player IDs &amp; logins for later use &ndash; fixed
<LI>the "Player dropped...track... from jukebox" message is shown in yellow instead of orange, like all other jukebox messages &ndash; fixed
</UL>
<HR>
<H3>New features and other changes in the v0.81 release of ASECO/RASP:</H3>
<UL>
<LI>new <b>/chatlog</b> command to display the most recent 30 (default) lines of player chat in a pop-up window
<LI>showing a FAST-like record report <u>after</u> each track is now optional too, via new config.xml setting <b><CODE>&lt;show_recs_after&gt;</CODE></b>; if <CODE>False</CODE>, the old top-5 from v0.7 is shown
<LI>new <b>/admin showguestlist</b> command to display the list of guest player(s)
<LI>new <b>/admin writeguestlist</b> and <b>/admin readguestlist</b> commands to write/read the player guestlist to/from disk
<LI>the <b>player join/leave messages</b> are now available from a separate jfreu.player.php plugin, in case you don't want/need the rest of the Jfreu functionality (rank limiting, unspec voting, badword filtering, admin commands, etc.)
<LI>the <b>Jfreu unspec-fix</b> plugin (jfreu.unspec.php) by F*ckfish is now part of the standard distribution, although by default not included in plugins.xml
</UL>
<H3>Bug fixes in the v0.81 release of ASECO/RASP:</H3>
<UL>
<LI>when a player connected, the <u>before</u> record report is shown to all players, instead of just the new one &ndash; fixed
</UL>
<HR>
<H3>Known problems in the v0.8+ releases of ASECO/RASP:</H3>
<UL>
<LI>If all (non-spectator) players press DEL during the scoreboard at the end of a track, the track switching process is disturbed and the next track in the jukebox will not be loaded. No solution known, this appears to be a TMN server quirk.
</UL>
<HR>
<H2><A HREF="Features_080.html">Initial release notes</A></H2>
<HR>
<ADDRESS>
Copyright &copy; 2007-2013 &ndash; Frans P. de Vries <A HREF="mailto:tm&#64;&#103;&#97;&#109;&#101;&#114;&#115;&#46;&#111;&#114;&#103;">&lt;tm&#64;&#103;&#97;&#109;&#101;&#114;&#115;&#46;&#111;&#114;&#103;&gt;</A>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
Last updated 27-Mar-2008
</ADDRESS>
</BODY>
</HTML>

View File

@ -1,913 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<TITLE>TrackMania Nations - XASECO release notes v1.03</TITLE>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<META NAME="author" CONTENT="Frans P. de Vries">
<META NAME="generator" CONTENT="vi :)">
<style type="text/css">
body { width: 960px; margin-left: 30px; font-family: Arial,Helvetica,sans-serif; font-size: 15px; }
li,div { padding: 3px; }
code,pre { font-size: 14px; }
pre { width: 90%; margin: 3px 0px; padding: 3px 0px 3px 12px; background-color: #F0F0F0; }
</style>
<META NAME="keywords" CONTENT="TrackMania, Forever, United, Nations, Original, Sunrise, racing, games, XASECO, ASECO, RASP, Jfreu, plugins, records, jukebox, Nadeo">
<META NAME="description" CONTENT="Information on the XASECO system for TrackMania Nations and Forever (& Original/Sunrise), racing games by Nadeo">
</HEAD>
<BODY TEXT="#000000" LINK="#ff0000" VLINK="#0000ff" ALINK="#00ff00" BGCOLOR="#ffffff">
<P ALIGN="center">
<A TARGET="_blank" HREF="http://eswc.trackmanianations.com/"><IMG SRC="banner.jpg" ALT="TrackMania Nations" BORDER="0" WIDTH="590" HEIGHT="149"></A>
<HR>
<H3>New features and other changes in the v1.03 release of XASECO:</H3>
<UL>
<LI>new support for an <b>admin lock password</b>:
<UL>
<LI>a lock password for <i>/admin</i> and <i>/jfreu</i> commands, as well as other admin abilities and the admin panel, can be configured via new config.xml setting <b><CODE>&lt;lock_password&gt;</CODE></b>
<LI>if the password setting is non-empty, admins of any tier have to enter a password before being able to use admin commands and features
<LI>the new <b>/admin unlock</b> command compares the supplied password with the above setting, and unlocks the admin commands and features if valid
<LI>the unlock status is remembered for the duration of the player session, so after every reconnect admins will have to enter the password again before they are fully authorized
<LI>when an <i>/admin</i> or <i>/jfreu</i> command is not permitted, the error message does not distinguish between a login without admin abilities and the absence of its unlock status, so a player with a spoofed login is left guessing whether the login indeed belongs to an admin or whether an unlock password is required
</UL>
<LI>new support for <b>admin IP addresses</b>:
<UL>
<LI>after each <CODE>&lt;tmlogin&gt;</CODE> field in the <CODE>&lt;masteradmins&gt;</CODE> section in config.xml there is now an <CODE>&lt;ipaddress&gt;</CODE> field which, if not empty, should contain the IP address that this MasterAdmin login is authorized from
<LI>similarly, after each <CODE>&lt;tmlogin&gt;</CODE> field in the <CODE>&lt;admins&gt;</CODE> and <CODE>&lt;operators&gt;</CODE> sections in adminops.xml there are now <CODE>&lt;ipaddress&gt;</CODE> fields which, if not empty, should contain the IP addresses that these Admin and Operator logins are authorized from
<LI>if the specified IP address for a given login does not match, a player with a spoofed MasterAdmin, Admin or Operator login will only have normal player abilities, and any unauthorized attempts to use admin commands are logged
<LI>when starting v1.03 for the first time it is not necessary to add <CODE>&lt;ipaddress&gt;</CODE> fields to your adminops.xml file, as empty fields will be created and saved automatically the next time that this file is written (e.g. with <i>/admin writeabilities</i>) &ndash; IP addresses for existing logins can then be added manually, and the file reloaded with <i>/admin readabilities</i>
<LI>when using this security feature for the <CODE>&lt;masteradmins&gt;</CODE> section in config.xml, you <u>do</u> have to manually add the <CODE>&lt;ipaddress&gt;</CODE> fields to the file, whether empty or with actual IP addresses
<LI>newly added admins and operators will always be saved to adminops.xml with their IP address, so if you are not using this security feature you can manually delete the address from the file, and then reload it
<LI>note to plugin authors: because of these two security features the parameter type for the allowAbility, isMasterAdmin, isAdmin, isOperator and isAnyAdmin functions changed from a login string to a player object
</UL>
<LI>new support for <b>IP address bans</b>, in co-operation with regular server bans (which are not preserved across TM server restarts):
<UL>
<LI>the new <b>bannedips.xml</b> file can contain a list of banned IP addresses, which is automatically loaded at XASECO start-up
<LI>the IP addresses of players are checked against the list upon connecting, and banned players are kicked with a banned IP message
<LI>the existing <i>/admin ban</i> and <i>/admin unban</i> commands also add/remove the IP address of the pertaining player to/from the banned IPs list
<LI>the new <b>/admin banip</b> command adds a manually specified IP address to the list, and <b>/admin unbanip</b> removes an IP address from the list &ndash; <i>/admin banip</i> does not require the pertaining player to be online like <i>/admin ban</i> does
<LI>the new <b>/admin showiplist</b> command (alias <b>/admin listips</b>) displays the current list of banned IP addresses &ndash; on TMF if config.xml setting <CODE>&lt;clickable_lists&gt;</CODE> is True, the addresses in the output are buttons to invoke <i>/admin unbanip</i> on the selected IP
<LI>the new <b>/admin cleaniplist</b> command deletes the entire list of banned IP addresses
<LI>all commands automatically write the updated bannedips.xml file, but the new <b>/admin writeiplist</b> and <b>/admin readiplist</b> commands can also be used to write/read the list whenever you want
</UL>
<br>
<LI>on TMF when plugin.msglog.php is enabled:
<UL>
<LI>a small arrow button is displayed in the lower-left corner above the chat window button that will invoke <i>/msglog</i>, allowing to quickly review the system message history
<LI>the system message window now always displays the last 5 message lines, and the <i>/msglog</i> output has been reduced to a single-page window of 21 lines to avoid having to page in order to read the latest messages
<LI>global jukebox messages can now be diverted to the window, configurable via rasp.settings.php setting <b><CODE>$jukebox_in_window</CODE></b> (true/false)
<LI>global chat-based vote messages can also be diverted to the window, configurable via votes.config.php setting <b><CODE>$vote_in_window</CODE></b> (true/false)
</UL>
<LI>new <b>/admin writeabilities</b> and <b>/admin readabilities</b> commands to write and read the admins/operators/abilities list to and from disk
<LI>the player join/leave messages (for both the full and lite Jfreu plugins) are defined via new jfreu.config.php settings <b><CODE>$player_join</CODE></b>, <b><CODE>$player_joins</CODE></b>, and <b><CODE>$player_left</CODE></b>
<LI>an optional divider message at the start of each track shows the name, author and author time, configurable via new config.xml setting <b><CODE>&lt;show_curtrack&gt;</CODE></b> (2 = TMF message window, 1 = chat, 0 = off)
<LI>it's now possible to specify multiple track IDs to <i>/admin add</i> (but not to <i>/add</i> due to the voting process) in order to quickly download more than one track from TMX or ShareMania &ndash; the optional TMX section or SM parameter should be last
<LI>when the target player of a <i>/kick</i> vote leaves before the vote completes, the vote is now cancelled
<LI>the karma message at the start of each track can now be disabled via new rasp.settings.php setting <b><CODE>$karma_show_start</CODE></b> (true/false)
<LI>the Dedimania welcome message for a newly connecting player can also be disabled via new dedimania.xml setting <b><CODE>&lt;show_welcome&gt;</CODE></b> (True/False)
<LI>the default name for the blacklist file used by <i>/admin readblacklist</i> and <i>/admin writeblacklist</i> is now configurable via new config.xml setting <b><CODE>&lt;blacklist_file&gt;</CODE></b> (default: blacklist.txt) &ndash; note that the TM server will continue to load the blacklist file with its default name at start-up, unless you adjust <CODE>&lt;blacklist_filename&gt;</CODE> in dedicated_cfg.txt as well
<LI>the default name for the guestlist file used by <i>/admin readguestlist</i> and <i>/admin writeguestlist</i> is also configurable via new config.xml setting <b><CODE>&lt;guestlist_file&gt;</CODE></b> (default: guestlist.txt) &ndash; note that the TM server will continue to load the guestlist file with its default name at start-up, unless you adjust <CODE>&lt;guestlist_filename&gt;</CODE> in dedicated_cfg.txt as well
<LI>the default name for the track history file is now configurable via new config.xml setting <b><CODE>&lt;trackhist_file&gt;</CODE></b> (default: trackhist.txt)
<LI>the output of <i>/admin players</i> is limited to at most 10000 entries to prevent possible memory overruns
<LI>the background of the TMF system message window is changed from transparent into blurry to enhance readability of the messages
<LI>a high-level outline of all of XASECO's features and plugins can be found on the new <A HREF="overview.html">Overview page</A>
<LI>the Upgrade notes for earlier versions are now archived on a <A HREF="upgrades.html">separate page</A>
<LI>this release requires the latest server <b>build 2008-08-05</b>
</UL>
<H3>Bug fixes in the v1.03 release of XASECO:</H3>
<UL>
<LI>on TMF with the Jfreu info messages diverted to the system message window, the <i>/message</i> command makes the window pop up much longer than the <CODE>&lt;window_timeout&gt;</CODE> value &ndash; fixed
<LI>if <CODE>&lt;cache_tags&gt;</CODE> in musicserver.xml is disabled, the <i>/music list</i> output isn't formatted correctly &ndash; fixed
<LI>attempts to <i>/admin ban</i> offline players are allowed (and naturally always fail) &ndash; fixed
<LI>the Z-value of the TMF <i>/admin pay</i> dialog puts it behind the full chat window &ndash; fixed
</UL>
<HR>
<H3>New features and other changes in the v1.02 release of XASECO:</H3>
<UL>
<LI>new support for a <b>system message window</b> on TMF with the following features:
<UL>
<LI>the message window becomes available when plugin.msglog.php is enabled (uncommented) in plugins.xml
<LI>various system messages that are sent to all players in the chat window can now be diverted into the message window in order to reduce chat clutter
<LI>the window normally pops up with the last 4 message lines whenever a new message is received, using a timeout that is configurable via new config.xml setting <b><CODE>&lt;window_timeout&gt;</CODE></b> (default: 6 seconds)
<LI>during the scoreboard at the end of each track, the window pops up with the last 6 lines if there are any new messages, for the same duration as the server's ChatTime setting (default: 10 seconds) plus an extra 5 seconds for the podium animation before the scoreboard comes up
<LI>the window size is restricted to 4 and 6 lines respectively due to the available screen space between the notice area and drop-down menu above it, and the main command window or scoreboard (at its largest size) below it
<LI>the new <b>/msglog</b> command displays the last 30 message lines so players can check back the system message history
<LI>messages to be diverted into this window can be any or all from:
<UL>
<LI>new/improved/secured/equalled local records, configurable via new config.xml setting <b><CODE>&lt;recs_in_window&gt;</CODE></b> (True/False)
<LI>new/improved/secured/equalled Dedimania records, configurable via new dedimania.xml setting <b><CODE>&lt;recs_in_window&gt;</CODE></b> (True/False)
<LI>the local records report before a track, configurable via config.xml setting <CODE>&lt;show_recs_before&gt;</CODE> (add 4 to original value: 6 = full report in window, 5 = track record in window, 2 = full report in chat, 1 = track record in chat, 0 = off)
<LI>the local records report after a track, configurable via config.xml setting <CODE>&lt;show_recs_after&gt;</CODE> (add 4 to original value: 6 = full report in window, 5 = top-5 in window, 2 = full report in chat, 1 = top-5 in chat, 0 = off)
<LI>the Dedimania records report before a track, configurable via dedimania.xml setting <CODE>&lt;show_recs_before&gt;</CODE> (2 = message window, 1 = chat, 0 = off)
<LI>the Dedimania records report after a track, configurable via dedimania.xml setting <CODE>&lt;show_recs_after&gt;</CODE> (2 = message window, 1 = chat, 0 = off)
<LI>the round finish reports in Rounds mode, configurable via new config.xml setting <b><CODE>&lt;rounds_in_window&gt;</CODE></b> (True/False)
<LI>the TMX World Record message at the start of a track, configurable via config.xml setting <CODE>&lt;show_tmxrec&gt;</CODE> (2 = message window, 1 = chat, 0 = off)
<LI>the total playtime message at the end of a track, configurable via config.xml setting <CODE>&lt;show_playtime&gt;</CODE> (2 = message window, 1 = chat, 0 = off)
<LI>the Jfreu Info message at the end of a track, configurable via jfreu.config.php setting <CODE>$infomessages</CODE> (2 = message window, 1 = chat, 0 = off)
</UL>
</UL>
<br>
<LI>new <b>/admin call</b> command for MasterAdmins to directly execute a server call, essentially incorporating most of the <A HREF="/tmn/#scripts">RPC Utilities</A>, with the following options:
<UL>
<LI><b>help</b>: Displays help information
<LI><b>help Method</b>: Displays help for method
<LI><b>list</b>: Lists all available methods
<LI><b>Method {params}</b>: Executes method with any necessary parameter(s) and displays any result(s)
<LI>boolean parameters should be entered as 'true' and 'false' (without the single quotes); string parameters consisting of multiple words need to be entered between double quotes (")
<LI>methods that require an array or struct as parameter are not supported
<LI>Admins and Operators cannot use this command regardless of the &lt;call&gt; setting in adminops.xml, as it would permit them to bypass all the normal ability checks
</UL>
<br>
<LI>new support for <b>.OGG comments</b> (ID3 tags) in the TMF music server plugin:
<UL>
<LI>the new <b><CODE>&lt;cache_tags&gt;</CODE></b> setting in musicserver.xml defines whether to cache and display comments (typically ID3 tags) for all .OGG files in the song list
<LI>the new <b><CODE>&lt;cache_file&gt;</CODE></b> setting defines the filename where the cached comments are stored (default: musictagscache.xml)
<LI>when the cache file doesn't exist upon restarting XASECO, it is created, and all .OGG files are read and their comments extracted
<LI>upon further XASECO restarts, and when using <i>/music reload</i>, the cache file is used to load the comments for all known songs, and only the .OGG files for new songs are read
<LI>only the first block (512 bytes) of each .OGG file is read to minimize server traffic and start-up time, but obviously this can still take some time when building the initial cache for a large song collection
<LI>the cache file is then immediately written out with the title and artist for all songs, ready for future restarts and reloads
<LI>if comments are enabled, the <i>/music current</i> and <i>/music settings</i> commands include the title and artist in their output, and the <i>/music list</i> command displays a secondary line with the title and artist for every song
<LI>the cache file can be edited manually to make adjustments or corrections to the title and artist information
<LI>.MUX files are ignored because they are encrypted and cannot be parsed for their comments
</UL>
<br>
<LI>on TMF (except when <i>/style</i> is <i>off</i>) all windows now show an icon in the left corner of the header that's appropriate for that window's content
<LI>on TMF if config.xml setting <CODE>&lt;clickable_lists&gt;</CODE> is True, the karma values in the <i>/list karma</i> output are buttons to invoke <i>/karma</i> on the selected track
<LI>on TMF in the <i>/jukebox display</i> output, admins with the <i>clearjukebox</i> ability get buttons at the end of every page to invoke <i>/admin clearjukebox</i>
<LI>the <i>/recs</i> and <i>/dedirecs</i> commands now accept the following options:
<UL>
<LI><b>help</b>: Displays help information
<LI><b>pb</b>: Runs the <i>/pb</i> or <i>/dedipb</i> command, respectively
<LI><b>new</b>: Runs the <i>/newrecs</i> or <i>/dedinew</i> command
<LI><b>live</b>: Runs the <i>/liverecs</i> or <i>/dedilive</i> command
<LI><b>first</b>: Runs the <i>/firstrec</i> or <i>/dedifirst</i> command
<LI><b>last</b>: Runs the <i>/lastrec</i> or <i>/dedilast</i> command
<LI><b>next</b>: Runs the <i>/nextrec</i> or <i>/dedinext</i> command
<LI><b>diff</b>: Runs the <i>/diffrec</i> or <i>/dedidiff</i> command
<LI><b>range</b>: Runs the <i>/recrange</i> or <i>/dedirange</i> command
<LI>without an option, they display the local or Dedimania records for the current track as before
</UL>
<LI>the main aseco.php program now contains a few configuration definitions that cannot be stored in a .php or .xml file:
<UL>
<LI><b>ABBREV_COMMANDS</b> controls whether to define abbreviations for some chat commands: <i>/ad</i> for <i>/admin</i>, <i>/jb</i> for <i>/jukebox</i>, and <i>/aj</i> for <i>/autojuke</i> &ndash; this was previously controlled by uncommenting a few lines in the pertaining source files
<LI><b>INHIBIT_RECCMDS</b> controls whether all local and Dedimania record relations commands are disabled from the <i>/help</i> and <i>/helpall</i> lists; these are: <i>/pb</i>, <i>/newrecs</i>, <i>/liverecs</i>, <i>/firstrec</i>, <i>/lastrec</i>, <i>/nextrec</i>, <i>/diffrec</i>, <i>/recrange</i> as well as <i>/dedipb</i>, <i>/dedinew</i>, <i>/dedilive</i>, <i>/dedifirst</i>, <i>/dedilast</i>, <i>/dedinext</i>, <i>/dedidiff</i>, <i>/dedirange</i> &ndash; note that the commands can still be used (and on TMN will be echoed to the chat window when doing so)
<LI><b>MONTHLY_LOGSDIR</b> defines whether to write the log in monthly chunks in a "logs/" subdirectory &ndash; this was previously controlled by the <CODE>$log_monthly_logsdir</CODE> variable in function doLog() in includes/basic.inc.php
</UL>
<LI>on TMF, tweaked the Z-values of the single- and multi-page windows so that they clearly stay "on top of" the full chat window (except when <i>/style</i> is <i>off</i>, as those windows were already displayed correctly)
<LI>if <CODE>$always_show_pb = false</CODE> in rasp.settings.php, the Personal Best message at the start of each track is also skipped if the player uses the records panel on TMF
<LI>the default name for the matchsettings file used by <i>/admin readtracklist</i> and <i>/admin writetracklist</i> is now configurable via new config.xml setting <b><CODE>&lt;default_tracklist&gt;</CODE></b> (default: tracklist.txt)
<LI>it's now possible to add an extra explanation to the <i>/help</i> output to help new players, configurable via new config.xml setting <b><CODE>&lt;help_explanation&gt;</CODE></b> (default: False)
<LI>chat-based voting commands can be temporarily disabled during the scoreboard at the end of a track, configurable via new votes.config.php setting <b><CODE>$disable_while_sb</CODE></b> (default: true)
<LI>the default number of tracks displayed by <i>/list newest</i> and <i>/list oldest</i> is now 50
<LI>the dedimania.xml settings &lt;log_news&gt;, &lt;show_recs_range&gt; and &lt;display_recs&gt; should now be specified as True/False instead of 1/0
<LI>the Dedimania system "refresh" is reduced from once every 3 minutes to once every 4 minutes
<LI>the <i>/donpanel</i> command is now disabled if plugin.donate.php is disabled in plugins.xml
<LI>optimized URL parsing in the get_file functions of the SMInfoFetcher, TMNDataFetcher, TMXInfoFetcher and TMXInfoSearcher modules
<LI>new window style ProgressBar, admin panel AboveSpeed2, donate panels LeftSmall and RightSmall, and vote panel BottomCenterTransp, courtesy of nouseforname
<LI>this release requires the latest server <b>build 2008-07-22</b>
</UL>
<H3>Bug fixes in the v1.02 release of XASECO:</H3>
<UL>
<LI>on some PHP systems all ManiaLink windows are broken &ndash; fixed by setting locale LC_NUMERIC = "C"
<LI>on some servers players that leave have their win counts cleared &ndash; fixed this long-standing issue
<LI><i>/ladder</i> and <i>/replay</i> are unable to reload the current track (temporarily added via <i>/add</i>) if that has just been added permanently via <i>/admin addthis</i> &ndash; fixed
<LI>disabling the default donate panel in config.xml also disables the admin panel &ndash; fixed
</UL>
<HR>
<H3>New features and other changes in the v1.01 release of XASECO:</H3>
<UL>
<LI>new <b>TMX search support</b>:
<UL>
<LI>there is a new <b>TMXInfoSearcher class</b> to search TMX with the following features:
<UL>
<LI>find tracks matching name, author and/or environment, returning up to 500 results from the TMNF/TMU sections and up to 20 from the TMO/TMS/TMN sections (due to an API limitation)
<LI>list the 10 most recent tracks (max. one per author) on any section
<LI>the TMXInfoSearcher object is an iterator that allows you to 'foreach' over it to obtain <b>TMXInfo objects</b> with all the info on each track
</UL>
<LI>new <b>/xlist</b> command to list tracks on TMX with the following options and features:
<UL>
<LI><b>help</b>: Displays help information
<LI><b>recent</b>: Lists the 10 most recent tracks (max. one per author)
<LI><b>&lt;xxx&gt;</b>: Lists tracks the matching (partial) name
<LI><b>auth:&lt;yyy&gt;</b>: Lists tracks the matching (partial) author
<LI><b>env:&lt;zzz&gt;</b>: Where &lt;zzz&gt; is an environment from: Stadium, Bay, Coast, Island, Snow/Alpine, Desert/Speed, Rally (case-insensitive)
<LI><b>&lt;xxx&gt; auth:&lt;yyy&gt; env:&lt;zzz&gt;</b>: Combines any of the name, author and/or environment searches
<LI><b>&lt;tmx&gt;</b>: Where &lt;tmx&gt; is a TMX section from: TMO, TMS, TMN, TMNF, TMU (case-insensitive)
<LI>the section option must be the last one but can be combined with any of the above searches; on a TMNF server the default section is TMNF, on a TMUF server it's TMU, and of course the TMN section on a TMN server
<LI>on TMF if config.xml setting <CODE>&lt;clickable_lists&gt;</CODE> is True, the TMX ids are buttons to invoke <i>/tmxinfo</i> on the selected track; the track names invoke <i>/add</i> on the selected track; admins with the <i>add</i> ability also get Add buttons to invoke <i>/admin add</i> on the selected track; and the author names invoke <i>/xlist auth:</i> on the selected author
<LI>on TMN you can list tracks in other TMX sections, but obviously only add them from the TMN section
</UL>
</UL>
<LI>new <b>ShareMania support</b>:
<UL>
<LI>with <i>/add &lt;ID&gt; SM</i> and <i>/admin add &lt;ID&gt; SM</i> you can now use the <A TARGET="_blank" HREF="http://www.sharemania.eu/">ShareMania site</A> to download tracks ('SM' is case-insensitive)
<LI>new <b>/sminfo</b> command (based on the new <b>SMInfoFetcher class</b>) to display the ShareMania information on the current track or, when given a track ID (from <i>/list</i>) or an SM ID, any other track
</UL>
<br>
<LI>new <b>TMUF donate panel</b> support with the following features:
<UL>
<LI>the donate panel shows buttons for seven different donation values, by default: 20, 50, 100, 200, 500, 1000, 2000 (configurable in plugin.donate.php)
<LI>the buttons invoke the <i>/donate</i> command with the specified coppers value
<LI>the distribution's <b>panels/</b> subdirectory can contain up to 20 donate panel templates; their filenames must start with 'Donate'
<LI>there are 6 standard templates in various positions and sizes all around the HUD
<LI>templates define the complete ManiaLink panel with position, size and fonts, so you have full control to develop custom panels
<LI>the default donate panel is configurable via new config.xml setting <b><CODE>&lt;donate_panel&gt;</CODE></b> (default: BelowCPList)
<LI>new <b>/admin donpanel &lt;xxx&gt;</b> command to select another default donate panel for newly connecting players (requires panel name, 'off' disables the default)
<LI>the new <b>/donpanel</b> command allows players to select an individual donate panel with the following options:
<UL>
<LI><b>help</b>: Displays help information
<LI><b>list</b>: Displays available panels
<LI><b>default</b>: Resets panel to server default
<LI><b>off</b>: Disables donate panel
<LI><b>&lt;xxx&gt;</b>: Selects donate panel &lt;xxx&gt;, which can be a panel name or the sequence number from <i>/donpanel list</i>
<LI>in the <i>/donpanel list</i> overview a player can also click a panel name to dynamically select a new panel (or refresh the current one if its .xml file was updated)
</UL>
<LI>on TMNF servers, players using the <i>/donpanel</i> command (and admins using <i>/admin donpanel</i>) receive a message that a TMUF server is needed; on TMUF servers, a TMNF player receives a message that a TMUF account is needed
</UL>
<br>
<LI>automatically enabling <i>/cps</i> and <i>/dedicps</i> for newly connecting players is now configurable via new config.xml settings <b><CODE>&lt;auto_enable_cps&gt;</CODE></b> and <b><CODE>&lt;auto_enable_dedicps&gt;</CODE></b>
<LI>new <b>/admin pay</b> command (TMUF-only) to pay server coppers to a login, including another server login, with the following features:
<UL>
<LI>the required parameters are the login, which can be any valid player or server login, and the coppers amount to pay
<LI>the command provides a dialog box, similar to the donation dialog, allowing the admin to confirm or cancel the payment
<LI>after confirmation, the payment happens immediately but the Nadeo tax (2 coppers plus 5 % of the transaction) isn't deducted from the server account until any player joins or leaves the server
<LI>on TMNF servers, admins using this command receive a message that a TMUF server is needed
</UL>
<LI>new <b>/admin cleanmutes</b> command (alias <b>/admin cleanignores</b>) to completely clean the global mute/ignore list
<LI>the <i>/admin server</i> command now also works on TMN (albeit with the column alignment difficulties inherent to those windows)
<LI>on TMF, <i>/server</i> and <i>/admin server</i> now show the server's rights (United or Nations) and <i>/stats</i> shows the pertaining player's rights
<LI>on TMNF servers, players using the <i>/donate</i> command now receive a message that a TMUF server is needed; on TMUF servers, a TMNF player receives a message that a TMUF account is needed
<LI>on TMNF servers, admins using the <i>/admin coppers</i> command now receive a message that a TMUF server is needed
<LI>updated the Dedimania system to randomly choose between the existing :8006 and :8007 and <b>new :8011, :8012 and :8013</b> communication ports (remember to open those ports on your firewall/router as well) in order to distribute the load across more Dedimania servers
<LI>attempts to <i>/add</i>, <i>/admin add</i> or <i>/admin addlocal</i> a track that's larger than 256 KB (the maximum online track size) are aborted with an error message
<LI>when using the full Jfreu plugin, the banning period by the badword filter is now configurable via <b><CODE>$badwordstime</CODE></b> in jfreu.config.php (default: 10 minutes)
<LI>new <b>/jfreu badwordstime</b> command to set the banning period (in minutes)
<LI>on TMF, unusual characters (such as in challenge names and player nicknames) no longer cause ManiaLink windows not to be displayed
<LI>on TMF, all standard admin panel templates now use the animated Buddy icon instead of the static Buddies one
<LI>on TMF, added the server's login, rights and packmask to the start-up header in the log
<LI>on TMN the default style and panel templates are no longer loaded
<LI>optimized the multi-page ManiaLink windows code on TMF
</UL>
<H3>Bug fixes in the v1.01 release of XASECO:</H3>
<UL>
<LI>on TMF, using <i>/style &lt;##&gt;</i>, <i>/admin panel &lt;##&gt;</i>, <i>/recpanel &lt;##&gt;</i> and <i>/votepanel &lt;##&gt;</i> to select the default style/panel doesn't work &ndash; fixed
<LI>on TMF, unofficial players (ladder rank -1) can bypass the rank limit checks &ndash; fixed
<LI>if a player reconnects within the same second after disconnecting, a MySQL warning is logged &ndash; fixed this long-standing bug
<LI>using <i>/add</i> on a track that's already in the server's list does not properly jukebox it anymore &ndash; fixed
<LI>on Windows, downloading the same track from TMX again with <i>/add</i> or <i>/admin add</i> can result in a PHP warning &ndash; fixed
<LI>if a newly connected player uses <i>/refresh</i>, a PHP warning can result &ndash; fixed
<LI>bogus PlayerFinish callbacks (with no valid login) occasionally result in PHP/XASECO warnings &ndash; fixed, such callbacks are now ignored
<LI>there are some layout glitches in the <i>/jfreu players</i> output when <i>/style</i> is <i>off</i> &ndash; fixed
<LI>the <i>/jfreu badwordsnum</i> command actually shows the <i>/jfreu maxplayers</i> value &ndash; fixed
<LI>on TMN, <i>/admin players</i> results in a 'GetIgnoreList' warning &ndash; fixed
<LI>a non-responding music server can cause XASECO to time out or crash when loading a song &ndash; fixed
<LI>log messages with a "Fatal Error" don't include the source file where the error occurs &ndash; fixed
</UL>
<HR>
<H3>New features and other changes in the v1.00 release of XASECO:</H3>
<UL>
<LI>new <b>TMF window styles</b> support with the following features:
<UL>
<LI>the distribution includes a new <b>styles/</b> subdirectory that can contain up to 50 style templates for the ManiaLink windows
<LI>there are no fewer than 20 standard templates in light and dark, and in transparent, blurred and opaque variants
<LI>templates define the window, header and body background containers, as well as the header and body text fonts, and the clickable button style
<LI>the default window style is configurable via new config.xml setting <b><CODE>&lt;window_style&gt;</CODE></b> (default: DarkBlur)
<LI>new <b>/admin style &lt;xxx&gt;</b> command to select another default window style for newly connecting players (requires style name, 'off' disables the default)
<LI>the new <b>/style</b> command allows players to select an individual window style with the following options:
<UL>
<LI><b>help</b>: Displays help information
<LI><b>list</b>: Displays available styles
<LI><b>default</b>: Resets style to server default
<LI><b>off</b>: Disables TMF window style
<LI><b>&lt;xxx&gt;</b>: Selects window style &lt;xxx&gt;, which can be a style name or the sequence number from <i>/style list</i>
<LI>in the <i>/style list</i> overview a player can also click a style name to dynamically select a new style (or refresh the current one if its .xml file was updated)
</UL>
<LI>multi-page windows get ArrowFirst and ArrowLast buttons to jump directly to the first and last pages &ndash; as with the plain TMN-like style, windows of more than 5 pages also get ArrowFastPrev (Prev5) and ArrowFastNext (Next5) buttons to jump back and forth by 5 pages
<LI>note that on TMNF the Black, Blue, Cyan and Orange styles revert to Green, so you might as well remove those files to prevent player confusion
</UL>
<br>
<LI>new <b>TMF admin panel</b> support with the following features:
<UL>
<LI>the admin panel contains 7 icons to perform common admin tasks, from left to right (or top to bottom):<br>
the ClipRewind icon for <i>/admin restartmap</i>, ClipPause for <i>/admin endround</i>, ClipPlay for <i>/admin nextmap</i>, Refresh for <i>/admin replaymap</i>, ArrowGreen for <i>/admin pass</i>, ArrowRed for <i>/admin cancel</i> and Buddies for <i>/admin players live</i>
<LI>the distribution includes a new <b>panels/</b> subdirectory that can contain up to 40 admin panel templates; their filenames must start with 'Admin'
<LI>there are 14 standard templates in various positions and sizes all around the HUD
<LI>templates define the complete ManiaLink panel with position, size and fonts, so you have full control to develop custom panels
<LI>the default admin panel is configurable via new config.xml setting <b><CODE>&lt;admin_panel&gt;</CODE></b> (default: BelowChat)
<LI>new <b>/admin admpanel &lt;xxx&gt;</b> command to select another default admin panel for newly connecting admins (requires panel name, 'off' disables the default)
<LI>the new <b>/admin panel</b> command allows admins to select an individual admin panel with the following options:
<UL>
<LI><b>help</b>: Displays help information
<LI><b>list</b>: Displays available panels
<LI><b>default</b>: Resets panel to server default
<LI><b>off</b>: Disables admin panel
<LI><b>&lt;xxx&gt;</b>: Selects admin panel &lt;xxx&gt;, which can be a panel name or the sequence number from <i>/admin panel list</i>
<LI>in the <i>/admin panel list</i> overview an admin can also click a panel name to dynamically select a new panel (or refresh the current one if its .xml file was updated)
</UL>
<LI>as with chat commands, use of the buttons in the admin panel remains governed by the tiered admin system and the ability lists
</UL>
<br>
<LI>new <b>TMF records panel</b> support with the following features:
<UL>
<LI>the records panel lists the Personal Best, Local #1 record, Dedimania #1 record and TMX world record
<LI>the times (or scores in TMUF Stunts mode) for these four fields act as buttons to invoke the <i>/topsums</i>, <i>/recs</i>, <i>/dedirecs</i> and <i>/tmxrecs</i> commands, respectively
<LI>the distribution's <b>panels/</b> subdirectory can contain up to 50 records panel templates; their filenames must start with 'Records'
<LI>there are 15 standard templates in left- and right-edge variants
<LI>templates define the complete ManiaLink panel with position, size and fonts, so you have full control to develop custom panels
<LI>the default records panel is configurable via new config.xml setting <b><CODE>&lt;records_panel&gt;</CODE></b> (default: RightBottom)
<LI>new <b>/admin recpanel &lt;xxx&gt;</b> command to select another default records panel for newly connecting players (requires panel name, 'off' disables the default)
<LI>the new <b>/recpanel</b> command allows players to select an individual records panel with the following options:
<UL>
<LI><b>help</b>: Displays help information
<LI><b>list</b>: Displays available panels
<LI><b>default</b>: Resets panel to server default
<LI><b>off</b>: Disables records panel
<LI><b>&lt;xxx&gt;</b>: Selects records panel &lt;xxx&gt;, which can be a panel name or the sequence number from <i>/recpanel list</i>
<LI>in the <i>/recpanel list</i> overview a player can also click a panel name to dynamically select a new panel (or refresh the current one if its .xml file was updated)
</UL>
<LI>all players' records panels are updated when a new #1 Local or Dedimania record is driven, a player's own panel when a new Personal Best is driven
<LI>when the scoreboard comes up at the end of a track, records panels are temporarily disabled
<LI>note that on TMNF some of the Blue fonts revert to Green, so you could rename those files to prevent player confusion
</UL>
<br>
<LI>new <b>TMF vote panel</b> support with the following features:
<UL>
<LI>the vote panel provides Yes and No buttons for TMX <i>/add</i> and all chat-based votes
<LI>players can also operate the buttons with the F5 and F6 keys respectively (the keys don't work for spectators)
<LI>the Yes button and F5 key invoke the <i>/y</i> command, the No button and F6 key are dummy operations to close the vote panel, which is necessary for a consistent user interface experience
<LI>the vote panel is displayed for all players upon entering an <i>/add</i> or chat-based voting command, except for spectators when <CODE>$allow_spec_voting</CODE> in votes.config.php is off (but admins always get the vote panel) and for the vote initiator when <CODE>$auto_vote_starter</CODE> is on (because that already invokes <i>/y</i> automatically)
<LI>a player's vote panel disappears once clicked (or when entering <i>/y</i>), and any remaining panels disappear automatically when a vote passes, expires, or is cancelled
<LI>the color of the Yes button matches the type of vote: pink ({#vote} in config.xml) for chat-based votes and orange ({#emotic}) for <i>/add</i> votes; the No button is always dark gray
<LI>the distribution's <b>panels/</b> subdirectory can contain up to 10 vote panel templates; their filenames must start with 'Vote'
<LI>there are 4 standard templates in various positions and sizes around the HUD
<LI>templates define the complete ManiaLink panel with position, size and fonts, so you have full control to develop custom panels
<LI>the default vote panel is configurable via new config.xml setting <b><CODE>&lt;vote_panel&gt;</CODE></b> (default: BelowChat)
<LI>new <b>/admin votepanel &lt;xxx&gt;</b> command to select another default vote panel for newly connecting players (requires panel name, 'off' disables the default)
<LI>the new <b>/votepanel</b> command allows players to select an individual vote panel with the following options:
<UL>
<LI><b>help</b>: Displays help information
<LI><b>list</b>: Displays available panels
<LI><b>default</b>: Resets panel to server default
<LI><b>off</b>: Disables vote panel
<LI><b>&lt;xxx&gt;</b>: Selects vote panel &lt;xxx&gt;, which can be a panel name or the sequence number from <i>/votepanel list</i>
<LI>in the <i>/votepanel list</i> overview a player can also click a panel name to dynamically select a new panel (or refresh the current one if its .xml file was updated) &ndash; while doing this the panel is briefly displayed to show its new location
</UL>
<LI>when the scoreboard comes up at the end of a track, vote panels are disabled (because the ongoing vote expires at that point)
</UL>
<br>
<LI>the <i>/admin players</i> command now accepts a special option <b>live</b> to display a list of just the online players, rather than any players in the database that match the search string
<LI>on TMF the <i>/admin players</i> command now provides a comprehensive player management window:
<UL>
<LI>the nick/login buttons will invoke <i>/stats</i> on the selected player
<LI>the operation buttons invoke, from left to right, on the selected player: <i>/admin warn</i>, <i>/admin ignore</i> or <i>/admin unignore</i>, <i>/admin kick</i>, <i>/admin ban</i> or <i>/admin unban</i>, <i>/admin ban</i> or <i>/admin unblack</i>, <i>/admin addguest</i> or <i>/admin removeguest</i>, and <i>/admin forcespec</i>
<LI>the toggle operations show the operation that is meaningful with respect to the player's status, e.g. UnIgnore for an ignored player, Add Guest for a non-guest one, and no Force Spec button for a spectator
<LI>operations can be performed on both online and offline players, but buttons are only provided when that operation is feasible, e.g. offline players cannot be warned, ignored, kicked or banned but they can still be unbanned and unblacked
<LI>the window is refreshed (albeit to the first page) to show the new status when any toggle operation is performed, i.e. (Un)Ignore, Kick, (Un)Ban, (Un)Black, Add/Remove Guest and Force Spec
<LI>buttons are only provided for the first 200 players, which should be sufficient for the <i>live</i> list &ndash; if the desired player in an offline list is beyond the 200 mark, refine your search string
</UL>
<br>
<LI>new <b>/jfreu players</b> command to display the list of all known players since the last XASECO restart, and search for offline players via a (part of a) login or nickname with <i>/jfreu players &lt;string&gt;</i>
<LI>the special option <b>live</b> displays a list of just the online players, rather than any players tracked since the last XASECO restart that match the search string
<LI>on TMN this command also includes the current Badword count for each player if <CODE>$badwords</CODE> in jfreu.config.php is 1 (true)
<LI>on TMF this command provides the second player management window:
<UL>
<LI>as before, the nick/login buttons will invoke <i>/stats</i> on the selected player
<LI>the operation buttons invoke, from left to right, on the selected player: <i>/jfreu badword</i> (if <CODE>$badwords</CODE> is 1), <i>/jfreu banfor 1H</i>, <i>/jfreu banfor 24H</i>, <i>/jfreu unban</i>, <i>/jfreu addvip</i> or <i>/jfreu removevip</i>, and <i>/jfreu unspec</i>
<LI>also shown are the player's current badword count (if <CODE>$badwords</CODE> is 1) and the time left in a temporary ban, if any
<LI>the single toggle operation in this window shows the operation that is meaningful with respect to the player's status, i.e. Add or Remove a player as VIP
<LI>the Spec column provides an UnSpec button for SpecOnly players, and otherwise shows the player's current status (Player, Spec or Offln)
<LI>operations can be performed on both online and offline players, but buttons are only provided when that operation is feasible, e.g. offline players cannot have their badword count incremented or be unspec-ed but they can still be temporarily banned
<LI>the window is refreshed (albeit to the first page) to show the new status after all of the operations
<LI>buttons are only provided for the first 200 players, which should be sufficient for the <i>live</i> list &ndash; if the desired player in an offline list is beyond the 200 mark, refine your search string
</UL>
<br>
<LI>on TMF in the output of the various <i>/list</i> lists, <i>/best</i> and <i>/worst</i>, an author column has been added
<LI>on TMF it's now possible to add clickable buttons to relevant lists, configurable via new config.xml setting <b><CODE>&lt;clickable_lists&gt;</CODE></b> (default: True):
<UL>
<LI>in the various <i>/list</i> lists, <i>/best</i> and <i>/worst</i> the track buttons will jukebox the selected track; no button is displayed for tracks in the track history &ndash; supports up to 1900 tracks
<LI>in the various <i>/list</i> lists, <i>/best</i> and <i>/worst</i> the author buttons will invoke <i>/list &lt;author&gt;</i>
<LI>on TMUF, in the various <i>/list</i> lists, <i>/best</i> and <i>/worst</i> the environment buttons will invoke <i>/list env:</i> for the selected environment
<LI>in <i>/music list</i> the song buttons will jukebox the selected song &ndash; supports up to 1900 songs
<LI>in <i>/jukebox display</i> a player will get a button only for the name of his/her own jukebox track, which can be used to drop it; admins of any tier with the <i>dropjukebox</i> ability get buttons for all track names to drop any of them &ndash; supports up to 100 tracks
<LI>in <i>/players</i> the nick/login buttons will invoke <i>/stats</i> on the selected player &ndash; supports up to 200 players
<LI>in <i>/stats</i> the Time Played field is a button to invoke <i>/active</i>, Server Rank invokes <i>/top100</i>, Records invokes <i>/toprecs</i> and Races Won invokes <i>/topwins</i>
<LI>in <i>/admin listignores</i>, <i>/admin listbans</i>, <i>/admin listblacks</i> and <i>/admin listguests</i> the nick/login buttons will invoke <i>/admin unignore</i>, <i>/admin unban</i>, <i>/admin unblacks</i> and <i>/admin removeguest</i> (respectively) on the selected player &ndash; supports up to 200 players
<LI>in <i>/jfreu listbans</i>, <i>/jfreu listvips</i> and <i>/jfreu listvipteams</i> the nick/login/team buttons will invoke <i>/jfreu unban</i>, <i>/jfreu removevip</i> and <i>/jfreu removevipteam</i> (respectively) on the selected player/team &ndash; supports up to 200 players/teams
<LI>this works with any window style, including the plain TMN-like style
</UL>
<br>
<LI>all clicked commands in the aforementioned windows and panels are logged analogous to chat commands
<LI>when you've added more style or panel templates than the maximum, a warning is logged and the excess templates are ignored
<LI>new <b>/autojuke</b> command to automatically jukebox the first available track from the chosen <i>/list</i> selection (e.g. <i>/autojuke nofinish</i>, <i>/autojuke norank</i>... see <i>/autojuke help</i>) &ndash; optional alias <b>/aj</b> becomes available by uncommenting the appropriate two lines at the start of plugin.rasp_jukebox.php
<LI>new <b>/admin forcespec</b> command to force a player into spectator mode (free camera)
<LI>the <i>/stats</i> command now accepts an optional login or player ID by all players, not just admins with the <i>chat_stats</i> ability &ndash; that ability was renamed to <b>chat_statsip</b> and defines which admin tiers can see the player's IP address (for privacy reasons this isn't shown to all players)
<LI>on TMF, players' team names are no longer updated (cleared) in the local database upon reconnection, so that a plugin/command (e.g. <i>/teamname</i> in plugin.matchsave.php) can store meaningful team names in the database
<LI>on TMF if a track contains no custom song, <i>/song</i> will advise to try <i>/music current</i> if the music server plugin is enabled
<LI>when the scoreboard comes up at the end of a track, any pop-up windows are now automatically closed
<LI>optimized the checkpoints panel display code
<LI>HTTP GET requests to TMX and for the up-to-date check now include a User-Agent header to allow minimal statistics tracking
<LI>updated the GBXDataFetcher module to rename the GBXDataFetcher class to <i>GBXChallengeFetcher</i>, and add the new <b>GBXReplayFetcher class</b> (not used in XASECO though)
</UL>
<H3>Bug fixes in the v1.00 release of XASECO:</H3>
<UL>
<LI>the search order is missing from the <i>/list karma</i> header &ndash; fixed
<LI>on TMF, the <i>/admin listignores</i> (aka. <i>ignorelist</i>) listing could get mixed up with previous window output &ndash; fixed
<LI>reminder, expiration and cancellation messages for <i>/add</i> votes show the unstripped track name &ndash; fixed
</UL>
<HR>
<H3>New features and other changes in the v0.99b release of XASECO:</H3>
<UL>
<LI>new <b>/admin clearhist</b> command to clear part of, or the entire, track history: with no option, it shows the total number of tracks in the history; with the 'all' option, the entire history is cleared; with a positive number, that many of the most recent tracks are cleared, and with a negative number that many of the oldest tracks
<LI>the music server plugin supports song files in subdirectories at the server URL, but now those subdirectories can be excluded in any command that shows songs (configurable via new musicserver.xml setting <b><CODE>&lt;strip_subdirs&gt;</CODE></b>)
<LI>new <b>/music stripdirs</b> command to change the strip subdirs setting; the <i>/music settings</i> output also includes the StripDirs value
<LI>a flexible way to control the contents of the ManiaLinks <b>&lt;custom_ui&gt; block</b> now allows other plugins and widgets to co-operate with the main XASECO system
<LI>the config.xml settings &lt;show_recs_before&gt; and &lt;show_recs_before&gt; are now integers instead of booleans: 2 = show the full records report, 1 = show just the track record before or the top-5 records after the track, 0 = show no records at all (reduces chat message volume when a records ManiaLink panel is displayed)
<LI>when XASECO is out of date and a master admin connects, he/she will automatically receive an <i>/admin uptodate</i> reminder message &ndash; hopefully this will motivate more master admins to keep their XASECO version in sync with the latest release
</UL>
<H3>Bug fixes in the v0.99b release of XASECO:</H3>
<UL>
<LI>new local records aren't properly marked anymore in <i>/liverecs</i>, <i>/newrecs</i>, rounds reports and the records report after a track &ndash; fixed
<LI>too stringent input checking for <i>/admin setpwd</i>, <i>/admin setspecpwd</i> and <i>/admin setrefpwd</i> prevents clearing those passwords &ndash; fixed
</UL>
<HR>
<H3>New features and other changes in the v0.99 release of XASECO:</H3>
<UL>
<LI>new <b>music server</b> support (TMF-only) becomes available when plugin.musicserver.php is enabled (uncommented) in plugins.xml, offering the following features:
<UL>
<LI>the music plugin is configured via musicserver.xml, containing the following entries:
<UL>
<LI>the server URL, an http server that must allow direct download of the song files from the specified directory
<LI>a list of song files (case-sensitive) in .OGG or .MUX format that must exist at the server URL &ndash; duplicates are removed when loading the XML file
<LI>configuration options to control whether to override a track's own music, whether to automatically load the next song upon the next track, and whether to allow jukeboxing songs by players
<LI>a list of plugin messages
</UL>
<LI>the new <b>/music</b> command offers the following options:
<UL>
<LI><b>help</b>: Displays help information &ndash; admins see all options, other players only the options they can use
<LI><b>settings</b>: Displays current music settings &ndash; for security, only admins see the server URL
<LI><b>list</b>: Displays available songs
<LI><b>current</b>: Shows current song
<LI><b>reload</b>: Reloads musicserver.xml config file &ndash; admin-only
<LI><b>next</b>: Skips to next song (upon next track) &ndash; admin-only
<LI><b>shuffle</b>: Randomizes song list &ndash; admin-only
<LI><b>override</b>: Changes track override setting &ndash; admin-only
<LI><b>autonext</b>: Changes automatic next song setting &ndash; admin-only
<LI><b>allowjb</b>: Changes allow jukebox setting &ndash; admin-only
<LI><b>off</b>: Disables music, auto next & jukebox &ndash; admin-only
<LI><b>jukebox</b> (alias <b>jb</b>): Displays upcoming songs in jukebox
<LI><b>drop</b>: Drops your currently added song
<LI><b>&lt;##&gt;</b>: Adds a song to jukebox where &lt;##&gt; is the number from <i>/music list</i>
</UL>
<LI>a new <b><CODE>&lt;music&gt;</CODE></b> color is defined in config.xml and used in all relevant music messages so that they can easily be customized
<LI>a new <b>chat_musicadmin</b> ability controls which tiered admin levels can use the <i>/music</i> admin commands
<LI>if <i>autonext</i> is enabled, the next song from the list will be loaded upon the next track, unless an admin manually skipped to the next song or the jukebox specifies another song
<LI>if <i>allowjb</i> is enabled, any player can add one song at a time to the jukebox &ndash; to jukebox another, first use the <i>drop</i> option
<LI>the same song cannot by added to the jukebox more than once
<LI>if a track itself contains a song and <i>override</i> is disabled, a possible jukeboxed song is skipped as it's not possible to detect the track song
<LI>the <i>off</i> option disables server music upon the next track (so the in-game music returns), clears the jukebox, and disables the <i>autonext</i> and <i>allowjb</i> options so no new songs get loaded &ndash; to enable server music again, simply turn either or both options back on
<LI>the <i>reload</i> and <i>shuffle</i> options also clear the jukebox
<LI>a warning message is logged when a song file cannot be loaded, and no song change takes place until the next track
<LI>reminder: to see the filename of a track's own song, use the <i>/song</i> command
</UL>
<br>
<LI>new <b>donation</b> support (TMUF-only) becomes available when plugin.donate.php is enabled (uncommented) in plugins.xml, providing the following features:
<UL>
<LI>new <b>/donate</b> command to give coppers to the server
<LI>the minimum donation is 10 coppers (because of Nadeo tax)
<LI>donations of 100 and more coppers are awarded with a public appreciation message (below 100 it remains private)
<LI>both thresholds are configurable in plugin.donate.php
<LI>a new <b><CODE>&lt;donate&gt;</CODE></b> color is defined in config.xml and used in all relevant donation messages so that they can easily be customized
<LI>remember that the server's coppers amount (seen with <i>/admin coppers</i>) isn't updated until any player joins or leaves the server
<LI><b>important</b>: you must make an initial donation from a TMUF player login to your server login via the in-game message system, so that there are sufficient coppers in the account to pay the Nadeo tax on the first <i>/donate</i> transaction
<LI>an account rights error is shown when attempting to donate from a TMNF player account or to a TMNF server account
</UL>
<LI>new <b>/list env:zzz</b> option (TMUF-only) to search for tracks by environment, where <i>zzz</i> can be: Stadium, Bay, Coast, Island, Alpine/Snow, Desert/Speed, Rally (case-insensitive) &ndash; can also be combined with a search for track/author name in either order: <i>/list xxx env:zzz</i> or <i>/list env:zzz xxx</i> (remember that <i>xxx</i> itself is allowed to contain spaces too)
<LI>on TMF, the <i>/stats</i> output now includes the time (in days and hours) since the player inscribed in the zone, as well as the last match score, number of wins/draws/losses and win/loss ratio (which are included in the <i>/statsall</i> output on TMN)
<LI>on TMF, the <i>/server</i> output now includes the server comment &ndash; note however that special formatting in long comments is not continued after column line breaks
<LI>new <b>/admin server</b> command (TMF-only) to display the server's detailed settings
<LI>new <b>/admin setcomment</b> command to change the server comment
<LI>new <b>/admin setmaxspecs</b> command to change the maximum number of spectators
<LI>new <b>/admin setpwd</b>, <b>/admin setspecpwd</b> and <b>/admin setrefpwd</b> commands to change the player, spectator and referee passwords (referee only on TMF)
<LI>new <b>/admin setrefmode</b> command (TMF-only) to change the Referee mode (0 = top3, 1 = all)
<LI>new <b>/admin forceteam</b> command (TMF-only) to force a player into the 'Blue' or 'Red' team (the names can be abbreviated to 'B' and 'R') &ndash; if no team is specified, the player's current team is shown
<LI>new <b>/admin nextenv</b> command (TMUF-only) to skip to the next track within the same environment
<LI>on TMF, the track name is now hyperlinked to the corresponding TMX page (if available) in the <i>/track</i>, <i>/playtime</i>, <i>/newrecs</i> and <i>/liverecs</i> messages as well as the local record reports before and after each track, and the total playtime message at the end of each track in Rounds/Team/Cup mode
<LI>on TMF, the track name is now hyperlinked to the corresponding Dedimania page in the <i>/dedinew</i> and <i>/dedilive</i> messages as well as the Dedimania record reports before and after each track
<LI>in TMUF Stunts mode, updated the TMX World Record message and <i>/tmxrecs</i> output to show scores
<LI>in TMUF Stunts mode, the total playtime message at the end of each track isn't shown anymore (always 5 minutes)
<LI>the <i>/tmxinfo</i> output now includes the TMX section for the track, as well as the download link to the TMX World Record replay (if available)
<LI>when the current track is not found on TMX, <i>/tmxinfo</i> and <i>/tmxrecs</i> now show the track name instead of the UID in the error message
<LI>added new internal <b>onStatusChangeToX (X = 1-5) event</b> for the corresponding TM server status changes, and new internal <b>onKarmaChange event</b> for karma vote changes
<LI>enforced strict and complete error checking on all local database operations
<LI>added a warning if the SuperAdmin password is still set to the default (and insecure) 'SuperAdmin'
<LI>added the operating system to the first log message during start-up
<LI>set a 20 MB memory limit for the XASECO PHP process
<LI>this release requires the latest server <b>build 2008-05-19</b>
</UL>
<H3>Bug fixes in the v0.99 release of XASECO:</H3>
<UL>
<LI>when the TM server goes away (e.g. crashes), XASECO loops forever at high load &ndash; fixed, XASECO also shuts down with an appropriate error message
<LI>tracks downloaded via <i>/add</i> and <i>/admin add</i> are corrupted since v0.98 and won't load in-game &ndash; fixed
<LI>in TMUF Stunts mode, the new/improved/secured/equalled record messages (both local and Dedimania) specify that the finish value is a Time &ndash; fixed into Score
<LI>on TMF, players added to the global mute list are still able to send global messages via the <i>/me</i>, <i>/hi</i>, <i>/bye</i>, etc. chat commands &ndash; fixed
<LI>on TMF, the muting system handles only 18 lines of the full chat window &ndash; increased to all 28 lines
<LI>on TMF, there is a tiny layout glitch in the <i>/server</i> output &ndash; fixed
<LI>there is no log message for <i>/admin setgamemode</i> &ndash; fixed
</UL>
<HR>
<H3>New features and other changes in the v0.98 release of XASECO:</H3>
<UL>
<LI>new <b>/dedicps</b> command to select which Dedimania record is used as reference for checkpoints tracking, with the following features:
<UL>
<LI>checkpoint references are stored for all players (according to their preferences) <u>only</u> at the start of a track, not when entering the <i>/dedicps</i> command or when the player (re)connects
<LI>with no parameter (<i>/dedicps</i>) the player's own record on each track is selected or, if none is set, the last record on the pertaining track
<LI><i>/dedicps {1-30}</i> selects Dedimania record 1-30 on each track or, if unavailable, again the last record
<LI><i>/dedicps off</i> disables the Dedimania references for checkpoints tracking
<LI>as usual, once a player gains a better finish time than the chosen Dedimania reference, the checkpoints panel (TMF) or pop-up (TMN) will use those corresponding checkpoints for further updates during the current track
<LI>if the checkpoints for the chosen Dedimania record are invalid (empty, or the last checkpoint doesn't match the finish time) then no record is used as reference during that track for the pertaining player(s)
<LI>the chosen <i>/dedicps</i> setting is remembered between a player's reconnects as long as <i>/cps</i> remains enabled, until the next XASECO restart
</UL>
<LI>new <b>/admin shuffle</b> (alias <b>/admin shufflemaps</b>) command to shuffle (randomize) the current track list; this requires having set &lt;writetracklist_random&gt; to True in config.xml, and defining an <CODE>$autosave_matchsettings filename</CODE> in rasp.settings.php &ndash; note that autosaving only happens during a track switch, so if you shuffle immediately after adding a track, the addition will be lost
<LI>new <b>/admin addlocal</b> command to add a track to the server's track list from the local 'Challenges/Downloaded/' directory; the track filename cannot contain spaces or non-typable characters, but can be entered case-insensitively and the '.Challenge.gbx' extension is optional &ndash; also, the <CODE>$jukebox_adminadd</CODE> setting is respected
<LI>new <b>/admin specfree</b> command (TMF-only) to set the camera mode of a spectator (login or ID) to Free &ndash; requires build '2008-05-07' or later
<LI>added support for <b>TMF Laps</b> mode:
<UL>
<LI>the checkpoints tracking system (if activated via <i>/cps</i>) will show the difference to the best lap at each checkpoint and at the lap finish, and update the best lap data after each improved lap
<LI>if <i>/dedicps</i> is activated, the lap data for the chosen Dedimania record is used as initial best lap according to the rules above
<LI>local records are now maintained and compared on lap basis, meaning that those records will usually be unbeatable once the server is switched back to another game mode than TimeAttack, so keep that in mind when picking tracks for TimeAttack and Laps versus other modes
<LI>Dedimania records are also maintained and compared on lap basis like the central Dedimania system does (where they're mixed with TimeAttack mode records only), so they are now properly supported
</UL>
<LI>added support for <b>TMUF Stunts</b> mode:
<UL>
<LI>updated <i>/track</i>, <i>/recs</i> and <i>/dedirecs</i>, <i>/pb</i> and <i>/dedipb</i>, and all record relation commands to show scores
<LI>updated the 'before' and 'after' track record messages (both local and Dedimania) to show scores
<LI>updated the new/improved/secured/equalled record messages (both local and Dedimania) to show scores
<LI>updated all record sorting into descending order
<LI>updated <i>/list nogold</i> and <i>/list noauthor</i> to check for player scores worse than the tracks' gold and author scores
<LI>adjusted the <i>/list help</i> information
<LI>disabled the <i>/list longest/shortest</i> command
<LI>disabled all <i>/cps</i> functionality (checkpoints are inactive)
<LI>disabled Dedimania records handling until the central Dedimania system supports them
</UL>
<LI>added explanations why the checkpoints panel doesn't appear immediately when <i>/cps</i> is activated (Stunts mode, spectating, and warm-up phase all disable the panel temporarily)
<LI>on TMF, multi-page ManiaLink windows now show the current and total page numbers in the header
<LI>on TMF, multi-page ManiaLink windows of more than 5 pages now include Prev5 and Next5 buttons to speed up navigation through long lists
<LI>updated the Dedimania system to randomly choose between the :8003 and <b>new :8006 and :8007</b> communication ports (remember to open those ports on your firewall/router as well) in order to distribute the load across more Dedimania servers
<LI>new records in the <i>/recs</i> and <i>/dedirecs</i> lists are now highlighted with a black time
<LI>on TMF, the <i>/stats</i> output now displays the full location path (sans "World|") instead of just the nation (thanks w1lla)
<LI>on TMF, the <i>/server</i> output now includes the server's location path (again without "World|") &ndash; requires build '2008-05-07' or later
<LI>added the capability to write the log in monthly chunks named "logfile-YYYYMM.txt" in an (automatically created) "logs/" subdirectory, instead of the single big "logfile.txt" &ndash; this is activated by setting "<CODE><b>$log_monthly_logsdir</b> = true</CODE>" in function doLog() in includes/basic.inc.php, as it cannot be a configuration option because configs aren't read until later during start-up
<LI>various welcome messages and in-game URLs are now hyperlinked to the external browser
<LI>updated the <i>/add</i> and <i>/admin add</i> commands to time out when the TMX site is down
<LI>minor optimizations of all multi-page window code
<LI>an example <b>plugin.ml_howto.php</b> module is included to demonstrate how to create single- and multi-page ManiaLink windows
</UL>
<H3>Bug fixes in the v0.98 release of XASECO:</H3>
<UL>
<LI>when <CODE>&lt;lists_colortracks&gt;</CODE> is True, recently played tracks are no longer greyed out to visually distinguish them from tracks that can be jukeboxed &ndash; fixed
<LI>jukeboxing a track via <i>/admin add</i> and <i>/admin replay</i> leaves out the Environment value &ndash; fixed
<LI>even when a player ID cannot be obtained from the local database, there's still an attempt to insert a finish time for the pertaining player login &ndash; fixed
<LI>on TMF, the <i>/admin shutdown</i> command produced a PHP warning because /autoquit is now the default &ndash; fixed, a QuitGame call is only done if /noautoquit was active
</UL>
<HR>
<H3>New features and other changes in the v0.97 release of XASECO:</H3>
<UL>
<LI>on TMF, the brief <i>/cps</i> pop-up is now a permanent, small transparant panel, mid-center of the screen just above the race time; it is temporarily disabled when a player switches to spectator mode though
<LI>on TMF, the checkpoints panel now also shows the difference against the best run at the finish ('CPF')
<LI>in TMF Cup mode, the end of the warm-up phase no longer generates an <i>onEndRace event</i>, preventing several chat messages that only belong at the end of the track; also, during warm-up the checkpoints panel is temporarily disabled
<LI>on TMF, the <i>/tmxinfo</i> window now displays the track screenshot from TMX
<LI>on TMF, <i>/tmxinfo {ID}</i> and <i>/tmxrecs {ID}</i> accept an optional TMX section parameter (TMN, TMU, TMNF, and even TMO, TMS &ndash all case-insensitive) after the TMX track ID to enable displaying track info from another section than the default (as outlined in the v0.96 release notes)
<LI>new <b>/admin scorepanel</b> command (TMF-only) to show the current Automatic Scorepanel setting &ndash; displaying the scoreboard after each run/round, or only at the end of the track &ndash; and to toggle it with an ON" or "OFF" (case-insensitive) parameter
<LI>new <b>/admin roundsfinish</b> command (TMF-only) to show the current Rounds Finishpanel setting &ndash; displaying the rounds panel for all players when the first player finishes, or not until each player finishes him/herself &ndash; and to toggle it with an ON" or "OFF" (case-insensitive) parameter
<LI>displaying colored or stripped player nicknames in <i>/top10</i>, <i>/top100</i>, <i>/toprecs</i>, <i>/topsums</i>, <i>/topwins</i>, <i>/recs</i>, <i>/dedirecs</i> and <i>/active</i> is now configurable via new config.xml setting <b><CODE>&lt;lists_colornicks&gt;</CODE></b> &ndash; because of column formatting caveats, it's recommended to keep nicknames stripped on TMN, as they were before
<LI>displaying colored or stripped tracknames in all <i>/list</i> commands, <i>/best</i>, <i>/worst</i>, <i>/jukebox display</i> and <i>/admin listdupes</i> is now configurable via new config.xml setting <b><CODE>&lt;lists_colortracks&gt;</CODE></b> &ndash; again, it's recommended to keep tracknames stripped on TMN as they were before
<LI>the teamnames in the <i>/topclans</i> output are not color-stripped anymore
<LI>Dedimania system timeouts are handled better to prevent record message flooding; also, improved logging and debugging of the low-level Dedimania layers
<LI>on TMF, any admin with the new <b>server_coppers</b> ability can see the server's coppers amount in the <i>/server</i> output
<LI>new <b>/admin coppers</b> command (TMF-only) to similarly check the server's coppers amount
<LI>on TMUF, the output of all <i>/list</i> commands (including <i>/best</i>, <i>/worst</i>) and of <i>/jukebox display</i> and <i>/admin listdupes</i> now includes an Env(ironment) column
<LI>on TMUF, the chat and log messages for the next jukebox track now specify that track's environment
<LI>added new internal <b>onBillUpdated</b>, <b>onChallengeListModified</b> and <b>onPlayerInfoChanged events</b> for the corresponding new TMF callbacks; also, the <i>onEndRound event</i> is now triggered by the real TMF EndRound callback
<LI>the new <i>onPlayerInfoChanged event</i> is now used to keep track of players' spectator status to avoid an extra GetPlayerInfo call whenever that status is needed (thanks Dagobert)
<LI>updated the stripColors function to strip out the '$h', '$l' and '$p' links for TMF as well
<LI>clarified all error messages related to XML config files not being read or parsed correctly
<LI>fine-tuned column widths of many ManiaLink windows
<LI>when restarting XASECO, all ManiaLinks on all connected clients are cleared
</UL>
<H3>Bug fixes in the v0.97 release of XASECO:</H3>
<UL>
<LI>when Dedimania is slow to respond to a track switch, the updated records message for the finished track may not appear until the next track is loaded, and use that new track's name &ndash; fixed
<LI>on TMF, very long country names cause layout glitches in the <i>/players</i> output &ndash; fixed, country names longer than 14 characters are mapped to their nation abbreviations
<LI>on TMF in Rounds/Team/Cup mode, the last 'Rx>' rounds report isn't shown due to a different callback sequence &ndash; fixed by using the real EndRound callback above
<LI>if a player connects without a team name, the TMNDataFetcher is used to try and obtain it from the TMN master server, even on TMF &ndash; fixed
<LI>the file_exists_nocase function (used by <i>/add</i> and <i>/admin add</i>) doesn't work correctly on Windows &ndash; fixed (hopefully)
<LI>adjusted two function declarations and related calls to avoid pass-by-reference warnings on some PHP setups
<LI>the <i>/summary</i> chat message was largely lacking the shadow attribute &ndash; fixed
</UL>
<HR>
<H3>New features and other changes in the v0.96b release of XASECO:</H3>
<UL>
<LI>on TMF, the global mute list now uses the built-in Ignore features instead of the muting plugin, so the actual muting works much better; the plugin is still needed for the individual player muting features though
<LI>accordingly, there are new aliases for the related admins commands: <b>/admin ignore</b> (for <i>/admin mute</i>), <b>/admin unignore</b> (for <i>/admin unmute</i>), <b>/admin ignorelist</b> and <b>/admin listignores</b> (for <i>/admin mutelist</i> and <i>/admin listmutes</i>)
<LI>on TMF, the ManiaZones country names are mapped back to three-letter nation abbreviations for storage in the local database and for Dedimania; to repair the Nation field in the local 'players' table, you can use <A HREF="scripts/repairnations.zip">this script</A>
<LI>new <b><CODE>$autosave_matchsettings</CODE></b> option in rasp.settings.php to enable autosaving the matchsettings file (with a configurable name) upon every track switch
<LI>on TMF, <i>/add</i> and <i>/admin add</i> accept an optional TMX section parameter (TMN, TMU, TMNF, and even TMO, TMS &ndash all case-insensitive) after the TMX track ID to enable downloading a track from another section than the default (as outlined in the v0.96 release notes)
<LI>when a track is jukeboxed that doesn't match the server packmask, it is skipped with warning, and the next track from the tracklist is loaded (the next jukeboxed track will follow after that)
<LI>on TMF, added another method in votes.config.php to really disable all CallVotes if chat-based votes are enabled
<LI>the pop-up windows in plugin.matchsave.php are now converted to TMF ManiaLink windows too, along with minor touch-ups of the TMN pop-ups
</UL>
<H3>Bug fixes in the v0.96b release of XASECO:</H3>
<UL>
<LI>on TMF, the <i>/nextmap</i> command always shows the first track after the current one is removed from the server's track list (via <i>/admin removethis</i> or <i>/admin erasethis</i>) &ndash; fixed
<LI>a missing or invalid connection to the TM server (due to configuration errors) can cause a flood of PHP warnings in the log &ndash; fixed
<LI>a track ending with no records set can cause a PHP warning in the Dedimania plugin &ndash; fixed
</UL>
<HR>
<H3>New features and other changes in the v0.96 release of XASECO:</H3>
<UL>
<LI>the system has been renamed to <b>XASECO</b> to avoid confusion with other ASECO/RASP systems, and to signify it's a complete and integrated solution for server control
<LI>added ManiaLinks windows (via new include <b>manialinks.inc.php</b>) to allow the system to display TMN-style pop-ups on TMF
<LI>added a Prev button to all multi-page ManiaLinks windows when viewing the second and subsequent pages
<LI>added recognition of server type TMF and game mode Cup, including with the <i>/admin setgamemode</i> command
<LI>updated the <i>/server</i> command to handle Cup mode and show the RoundsPerChallenge value (in addition to the points limit) if the server is in Cup mode
<LI>new <b>/admin disablerespawn</b> command (TMF-only) to show the current DisableRespawn setting &ndash; allowing players to respawn at checkpoints &ndash; and to toggle it with an ON" or "OFF" (case-insensitive) parameter
<LI>new <b>/admin forceshowall</b> command (TMF-only) to show the current ForceShowAllOpponents setting &ndash; forcing players to see all opponents &ndash; and to toggle it with an ON" or "OFF" (case-insensitive) parameter
<LI>updated the <i>TMXInfoFetcher class</i> to handle the new TMNF section
<LI>on a TMNF server (packmask Stadium) the <i>/tmxinfo</i> and <i>/tmxrecs</i> commands as well as the TMX World Record message at the start of a new track will consult the TMNF section of TMX, on a TMUF server the TMU section, and (as before) on a TMN server the TMN section
<LI>the <i>/add</i> and <i>/admin add</i> commands will consult the TMNF, TMUF and TMN sections of TMX according to the same rules
<LI>new <b><CODE>$jukebox_permadd</CODE></b> option in rasp.settings.php to allow tracks voted into the jukebox via <i>/add</i> to remain permanently in the server's track list (normally they're removed after they're finished)
<LI>added extra check for non-empty TM server build during start-up
<LI>several minor tweaks to web_access.inc.php to make it more robust and prevent stream_select() warnings (thanks Slig)
</UL>
<H3>Bug fixes in the v0.96 release of XASECO:</H3>
<UL>
<LI>when a player equals his/her local or Dedimania record, it would be logged again with the next higher position (but not stored anywhere) &ndash; fixed
<LI>new Dedimania record messages would be displayed for LAN logins making records, even though the records aren't actually submitted to the central Dedimania server &ndash; fixed
<LI>plugin.matchsave.php used the CRLF constant in a TMN pop-up &ndash; fixed into LF
</UL>
<HR>
<H3>Known issues in the v0.96+ release of XASECO:</H3>
<UL>
<LI>the <i>/statsall</i> command doesn't work in TMF because there's no way to obtain a player's world stats (yet?)
</UL>
<HR>
<H2><A HREF="Features_095.html">Older release notes</A></H2>
<HR>
<ADDRESS>
Copyright &copy; 2007-2013 &ndash; Frans P. de Vries <A HREF="mailto:tm&#64;&#103;&#97;&#109;&#101;&#114;&#115;&#46;&#111;&#114;&#103;">&lt;tm&#64;&#103;&#97;&#109;&#101;&#114;&#115;&#46;&#111;&#114;&#103;&gt;</A>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
Last updated 19-Aug-2008
</ADDRESS>
</BODY>
</HTML>

View File

@ -1,895 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<TITLE>TrackMania Nations - XASECO release notes v1.16</TITLE>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<META NAME="author" CONTENT="Frans P. de Vries">
<META NAME="generator" CONTENT="vi :)">
<style type="text/css">
body { width: 960px; margin-left: 30px; font-family: Arial,Helvetica,sans-serif; font-size: 15px; }
li,div { padding: 3px; }
code,pre { font-size: 14px; }
pre { width: 90%; margin: 3px 0px; padding: 3px 0px 3px 12px; background-color: #F0F0F0; }
</style>
<META NAME="keywords" CONTENT="TrackMania, Forever, United, Nations, Original, Sunrise, racing, games, XASECO, ASECO, RASP, Jfreu, plugins, records, jukebox, Nadeo">
<META NAME="description" CONTENT="Information on the XASECO system for TrackMania Nations and Forever (& Original/Sunrise), racing games by Nadeo">
</HEAD>
<BODY TEXT="#000000" LINK="#ff0000" VLINK="#0000ff" ALINK="#00ff00" BGCOLOR="#ffffff">
<P ALIGN="center">
<A TARGET="_blank" HREF="http://eswc.trackmanianations.com/"><IMG SRC="banner.jpg" ALT="TrackMania Nations" BORDER="0" WIDTH="590" HEIGHT="149"></A>
<HR>
<H3>New features and other changes in the v1.16 release of XASECO:</H3>
<UL>
<LI>new <b>/cptms</b> command to display the checkpoint times (if available, as they're only being stored since v1.06) for all local records on the current track, as a complement to <i>/sectms</i>
<LI>new <b>/dedicptms</b> command to display the checkpoint times for all Dedimania records on the current track, as a complement to <i>/dedisectms</i>
<LI>added the Countable interface to the <i>TMXInfoSearcher</i> class
<LI>removed the &lt;max_recs&gt; setting from dedimania.xml to insure that only the Server and player MaxRank values from the Dedimania master server are used, and to avoid confusion
<LI>resetting the challenges list cache at the start of each challenge is now configurable via new rasp.settings.php setting <b>$reset_cache_start</b> (default: true)
<LI>the PHP memory limit for XASECO2 is no longer set to 50 MB but to 128 MB (the PHP default) unless it is already at least that size (thanks Electron)
<LI>updated the <i>GBXDataFetcher module</i> to the latest version
</UL>
<H3>Bug fixes in the v1.16 release of XASECO:</H3>
<UL>
<LI>when a map isn't in the database yet, in some situations its name could be stored with stripped colors/formatting &ndash; fixed
</UL>
<HR>
<H3>New features and other changes in the v1.15b release of XASECO:</H3>
<UL>
<LI>rewrote the <i>GBXDataFetcher module</i> completely to correctly process ManiaPlanet maps and replays &ndash; the new <b>GBXChallMapFetcher</b> and <b>GBXReplayFetcher classes</b> are not compatible with the old GBXChallengeFetcher and GBXReplayFetcher ones, but a new <i>GBXChallengeFetcher wrapper class</i> is included for backwards compatibility with third-party plugins
<LI>small update to the <i>TMXInfoFetcher class</i> to support 24-char UIDs
<LI>removed the obsolete <i>ReplayParser class</i>
</UL>
<H3>Bug fixes in the v1.15b release of XASECO:</H3>
<UL>
<LI>two tiny fixes in Auto TimeLimit handling and <i>/tmxinfo</i>
<LI>the error checking in the <i>TMXInfoSearcher class</i> is slightly too strict &ndash; fixed
</UL>
<HR>
<H3>New features and other changes in the v1.15 release of XASECO:</H3>
<UL>
<LI>implemented several security enhancements to prevent unauthorised use of chat commands
<LI>in multi-page windows all pages are filled up with empty rows to the same number of rows as the first page to ease browsing (except when using the old TMN-style windows)
<LI>on TMF, the <i>/jukebox</i>, <i>/add</i>, <i>/admin add</i> and <i>/admin addlocal</i> commands now check the chosen track against the server settings and ignore it if it doesn't match
<LI>new support for the Dedimania MaxRank system:
<UL>
<LI>the default MaxRank is 30, meaning that players normally cannot attain a record outside the top-30
<LI>when a server MaxRank has been upgraded (still to be fully implemented by Slig) then all players on that server can attain records up to that larger rank
<LI>when a player's MaxRank has been upgraded (ditto) then that player can attain records up to his/her rank, or the server MaxRank if that is still larger
<LI><i>/dedirecs</i> and <i>/dedisectms</i> show all known records for a track, including those outside the top-30
<LI><i>/dedilast</i> and <i>/dedirange</i> also operate on the last known record, even if that is outside the top-30
<LI>the <i>/dedistats</i> output includes the Server MaxRank and your player MaxRank
</UL>
<LI>a fatal error is now reported if no masteradmin is configured in config.xml
<LI>added an <b>updatepanels.php</b> script to the DOCS/ directory to allow updating all players' panels of a given type to a new template
<LI>added more logging, including transaction IDs, of copper transactions
<LI>new <b>onDediRecsLoaded event</b> to indicate that the Dedimania records for a new track have been received from the master server (thanks undef.de)
<LI>the checks why Dedimania records are ignored on a track have been improved, and the reasons are now logged always (not just in debug mode)
<LI>improved error checking and handling in the Dedimania system and the local database plugin
<LI>deployed updated web_access.inc.php for Dedimania communication (thanks Slig)
<LI>added a dynamic idle period to the main loop in order to reduce the CPU load if system usage allows it (thanks oliverde8)
<LI>the game mode values are now available as constants Gameinfo::RNDS (0), TA (1), TEAM (2), LAPS (3), STNT (4), CUP (5)
<LI>the game state (racing or scoreboard) is now maintained in $aseco-&gt;server-&gt;gamestate with constants Server::RACE and Server::SCORE (thanks undef.de)
<LI>improved error reporting in the updated <i>TMXInfoFetcher</i> and <i>TMXInfoSearcher classes</i>
<LI>this release requires the latest server <b>build 2011-02-21</b>
</UL>
<H3>Bug fixes in the v1.15 release of XASECO:</H3>
<UL>
<LI>in Laps mode, the checkpoints panel isn't updated on the first passage through the finish when a previous best lap time is already known &ndash; fixed
<LI>UTF-8 characters in (master)admin/operator titles in adminops.xml are not processed correctly &ndash; fixed (thanks TheBigG)
<LI>on TMF the <i>/dedisectms</i> header shows the maximum number of local records instead of Dedimania ones &ndash; fixed
<LI><i>/dedipb</i> causes PHP warnings for a player without Dedimania record on a track with fewer than the maximum number of records &ndash; fixed
<LI>tiny code and typo fixes discovered while creating XASECO2
</UL>
<HR>
<H3>New features and other changes in the v1.14 release of XASECO:</H3>
<UL>
<LI>new support for <b>TMF relay servers</b>:
<UL>
<LI>on the master server, relays are now registered separately rather than considered spectating players
<LI>on a relay server, the start-up log includes the login and nickname of the master server it relays to
<LI>new <b>/admin relays</b> command to display (on the master server) the list of connected relay(s), or show (on a relay server) its master server
<LI>the <i>/admin server</i> output is reorganized to make room for a line about the server's master/relay status on the first page
<LI>on a relay server, the <i>/server</i> output includes the master server's login/nickname in place of the track count
<LI>on a relay server are disabled:
<UL>
<LI>commands (e.g. <i>/jukebox</i>), events (e.g. checkpoints and finishes) and functionality (e.g. player reranking) that make no sense on a relay
<LI>commands (e.g. <i>/recs</i>) and functionality (e.g. personal bests) that require information from the master server's database
<LI>logging of chat messages from the master server (but they are still shown)
</UL>
<LI>on relay servers, plugins plugin.autotime.php, plugin.matchsave.php, plugin.rasp_votes.php, chat.dedimania.php and plugin.dedimania.php must be <u>disabled</u>, and third-party plugins may not operate correctly (e.g. Fufi's Menu is fine, but Fufi's Widgets won't work) &ndash; you may want to disable plugins such as chat.records.php, chat.records2.php, plugin.checkpoints.php, etc. too, as all their commands are disabled anyway
</UL>
<LI>improvements in the Dedimania plugins due to API enhancements (thanks Slig):
<UL>
<LI>identical logins from different games (e.g. TMN ESWC vs. TMU/TMF) are now associated correctly with their records in relevant commands, new/improved/secured/equalled chat messages, and the reports before and after each track
<LI>when a login that is banned from Dedimania joins the server, this is announced with a general chat message, and finishes by that login are ignored (you may also want to activate the Dedimania global blacklist in rasp.settings.php to prevent them from joining in the first place)
</UL>
<LI>on TMF, the challenge list cache is now also refreshed upon external changes (i.e. by remote controllers) to the server's track list
<LI><i>/admin setgamemode</i> checks whether the game mode is actually being changed, and mode changes are now taken into account when restarting (thanks undef.de)
<LI>the XML parser (parseXml in xmlparser.inc.php) has a new option to preserve UTF-8 encoding on extracted strings (for historical reasons the default is <CODE>false</CODE>), so now any plugin calling the parser can control UTF-8 encoding
<LI>a new aseco.php configuration definition <b>CONFIG_UTF8ENCODE</b> controls whether UTF-8 encoding on strings in config.xml is preserved (default <CODE>false</CODE> as above) &ndash; config.xml setting <CODE>&lt;welcome_utf8encode&gt;</CODE> is now obsolete
<LI>tagged all generic warning/error messages from the dedicated server with the invoking method
<LI>all included HTML documentation now passes the W3C validatator
</UL>
<H3>Bug fixes in the v1.14 release of XASECO:</H3>
<UL>
<LI>the challenge list cache isn't always properly refreshed &ndash; fixed (thanks jimos94)
<LI>when XASECO is configured to use the global Dedimania blacklist on a server that didn't use it before, the initial bulk merge doesn't work &ndash; fixed (thanks soehest)
<LI>merging the global blacklist causes a bogus warning &ndash; fixed
</UL>
<HR>
<H3>New features and other changes in the v1.13 release of XASECO:</H3>
<UL>
<LI>new <b>/ignore</b> command to start a chat-based vote to ignore/mute a player &ndash; usage and configuration are analogous to <i>/kick</i>, so see the <a href="Features_084.html">v0.84 release notes</a> for more info
<LI>new <b>/lastwin</b> command (via chat.lastwin.php) to re-open the multi-page window that was most recently closed; on TMN it's opened at the first page, on TMF at the current page &ndash; single-page windows are not stored with the player data so those cannot be re-opened
<LI>implemented a challenge list cache mechanism to improve the speed of all <i>/list</i> lists (thanks xai), <i>/best</i>, <i>/worst</i> and <i>/summary</i>, especially on servers with a large number of tracks
<LI>the speed of <i>/toprecs</i>, <i>/topsums</i> and the calculation of all players' server ranks is further improved by optimized MySQL interaction, in addition to the above cache mechanism
<LI>updates for the (TMF-only) music server plugin (thanks undef.de):
<UL>
<LI>for http music servers, spaces and other special characters in the server path and/or song filename (and optional subdirectory) are now supported
<LI>after restarting a track, followed by the scoreboard and ChatTime countdown, the current song is now correctly shown
<LI>duplicate song removal is handled a litte better
<LI>upon XASECO shutdown, server music is disabled (thanks Terron)
</UL>
<LI>rewrote <i>/admin prev</i> and <i>/admin nextenv</i> using the jukebox system so they keep working when tracks are jukeboxed
<LI>new and updated <b>internal events</b>:
<UL>
<LI>new <b>onVoteUpdated event</b> for handling the new TMF VoteUpdated callback (requires the latest server build 2011-02-21)
<LI>new <b>onTracklistChanged event</b> to signal changes to the track list, passing along an action string ('add', 'remove', 'rename', 'juke', 'unjuke', 'read' &amp; 'write') and the pertaining track filename, or <i>null</i> for the 'read' &amp; 'write' actions (thanks undef.de)
<LI>updated <b>onJukeboxChanged event</b> with action strings 'previous' and 'nextenv'
</UL>
<LI>implemented a time-out mechanism in the connection of XASECO to the dedicated server (thanks La beuze):
<UL>
<LI>the mechanism allows you to (re)start the dedicated server and XASECO at the same time (or right after eachother) from the same script, and XASECO will keep retrying to connect until the server reaches status 4 (Running - Play), or the time-out is exhausted
<LI>this is especially useful on servers that take a long time to fully start up due to a large number of tracks
<LI>the time-out (in seconds) is configurable via new config.xml setting <b><CODE>&lt;tmserver&gt;&lt;timeout&gt;</CODE></b> &ndash; a warning is logged when it is missing
<LI>the GbxRemote modules have been updated to accommodate this connection time-out
</UL>
<LI>improved detection of warm-up phase
<LI>enhanced the sorting order of equally-finished players in the rounds reports (Rounds/Team/Cup mode) to match that of the game (thanks .anDy)
<LI>the speed of <i>/best</i>, <i>/worst</i>, <i>/summary</i> and <i>/stats</i> is improved through optimization of the underlying get_recs function (thanks undef.de)
<LI>improved initialisation sequence (and its error handling) of the main program
<LI>on TMF, new 'avatar', 'language' and 'teamid' members in the Player object
</UL>
<H3>Bug fixes in the v1.13 release of XASECO:</H3>
<UL>
<LI><i>/admin delrec</i> doesn't work since v1.12 &ndash; fixed (thanks Ouwe)
<LI>when using a player ID after <i>/best</i>, <i>/worst</i>, <i>/summary</i> and <i>/stats</i>, that player's records aren't found since v1.12 &ndash; fixed
<LI>the help messages for <i>/donate</i> and <i>/admin pay</i> don't display correctly &ndash; fixed (thanks xai)
<LI>when using NewRules in Rounds or Team modes, <i>/server</i> shows the normal points limit &ndash; fixed, now the NewRules points limit is shown (thanks undef.de)
<LI>when there are no ranked players, <i>/toprecs</i> and <i>/topsums</i> produce gibberish output and PHP warnings &ndash; fixed
<LI><i>/topwins</i> causes PHP warnings for an empty players table &ndash; fixed (thanks relaxedracer)
<LI>mysql_query SELECT results aren't always properly freed up with mysql_free_result &ndash; fixed
</UL>
<HR>
<H3>New features and other changes in the v1.12 release of XASECO:</H3>
<UL>
<LI>new <b>database and query optimizations</b>:
<UL>
<LI>these database optimizations are automatically applied once the first time this release is run, but will take a while depending on the size of the database and the speed of your MySQL server, so be patient as they could easily take several minutes (especially the 'rs_times' changes) &ndash; interrupting this process could result in a corrupt database, so... don't
<LI>the Score fields in the 'records' and 'rs_times' tables are converted from MediumInt to Int, increasing the maximum race time from 140 minutes to 596 hours
<LI>the 'records' Id, 'rs_times' ID and 'players' TimePlayed fields are also increased to Int, and the 'rs_karma' Score field is reduced to TinyInt
<LI>the keys on the 'records' and 'rs_times' tables are reorganized and expanded to improve the speed of various queries on those tables
<LI>RASP's clean-up of unused 'records' and 'rs_times' entries at start-up now only happens if <CODE>$prune_records_times</CODE> in rasp.settings.php is true, resulting in faster start-up
<LI>the speed of this clean-up is improved by different queries and related processing, and it is logged in more detail
<LI>preparation of the player stats panels at the scoreboard is sped up with an improved query and related processing
<LI>the speed of the <i>/server</i> and <i>/nations</i> commands is improved by different queries and related processing
<LI>the speed of the <i>/topdons</i> command is improved by an appropriate key on the 'players_extra' table
<LI>you can verify the result of all conversions against the MySQL schema in the localdb/*.sql files using SHOW CREATE TABLE queries or the 'mysqldump --no-data' command
<LI>XASECO's main tables are created automatically the first time this release is run, analogous to RASP's 'rs_*' tables, thus simplifying installation
<LI>the 'id' member of the Player object (holding the dedicated server's PlayerId value for a player) is renamed to 'pid' and 'id' now contains the database id from the 'players' table, analogous to the Challenge object &ndash; this eliminates most player ID queries
<LI>thanks to Tyrann for providing dumps of a large database to analyze &amp; test with
</UL>
<br>
<LI>new and updated <b>internal events</b> (thanks undef.de):
<UL>
<LI>new <b>onDedimaniaRecord event</b> to indicate a new/improved/secured Dedimania record, including its position &ndash; note that a Dedimania record is not official until confirmed after the end of a track
<LI>the <i>onLocalRecord event</i> also includes a new pos(ition) field
<LI>new <b>onJukeboxChanged event</b> to signal changes to the jukebox, passing along an action string ('add', 'clear', 'drop', 'play', 'replay', 'replay', 'restart' &amp; 'skip') and the pertaining track data, or <i>null</i> for the 'clear' action
<LI>new <b>onMusicboxReloaded event</b> to alert that the music server config file (musicserver.xml) was reloaded via <i>/music reload</i>
<LI>new <b>onDonation event</b> to indicate that a new donation was completed, including login and coppers amount
<LI>on TMF, restarting when at least one player already has a finish time or a score results in the scoreboard and ChatTime countdown, thus allowing time for the normal <i>onNewChallenge</i> and <i>onEndRace events</i> instead of the <i>onRestartChallenge</i> one &ndash; for instant restarts the latter is issued as before, and the two restart types are logged distinctly
</UL>
<br>
<LI>new support for <b>sector times</b> (not to be confused with sector records, as offered by third-party plugins):
<UL>
<LI>new <b>/sectms</b> command to display the sector times (if available, as they're only being stored since v1.06) for all local records on the current track
<LI>new <b>/dedisectms</b> command to display the sector times for all Dedimania records on the current track
<LI>on TMN there's room for the first 9 sectors, on TMF for the first 12 sectors of each record &ndash; a '+' indicates when there are more sectors than can be displayed
</UL>
<LI>eliminated checkpoints panel toggling due to temporary spectator status changes at the end and start of tracks, thus significantly reducing outgoing ManiaLink traffic during that period &ndash; this also reduces the problem with stalled panels and widgets
<LI>PlayerFinish callbacks are now ignored when not in status 4 (Running - Play), again reducing processing overhead during the end and start of tracks
<LI>once a track is being replayed (after <i>/replay</i> or <i>/admin replay</i>), then <i>/playtime</i> and the total playtime message at the end of that track will include the number of replays and the overall playtime (thanks Milenco)
<LI>at start-up the dedicated server connection, LocalDB and RASP messages are now logged with timestamps
<LI>updated the stripColors function to (even) better reproduce the way the game strips incomplete tags (thanks Slig)
<LI>all Dedimania communication now occurs via <i>port :8002</i> only, and you should remove the RPC4/server.php link from dedimania.xml
<LI>improved debug logging in the Dedimania plugin
<LI>upon shut down (via the <i>/admin</i> commands) or Fatal Error, all ManiaLinks on all connected clients are cleared (thanks Terron)
<LI>various tweaks and corrections to plugin.matchsave.php
<LI>retired chat.vote.php with its obsolete <i>/vote</i> and <i>/score</i> commands &ndash; you can manual delete the empty 'votes' table via a DROP TABLE query
</UL>
<H3>Bug fixes in the v1.12 release of XASECO:</H3>
<UL>
<LI>the <i>onLocalRecord event</i> is also issued for equalled records &ndash; fixed
<LI>the <i>/list & /autojuke nofinish & norank</i> commands cause PHP warnings for players without finished tracks &ndash; fixed
<LI>missing title or artist tags of .OGG songs can cause PHP warnings &ndash; fixed
<LI>the TMXInfoFetcher can cause PHP warnings upon empty results from TMX API calls &ndash; fixed
</UL>
<HR>
<H3>New features and other changes in the v1.11 release of XASECO:</H3>
<UL>
<LI>new <b>/xaseco</b> command to display a variety of info about your XASECO installation, including uptime, the welcome message (TMF-only), and the masteradmin(s) &ndash; the XASECO version is no longer in the <i>/server</i> output
<LI>new <b>/mod</b> command (based on an updated <i>GBXChallengeFetcher class</i>) to show the (file)name for the current track's mod
<LI>if followed by the <b>url</b> (alias <b>loc</b>) parameter, <i>/song</i> and <i>/mod</i> will also display the song's or mod's locator URL (if available), hyperlinked for easy download
<LI>an optional search string after <i>/music list</i> will now list only songs with that string in their filenames or, if &lt;cache_tags&gt; in musicserver.xml is enabled, in the title or artist tags of .OGG songs &ndash; the song IDs shown are the original (now possibly non-sequential) ones from the complete list so that jukeboxing still works correctly
<LI>the <i>/chatlog</i>, <i>/pmlog</i> and <i>/admin pmlog</i> output can show the timestamp of each message, configurable via new config.xml setting <b><CODE>&lt;chatpmlog_times&gt;</CODE></b> (default: True)
<LI>new <i>/list</i> option: <b>/list novote</b> to display all tracks the player didn't karma vote for
<LI>new <i>/autojuke</i> option: <b>/autojuke novote</b> to automatically jukebox the first available track from the <i>/list novote</i> selection
<LI><i>/list karma 0</i> now correctly lists all tracks without karma votes as well as those with average karma value 0 &ndash; previously this command would list tracks with negative or zero karma but not those without any votes
<LI>new <b><CODE>$jukebox_adminnoskip</CODE></b> option in rasp.settings.php to <i>not</i> skip tracks (if <CODE>$jukebox_skipleft</CODE> is true) that were jukeboxed by admins (of any tier) which left the server
<LI>when a player whose IP address was banned re-enters after the dedicated server was restarted, [s]he is now re-banned instead of just kicked &ndash; this insures the dedicated rather than XASECO will keep the player out on subsequent connect attempts, at least until another restart
<LI>updated the Dedimania system to use only the <b>new :8002</b> communication port (remember to open this port on your firewall/router as well) &ndash; the load is now internally distributed on the Dedimania master server
<LI>on TMF, the <i>/stats</i> output now includes the player's client build/version
<LI>changed/added common Rounds points systems on TMF, with <i>f1gp</i> replaced by:
<UL>
<LI><b>f1old</b>: Formula 1 GP Old &ndash; 10,8,6,5,4,3,2,1,...
<LI><b>f1new</b>: Formula 1 GP New &ndash; 25,18,15,12,10,8,6,4,2,1,...
</UL>
<LI>player wins in Stunts mode are now determined and attributed (thanks nouseforname)
<LI>changed the public appreciation message for large donations to prevent a fraud scheme
<LI>optimized MySQL interaction for calculation of players' server ranks (thanks Nanir)
<LI>upon a Fatal Error, an <b>onShutdown event</b> is issued just before shutting down (thanks nocturne)
<LI>the player/spectator and voting values in the $aseco->server object are refreshed at each track switch in case they've been modified (thanks undef.de)
<LI>the Auto TimeLimit and music server plugins now log an initialization message before loading their respective .xml configs
<LI>deployed updated web_access.inc.php for Dedimania communication (thanks Slig)
<LI>removed all ShareMania support as the site was retired
</UL>
<H3>Bug fixes in the v1.11 release of XASECO:</H3>
<UL>
<LI>changes in the GameInfo structure aren't detected upon restarts, only upon track switches &ndash; fixed
<LI>players that should have been kicked (e.g. for an obsolete client) but weren't, can cause PHP warnings &ndash; fixed, and their finishes are ignored
<LI>in Laps mode when <i>/dedicps</i> is active, local records are not detected &ndash; fixed (thanks blue)
<LI>there's a global $linelen conflict between plugin.chatlog.php and plugin.msglog.php &ndash; fixed
<LI><i>/list karma</i> is allowed while $feature_karma in rasp.settings.php is false &ndash; fixed
<LI>in rare situations <i>/best</i>, <i>/worst</i> and <i>/list best|worst</i> can produce gibberish output &ndash; fixed
<LI>following <i>/list</i> with <i>/style ##</i> or any <i>/*panel ##</i> command can cause a PHP warning &ndash; fixed
<LI>an XML/RPC communication problem with the Dedimania server can cause a PHP warning &ndash; fixed
</UL>
<HR>
<H3>New features and other changes in the v1.10 release of XASECO:</H3>
<UL>
<LI>new support for <b>TMF client version checking</b> upon player connects:
<UL>
<LI>when players connect on TMF, it is now possible to check their client version for a minimum number
<LI>if new config.xml setting <b><CODE>&lt;player_client_version&gt;</CODE></b> is empty, checking is disabled; otherwise it must be a valid TMF version number, 2.11.11 or higher
<LI>if checking is enabled and the player's client version is less than the required number (where the empty version of the initial TMF releases counts as 2.11.11), then the player is kicked with appropriate log and chat messages, and the kick dialog also contains a suitable message (configurable in config.xml)
<LI>cheating currently happens only with v2.11.11 clients, so in order to prevent potential cheaters (along with other players that haven't upgraded yet) from joining, you can choose to set <CODE>&lt;player_client_version&gt;</CODE> to 2.11.12 or higher
<LI>when admins of any tier connect on TMF, it is also possible to check their client version for a separate minimum number
<LI>if new config.xml setting <b><CODE>&lt;admin_client_version&gt;</CODE></b> is empty, checking is disabled; otherwise it must be a valid TMF version number, 2.11.11 or higher
<LI>if checking is enabled and the admin's client version is less than the required number (where an empty version again counts as 2.11.11), then the admin is similarly notified and kicked
<LI>recent client and server versions <a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=22523">prevent login spoofing</a>, so it's recommended to set <CODE>&lt;admin_client_version&gt;</CODE> to 2.11.19 or higher and have all your server's admins upgrade if necessary
<LI>note that digitally distributed editions of TMF are not easily upgraded with the <a target="_blank" href="http://www.tm-forum.com/viewtopic.php?p=138727#p138727">manual patches</a> &ndash; e.g. the Steam edition is currently at 2.11.16 &ndash; so be careful about setting the versions too high
</UL>
<LI>new <b>/settings</b> command to display your personal settings, or those of any player (login or ID) if you're an admin with the new <b>chat_settings</b> ability &ndash; the settings are: the <i>/cps</i> and <i>/dedicps</i> values, and on TMF also the <i>/style</i>, <i>/admin panel</i>, <i>/donpanel</i>, <i>/recpanel</i> and <i>/votepanel</i> values (if the pertaining plugins are enabled)
<LI>new <b>/plugins</b> command to display the list of currently active plugins
<LI>new <b>/admin delrec</b> command to delete the specified record (1 - $maxrecs) for the current track, delete the corresponding 'rs_times' entries and, if necessary, move the next best time in as the new last record
<LI>the number of times a track can be replayed via <i>/replay</i> votes is now configurable via new votes.config.php setting <b><CODE>$replays_limit</CODE></b> (default 0 = unlimited)
<LI>admins with the new <b>chat_jukebox</b> ability can now use the <i>/jukebox</i> command even if <CODE>$feature_jukebox</CODE> in rasp.settings.php is false
<LI>on TMF the <i>/recs</i> output can optionally include the players' logins, configurable via new config.xml setting <b><CODE>&lt;show_rec_logins&gt;</CODE></b> (default: True)
<LI>on TMF the <i>/dedirecs</i> output can optionally include the players' logins, configurable via new dedimania.xml setting <b><CODE>&lt;show_rec_logins&gt;</CODE></b> (default: True)
<LI>new <b>/dedistats</b> command to display a few Dedimania statistics for the current track and, only on TMF, a link to the track's Dedimania page with all its records
<LI>for TMF global blacklists that contain optional &lt;account&gt; fields with values 'United' or 'Nations', the merge feature can now process only the United logins, configurable via new rasp.settings.php setting <b><CODE>$globalbl_united</CODE></b> (default: false)
<LI>a log message now indicates when a Dedimania record is ignored because the pertaining login is banned from Dedimania
<LI>on TMF the Dedimania plugin now verifies that the configured server login is the same as the actual server login
<LI>the <i>/xlist</i> command can now search TMX for track names using multiple words (thanks bmandk)
<LI>added new common Rounds points system on TMF:
<UL>
<LI><b>superstars</b>: Superstars &ndash; 20,15,12,10,8,6,4,3,2,1,...
</UL>
<LI>reduced the MySQL reconnect polling frequency at an empty server to once every second
<LI>optimized the MySQL queries for the <i>/list nofinish</i> and <i>/list norank</i> commands (thanks Pesky)
<LI>the 'GameData/Tracks/Challenges/TMX/' and '.../TMXtmp' directories are now created automatically if they don't exist when starting XASECO for the first time (this also simplifies the installation procedure by one step)
<LI>arguments to <i>/admin clearhist</i> are clipped at $buffersize
<LI>usage of the dedicated server's built-in commands <i>/version</i> and (TMF-only) <i>/serverlogin</i> is now logged as such
<LI>new donate panel BelowCPListRM and record panel RightBottomRM, courtesy of sebik1992 (RoundMania 90k)
</UL>
<H3>Bug fixes in the v1.10 release of XASECO:</H3>
<UL>
<LI>restarting XASECO triggers required checkpoints warnings for the ongoing race &ndash; fixed, the warnings now get enabled after the end (or a restart) of the current track
<LI>after merging a global blacklist, the local blacklist is saved without the newly blacklisted logins &ndash; fixed
<LI>blacklisted logins of players that never visited the server (e.g. from a merged global blacklist) can't be unblacklisted &ndash; fixed
</UL>
<HR>
<H3>New features and other changes in the v1.09 release of XASECO:</H3>
<UL>
<LI>new support for a <b>global blacklist</b> on TMN and (especially) TMF, because at start-up the TMF server now properly loads the global blacklist specified in dedicated_cfg.txt entry &lt;blacklist_url&gt; and merges it with the local blacklist:
<UL>
<LI>new <b>/admin mergegbl</b> command to merge a (possibly updated) global blacklist with the server's blacklist at other times than just start-up
<LI>the default blacklist is configurable via rasp.settings.php setting <b><CODE>$globalbl_url</CODE></b>, and should be the same as &lt;blacklist_url&gt;
<LI>the <i>/admin mergegbl</i> command optionally accepts a http[s] URL to load another global blacklist, and access to the command is defined in adminops.xml as usual
<LI>when a MasterAdmin connects, the default global blacklist can automatically be merged, configurable via rasp.settings.php setting <b><CODE>$globalbl_merge</CODE></b> (default: false)
<LI>after merging, log and chat messages indicate the number of newly blacklisted logins, and the local blacklist is saved just like after a manual <i>/admin black</i> command
</UL>
<br>
<LI>new support for <b>player access control</b> by nation (TMN) or zone (TMF) becomes available when plugin.access.php is enabled (uncommented) in plugins.xml, offering the following features:
<UL>
<LI>the control mechanism is inspired by Apache's <A TARGET="_blank" HREF="http://httpd.apache.org/docs/2.0/mod/mod_access.html">mod_access</A> and is configured via access.xml, containing the following directives:
<UL>
<LI>the Order section, defining the order in which the other two sections are processed
<LI>the Allow section, containing one or more From fields to specify nations/zones that are allowed access
<LI>the Deny section, containing one or more From fields to specify nations/zones that are denied access
<LI>the From values are case-sensitive, upper- and lowercase characters must match exactly with the players' nations/zones you want to control
<LI>the catch-all value for either the Allow or Deny section is 'all' (lowercase), and in that case this section cannot contain other From fields
<LI>for more information and examples on these directives, see the comments in access.xml and the aforementioned mod_access page
</UL>
<LI>on TMF, a match on a specified zone will also match its subzones, e.g. a match on "Netherlands" will include all Dutch provinces too
<LI>denied players are kicked with appropriate log and chat messages, and on TMF the kick dialog also contains a suitable message, which can be configured in access.xml
<LI>the new <b>/admin access</b> command offers the following options:
<UL>
<LI><b>help</b>: Displays help information
<LI><b>list</b>: Displays current access control settings
<LI><b>reload</b>: Reloads updated access control settings
</UL>
<LI>player access control is disabled upon a configuration error in (re)loading access.xml
</UL>
<br>
<LI>new <b>/cpsspec</b> command (TMF-only) to relay the checkpoints panel of the player you're spectating to your own screen:
<UL>
<LI>this feature may have some performance impact on busy servers, so it's your choice to enable it via new config.xml setting <b><CODE>&lt;enable_cpsspec&gt;</CODE></b> (default: False)
<LI>the <i>/cpsspec</i> command toggles tracking the checkpoints of a spectated player
<LI>if tracking is enabled and you're spectating another player in Follow or Replay camera mode, the checkpoints panel of that player is also shown on your screen, but only if the spectated player has enabled checkpoints tracking him/herself
<LI>the <i>/cpsspec</i> status is intentionally not saved among a player's personal settings, so it is off upon reconnects
</UL>
<br>
<LI>updates for the music server plugin (TMF-only):
<UL>
<LI>the song list can now be automatically shuffled at start-up and upon the <i>/music reload</i> command (configurable via new musicserver.xml setting <b><CODE>&lt;auto_shuffle&gt;</CODE></b>)
<LI>new <b>/music autoshuffle</b> command to change the automatic shuffle setting; the <i>/music settings</i> output also includes the AutoShuffle value
</UL>
<LI>on TMF, released the player slot when changing a player into spectator in <i>/admin forcespec</i>, <i>/afk</i> and action 1 (Set to Spectator) for a detected cheater
<LI>in Laps mode, each lap time is now stored in the 'rs_times' table (if <CODE>$feature_stats</CODE> in rasp.settings.php is true, of course)
<LI>UTF-8 encoding the welcome message, necessary on some systems to display accented characters correctly, can now be configured via new config.xml setting <b><CODE>&lt;welcome_utf8encode&gt;</CODE></b> (default: True)
<LI>on TMF when rank limiting by the full Jfreu plugin is in effect, the kick dialog echoes the explanatory chat message sent to a connecting player who is kicked due to a bad rank
<LI>on TMF when using the <i>/bootme</i> command, the kick dialog can optionally display a 'goodbye' message if new rasp.xml message <b><CODE>&lt;bootme_dialog&gt;</CODE></b> exists
<LI>in the XASECO start-up sequence the <i>onSync event</i> is now issued before the <i>onPlayerConnect events</i> for all current players so that plugins are initialized in a more logical order
<LI>during XASECO start-up global voting explanations (<CODE>$global_explain = 2</CODE> in votes.config.xml) are temporarily inhibited to prevent a message flood on busy servers
<LI>updated the stripColors function to strip out incomplete color codes before the end of the string, and add an option so that log output doesn't show '$$' for '$'
<LI>in the local database the 'Name' column in table 'challenges' and the 'NickName' column in table 'players' have been increased to 100 characters &ndash; for new XASECO installations the updated columns are defined in the localdb/aseco.sql file as usual, and for existing installs they will be modified automatically the first time this release is run
<LI>minor improvements in the <i>GBXChallengeFetcher</i>, <i>GBXReplayFetcher</i> and <i>ReplayParser classes</i>
<LI>this release <u>requires</u> the latest server <b>build 2009-05-25</b>
</UL>
<H3>Bug fixes in the v1.09 release of XASECO:</H3>
<UL>
<LI>some players with numeric logins still confuse the player ID mechanism &ndash; now really fixed
<LI>in Laps mode, improved laps aren't always checked for new Dedimania records &ndash; fixed
<LI>the global voting explanation upon a player join doesn't appear in the TMF message window when <CODE>$vote_in_window = true</CODE> &ndash; fixed
<LI>on some OSes a repetitive but harmless warning about "Invalid CRT parameters" in GbxRemote can occur &ndash; fixed
</UL>
<HR>
<H3>New features and other changes in the v1.08 release of XASECO:</H3>
<UL>
<LI>improved checkpoints & finish processing, anti-cheat testing and Dedimania records handling (if plugin.checkpoints.php is enabled in plugins.xml)
<LI>on TMF, local and Dedimania records that, for any reason, don't have the correct number of checkpoints are ignored with a logged warning (if plugin.checkpoints.php is enabled)
<LI>on TMF, used the new TMF BeginChallenge and EndChallenge callbacks (instead of BeginRace and EndRace) to trigger the <i>onNewChallenge</i> and <i>onEndRace events</i>, respectively
<LI>on TMF, the <i>onNewChallenge</i> and <i>onEndRace events</i> are no longer issued when restarting a track; this prevents, for example, losing the next track from the jukebox and the needless repetition of all messages sent at the start and end of a track &ndash; instead a new <b>onRestartChallenge event</b> is issued
<LI>added the <b>onPlayerIncoherence</b>, <b>onTunnelDataReceived</b> and <b>onManualFlowControlTransition events</b> for handling the existing TMF PlayerIncoherence, TunnelDataReceived and ManualFlowControlTransition callbacks, respectively
<LI>checkpoints in Dedimania records are now sent as a comma-separated string to the central Dedimania system in order to reduce data traffic
<LI>on TMF, a new <b><CODE>$specPlayFirst</CODE></b> configuration variable (default: false) in mistral.idlekick.php can be used to first set an idle player into spectator mode (free camera) instead of kicking him/her right away
<LI>removed the 1 second delay to set free camera mode in <i>/admin forcespec</i>, <i>/afk</i> and action 1 (Set to Spectator) for a detected cheater
<LI>challenge names with embedded newlines no longer cause malformed messages and such (due to use of a new <b>stripNewlines function</b>)
<LI>a new <b>stripSizes function</b> that strips only the size-related tags ($n, $w and $o) from strings, is available as alternative to stripColors
<LI>added the new <b>ReplayParser class</b> for future use with the Dedimania system
<LI>updated the GbxRemote modules to the latest versions from Nadeo
<LI>minor code tweaks in many parts of the system
<LI>this release <u>requires</u> the latest server <b>build 2009-05-04</b>
</UL>
<H3>Bug fixes in the v1.08 release of XASECO:</H3>
<UL>
<LI>an ampersand character (&amp;) in any .xml file crashes the XML parser &ndash; fixed this long-standing issue (thanks Assembler Maniac)
<LI>non-ASCII characters in the &lt;welcome&gt; message in config.xml cause the entire message not to be displayed &ndash; fixed (thanks dragu)
<LI>using <i>/style #</i> stores the number instead of the style name in the database as the player's preference &ndash; fixed (thanks nouseforname)
<LI>players with numeric logins confuse the player ID mechanism &ndash; fixed (thanks n4p1)
</UL>
<HR>
<H3>New features and other changes in the v1.06 release of XASECO:</H3>
<UL>
<LI>new support for <b>local checkpoints storage</b>:
<UL>
<LI>a new 'Checkpoints' column has been added to the local database tables 'records' and 'rs_times', and checkpoints data will be stored for all newly driven records and finish times
<LI>for new XASECO installations the new columns are defined in the localdb/aseco.sql and rasp.sql files as usual, and for existing installs they will be added automatically the first time this release is run
<LI>the <a href="scripts/repairrecs.zip">Repair records script</a> has been updated to handle the extra columns
</UL>
<LI>functionality of the <i>/cps</i> command is changed analogous to <i>/dedicps</i>:
<UL>
<LI>checkpoint references are stored for all players (according to their individual preferences) <u>only</u> at the start of a track, not when entering the <i>/cps</i> command or when the player (re)connects
<LI>with no parameter (<i>/cps</i>) the player's own local record on each track is selected or, if none is set, the last record on the pertaining track
<LI><i>/cps {1-maxrecs}</i> selects local record 1-maxrecs on each track or, if unavailable, again the last record
<LI><i>/cps off</i> disables checkpoints tracking altogether
<LI>if the checkpoints for the chosen local record are invalid (empty, or the last checkpoint doesn't match the finish time) then no record is used as initial reference during that track for the pertaining player(s)
<LI>checkpoint differences to the chosen reference are now shown from the first run through the track, rather than the second
<LI>if <i>/dedicps</i> is not set to <i>off</i>, local record tracking is superseded by Dedimania record tracking as per that setting
<LI>the default setting for <CODE>&lt;auto_enable_dedicps&gt;</CODE> in config.xml is now False
<LI>as usual, once a player gains a better finish time than the chosen reference, the checkpoints panel (TMF) or pop-up (TMN) will use those corresponding checkpoints for further updates during the current track
<LI>explanations why the TMF checkpoints panel doesn't appear immediately when <i>/cps</i> is activated (Stunts mode, spectating, and warm-up phase) are no longer shown
</UL>
<br>
<LI>new support for <b>storing donations and personal settings</b>:
<UL>
<LI>a new 'players_extra' table has been added to the local database to store donation totals (on TMUF servers) and setting preferences for each player
<LI>stored settings are: the <i>/cps</i> and <i>/dedicps</i> values, and on TMF also the <i>/style</i>, <i>/admin panel</i>, <i>/donpanel</i>, <i>/recpanel</i> and <i>/votepanel</i> values
<LI>for new XASECO installations the new table is defined in the localdb/extra.sql file, and for existing installs it will be added automatically the first time this release is run
<LI>when a new player first connects, an entry with the server's default values is created in this table, but changed settings are subsequently stored and reloaded each time the player revisits
<LI>the 'donations' column is updated every time a player donates coppers to the server
<LI>on TMUF servers, the <i>/stats</i> output now includes the player's donation total
<LI>new <b>/topdons</b> command to display the top-100 of players that donated the most coppers
</UL>
<br>
<LI>new support for <b>player stats panels during the scoreboard</b> on TMF:
<UL>
<LI>on TMF, this feature is configured via new config.xml setting <b><CODE>&lt;sb_stats_panels&gt;</CODE></b> (default: False)
<LI>enabling the player stats panels during the scoreboard automatically disables the rank chat messages shown at the same time
<LI>the panel is displayed in the lower-left corner of the scoreboard screen, and is defined by the panels/StatsNations.xml (for TMNF servers) and StatsUnited.xml (for TMUF) templates
<LI>the panel contains each player's server rank, record average, records total, wins total, session play time, and donation total (on TMUF servers)
<LI>computing the record totals can be a bit time consuming depending on the number of challenges, players and records in the database, so displaying all scoreboard panels may be slightly delayed
</UL>
<br>
<LI>when a player leaves, the chat message (if either Jfreu plugin is enabled) and the log message now include the amount of time played in that session
<LI>during XASECO start-up, player join messages are temporarily inhibited to prevent a message flood on busy servers
<LI>on TMF, the <i>/server</i> and <i>/admin server</i> output now include the server's ladder points limits
<LI>on TMUF, donate panels are temporarily disabled during the scoreboard at the end of a track, as they aren't immediately responsive anyway
<LI>on TMF in Rounds mode, Dedimania records on lap tracks are now ignored if RoundForcedLaps is not set to the default value 0
<LI>on TMF in Cup mode, commands that restart the current track or switch to the next or previous one now preserve the current match scores
<LI>new <b>/n1</b> command to send a Nice One message; also, the <i>/gr</i> message no longer includes the word 'All' by default
<LI>added the <b>onEcho event</b> for handling the TMF Echo callback
</UL>
<H3>Bug fixes in the v1.06 release of XASECO:</H3>
<UL>
<LI>using <i>/dedicps</i> to track checkpoints of existing Dedimania records results in new/improved/secured records not registering in some situations &ndash; fixed
<LI>when a player joins during a Laps mode race and completes a lap, an invalid record is registered &ndash; fixed (thanks princemichi)
<LI>in Laps mode the finish times of complete races are stored in the 'rs_times' table &ndash; fixed, no times are stored in Laps mode
<LI>if &lt;display&gt; in localdatabase.xml is False, other records related commands and features don't work either &ndash; fixed
<LI>when using a local path for the music server, and with some http servers, the .OGG comments aren't read from the song files &ndash; fixed (thanks HaveDerf_TMu)
</UL>
<HR>
<H3>New features and other changes in the v1.05b release of XASECO:</H3>
<UL>
<LI>updated the Dedimania system to randomly choose between the existing :8006, :8007, :8011, :8012 and :8013 and <b>new :8016 through :8021</b> communication ports (remember to open those ports on your firewall/router as well) in order to distribute the load across more Dedimania servers
<LI>the number of lines in the TMF system message window can now be easily modified with the <b>$winlen</b> variable at the start of plugin.msglog.php
<LI>refined UTF-8 string validation function (thanks Slig)
</UL>
<H3>Bug fixes in the v1.05b release of XASECO:</H3>
<UL>
<LI>Dedimania records aren't reliably registered due to the new anti-cheat tests &ndash; fixed
<LI>Dedimania records on tracks that don't have the full &lt;max_recs&gt; entries aren't registered unless they're better than the existing last record &ndash; fixed (thanks lille79)
<LI>in case of Dedimania connection problems persisting across track changes, records data from the previous track is still used on the next one &ndash; fixed (thanks schmidi)
<LI>restarting a track causes no further Dedimania records to be registered on that track &ndash; fixed
<LI>restarting XASECO triggers the anti-cheat tests for the ongoing race &ndash; fixed, the tests now get enabled after the end of the current track
<LI>with the music server configured for local files, <i>/music current</i> and <i>/music settings</i> don't show the song's info &ndash; fixed
<LI>on Windows, the <i>/music stripdirs</i> option doesn't work correctly on local files &ndash; fixed
</UL>
<HR>
<H3>New features and other changes in the v1.05 release of XASECO:</H3>
<UL>
<LI>new <b>checkpoint sanity checks</b> to prevent cheated records (if plugin.checkpoints.php is enabled in plugins.xml):
<UL>
<LI>all checkpoint times must be larger than zero
<LI>each checkpoint time within a player's run must be larger than the preceding one
<LI>all checkpoint indexes must be zero or larger
<LI>each checkpoint index within a player's run must be 1 larger than the preceding one
<LI>the last checkpoint time must be equal to the finish time
<LI>when any of these requirements isn't met, one of the following actions is taken on the pertaining player, configurable via new config.xml setting <b><CODE>&lt;cheater_action&gt;</CODE></b> (default: 0):<br>
0: Ignore; 1: Set to Spectator (only on TMF, falls back to 0 on TMN); 2: Kick; 3: Ban (implies Kick); 4: BlackList & Kick; 5: Blacklist & Ban
<LI>new/updated local and Dedimania records that fail one or more of the aforementioned checks are not stored (even if the above action is 0)
</UL>
<LI>new <b>Dedimania sanity checks</b>:
<UL>
<LI>keeping any of the three &lt;masterserver_account&gt; fields in dedimania.xml at a default or empty value results in a fatal error
<LI>records are no longer processed if they are less than 6 seconds
<LI>records are no longer processed for tracks with an author time of less than 8 seconds
</UL>
<LI>updates for the music server plugin (TMF-only):
<UL>
<LI>song files can now be stored locally on the TM server in a path under its GameData/ directory, e.g. Music/, without the need for a remote http server
<LI>if &lt;auto_nextsong&gt; is disabled a jukeboxed song will no longer be repeated on all subsequent tracks until another song is jukeboxed
</UL>
<LI>a new config.xml setting <b><CODE>&lt;display_checkpoints&gt;</CODE></b> (default: True) can be set to False to permanently disable checkpoint pop-ups (TMN) or panels (TMF) for all players while still tracking the checkpoints data internally &ndash; this allows you to keep plugin.checkpoints.php enabled for anti-cheat checks and the Dedimania system when high player counts cause performance/crash problems
<LI>a global congratulations message can be displayed instead of the regular personal one at a player's win of a track, if that win count reaches a multiple configured via new config.xml setting <b><CODE>&lt;global_win_multiple&gt;</CODE></b> (default: 50)
<LI>if plugin.rpoints.php is enabled on TMF, it's now possible to initialize the TM server with a default Rounds points system at start-up via new config.xml setting <b><CODE>&lt;default_rpoints&gt;</CODE></b> &ndash; the value can be a custom system with specified values (X,Y,...,Z) or a common system by name (f1gp, motogp, etc), just like the parameters to the <i>/admin rpoints</i> command; if empty, the standard points system is initialized
<LI>on TMF, automatically setting a player that uses the <i>/afk</i> command into free spectator mode can now be configured via new config.xml setting <b><CODE>&lt;afk_force_spec&gt;</CODE></b> (default: True)
<LI>automatically adding the current IP address for newly added admins and operators can now be configured via new config.xml setting <b><CODE>&lt;auto_admin_addip&gt;</CODE></b> (default: True)
<LI>new <b>/admin autotime</b> command to enable or disable the Auto TimeLimit feature dynamically (assuming plugin.autotime.php is enabled in plugins.xml)
<LI>when restarting a track via a <i>/ladder</i> vote (with votes.config.php setting <CODE>$ladder_fast_restart = true</CODE>) or <i>/admin restartmap</i>, the Auto TimeLimit is no longer set to next track's value
<LI>successful <i>/donate</i> and <i>/admin pay</i> copper transfers are now logged
<LI>when adminops.xml is written out without any admin or operator entries, bannedips.xml without IPs, jfreu.bans.xml without temporary bans, or jfreu.vips.xml without VIP logins or teams, then a comment block to show the entry syntax is included instead
<LI>if the GD/JPEG libraries are installed in PHP, the <i>GBXChallengeFetcher class</i> now flips the upside-down thumbnail image in a challenge into its upright format
<LI>a message is logged when plugins.xml is being loaded at start-up
<LI>this release requires the latest server <b>build 2008-12-05</b>
</UL>
<H3>Bug fixes in the v1.05 release of XASECO:</H3>
<UL>
<LI><i>/players &lt;string&gt;</i> displays an erroneous window if the search string matches no players &ndash; fixed, a warning message is shown
<LI>on TMF if plugin.panels.php is not enabled, TMX <i>/add</i> and chat-based votes result in crashes &ndash; fixed
<LI>on TMN, running <i>/admin helpall</i> as an Admin (not MasterAdmin or Operator) locks up the client after the second page &ndash; fixed (thanks B.A.S.S.)
<LI>a time-out on the version server at the up-to-date check gives an incorrect message &ndash; fixed
<LI>some PHP constructs still cause silent notices during strict run-time checks &ndash; fixed more of them
<LI>debug logging in the Dedimania system doesn't consistently use CRLF on Windows &ndash; fixed
</UL>
<HR>
<H3>New features and other changes in the v1.04 release of XASECO:</H3>
<UL>
<LI>new support for <b>custom Rounds points</b> on TMF with the following features:
<UL>
<LI>custom points in Rounds mode become available when plugin.rpoints.php is enabled (uncommented) in plugins.xml
<LI>new <b>/admin rpoints</b> command to list and set common points systems, as well as custom distributions, with the following options:
<UL>
<LI><b>help</b>: Displays help information
<LI><b>list</b>: Displays available points systems
<LI><b>show</b>: Shows current points system
<LI><b>&lt;xxx&gt;</b>: Sets points system labelled &lt;xxx&gt;
<LI><b>X,Y,...,Z</b>: Sets custom points system with specified values; X,Y,...,Z must be decreasing integers and there must be at least two values with no spaces
<LI><b>off</b>: Disables custom points system
</UL>
<LI>the following common points systems are included:
<UL>
<LI><b>f1gp</b>: Formula 1 GP &ndash; 10,8,6,5,4,3,2,1,...
<LI><b>motogp</b>: MotoGP &ndash; 25,20,16,13,11,10,9,8,7,6,5,4,3,2,1,...
<LI><b>motogp5</b>: MotoGP + 5 points &ndash; 30,25,21,18,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,...
<LI><b>fet1</b>: Formula ET Season 1 &ndash; 12,10,9,8,7,6,5,4,4,3,3,3,2,2,2,1,...
<LI><b>fet2</b>: Formula ET Season 2 &ndash; 15,12,11,10,9,8,7,6,6,5,5,4,4,3,3,3,2,2,2,1,...
<LI><b>fet3</b>: Formula ET Season 3 &ndash; 15,12,11,10,9,8,7,6,6,5,5,4,4,3,3,3,2,2,2,2,1,...
<LI><b>champcar</b>: Champ Car World Series &ndash; 31,27,25,23,21,19,17,15,13,11,10,9,8,7,6,5,4,3,2,1,...
<LI><b>simple5</b>: Simple 5 &ndash; 5,4,3,2,1,...
<LI><b>simple10</b>: Simple 10 &ndash; 10,9,8,7,6,5,4,3,2,1,...
</UL>
<LI>note that any players finishing beyond the last points entry get the same number of points (typically 1) as that last entry
<LI>new <b>/rpoints</b> command to show the current points system
<LI>additional points systems can be added to <CODE>$rounds_points</CODE> at the start of the plugin
</UL>
<br>
<LI>an updated and optimized <b>Auto TimeLimit</b> plugin (plugin.autotime.php) by cyrus is now part of the standard distribution:
<UL>
<LI>this plugin works only in TimeAttack mode, and defines the timelimit for each track dynamically based on the track's author time
<LI>the new <b>autotime.xml</b> file contains the plugin's settings to determine the new timelimit (multiplication factor, minimum, maximum and default); this file is loaded only once at start-up, rather than at every track switch
<LI>as before, a <b>multiplicator</b> of zero will disable the plugin
<LI>the new <b>display</b> setting controls whether to show a timelimit message in the TMF system message window, the chat window, or not at all; a similar message is always logged
<LI>the type of timelimit (new, min, max, default) is included in these messages
<LI>the timelimit is rounded down to seconds in the chat and log messages
<LI>when there are no active players, the default timelimit is applied because of the way the TM server instantly switches tracks with no opportunity to set a custom limit
</UL>
<LI>updates for the music server plugin (TMF-only):
<UL>
<LI>the song filename extensions can now be excluded in any command that shows songs (configurable via new musicserver.xml setting <b><CODE>&lt;strip_exts&gt;</CODE></b>)
<LI>new <b>/music stripexts</b> command to change the strip extensions setting; the <i>/music settings</i> output also includes the StripExts value
<LI>new <b>/music sort</b> command to sort the song list alphabetically by song paths
<LI>the cache file for .OGG comments can be defined as read-only (configurable via new musicserver.xml setting <b><CODE>&lt;cache_readonly&gt;</CODE></b>)
</UL>
<LI>in the &lt;ipaddress&gt; fields in config.xml and adminops.xml, it is now possible: to specify class B (e.g. 12.34.*.*) and class C (e.g. 12.34.56.*) wildcards to allow for partial IP checks on admins with dynamics IPs; and to specify multiple comma-separated IPs and/or wildcards (e.g. 12.34.56.78,98.76.54.*)
<LI>note to plugin authors: while the isMasterAdmin, isAdmin, isOperator and isAnyAdmin functions require a player object and check the IP address, new isMasterAdminL, isAdminL, isOperatorL and isAnyAdminL functions are now available that accept a login string (like before v1.03) and don't check the IP address
<LI>significantly optimized calculation of all players' server ranks after each track
<LI>if the Nation field in the player join/leave messages is 15 or more characters, it's abbreviated to the 3-letter country code
<LI>changed the ManiaLink processing to (hopefully) reduce the risk of crashing at high player counts
<LI>a new <b><CODE>&lt;logina&gt;</CODE></b> color is defined in config.xml and used for the admin titles in player join and other relevant messages, as well as admin logins in the <i>/players</i>, <i>/admin players</i> and <i>/jfreu players</i> output
<LI>setting empty player, spectator and referee passwords produces the appropriate log and chat messages about disabling them
<LI>the <i>/admin setrefmode</i> command without parameter now shows the current Referee mode
<LI>the <i>/admin forceshowall</i> command has been renamed to <b>/admin forceshowopp</b> and its 'on' option to 'all'; further, the command now accepts a number (>= 2) to force showing that minimum number of opponents
<LI>the <i>/admin shutdown</i> command will now shut down only XASECO (in order to permit restarts via the external start-up script), while the new <b>/admin shutdownall</b> command terminates both XASECO <u>and</u> the TM server
<LI>the output of <i>/admin players</i> is limited to at most 5000 entries, and the memory limit for the XASECO PHP process is increased to 50 MB, in order to further reduce the chances of memory overruns
<LI>if the <A TARGET="_blank" HREF="http://www.xdebug.org/">Xdebug extension</A> for PHP is installed, a fatal error will automatically log a stack trace
<LI>the <i>/music</i>, <i>/admin</i> and <i>/jfreu</i> commands are now able to handle multiple spaces between their parameters
</UL>
<H3>Bug fixes in the v1.04 release of XASECO:</H3>
<UL>
<LI>players that instantly reconnect can have their win counts cleared &ndash; fixed
<LI><i>/admin removeadmin</i> and <i>/admin removeop</i> don't work when the &lt;ipaddress&gt; field for the pertaining login is set &ndash; fixed
<LI>the <i>/jfreu infomessages</i> command is still boolean &ndash; updated the command to recognize the 2/1/0 values of the underlying <CODE>$infomessages</CODE> variable
<LI>the Auto TimeLimit plugin doesn't work correctly when all connected players are spectating &ndash; fixed
<LI>the Auto TimeLimit plugin doesn't work properly on servers with more than 500 tracks &ndash; fixed
<LI>when a player doesn't have a Dedimania record but his/her local personal best is better than the last Dedimania record, <i>/dedinext</i> computes the wrong difference &ndash; fixed
<LI><i>/admin setrefmode {0/1}</i> doesn't work correctly &ndash; fixed
<LI><i>/admin forceteam</i>, <i>/admin forcespec</i> and <i>/admin specfree</i> are allowed on offline logins &ndash; fixed
<LI><i>/admin forcespec</i> doesn't always set the spectator into free camera &ndash; fixed
<LI>in the music server plugin, messages referring to songs without .OGG comments are not formatted correctly &ndash; fixed
<LI>on TMF, a newly connected player's ladder rank in the internal players list can be temporarily erased until he/she becomes official &ndash; fixed
<LI>numerous PHP constructs cause silent notices during strict run-time checks &ndash; fixed most of them
</UL>
<HR>
<H2><A HREF="Features_103.html">Older release notes</A></H2>
<HR>
<ADDRESS>
Copyright &copy; 2007-2013 &ndash; Frans P. de Vries <A HREF="mailto:tm&#64;&#103;&#97;&#109;&#101;&#114;&#115;&#46;&#111;&#114;&#103;">&lt;tm&#64;&#103;&#97;&#109;&#101;&#114;&#115;&#46;&#111;&#114;&#103;&gt;</A>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
Last updated 26-Jul-2013
</ADDRESS>
</BODY>
</HTML>

View File

@ -1,149 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>TrackMania Forever callbacks</title>
</head>
<body>
<h1>Available callbacks:</h1>
<ul>
<li>
TrackMania.<b>PlayerConnect</b>(string Login, bool IsSpectator);
</li>
<li>
TrackMania.<b>PlayerDisconnect</b>(string Login);
</li>
<li>
TrackMania.<b>PlayerChat</b>(int PlayerUid, string Login, string Text, bool IsRegistredCmd);
</li>
<li>
TrackMania.<b>PlayerManialinkPageAnswer</b>(int PlayerUid, string Login, int Answer);<br/>
<i>difference with previous TM: this is not called if the player doesn't answer, and thus '0' is also a valid answer.</i>
</li>
<li>
TrackMania.<b>Echo</b>(string Internal, string Public);
</li>
<li>
TrackMania.<b>ServerStart</b>();
</li>
<li>
TrackMania.<b>ServerStop</b>();
</li>
<li>
TrackMania.<b>BeginRace</b>(SChallengeInfo Challenge);
<pre>
struct SChallengeInfo
{
string Uid;
string Name;
string FileName;
string Author;
string Environnement;
string Mood;
int BronzeTime;
int SilverTime;
int GoldTime;
int AuthorTime;
int CopperPrice;
bool LapRace;
int NbLaps;
int NbCheckpoints;
}</pre>
</li>
<li>
TrackMania.<b>EndRace</b>(SPlayerRanking Rankings[], SChallengeInfo Challenge);
<pre>
struct SPlayerRanking {
string Login;
string NickName;
int PlayerId;
int Rank;
int BestTime;
int[] BestCheckpoints;
int Score;
int NbrLapsFinished;
double LadderScore;
}
</pre>
</li>
<li>
TrackMania.<b>BeginChallenge</b>(SChallengeInfo Challenge, bool WarmUp, bool MatchContinuation);
</li>
<li>
TrackMania.<b>EndChallenge</b>(SPlayerRanking Rankings[], SChallengeInfo Challenge, bool WasWarmUp, bool MatchContinuesOnNextChallenge, bool RestartChallenge);
</li>
<li>
TrackMania.<b>BeginRound</b>();
</li>
<li>
TrackMania.<b>EndRound</b>();
</li>
<li>
TrackMania.<b>StatusChanged</b>(int StatusCode, string StatusName);
</li>
<li>
TrackMania.<b>PlayerCheckpoint</b>(int PlayerUid, string Login, int TimeOrScore, int CurLap, int CheckpointIndex);
</li>
<li>
TrackMania.<b>PlayerFinish</b>(int PlayerUid, string Login, int TimeOrScore);
</li>
<li>
TrackMania.<b>PlayerIncoherence</b>(int PlayerUid, string Login);
</li>
<li>
TrackMania.<b>BillUpdated</b>(int BillId, int State, string StateName, int TransactionId);
</li>
<li>
TrackMania.<b>TunnelDataReceived</b>(int PlayerUid, string Login, base64 Data);
</li>
<li>
TrackMania.<b>ChallengeListModified</b>(int CurChallengeIndex, int NextChallengeIndex, bool IsListModified);
</li>
<li>
TrackMania.<b>PlayerInfoChanged</b>(SPlayerInfo PlayerInfo);
<pre>
struct SPlayerInfo {
string Login;
string NickName;
int PlayerId;
int TeamId;
int SpectatorStatus;
int LadderRanking;
int Flags;
}
</pre>
</li>
<li>
TrackMania.<b>ManualFlowControlTransition</b>(string Transition);
</li>
<li>
TrackMania.<b>VoteUpdated</b>(string StateName, string Login, string CmdName, string CmdParam);<br/>
<i>StateName values: NewVote, VoteCancelled, VotePassed or VoteFailed</i>
</li>
</ul>
</body>
</html>

View File

@ -1,88 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>TrackMania Nations callbacks</title>
</head>
<body>
<h1>Available callbacks:</h1>
<ul>
<li>
TrackMania.<b>PlayerConnect</b>(string Login, bool IsSpectator);
</li>
<li>
TrackMania.<b>PlayerDisconnect</b>(string Login);
</li>
<li>
TrackMania.<b>PlayerChat</b>(int PlayerUid, string Login, string Text, bool IsRegistredCmd);
</li>
<li>
TrackMania.<b>PlayerServerMessageAnswer</b>(int PlayerUid, string Login, int Answer);<br/>
<i>Answer: 0 -&gt; no answer (timeout...), 1 or 2 -&gt; answer from the player</i>
</li>
<li>
TrackMania.<b>ServerStart</b>();
</li>
<li>
TrackMania.<b>ServerStop</b>();
</li>
<li>
TrackMania.<b>BeginRace</b>(SChallengeInfo Challenge);<br/>
<pre>
struct SChallengeInfo
{
string Name;
string FileName;
string Author;
string Environnement;
string Mood;
int BronzeTime;
int SilverTime;
int GoldTime;
int AuthorTime;
int CopperPrice;
bool LapRace;
}</pre>
</li>
<li>
TrackMania.<b>EndRace</b>(SPlayerRanking Rankings[], SChallengeInfo Challenge);
<pre>
struct SPlayerRanking {
string Login;
string NickName;
int PlayerId;
int Rank;
int BestTime;
int[] BestCheckpoints;
int Score;
int NbrLapsFinished;
double LadderScore;
}
</pre>
</li>
<li>
TrackMania.<b>BeginRound</b>();
</li>
<li>
TrackMania.<b>StatusChanged</b>(int StatusCode, string StatusName);
</li>
<li>TrackMania.<b>PlayerCheckpoint</b>(int PlayerUid, string Login, int Time, int Score, int CheckpointIndex);
</li>
<li>TrackMania.<b>PlayerFinish</b>(int PlayerUid, string Login, int TimeOrScore);
</li>
</ul>
</body>
</html>

View File

@ -1,189 +0,0 @@
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Dedimania Server Help Page</title>
</head>
<body>
<h1><center>Dedimania Server Help Page</center></h1>
<h2>Site & Statistics:</h2>
<ul>
<li><a href="http://dedimania.com/">Dedimania Site</a>
<li><a href="http://dedimania.net/tmstats/">Statistics</a>
</ul>
<h2>Usage:</h2>
<dt><u><b>Where to send queries ?</b></u>
<ul>
<li>The initial script query should be done on the main url http://dedimania.net/RPC4/server.php, because if the account was not authenticated successfully then on http://dedimania.net:80xx/ ones it could make timeouts, slowing the other scripts/clients requests responses.
<br/><br/>
<li>Next script queries (once successfully authenticated!) should be made on the http://dedimania.net:80xx/ urls, because these ones use far less server resources than the main one. You have to contact me at <a href="http://www.tm-forum.com/ucp.php?i=pm&mode=compose&u=487">Slig</a> or on the <a href="http://dedimania.com/SITE/forum/viewforum.php?id=17">Dedimania forum for scripts devs</a>, to both tell me that you are going to use Dedimania for your script, and to know what url you should use.
</ul>
Note that later the main url will reply only to dedimania.CheckConnection, dedimania.GetVersion, dedimania.Authenticate and dedimania.ValidateAccount methods !
<br/><br/>
</dl>
<dt><u><b>How to send a query ?</b></u>
<ul>
<li>The query is a standard <b>http text/xml call, with the xml message as the http body</b>. This form is the standard xmlrpc calling form, and the reply will have that form too. This method is the right xmlrpc one, and should be preferred !
<br/><br/>
<li>The query can also be a standard <b>http text/html call, with the attribute 'xmlrpc'</b>. This was added to permit easy requests using a standard html GET or POST query:
<ul>
<li>The value for the 'xmlrpc' attribute is just a xmlrpc text, urlsafe base64 encoded.
<li>The method can be either <u>GET or POST</u>.
<li>The reply is just plain xmlrpc.
</ul>
<br/>
A real (GET) call would look like this:
<pre>http://dedimania.net/RPC4/server.php?xmlrpc=&lt;urlsafe_base64_encoded_xmlrpc_text&gt;</pre>
In the case of a GET query, the xmlrpc value has to be base64 encoded, but be cautious: it has to use the url-safe base64 <a href="http://www.faqs.org/rfcs/rfc3548.html">RFC 3548</a> ('+' replaced by '-' and '/' replaced by '_'), and the URI size can be limited.
<br/><br/>
<li>In all cases, the query and the reply can be compressed (gzip or deflate), using the standard http headers. After test and debug the compression <u>should</u> be used !
<li>The client should try to support http keepalive (with long timeout, ie. 4 minutes or more): it will save some Dedimania server resources, and avoid to have connection timeouts on client side for each request !
<br/><br/>
</ul>
</dl>
<br/>
<dt><u><b>The form of xmlrpc queries and replies</b></u>
<ul>
<li>The xmlrpc query and result fully respect the <a href="http://www.xmlrpc.com/">xml-rpc specification</a>.
<li>It is better if client support cookies and keep-alive connections, avoiding to make a new connection for each request, which is better both for server and client. The server support long keep-alive (more than 5min), so the client really should support it too, to help reduce the server load ! In fact your script should support long http keep-alive and http compression !
</ul>
</dl>
<br/>
<dt><u><b>What kind of records does Dedimania support ?</b></u>
<ul>
<li>General: <b>the low limit for records is now 6s</b> : no records under that limit will be stored. <b>Scripts should not send records for challenges with author time under 8s</b> !
<li>Rounds: round final time. And for a multilap challenge only if the number of laps is the main number of laps of the map, and not a different number forced using RoundForcedLaps !
<li>Time attack: attempt final time.
<li>Laps: lap time (ie best lap time). Is merged with Time Attack records.
<li>Stunts: attempt final score (actually not supported).
<li>Cup: round final time. Is merged with Rounds records.
</ul>
</dl>
<br/>
<dt><u><b>What kind of records does Dedimania <u>not</u> support ?</b></u>
<ul>
<li>General: times under 6s are refused.
<li>Rounds: multilap challenge with the number of laps different than the main number of laps of the map (mainly using RoundForcedLaps) is not supported ! (eventually the script can send best lap as a Laps record)
<li>Laps: more than one lap is not supported.
<li>Stunts: actually not supported.
</ul>
</dl>
<br/>
<dt><u><b>Sending xmlrpc request methods</b></u>
<ul>
<li><b>It is mandatory to put the <u>dedimania.Authenticate</u> in your query before any other method which is indicated as 'Only if authenticated.'.</b> Because of this, you have to use system.multicall in most cases. Yes, it is needed in each request (well, it can be omitted in next requests if you client support http keepalive correctly and stay connected, but it is easier to send the Authenticate each time).<br/>
You should probably always use <u>dedimania.WarningsAndTTR</u> as last method in your queries, so you will get warnings and not definitive errors of the previous methods in the query.
<br/><br/>
<li>In <u>dedimania.Authenticate</u> you can send the community code of the server login, instead of the password. After the first successful authentication with Nadeo masters, an MD5 of the password is stored, to make further authentications faster. The password and/or community code are not stored in the Dedimania database.
<br/><br/>
<li>Mainly, the standard usage of requests methods for a script using Dedimania records is:
<br/><u>dedimania.CurrentChallenge</u> at beginning of map (to indicate the current map, players, and get current records),
<br/><u>dedimania.UpdateServerPlayers</u> every 4 minutes after the beginning of the map (to keep up to date server and players infos),
<br/><u>dedimania.ChallengeRaceTimes</u> at the end of map (sending all players best time -new records or not-, and get the new records list),
<br/><u>dedimania.PlayerArrive</u> when a player connects (can be skipped),
<br/><u>dedimania.PlayerLeave</u> when a player disconnects (not really needed, will only speedup to show the player offline on tmstats).
<br/><br/>
<li><u>dedimania.CheckConnection</u> and <u>dedimania.GetVersion</u> can be used to verify that your script requests are received correctly and understood by the Dedimania server, and that your script receives and understands the reply (most times only dedimania.Authenticate is used).
<br/><br/>
<li><u>dedimania.WarningsAndTTR</u> should be used as last method of the request, to get warnings/errors (and some other infos) about previous methods.
</ul>
</dl>
<br/>
<dt><u><b>Raw query/reply examples (without http compression of course)</b></u>
<ul>
<a href="http://dedimania.net/RPC4/dedimania_protocol.html">Dedimania protocol raw examples</a>
</ul>
</dl>
<br/>
<b><u>Note1:</u></b><br/>
If you make a client script support, please notify it to <a href="http://www.tm-forum.com/ucp.php?i=pm&mode=compose&u=487">Slig</a>. First because I may open a new url port for your script, because the port 80 url use more resources, also because you should not use url used by other without telling it, and finally because i want to know what scripts are using Dedimania resources and on what port(s).
<br/><br/>
<b><u>Note2:</u></b><br/>
The url http://dedimania.net/RPC4/server.php must <u>never</u> be used, except eventually for testing or rescue (for users who have a server which can't use 80xx ports). To know what url you have to use, see note 1 !
<br/><br/>
<b><u>Note3: MaxRank</u></b><br/>
The MaxRank work at several levels. Except special case where the player MaxRank is 0 because he is banned, a player
can always make a record on a server and challenge at the max rank determined by the max of ServerMaxRecords, his own MaxRank, and the MaxRank stored for his current record if he has one.
<br/>- ServerMaxRecords is the server MaxRank, any player connected and not banned can make a record at least up to this value.
<br/>- dedimania.PlayerArrive/MaxRank is the player MaxRank, the player can make a record up to this value also if ServerMaxRecords is smaller.
<br/>- records MaxRank is the max of current player record and his general MaxRank, the record remain valid if not above that value (or ServerMaxRecords value if bigger).
<br/><br/>
<h2>Available methods:</h2>
<li><b>dedimania.CheckConnection</b></li>boolean
<u>dedimania.CheckConnection</u>()<br>
<i><font color='#001355'>Just reply true.</font></i><br>
<br><li><b>dedimania.GetVersion</b></li>struct
<u>dedimania.GetVersion</u>()<br>
<i><font color='#001355'>Reply a struct {'Version': int, 'MaxRecords': int}.</font></i><br>
<br><li><b>dedimania.Authenticate</b></li>boolean
<u>dedimania.Authenticate</u>(struct)<br>
<i><font color='#001355'>Allow user authentication by specifying a struct {'Game': string, 'Login': string, 'Password': string, 'Tool': string, 'Version': string, [Optionals: 'Packmask': string, 'Nation': string, 'ServerIP': string, 'ServerPort': int, 'XmlrpcPort': int, 'PlayersGame': boolean]}. Game can be 'TMF', 'TMUF', 'TMNF', 'TMU', 'TMO', 'TMS' or 'TMN' (for TMUF/TMNF servers, please send TMF or TMUF or TMNF, and the Packmask !). Packmask should be the value returned by GetServerPackMask. Nation can be 3 letters nation or TMF Path. If PlayersGame is set to true then a few methods will return more infos, mainly the game associated to the player login in records, and the player max rank (see general notes). Note: in case of error it returns a string with the error description.</font></i><br>
<br><li><b>dedimania.ValidateAccount</b></li>struct
<u>dedimania.ValidateAccount</u>()<br>
<i><font color='#001355'>Reply a struct {'Status': boolean, 'Messages': array of struct {'Date': string, 'Text': string} }. Status is always true, else you get a not authenticated error.<br>
Only if authenticated.</font></i><br>
<br><li><b>dedimania.PlayerArrive</b></li>struct
<u>dedimania.PlayerArrive</u>(string, string, string, string, string, int, boolean, boolean)<br>
<i><font color='#001355'>Announce that a new player has arrived. Arguments are (Game, Login, Nickname, Nation, TeamName, LadderRanking, IsSpec, IsOff). Game can be 'TMF', 'TMUF', 'TMNF', 'TMU', 'TMO', 'TMS' or 'TMN'.<br>
Reply a struct {['Game': string,] 'Login': string, 'TeamName': string, 'Nation': string, ['MaxRank': int, 'Status': int,] 'Options': array of struct {'Option': string, 'Value': string, 'Tool': string}, 'Aliases': array of struct {'Alias': string, 'Text': string, 'Tool': string} }. Game, MaxRank and Status are added only if PlayersGame is set in authenticate, Status bit 0 is 1 if banned (is which case MaxRank is 0). Note that MaxRank is the real max rank for the player (see general notes).<br>
Only if authenticated.</font></i><br>
<br><li><b>dedimania.PlayerLeave</b></li>struct
<u>dedimania.PlayerLeave</u>(string, string)<br>
<i><font color='#001355'>Announce that a player has left. Arguments are (Game,Login). Game can be 'TMF', 'TMUF', 'TMNF', 'TMU', 'TMO', 'TMS' or 'TMN'.<br>
Reply a struct {'Login': string}.<br>
Only if authenticated.</font></i><br>
<br><li><b>dedimania.CurrentChallenge</b></li>struct
<u>dedimania.CurrentChallenge</u>(string, string, string, string, string, int, struct, int, array)<br>
<i><font color='#001355'>Set current challenge info and get records. Arguments are (Uid, Name, Environment, Author, Game, Mode, SrvInfo, MaxGetTimes, Players). Game is currently 'TMF', 'TMUF', 'TMNF', 'TMU', 'TMO', 'TMS' or 'TMN'. SrvInfo is a struct {'SrvName': string, 'Comment': string, 'Private': boolean, 'SrvIP': string, 'SrvPort': int, 'XmlrpcPort': int, 'NumPlayers': int, 'MaxPlayers': int, 'NumSpecs': int, 'MaxSpecs': int, 'LadderMode': int, 'NextFiveUID': string of next five uid separated with '/'}. Players is an array of struct {'Login': string, 'Nation': string, 'TeamName': string, 'TeamId': int, 'IsSpec': boolean, 'Ranking': int, 'IsOff': boolean}.<br>
Reply a struct {'Uid': string, 'TotalRaces': int, 'TotalPlayers': int, 'TimeAttackRaces': int, 'TimeAttackPlayers': int, 'NumberOfChecks': int, 'ServerMaxRecords': int, 'Records': array of struct {['Game': string,] 'Login': string, 'NickName': string, 'Best': int, 'Rank': int, ['MaxRank': int,] 'Checks': array of int, 'Vote': int} }, NumberOfChecks per lap is 0 if unknown, Checks are the bestchecks of the associated record, Vote is 0 to 100 value, or -1 if player did not vote for the map. Game and MaxRank are added only if PlayersGame is set in authenticate (see general notes).<br>
Only if authenticated.</font></i><br>
<br><li><b>dedimania.ChallengeRaceTimes</b></li>struct
<u>dedimania.ChallengeRaceTimes</u>(string, string, string, string, string, int, int, int, array)<br>
<i><font color='#001355'>Set current challenge info and players' best times, and get the updated records. Arguments are (Uid, Name, Environment, Author, Game, Mode, NumberOfChecks, MaxGetTimes, Times). Game is currently 'TMF', 'TMUF', 'TMNF', 'TMU', 'TMO', 'TMS' or 'TMN'. Times is a sorted (by 'Best') array of struct {'Login': string, 'Best': int, 'Checks': array of int}. Checks are BestCheckpoints array of the best time of player (can also be sent as a comma separated list of int in a string, which is far smaller in xmlrpc). In case of time equality the order in the Times array is used.<br>
Reply a struct {'Uid': string, 'TotalRaces': int, 'TotalPlayers': int, 'TimeAttackRaces': int, 'TimeAttackPlayers': int, 'NumberOfChecks': int, 'ServerMaxRecords': int, 'Records': array of struct {['Game': string,] 'Login': string, 'NickName': string, 'Best': int, 'Rank': int, ['MaxRank': int,] 'Checks': array of int, 'NewBest': boolean} }, NumberOfChecks per lap is 0 if unknown. Game and MaxRank are added only if PlayersGame is set in authenticate (see general notes).<br>
Only if authenticated.</font></i><br>
<br><li><b>dedimania.UpdateServerPlayers</b></li>boolean
<u>dedimania.UpdateServerPlayers</u>(string, int, struct, array)<br>
<i><font color='#001355'>Set current challenge and players info. Arguments are (Game, Mode, SrvInfo, Players). Game is currently 'TMF', 'TMUF', 'TMNF', 'TMU', 'TMO', 'TMS' or 'TMN'. SrvInfo is a struct {'SrvName': string, 'Comment': string, 'Private': boolean, 'SrvIP': string, 'SrvPort': int, 'XmlrpcPort': int, 'NumPlayers': int, 'MaxPlayers': int, 'NumSpecs': int, 'MaxSpecs': int, 'LadderMode': boolean, 'NextFiveUID': string of next five uid separated with '/'}. Players is an array of struct {'Login': string, 'Nation': string, 'TeamName': string, 'TeamId': int, 'IsSpec': boolean, 'Ranking': int, 'IsOff': boolean}.<br>
Reply true.<br>
Should be used every 4 minutes if no 'dedimania.CurrentChallenge' or 'dedimania.ChallengeRaceTimes' has been called, to keep the server and players 'On'.<br>
Only if authenticated.</font></i><br>
<br><li><b>dedimania.WarningsAndTTR</b></li>struct
<u>dedimania.WarningsAndTTR</u>()<br>
<i><font color='#001355'>Get warnings messages and TimeToRespond for all previous methods.<br>
Reply a struct {'globalTTR': int, 'methods': array of struct {'methodName': string, 'errors': string, 'TTR': int}}.</font></i><br>
<br><li><b>system.listMethods</b></li>array
<u>system.listMethods</u>()<br>
<i><font color='#001355'>This method lists all the methods that the XML-RPC server knows how to dispatch.</font></i><br>
<br><li><b>system.methodHelp</b></li>string
<u>system.methodHelp</u>(string)<br>
<i><font color='#001355'>Returns help text if defined for the method passed, otherwise returns an empty string.</font></i><br>
<br><li><b>system.methodSignature</b></li>array
<u>system.methodSignature</u>(string)<br>
<i><font color='#001355'>Returns an array of known signatures (an array of arrays) for the method name passed. If no signatures are known, returns a none-array (test for type != array to detect missing signature).</font></i><br>
<br><li><b>system.multicall</b></li>array
<u>system.multicall</u>(array)<br>
<i><font color='#001355'>Boxcar multiple RPC calls in one request. See http://www.xmlrpc.com/discuss/msgReader$1208 and raw examples for details. Each array entry is a struct {'methodCall':string, 'params':array}.</font></i><br>
<br>
</body>
</html>

View File

@ -1,717 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>TrackMania Forever methods</title>
</head>
<body>
<h1>Available methods:</h1>
<ul>
<li><b>system.listMethods</b><br/>
array system.listMethods()<br/>
<font color="0x113355">Return an array of all available XML-RPC methods on this server.</font></li>
<li><b>system.methodSignature</b><br/>
array system.methodSignature(string)<br/>
<font color="0x113355">Given the name of a method, return an array of legal signatures. Each signature is an array of strings. The first item of each signature is the return type, and any others items are parameter types.</font></li>
<li><b>system.methodHelp</b><br/>
string system.methodHelp(string)<br/>
<font color="0x113355">Given the name of a method, return a help string.</font></li>
<li><b>system.multicall</b><br/>
array system.multicall(array)<br/>
<font color="0x113355">Process an array of calls, and return an array of results. Calls should be structs of the form {'methodName': string, 'params': array}. Each result will either be a single-item array containing the result value, or a struct of the form {'faultCode': int, 'faultString': string}. This is useful when you need to make lots of small calls without lots of round trips.</font></li>
<li><b>Authenticate</b><br/>
boolean Authenticate(string, string)<br/>
<font color="0x113355">Allow user authentication by specifying a login and a password, to gain access to the set of functionalities corresponding to this authorization level.</font></li>
<li><b>ChangeAuthPassword</b><br/>
boolean ChangeAuthPassword(string, string)<br/>
<font color="0x113355">Change the password for the specified login/user. Only available to SuperAdmin.</font></li>
<li><b>EnableCallbacks</b><br/>
boolean EnableCallbacks(boolean)<br/>
<font color="0x113355">Allow the GameServer to call you back.</font></li>
<li><b>GetVersion</b><br/>
struct GetVersion()<br/>
<font color="0x113355">Returns a struct with the <i>Name</i>, <i>Version</i> and <i>Build</i> of the application remotely controled.</font></li>
<li><b>CallVote</b><br/>
boolean CallVote(string)<br/>
<font color="0x113355">Call a vote for a cmd. The command is a XML string corresponding to an XmlRpc request. Only available to Admin.</font></li>
<li><b>CallVoteEx</b><br/>
boolean CallVoteEx(string, double, int, int)<br/>
<font color="0x113355">Extended call vote. Same as CallVote, but you can additionally supply specific parameters for this vote: a ratio, a time out and who is voting. Special timeout values: a timeout of '0' means default, '1' means indefinite; a ratio of '-1' means default; Voters values: '0' means only active players, '1' means any player, '2' is for everybody, pure spectators included. Only available to Admin.</font></li>
<li><b>InternalCallVote</b><br/>
boolean InternalCallVote()<br/>
<font color="0x113355">Used internally by game.</font></li>
<li><b>CancelVote</b><br/>
boolean CancelVote()<br/>
<font color="0x113355">Cancel the current vote. Only available to Admin.</font></li>
<li><b>GetCurrentCallVote</b><br/>
struct GetCurrentCallVote()<br/>
<font color="0x113355">Returns the vote currently in progress. The returned structure is { CallerLogin, CmdName, CmdParam }.</font></li>
<li><b>SetCallVoteTimeOut</b><br/>
boolean SetCallVoteTimeOut(int)<br/>
<font color="0x113355">Set a new timeout for waiting for votes. A zero value disables callvote. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetCallVoteTimeOut</b><br/>
struct GetCallVoteTimeOut()<br/>
<font color="0x113355">Get the current and next timeout for waiting for votes. The struct returned contains two fields 'CurrentValue' and 'NextValue'.</font></li>
<li><b>SetCallVoteRatio</b><br/>
boolean SetCallVoteRatio(double)<br/>
<font color="0x113355">Set a new default ratio for passing a vote. Must lie between 0 and 1. Only available to Admin.</font></li>
<li><b>GetCallVoteRatio</b><br/>
double GetCallVoteRatio()<br/>
<font color="0x113355">Get the current default ratio for passing a vote. This value lies between 0 and 1.</font></li>
<li><b>SetCallVoteRatios</b><br/>
boolean SetCallVoteRatios(array)<br/>
<font color="0x113355">Set new ratios for passing specific votes. The parameter is an array of structs {string <i>Command</i>, double <i>Ratio</i>}, ratio is in [0,1] or -1 for vote disabled. Only available to Admin.</font></li>
<li><b>GetCallVoteRatios</b><br/>
array GetCallVoteRatios()<br/>
<font color="0x113355">Get the current ratios for passing votes.</font></li>
<li><b>ChatSendServerMessage</b><br/>
boolean ChatSendServerMessage(string)<br/>
<font color="0x113355">Send a text message to all clients without the server login. Only available to Admin.</font></li>
<li><b>ChatSendServerMessageToLanguage</b><br/>
boolean ChatSendServerMessageToLanguage(array, string)<br/>
<font color="0x113355">Send a localised text message to all clients without the server login, or optionally to a Login (which can be a single login or a list of comma-separated logins). The parameter is an array of structures {<i>Lang</i>='??', <i>Text</i>='...'}. If no matching language is found, the last text in the array is used. Only available to Admin.</font></li>
<li><b>ChatSendServerMessageToId</b><br/>
boolean ChatSendServerMessageToId(string, int)<br/>
<font color="0x113355">Send a text message without the server login to the client with the specified PlayerId. Only available to Admin.</font></li>
<li><b>ChatSendServerMessageToLogin</b><br/>
boolean ChatSendServerMessageToLogin(string, string)<br/>
<font color="0x113355">Send a text message without the server login to the client with the specified login. Login can be a single login or a list of comma-separated logins. Only available to Admin.</font></li>
<li><b>ChatSend</b><br/>
boolean ChatSend(string)<br/>
<font color="0x113355">Send a text message to all clients. Only available to Admin.</font></li>
<li><b>ChatSendToLanguage</b><br/>
boolean ChatSendToLanguage(array, string)<br/>
<font color="0x113355">Send a localised text message to all clients, or optionally to a Login (which can be a single login or a list of comma-separated logins). The parameter is an array of structures {<i>Lang</i>='??', <i>Text</i>='...'}. If no matching language is found, the last text in the array is used. Only available to Admin.</font></li>
<li><b>ChatSendToLogin</b><br/>
boolean ChatSendToLogin(string, string)<br/>
<font color="0x113355">Send a text message to the client with the specified login. Login can be a single login or a list of comma-separated logins. Only available to Admin.</font></li>
<li><b>ChatSendToId</b><br/>
boolean ChatSendToId(string, int)<br/>
<font color="0x113355">Send a text message to the client with the specified PlayerId. Only available to Admin.</font></li>
<li><b>GetChatLines</b><br/>
array GetChatLines()<br/>
<font color="0x113355">Returns the last chat lines. Maximum of 40 lines. Only available to Admin.</font></li>
<li><b>ChatEnableManualRouting</b><br/>
boolean ChatEnableManualRouting(boolean, boolean)<br/>
<font color="0x113355">The chat messages are no longer dispatched to the players, they only go to the rpc callback and the controller has to manually forward them. The second (optional) parameter allows all messages from the server to be automatically forwarded. Only available to Admin.</font></li>
<li><b>ChatForwardToLogin</b><br/>
boolean ChatForwardToLogin(string, string, string)<br/>
<font color="0x113355">(Text, SenderLogin, DestLogin) Send a text message to the specified DestLogin (or everybody if empty) on behalf of SenderLogin. DestLogin can be a single login or a list of comma-separated logins. Only available if manual routing is enabled. Only available to Admin.</font></li>
<li><b>SendNotice</b><br/>
boolean SendNotice(string, string, int)<br/>
<font color="0x113355">Display a notice on all clients. The parameters are the text message to display, and the login of the avatar to display next to it (or '' for no avatar), and an optional 'max duration' in seconds (default: 3). Only available to Admin.</font></li>
<li><b>SendNoticeToId</b><br/>
boolean SendNoticeToId(int, string, int, int)<br/>
<font color="0x113355">Display a notice on the client with the specified UId. The parameters are the Uid of the client to whom the notice is sent, the text message to display, and the UId of the avatar to display next to it (or '255' for no avatar), and an optional 'max duration' in seconds (default: 3). Only available to Admin.</font></li>
<li><b>SendNoticeToLogin</b><br/>
boolean SendNoticeToLogin(string, string, string, int)<br/>
<font color="0x113355">Display a notice on the client with the specified login. The parameters are the login of the client to whom the notice is sent, the text message to display, and the login of the avatar to display next to it (or '' for no avatar), and an optional 'max duration' in seconds (default: 3). Login can be a single login or a list of comma-separated logins. Only available to Admin.</font></li>
<li><b>SendDisplayManialinkPage</b><br/>
boolean SendDisplayManialinkPage(string, int, boolean)<br/>
<font color="0x113355">Display a manialink page on all clients. The parameters are the xml description of the page to display, a timeout to autohide it (0 = permanent), and a boolean to indicate whether the page must be hidden as soon as the user clicks on a page option. Only available to Admin.</font></li>
<li><b>SendDisplayManialinkPageToId</b><br/>
boolean SendDisplayManialinkPageToId(int, string, int, boolean)<br/>
<font color="0x113355">Display a manialink page on the client with the specified UId. The first parameter is the UId of the player, the other are identical to 'SendDisplayManialinkPage'. Only available to Admin.</font></li>
<li><b>SendDisplayManialinkPageToLogin</b><br/>
boolean SendDisplayManialinkPageToLogin(string, string, int, boolean)<br/>
<font color="0x113355">Display a manialink page on the client with the specified login. The first parameter is the login of the player, the other are identical to 'SendDisplayManialinkPage'. Login can be a single login or a list of comma-separated logins. Only available to Admin.</font></li>
<li><b>SendHideManialinkPage</b><br/>
boolean SendHideManialinkPage()<br/>
<font color="0x113355">Hide the displayed manialink page on all clients. Only available to Admin.</font></li>
<li><b>SendHideManialinkPageToId</b><br/>
boolean SendHideManialinkPageToId(int)<br/>
<font color="0x113355">Hide the displayed manialink page on the client with the specified UId. Only available to Admin.</font></li>
<li><b>SendHideManialinkPageToLogin</b><br/>
boolean SendHideManialinkPageToLogin(string)<br/>
<font color="0x113355">Hide the displayed manialink page on the client with the specified login. Login can be a single login or a list of comma-separated logins. Only available to Admin.</font></li>
<li><b>GetManialinkPageAnswers</b><br/>
array GetManialinkPageAnswers()<br/>
<font color="0x113355">Returns the latest results from the current manialink page, as an array of structs {string <i>Login</i>, int <i>PlayerId</i>, int <i>Result</i>} Result==0 -> no answer, Result>0.... -> answer from the player.</font></li>
<li><b>Kick</b><br/>
boolean Kick(string, string)<br/>
<font color="0x113355">Kick the player with the specified login, with an optional message. Only available to Admin.</font></li>
<li><b>KickId</b><br/>
boolean KickId(int, string)<br/>
<font color="0x113355">Kick the player with the specified PlayerId, with an optional message. Only available to Admin.</font></li>
<li><b>Ban</b><br/>
boolean Ban(string, string)<br/>
<font color="0x113355">Ban the player with the specified login, with an optional message. Only available to Admin.</font></li>
<li><b>BanAndBlackList</b><br/>
boolean BanAndBlackList(string, string, boolean)<br/>
<font color="0x113355">Ban the player with the specified login, with a message. Add it to the black list, and optionally save the new list. Only available to Admin.</font></li>
<li><b>BanId</b><br/>
boolean BanId(int, string)<br/>
<font color="0x113355">Ban the player with the specified PlayerId, with an optional message. Only available to Admin.</font></li>
<li><b>UnBan</b><br/>
boolean UnBan(string)<br/>
<font color="0x113355">Unban the player with the specified login. Only available to Admin.</font></li>
<li><b>CleanBanList</b><br/>
boolean CleanBanList()<br/>
<font color="0x113355">Clean the ban list of the server. Only available to Admin.</font></li>
<li><b>GetBanList</b><br/>
array GetBanList(int, int)<br/>
<font color="0x113355">Returns the list of banned players. This method takes two parameters. The first parameter specifies the maximum number of infos to be returned, and the second one the starting index in the list. The list is an array of structures. Each structure contains the following fields : <i>Login</i>, <i>ClientName</i> and <i>IPAddress</i>.</font></li>
<li><b>BlackList</b><br/>
boolean BlackList(string)<br/>
<font color="0x113355">Blacklist the player with the specified login. Only available to SuperAdmin.</font></li>
<li><b>BlackListId</b><br/>
boolean BlackListId(int)<br/>
<font color="0x113355">Blacklist the player with the specified PlayerId. Only available to SuperAdmin.</font></li>
<li><b>UnBlackList</b><br/>
boolean UnBlackList(string)<br/>
<font color="0x113355">UnBlackList the player with the specified login. Only available to SuperAdmin.</font></li>
<li><b>CleanBlackList</b><br/>
boolean CleanBlackList()<br/>
<font color="0x113355">Clean the blacklist of the server. Only available to SuperAdmin.</font></li>
<li><b>GetBlackList</b><br/>
array GetBlackList(int, int)<br/>
<font color="0x113355">Returns the list of blacklisted players. This method takes two parameters. The first parameter specifies the maximum number of infos to be returned, and the second one the starting index in the list. The list is an array of structures. Each structure contains the following fields : <i>Login</i>.</font></li>
<li><b>LoadBlackList</b><br/>
boolean LoadBlackList(string)<br/>
<font color="0x113355">Load the black list file with the specified file name. Only available to Admin.</font></li>
<li><b>SaveBlackList</b><br/>
boolean SaveBlackList(string)<br/>
<font color="0x113355">Save the black list in the file with specified file name. Only available to Admin.</font></li>
<li><b>AddGuest</b><br/>
boolean AddGuest(string)<br/>
<font color="0x113355">Add the player with the specified login on the guest list. Only available to Admin.</font></li>
<li><b>AddGuestId</b><br/>
boolean AddGuestId(int)<br/>
<font color="0x113355">Add the player with the specified PlayerId on the guest list. Only available to Admin.</font></li>
<li><b>RemoveGuest</b><br/>
boolean RemoveGuest(string)<br/>
<font color="0x113355">Remove the player with the specified login from the guest list. Only available to Admin.</font></li>
<li><b>RemoveGuestId</b><br/>
boolean RemoveGuestId(int)<br/>
<font color="0x113355">Remove the player with the specified PlayerId from the guest list. Only available to Admin.</font></li>
<li><b>CleanGuestList</b><br/>
boolean CleanGuestList()<br/>
<font color="0x113355">Clean the guest list of the server. Only available to Admin.</font></li>
<li><b>GetGuestList</b><br/>
array GetGuestList(int, int)<br/>
<font color="0x113355">Returns the list of players on the guest list. This method takes two parameters. The first parameter specifies the maximum number of infos to be returned, and the second one the starting index in the list. The list is an array of structures. Each structure contains the following fields : <i>Login</i>.</font></li>
<li><b>LoadGuestList</b><br/>
boolean LoadGuestList(string)<br/>
<font color="0x113355">Load the guest list file with the specified file name. Only available to Admin.</font></li>
<li><b>SaveGuestList</b><br/>
boolean SaveGuestList(string)<br/>
<font color="0x113355">Save the guest list in the file with specified file name. Only available to Admin.</font></li>
<li><b>SetBuddyNotification</b><br/>
boolean SetBuddyNotification(string, boolean)<br/>
<font color="0x113355">Sets whether buddy notifications should be sent in the chat. <i>login</i> is the login of the player, or '' for global setting, and <i>enabled</i> is the value. Only available to Admin.</font></li>
<li><b>GetBuddyNotification</b><br/>
boolean GetBuddyNotification(string)<br/>
<font color="0x113355">Gets whether buddy notifications are enabled for <i>login</i>, or '' to get the global setting.</font></li>
<li><b>WriteFile</b><br/>
boolean WriteFile(string, base64)<br/>
<font color="0x113355">Write the data to the specified file. The filename is relative to the Tracks path. Only available to Admin.</font></li>
<li><b>TunnelSendDataToId</b><br/>
boolean TunnelSendDataToId(int, base64)<br/>
<font color="0x113355">Send the data to the specified player. Only available to Admin.</font></li>
<li><b>TunnelSendDataToLogin</b><br/>
boolean TunnelSendDataToLogin(string, base64)<br/>
<font color="0x113355">Send the data to the specified player. Login can be a single login or a list of comma-separated logins. Only available to Admin.</font></li>
<li><b>Echo</b><br/>
boolean Echo(string, string)<br/>
<font color="0x113355">Just log the parameters and invoke a callback. Can be used to talk to other xmlrpc clients connected, or to make custom votes. If used in a callvote, the first parameter will be used as the vote message on the clients. Only available to Admin.</font></li>
<li><b>Ignore</b><br/>
boolean Ignore(string)<br/>
<font color="0x113355">Ignore the player with the specified login. Only available to Admin.</font></li>
<li><b>IgnoreId</b><br/>
boolean IgnoreId(int)<br/>
<font color="0x113355">Ignore the player with the specified PlayerId. Only available to Admin.</font></li>
<li><b>UnIgnore</b><br/>
boolean UnIgnore(string)<br/>
<font color="0x113355">Unignore the player with the specified login. Only available to Admin.</font></li>
<li><b>UnIgnoreId</b><br/>
boolean UnIgnoreId(int)<br/>
<font color="0x113355">Unignore the player with the specified PlayerId. Only available to Admin.</font></li>
<li><b>CleanIgnoreList</b><br/>
boolean CleanIgnoreList()<br/>
<font color="0x113355">Clean the ignore list of the server. Only available to Admin.</font></li>
<li><b>GetIgnoreList</b><br/>
array GetIgnoreList(int, int)<br/>
<font color="0x113355">Returns the list of ignored players. This method takes two parameters. The first parameter specifies the maximum number of infos to be returned, and the second one the starting index in the list. The list is an array of structures. Each structure contains the following fields : <i>Login</i>.</font></li>
<li><b>Pay</b><br/>
int Pay(string, int, string)<br/>
<font color="0x113355">Pay coppers from the server account to a player, returns the BillId. This method takes three parameters: <i>Login</i> of the payee, <i>Coppers</i> to pay and a <i>Label</i> to send with the payment. The creation of the transaction itself may cost coppers, so you need to have coppers on the server account. Only available to Admin.</font></li>
<li><b>SendBill</b><br/>
int SendBill(string, int, string, string)<br/>
<font color="0x113355">Create a bill, send it to a player, and return the BillId. This method takes four parameters: <i>LoginFrom</i> of the payer, <i>Coppers</i> the player has to pay, <i>Label</i> of the transaction and an optional <i>LoginTo</i> of the payee (if empty string, then the server account is used). The creation of the transaction itself may cost coppers, so you need to have coppers on the server account. Only available to Admin.</font></li>
<li><b>GetBillState</b><br/>
struct GetBillState(int)<br/>
<font color="0x113355">Returns the current state of a bill. This method takes one parameter, the <i>BillId</i>. Returns a struct containing <i>State</i>, <i>StateName</i> and <i>TransactionId</i>. Possible enum values are: <i>CreatingTransaction</i>, <i>Issued</i>, <i>ValidatingPayement</i>, <i>Payed</i>, <i>Refused</i>, <i>Error</i>.</font></li>
<li><b>GetServerCoppers</b><br/>
int GetServerCoppers()<br/>
<font color="0x113355">Returns the current number of coppers on the server account.</font></li>
<li><b>GetSystemInfo</b><br/>
struct GetSystemInfo()<br/>
<font color="0x113355">Get some system infos, including connection rates (in kbps).</font></li>
<li><b>SetConnectionRates</b><br/>
boolean SetConnectionRates(int, int)<br/>
<font color="0x113355">Set the download and upload rates (in kbps).</font></li>
<li><b>SetServerName</b><br/>
boolean SetServerName(string)<br/>
<font color="0x113355">Set a new server name in utf8 format. Only available to Admin.</font></li>
<li><b>GetServerName</b><br/>
string GetServerName()<br/>
<font color="0x113355">Get the server name in utf8 format.</font></li>
<li><b>SetServerComment</b><br/>
boolean SetServerComment(string)<br/>
<font color="0x113355">Set a new server comment in utf8 format. Only available to Admin.</font></li>
<li><b>GetServerComment</b><br/>
string GetServerComment()<br/>
<font color="0x113355">Get the server comment in utf8 format.</font></li>
<li><b>SetHideServer</b><br/>
boolean SetHideServer(int)<br/>
<font color="0x113355">Set whether the server should be hidden from the public server list (0 = visible, 1 = always hidden, 2 = hidden from nations). Only available to Admin.</font></li>
<li><b>GetHideServer</b><br/>
int GetHideServer()<br/>
<font color="0x113355">Get whether the server wants to be hidden from the public server list.</font></li>
<li><b>IsRelayServer</b><br/>
boolean IsRelayServer()<br/>
<font color="0x113355">Returns true if this is a relay server.</font></li>
<li><b>SetServerPassword</b><br/>
boolean SetServerPassword(string)<br/>
<font color="0x113355">Set a new password for the server. Only available to Admin.</font></li>
<li><b>GetServerPassword</b><br/>
string GetServerPassword()<br/>
<font color="0x113355">Get the server password if called as Admin or Super Admin, else returns if a password is needed or not.</font></li>
<li><b>SetServerPasswordForSpectator</b><br/>
boolean SetServerPasswordForSpectator(string)<br/>
<font color="0x113355">Set a new password for the spectator mode. Only available to Admin.</font></li>
<li><b>GetServerPasswordForSpectator</b><br/>
string GetServerPasswordForSpectator()<br/>
<font color="0x113355">Get the password for spectator mode if called as Admin or Super Admin, else returns if a password is needed or not.</font></li>
<li><b>SetMaxPlayers</b><br/>
boolean SetMaxPlayers(int)<br/>
<font color="0x113355">Set a new maximum number of players. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetMaxPlayers</b><br/>
struct GetMaxPlayers()<br/>
<font color="0x113355">Get the current and next maximum number of players allowed on server. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetMaxSpectators</b><br/>
boolean SetMaxSpectators(int)<br/>
<font color="0x113355">Set a new maximum number of Spectators. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetMaxSpectators</b><br/>
struct GetMaxSpectators()<br/>
<font color="0x113355">Get the current and next maximum number of Spectators allowed on server. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>EnableP2PUpload</b><br/>
boolean EnableP2PUpload(boolean)<br/>
<font color="0x113355">Enable or disable peer-to-peer upload from server. Only available to Admin.</font></li>
<li><b>IsP2PUpload</b><br/>
boolean IsP2PUpload()<br/>
<font color="0x113355">Returns if the peer-to-peer upload from server is enabled.</font></li>
<li><b>EnableP2PDownload</b><br/>
boolean EnableP2PDownload(boolean)<br/>
<font color="0x113355">Enable or disable peer-to-peer download for server. Only available to Admin.</font></li>
<li><b>IsP2PDownload</b><br/>
boolean IsP2PDownload()<br/>
<font color="0x113355">Returns if the peer-to-peer download for server is enabled.</font></li>
<li><b>AllowChallengeDownload</b><br/>
boolean AllowChallengeDownload(boolean)<br/>
<font color="0x113355">Allow clients to download challenges from the server. Only available to Admin.</font></li>
<li><b>IsChallengeDownloadAllowed</b><br/>
boolean IsChallengeDownloadAllowed()<br/>
<font color="0x113355">Returns if clients can download challenges from the server.</font></li>
<li><b>AutoSaveReplays</b><br/>
boolean AutoSaveReplays(boolean)<br/>
<font color="0x113355">Enable the autosaving of all replays (vizualisable replays with all players, but not validable) on the server. Only available to SuperAdmin.</font></li>
<li><b>AutoSaveValidationReplays</b><br/>
boolean AutoSaveValidationReplays(boolean)<br/>
<font color="0x113355">Enable the autosaving on the server of validation replays, every time a player makes a new time. Only available to SuperAdmin.</font></li>
<li><b>IsAutoSaveReplaysEnabled</b><br/>
boolean IsAutoSaveReplaysEnabled()<br/>
<font color="0x113355">Returns if autosaving of all replays is enabled on the server.</font></li>
<li><b>IsAutoSaveValidationReplaysEnabled</b><br/>
boolean IsAutoSaveValidationReplaysEnabled()<br/>
<font color="0x113355">Returns if autosaving of validation replays is enabled on the server.</font></li>
<li><b>SaveCurrentReplay</b><br/>
boolean SaveCurrentReplay(string)<br/>
<font color="0x113355">Saves the current replay (vizualisable replays with all players, but not validable). Pass a filename, or '' for an automatic filename. Only available to Admin.</font></li>
<li><b>SaveBestGhostsReplay</b><br/>
boolean SaveBestGhostsReplay(string, string)<br/>
<font color="0x113355">Saves a replay with the ghost of all the players' best race. First parameter is the login of the player (or '' for all players), Second parameter is the filename, or '' for an automatic filename. Only available to Admin.</font></li>
<li><b>GetValidationReplay</b><br/>
base64 GetValidationReplay(string)<br/>
<font color="0x113355">Returns a replay containing the data needed to validate the current best time of the player. The parameter is the login of the player.</font></li>
<li><b>SetLadderMode</b><br/>
boolean SetLadderMode(int)<br/>
<font color="0x113355">Set a new ladder mode between ladder disabled (0) and forced (1). Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetLadderMode</b><br/>
struct GetLadderMode()<br/>
<font color="0x113355">Get the current and next ladder mode on server. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>GetLadderServerLimits</b><br/>
struct GetLadderServerLimits()<br/>
<font color="0x113355">Get the ladder points limit for the players allowed on this server. The struct returned contains two fields <i>LadderServerLimitMin</i> and <i>LadderServerLimitMax</i>.</font></li>
<li><b>SetVehicleNetQuality</b><br/>
boolean SetVehicleNetQuality(int)<br/>
<font color="0x113355">Set the network vehicle quality to Fast (0) or High (1). Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetVehicleNetQuality</b><br/>
struct GetVehicleNetQuality()<br/>
<font color="0x113355">Get the current and next network vehicle quality on server. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetServerOptions</b><br/>
boolean SetServerOptions(struct)<br/>
<font color="0x113355">Set new server options using the struct passed as parameters. This struct must contain the following fields : <i>Name</i>, <i>Comment</i>, <i>Password</i>, <i>PasswordForSpectator</i>, <i>NextMaxPlayers</i>, <i>NextMaxSpectators</i>, <i>IsP2PUpload</i>, <i>IsP2PDownload</i>, <i>NextLadderMode</i>, <i>NextVehicleNetQuality</i>, <i>NextCallVoteTimeOut</i>, <i>CallVoteRatio</i>, <i>AllowChallengeDownload</i>, <i>AutoSaveReplays</i>, and optionally for forever: <i>RefereePassword</i>, <i>RefereeMode</i>, <i>AutoSaveValidationReplays</i>, <i>HideServer</i>, <i>UseChangingValidationSeed</i>. Only available to Admin. A change of NextMaxPlayers, NextMaxSpectators, NextLadderMode, NextVehicleNetQuality, NextCallVoteTimeOut or UseChangingValidationSeed requires a challenge restart to be taken into account.</font></li>
<li><b>GetServerOptions</b><br/>
struct GetServerOptions(int)<br/>
<font color="0x113355">Optional parameter for compatibility: struct version (0 = united, 1 = forever). Returns a struct containing the server options: <i>Name</i>, <i>Comment</i>, <i>Password</i>, <i>PasswordForSpectator</i>, <i>CurrentMaxPlayers</i>, <i>NextMaxPlayers</i>, <i>CurrentMaxSpectators</i>, <i>NextMaxSpectators</i>, <i>IsP2PUpload</i>, <i>IsP2PDownload</i>, <i>CurrentLadderMode</i>, <i>NextLadderMode</i>, <i>CurrentVehicleNetQuality</i>, <i>NextVehicleNetQuality</i>, <i>CurrentCallVoteTimeOut</i>, <i>NextCallVoteTimeOut</i>, <i>CallVoteRatio</i>, <i>AllowChallengeDownload</i> and <i>AutoSaveReplays</i>, and additionally for forever: <i>RefereePassword</i>, <i>RefereeMode</i>, <i>AutoSaveValidationReplays</i>, <i>HideServer</i>, <i>CurrentUseChangingValidationSeed</i>, <i>NextUseChangingValidationSeed</i>.</font></li>
<li><b>SetServerPackMask</b><br/>
boolean SetServerPackMask(string)<br/>
<font color="0x113355">Defines the packmask of the server. Can be 'United', 'Nations', 'Sunrise', 'Original', or any of the environment names. (Only challenges matching the packmask will be allowed on the server, so that player connecting to it know what to expect.) Only available when the server is stopped. Only available to Admin.</font></li>
<li><b>GetServerPackMask</b><br/>
string GetServerPackMask()<br/>
<font color="0x113355">Get the packmask of the server.</font></li>
<li><b>SetForcedMods</b><br/>
boolean SetForcedMods(boolean, array)<br/>
<font color="0x113355">Set the mods to apply on the clients. Parameters: <i>Override</i>, if true even the challenges with a mod will be overridden by the server setting; and <i>Mods</i>, an array of structures [{<i>EnvName</i>, <i>Url</i>}, ...]. Requires a challenge restart to be taken into account. Only available to Admin.</font></li>
<li><b>GetForcedMods</b><br/>
struct GetForcedMods()<br/>
<font color="0x113355">Get the mods settings.</font></li>
<li><b>SetForcedMusic</b><br/>
boolean SetForcedMusic(boolean, string)<br/>
<font color="0x113355">Set the music to play on the clients. Parameters: <i>Override</i>, if true even the challenges with a custom music will be overridden by the server setting, and a <i>UrlOrFileName</i> for the music. Requires a challenge restart to be taken into account. Only available to Admin.</font></li>
<li><b>GetForcedMusic</b><br/>
struct GetForcedMusic()<br/>
<font color="0x113355">Get the music setting.</font></li>
<li><b>SetForcedSkins</b><br/>
boolean SetForcedSkins(array)<br/>
<font color="0x113355">Defines a list of remappings for player skins. It expects a list of structs <i>Orig</i>, <i>Name</i>, <i>Checksum</i>, <i>Url</i>. Orig is the name of the skin to remap, or '*' for any other. Name, Checksum, Url define the skin to use. (They are optional, you may set value '' for any of those. All 3 null means same as Orig). Will only affect players connecting after the value is set. Only available to Admin.</font></li>
<li><b>GetForcedSkins</b><br/>
array GetForcedSkins()<br/>
<font color="0x113355">Get the current forced skins.</font></li>
<li><b>GetLastConnectionErrorMessage</b><br/>
string GetLastConnectionErrorMessage()<br/>
<font color="0x113355">Returns the last error message for an internet connection. Only available to Admin.</font></li>
<li><b>SetRefereePassword</b><br/>
boolean SetRefereePassword(string)<br/>
<font color="0x113355">Set a new password for the referee mode. Only available to Admin.</font></li>
<li><b>GetRefereePassword</b><br/>
string GetRefereePassword()<br/>
<font color="0x113355">Get the password for referee mode if called as Admin or Super Admin, else returns if a password is needed or not.</font></li>
<li><b>SetRefereeMode</b><br/>
boolean SetRefereeMode(int)<br/>
<font color="0x113355">Set the referee validation mode. 0 = validate the top3 players, 1 = validate all players. Only available to Admin.</font></li>
<li><b>GetRefereeMode</b><br/>
int GetRefereeMode()<br/>
<font color="0x113355">Get the referee validation mode.</font></li>
<li><b>SetUseChangingValidationSeed</b><br/>
boolean SetUseChangingValidationSeed(boolean)<br/>
<font color="0x113355">Set whether the game should use a variable validation seed or not. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetUseChangingValidationSeed</b><br/>
struct GetUseChangingValidationSeed()<br/>
<font color="0x113355">Get the current and next value of UseChangingValidationSeed. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetWarmUp</b><br/>
boolean SetWarmUp(boolean)<br/>
<font color="0x113355">Sets whether the server is in warm-up phase or not. Only available to Admin.</font></li>
<li><b>GetWarmUp</b><br/>
boolean GetWarmUp()<br/>
<font color="0x113355">Returns whether the server is in warm-up phase.</font></li>
<li><b>ChallengeRestart</b><br/>
boolean ChallengeRestart()<br/>
<font color="0x113355">Restarts the challenge, with an optional boolean parameter <i>DontClearCupScores</i> (only available in cup mode). Only available to Admin.</font></li>
<li><b>RestartChallenge</b><br/>
boolean RestartChallenge()<br/>
<font color="0x113355">Restarts the challenge, with an optional boolean parameter <i>DontClearCupScores</i> (only available in cup mode). Only available to Admin.</font></li>
<li><b>NextChallenge</b><br/>
boolean NextChallenge()<br/>
<font color="0x113355">Switch to next challenge, with an optional boolean parameter <i>DontClearCupScores</i> (only available in cup mode). Only available to Admin.</font></li>
<li><b>StopServer</b><br/>
boolean StopServer()<br/>
<font color="0x113355">Stop the server. Only available to SuperAdmin.</font></li>
<li><b>ForceEndRound</b><br/>
boolean ForceEndRound()<br/>
<font color="0x113355">In Rounds or Laps mode, force the end of round without waiting for all players to giveup/finish. Only available to Admin.</font></li>
<li><b>SetGameInfos</b><br/>
boolean SetGameInfos(struct)<br/>
<font color="0x113355">Set new game settings using the struct passed as parameters. This struct must contain the following fields : <i>GameMode</i>, <i>ChatTime</i>, <i>RoundsPointsLimit</i>, <i>RoundsUseNewRules</i>, <i>RoundsForcedLaps</i>, <i>TimeAttackLimit</i>, <i>TimeAttackSynchStartPeriod</i>, <i>TeamPointsLimit</i>, <i>TeamMaxPoints</i>, <i>TeamUseNewRules</i>, <i>LapsNbLaps</i>, <i>LapsTimeLimit</i>, <i>FinishTimeout</i>, and optionally: <i>AllWarmUpDuration</i>, <i>DisableRespawn</i>, <i>ForceShowAllOpponents</i>, <i>RoundsPointsLimitNewRules</i>, <i>TeamPointsLimitNewRules</i>, <i>CupPointsLimit</i>, <i>CupRoundsPerChallenge</i>, <i>CupNbWinners</i>, <i>CupWarmUpDuration</i>. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetCurrentGameInfo</b><br/>
struct GetCurrentGameInfo(int)<br/>
<font color="0x113355">Optional parameter for compatibility: struct version (0 = united, 1 = forever). Returns a struct containing the current game settings, ie: <i>GameMode</i>, <i>ChatTime</i>, <i>NbChallenge</i>, <i>RoundsPointsLimit</i>, <i>RoundsUseNewRules</i>, <i>RoundsForcedLaps</i>, <i>TimeAttackLimit</i>, <i>TimeAttackSynchStartPeriod</i>, <i>TeamPointsLimit</i>, <i>TeamMaxPoints</i>, <i>TeamUseNewRules</i>, <i>LapsNbLaps</i>, <i>LapsTimeLimit</i>, <i>FinishTimeout</i>, and additionally for version 1: <i>AllWarmUpDuration</i>, <i>DisableRespawn</i>, <i>ForceShowAllOpponents</i>, <i>RoundsPointsLimitNewRules</i>, <i>TeamPointsLimitNewRules</i>, <i>CupPointsLimit</i>, <i>CupRoundsPerChallenge</i>, <i>CupNbWinners</i>, <i>CupWarmUpDuration</i>.</font></li>
<li><b>GetNextGameInfo</b><br/>
struct GetNextGameInfo(int)<br/>
<font color="0x113355">Optional parameter for compatibility: struct version (0 = united, 1 = forever). Returns a struct containing the game settings for the next challenge, ie: <i>GameMode</i>, <i>ChatTime</i>, <i>NbChallenge</i>, <i>RoundsPointsLimit</i>, <i>RoundsUseNewRules</i>, <i>RoundsForcedLaps</i>, <i>TimeAttackLimit</i>, <i>TimeAttackSynchStartPeriod</i>, <i>TeamPointsLimit</i>, <i>TeamMaxPoints</i>, <i>TeamUseNewRules</i>, <i>LapsNbLaps</i>, <i>LapsTimeLimit</i>, <i>FinishTimeout</i>, and additionally for version 1: <i>AllWarmUpDuration</i>, <i>DisableRespawn</i>, <i>ForceShowAllOpponents</i>, <i>RoundsPointsLimitNewRules</i>, <i>TeamPointsLimitNewRules</i>, <i>CupPointsLimit</i>, <i>CupRoundsPerChallenge</i>, <i>CupNbWinners</i>, <i>CupWarmUpDuration</i>.</font></li>
<li><b>GetGameInfos</b><br/>
struct GetGameInfos(int)<br/>
<font color="0x113355">Optional parameter for compatibility: struct version (0 = united, 1 = forever). Returns a struct containing two other structures, the first containing the current game settings and the second the game settings for next challenge. The first structure is named <i>CurrentGameInfos</i> and the second <i>NextGameInfos</i>.</font></li>
<li><b>SetGameMode</b><br/>
boolean SetGameMode(int)<br/>
<font color="0x113355">Set a new game mode between Rounds (0), TimeAttack (1), Team (2), Laps (3), Stunts (4) and Cup (5). Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetGameMode</b><br/>
int GetGameMode()<br/>
<font color="0x113355">Get the current game mode.</font></li>
<li><b>SetChatTime</b><br/>
boolean SetChatTime(int)<br/>
<font color="0x113355">Set a new chat time value in milliseconds (actually 'chat time' is the duration of the end race podium, 0 means no podium displayed.). Only available to Admin.</font></li>
<li><b>GetChatTime</b><br/>
struct GetChatTime()<br/>
<font color="0x113355">Get the current and next chat time. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetFinishTimeout</b><br/>
boolean SetFinishTimeout(int)<br/>
<font color="0x113355">Set a new finish timeout (for rounds/laps mode) value in milliseconds. 0 means default. 1 means adaptative to the duration of the challenge. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetFinishTimeout</b><br/>
struct GetFinishTimeout()<br/>
<font color="0x113355">Get the current and next FinishTimeout. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetAllWarmUpDuration</b><br/>
boolean SetAllWarmUpDuration(int)<br/>
<font color="0x113355">Set whether to enable the automatic warm-up phase in all modes. 0 = no, otherwise it's the duration of the phase, expressed in number of rounds (in rounds/team mode), or in number of times the gold medal time (other modes). Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetAllWarmUpDuration</b><br/>
struct GetAllWarmUpDuration()<br/>
<font color="0x113355">Get whether the automatic warm-up phase is enabled in all modes. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetDisableRespawn</b><br/>
boolean SetDisableRespawn(boolean)<br/>
<font color="0x113355">Set whether to disallow players to respawn. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetDisableRespawn</b><br/>
struct GetDisableRespawn()<br/>
<font color="0x113355">Get whether players are disallowed to respawn. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetForceShowAllOpponents</b><br/>
boolean SetForceShowAllOpponents(int)<br/>
<font color="0x113355">Set whether to override the players preferences and always display all opponents (0=no override, 1=show all, other value=minimum number of opponents). Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetForceShowAllOpponents</b><br/>
struct GetForceShowAllOpponents()<br/>
<font color="0x113355">Get whether players are forced to show all opponents. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetTimeAttackLimit</b><br/>
boolean SetTimeAttackLimit(int)<br/>
<font color="0x113355">Set a new time limit for time attack mode. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetTimeAttackLimit</b><br/>
struct GetTimeAttackLimit()<br/>
<font color="0x113355">Get the current and next time limit for time attack mode. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetTimeAttackSynchStartPeriod</b><br/>
boolean SetTimeAttackSynchStartPeriod(int)<br/>
<font color="0x113355">Set a new synchronized start period for time attack mode. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetTimeAttackSynchStartPeriod</b><br/>
struct GetTimeAttackSynchStartPeriod()<br/>
<font color="0x113355">Get the current and synchronized start period for time attack mode. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetLapsTimeLimit</b><br/>
boolean SetLapsTimeLimit(int)<br/>
<font color="0x113355">Set a new time limit for laps mode. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetLapsTimeLimit</b><br/>
struct GetLapsTimeLimit()<br/>
<font color="0x113355">Get the current and next time limit for laps mode. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetNbLaps</b><br/>
boolean SetNbLaps(int)<br/>
<font color="0x113355">Set a new number of laps for laps mode. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetNbLaps</b><br/>
struct GetNbLaps()<br/>
<font color="0x113355">Get the current and next number of laps for laps mode. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetRoundForcedLaps</b><br/>
boolean SetRoundForcedLaps(int)<br/>
<font color="0x113355">Set a new number of laps for rounds mode (0 = default, use the number of laps from the challenges, otherwise forces the number of rounds for multilaps challenges). Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetRoundForcedLaps</b><br/>
struct GetRoundForcedLaps()<br/>
<font color="0x113355">Get the current and next number of laps for rounds mode. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetRoundPointsLimit</b><br/>
boolean SetRoundPointsLimit(int)<br/>
<font color="0x113355">Set a new points limit for rounds mode (value set depends on UseNewRulesRound). Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetRoundPointsLimit</b><br/>
struct GetRoundPointsLimit()<br/>
<font color="0x113355">Get the current and next points limit for rounds mode (values returned depend on UseNewRulesRound). The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetRoundCustomPoints</b><br/>
boolean SetRoundCustomPoints(array, boolean)<br/>
<font color="0x113355">Set the points used for the scores in rounds mode. <i>Points</i> is an array of decreasing integers for the players from the first to last. And you can add an optional boolean to relax the constraint checking on the scores. Only available to Admin.</font></li>
<li><b>GetRoundCustomPoints</b><br/>
array GetRoundCustomPoints()<br/>
<font color="0x113355">Gets the points used for the scores in rounds mode.</font></li>
<li><b>SetUseNewRulesRound</b><br/>
boolean SetUseNewRulesRound(boolean)<br/>
<font color="0x113355">Set if new rules are used for rounds mode. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetUseNewRulesRound</b><br/>
struct GetUseNewRulesRound()<br/>
<font color="0x113355">Get if the new rules are used for rounds mode (Current and next values). The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetTeamPointsLimit</b><br/>
boolean SetTeamPointsLimit(int)<br/>
<font color="0x113355">Set a new points limit for team mode (value set depends on UseNewRulesTeam). Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetTeamPointsLimit</b><br/>
struct GetTeamPointsLimit()<br/>
<font color="0x113355">Get the current and next points limit for team mode (values returned depend on UseNewRulesTeam). The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetMaxPointsTeam</b><br/>
boolean SetMaxPointsTeam(int)<br/>
<font color="0x113355">Set a new number of maximum points per round for team mode. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetMaxPointsTeam</b><br/>
struct GetMaxPointsTeam()<br/>
<font color="0x113355">Get the current and next number of maximum points per round for team mode. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetUseNewRulesTeam</b><br/>
boolean SetUseNewRulesTeam(boolean)<br/>
<font color="0x113355">Set if new rules are used for team mode. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetUseNewRulesTeam</b><br/>
struct GetUseNewRulesTeam()<br/>
<font color="0x113355">Get if the new rules are used for team mode (Current and next values). The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetCupPointsLimit</b><br/>
boolean SetCupPointsLimit(int)<br/>
<font color="0x113355">Set the points needed for victory in Cup mode. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetCupPointsLimit</b><br/>
struct GetCupPointsLimit()<br/>
<font color="0x113355">Get the points needed for victory in Cup mode. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetCupRoundsPerChallenge</b><br/>
boolean SetCupRoundsPerChallenge(int)<br/>
<font color="0x113355">Sets the number of rounds before going to next challenge in Cup mode. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetCupRoundsPerChallenge</b><br/>
struct GetCupRoundsPerChallenge()<br/>
<font color="0x113355">Get the number of rounds before going to next challenge in Cup mode. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetCupWarmUpDuration</b><br/>
boolean SetCupWarmUpDuration(int)<br/>
<font color="0x113355">Set whether to enable the automatic warm-up phase in Cup mode. 0 = no, otherwise it's the duration of the phase, expressed in number of rounds. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetCupWarmUpDuration</b><br/>
struct GetCupWarmUpDuration()<br/>
<font color="0x113355">Get whether the automatic warm-up phase is enabled in Cup mode. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetCupNbWinners</b><br/>
boolean SetCupNbWinners(int)<br/>
<font color="0x113355">Set the number of winners to determine before the match is considered over. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetCupNbWinners</b><br/>
struct GetCupNbWinners()<br/>
<font color="0x113355">Get the number of winners to determine before the match is considered over. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>GetCurrentChallengeIndex</b><br/>
int GetCurrentChallengeIndex()<br/>
<font color="0x113355">Returns the current challenge index in the selection, or -1 if the challenge is no longer in the selection.</font></li>
<li><b>GetNextChallengeIndex</b><br/>
int GetNextChallengeIndex()<br/>
<font color="0x113355">Returns the challenge index in the selection that will be played next (unless the current one is restarted...)</font></li>
<li><b>SetNextChallengeIndex</b><br/>
boolean SetNextChallengeIndex(int)<br/>
<font color="0x113355">Sets the challenge index in the selection that will be played next (unless the current one is restarted...)</font></li>
<li><b>GetCurrentChallengeInfo</b><br/>
struct GetCurrentChallengeInfo()<br/>
<font color="0x113355">Returns a struct containing the infos for the current challenge. The struct contains the following fields : <i>Name</i>, <i>UId</i>, <i>FileName</i>, <i>Author</i>, <i>Environnement</i>, <i>Mood</i>, <i>BronzeTime</i>, <i>SilverTime</i>, <i>GoldTime</i>, <i>AuthorTime</i>, <i>CopperPrice</i>, <i>LapRace</i>, <i>NbLaps</i> and <i>NbCheckpoints</i>.</font></li>
<li><b>GetNextChallengeInfo</b><br/>
struct GetNextChallengeInfo()<br/>
<font color="0x113355">Returns a struct containing the infos for the next challenge. The struct contains the following fields : <i>Name</i>, <i>UId</i>, <i>FileName</i>, <i>Author</i>, <i>Environnement</i>, <i>Mood</i>, <i>BronzeTime</i>, <i>SilverTime</i>, <i>GoldTime</i>, <i>AuthorTime</i>, <i>CopperPrice</i> and <i>LapRace</i>. (<i>NbLaps</i> and <i>NbCheckpoints</i> are also present but always set to -1)</font></li>
<li><b>GetChallengeInfo</b><br/>
struct GetChallengeInfo(string)<br/>
<font color="0x113355">Returns a struct containing the infos for the challenge with the specified filename. The struct contains the following fields : <i>Name</i>, <i>UId</i>, <i>FileName</i>, <i>Author</i>, <i>Environnement</i>, <i>Mood</i>, <i>BronzeTime</i>, <i>SilverTime</i>, <i>GoldTime</i>, <i>AuthorTime</i>, <i>CopperPrice</i> and <i>LapRace</i>. (<i>NbLaps</i> and <i>NbCheckpoints</i> are also present but always set to -1)</font></li>
<li><b>CheckChallengeForCurrentServerParams</b><br/>
boolean CheckChallengeForCurrentServerParams(string)<br/>
<font color="0x113355">Returns a boolean if the challenge with the specified filename matches the current server settings.</font></li>
<li><b>GetChallengeList</b><br/>
array GetChallengeList(int, int)<br/>
<font color="0x113355">Returns a list of challenges among the current selection of the server. This method take two parameters. The first parameter specifies the maximum number of infos to be returned, and the second one the starting index in the selection. The list is an array of structures. Each structure contains the following fields : <i>Name</i>, <i>UId</i>, <i>FileName</i>, <i>Environnement</i>, <i>Author</i>, <i>GoldTime</i> and <i>CopperPrice</i>.</font></li>
<li><b>AddChallenge</b><br/>
boolean AddChallenge(string)<br/>
<font color="0x113355">Add the challenge with the specified filename at the end of the current selection. Only available to Admin.</font></li>
<li><b>AddChallengeList</b><br/>
int AddChallengeList(array)<br/>
<font color="0x113355">Add the list of challenges with the specified filenames at the end of the current selection. The list of challenges to add is an array of strings. Only available to Admin.</font></li>
<li><b>RemoveChallenge</b><br/>
boolean RemoveChallenge(string)<br/>
<font color="0x113355">Remove the challenge with the specified filename from the current selection. Only available to Admin.</font></li>
<li><b>RemoveChallengeList</b><br/>
int RemoveChallengeList(array)<br/>
<font color="0x113355">Remove the list of challenges with the specified filenames from the current selection. The list of challenges to remove is an array of strings. Only available to Admin.</font></li>
<li><b>InsertChallenge</b><br/>
boolean InsertChallenge(string)<br/>
<font color="0x113355">Insert the challenge with the specified filename after the current challenge. Only available to Admin.</font></li>
<li><b>InsertChallengeList</b><br/>
int InsertChallengeList(array)<br/>
<font color="0x113355">Insert the list of challenges with the specified filenames after the current challenge. The list of challenges to insert is an array of strings. Only available to Admin.</font></li>
<li><b>ChooseNextChallenge</b><br/>
boolean ChooseNextChallenge(string)<br/>
<font color="0x113355">Set as next challenge the one with the specified filename, if it is present in the selection. Only available to Admin.</font></li>
<li><b>ChooseNextChallengeList</b><br/>
int ChooseNextChallengeList(array)<br/>
<font color="0x113355">Set as next challenges the list of challenges with the specified filenames, if they are present in the selection. The list of challenges to choose is an array of strings. Only available to Admin.</font></li>
<li><b>LoadMatchSettings</b><br/>
int LoadMatchSettings(string)<br/>
<font color="0x113355">Set a list of challenges defined in the playlist with the specified filename as the current selection of the server, and load the gameinfos from the same file. Only available to Admin.</font></li>
<li><b>AppendPlaylistFromMatchSettings</b><br/>
int AppendPlaylistFromMatchSettings(string)<br/>
<font color="0x113355">Add a list of challenges defined in the playlist with the specified filename at the end of the current selection. Only available to Admin.</font></li>
<li><b>SaveMatchSettings</b><br/>
int SaveMatchSettings(string)<br/>
<font color="0x113355">Save the current selection of challenge in the playlist with the specified filename, as well as the current gameinfos. Only available to Admin.</font></li>
<li><b>InsertPlaylistFromMatchSettings</b><br/>
int InsertPlaylistFromMatchSettings(string)<br/>
<font color="0x113355">Insert a list of challenges defined in the playlist with the specified filename after the current challenge. Only available to Admin.</font></li>
<li><b>GetPlayerList</b><br/>
array GetPlayerList(int, int, int)<br/>
<font color="0x113355">Returns the list of players on the server. This method take two parameters. The first parameter specifies the maximum number of infos to be returned, and the second one the starting index in the list, an optional 3rd parameter is used for compatibility: struct version (0 = united, 1 = forever, 2 = forever, including the servers). The list is an array of PlayerInfo structures. Forever PlayerInfo struct is: <i>Login</i>, <i>NickName</i>, <i>PlayerId</i>, <i>TeamId</i>, <i>SpectatorStatus</i>, <i>LadderRanking</i>, and <i>Flags</i>. <br/>
<i>LadderRanking</i> is 0 when not in official mode, <br/>
<i>Flags</i> = <i>ForceSpectator</i>(0,1,2) + <i>IsReferee</i> * 10 + <i>IsPodiumReady</i> * 100 + <i>IsUsingStereoscopy</i> * 1000 + <i>IsManagedByAnOtherServer</i> * 10000 + <i>IsServer</i> * 100000 + <i>HasPlayerSlot</i> * 1000000<br/>
<i>SpectatorStatus</i> = <i>Spectator</i> + <i>TemporarySpectator</i> * 10 + <i>PureSpectator</i> * 100 + <i>AutoTarget</i> * 1000 + <i>CurrentTargetId</i> * 10000</font></li>
<li><b>GetPlayerInfo</b><br/>
struct GetPlayerInfo(string, int)<br/>
<font color="0x113355">Returns a struct containing the infos on the player with the specified login, with an optional parameter for compatibility: struct version (0 = united, 1 = forever). The structure is identical to the ones from GetPlayerList. Forever PlayerInfo struct is: <i>Login</i>, <i>NickName</i>, <i>PlayerId</i>, <i>TeamId</i>, <i>SpectatorStatus</i>, <i>LadderRanking</i>, and <i>Flags</i>. <br/>
<i>LadderRanking</i> is 0 when not in official mode, <br/>
<i>Flags</i> = <i>ForceSpectator</i>(0,1,2) + <i>IsReferee</i> * 10 + <i>IsPodiumReady</i> * 100 + <i>IsUsingStereoscopy</i> * 1000 + <i>IsManagedByAnOtherServer</i> * 10000 + <i>IsServer</i> * 100000 + <i>HasPlayerSlot</i> * 1000000<br/>
<i>SpectatorStatus</i> = <i>Spectator</i> + <i>TemporarySpectator</i> * 10 + <i>PureSpectator</i> * 100 + <i>AutoTarget</i> * 1000 + <i>CurrentTargetId</i> * 10000</font></li>
<li><b>GetDetailedPlayerInfo</b><br/>
struct GetDetailedPlayerInfo(string)<br/>
<font color="0x113355">Returns a struct containing the infos on the player with the specified login. The structure contains the following fields : <i>Login</i>, <i>NickName</i>, <i>PlayerId</i>, <i>TeamId</i>, <i>IPAddress</i>, <i>DownloadRate</i>, <i>UploadRate</i>, <i>Language</i>, <i>IsSpectator</i>, <i>IsInOfficialMode</i>, a structure named <i>Avatar</i>, an array of structures named <i>Skins</i>, a structure named <i>LadderStats</i>, <i>HoursSinceZoneInscription</i> and <i>OnlineRights</i> (0: nations account, 3: united account). Each structure of the array <i>Skins</i> contains two fields <i>Environnement</i> and a struct <i>PackDesc</i>. Each structure <i>PackDesc</i>, as well as the struct <i>Avatar</i>, contains two fields <i>FileName</i> and <i>Checksum</i>.</font></li>
<li><b>GetMainServerPlayerInfo</b><br/>
struct GetMainServerPlayerInfo(int)<br/>
<font color="0x113355">Returns a struct containing the player infos of the game server (ie: in case of a basic server, itself; in case of a relay server, the main server), with an optional parameter for compatibility: struct version (0 = united, 1 = forever). The structure is identical to the ones from GetPlayerList. Forever PlayerInfo struct is: <i>Login</i>, <i>NickName</i>, <i>PlayerId</i>, <i>TeamId</i>, <i>SpectatorStatus</i>, <i>LadderRanking</i>, and <i>Flags</i>. <br/>
<i>LadderRanking</i> is 0 when not in official mode, <br/>
<i>Flags</i> = <i>ForceSpectator</i>(0,1,2) + <i>IsReferee</i> * 10 + <i>IsPodiumReady</i> * 100 + <i>IsUsingStereoscopy</i> * 1000 + <i>IsManagedByAnOtherServer</i> * 10000 + <i>IsServer</i> * 100000 + <i>HasPlayerSlot</i> * 1000000<br/>
<i>SpectatorStatus</i> = <i>Spectator</i> + <i>TemporarySpectator</i> * 10 + <i>PureSpectator</i> * 100 + <i>AutoTarget</i> * 1000 + <i>CurrentTargetId</i> * 10000</font></li>
<li><b>GetCurrentRanking</b><br/>
array GetCurrentRanking(int, int)<br/>
<font color="0x113355">Returns the current rankings for the race in progress. (in team mode, the scores for the two teams are returned. In other modes, it's the individual players' scores) This method take two parameters. The first parameter specifies the maximum number of infos to be returned, and the second one the starting index in the ranking. The ranking returned is a list of structures. Each structure contains the following fields : <i>Login</i>, <i>NickName</i>, <i>PlayerId</i>, <i>Rank</i>, <i>BestTime</i>, <i>Score</i>, <i>NbrLapsFinished</i> and <i>LadderScore</i>. It also contains an array <i>BestCheckpoints</i> that contains the checkpoint times for the best race.</font></li>
<li><b>GetCurrentRankingForLogin</b><br/>
array GetCurrentRankingForLogin(string)<br/>
<font color="0x113355">Returns the current ranking for the race in progressof the player with the specified login (or list of comma-separated logins). The ranking returned is a list of structures, that contains the following fields : <i>Login</i>, <i>NickName</i>, <i>PlayerId</i>, <i>Rank</i>, <i>BestTime</i>, <i>Score</i>, <i>NbrLapsFinished</i> and <i>LadderScore</i>. It also contains an array <i>BestCheckpoints</i> that contains the checkpoint times for the best race.</font></li>
<li><b>ForceScores</b><br/>
boolean ForceScores(array, boolean)<br/>
<font color="0x113355">Force the scores of the current game. Only available in rounds and team mode. You have to pass an array of structs {int <i>PlayerId</i>, int <i>Score</i>}. And a boolean <i>SilentMode</i> - if true, the scores are silently updated (only available for SuperAdmin), allowing an external controller to do its custom counting... Only available to Admin/SuperAdmin.</font></li>
<li><b>ForcePlayerTeam</b><br/>
boolean ForcePlayerTeam(string, int)<br/>
<font color="0x113355">Force the team of the player. Only available in team mode. You have to pass the login and the team number (0 or 1). Only available to Admin.</font></li>
<li><b>ForcePlayerTeamId</b><br/>
boolean ForcePlayerTeamId(int, int)<br/>
<font color="0x113355">Force the team of the player. Only available in team mode. You have to pass the playerid and the team number (0 or 1). Only available to Admin.</font></li>
<li><b>ForceSpectator</b><br/>
boolean ForceSpectator(string, int)<br/>
<font color="0x113355">Force the spectating status of the player. You have to pass the login and the spectator mode (0: user selectable, 1: spectator, 2: player). Only available to Admin.</font></li>
<li><b>ForceSpectatorId</b><br/>
boolean ForceSpectatorId(int, int)<br/>
<font color="0x113355">Force the spectating status of the player. You have to pass the playerid and the spectator mode (0: user selectable, 1: spectator, 2: player). Only available to Admin.</font></li>
<li><b>ForceSpectatorTarget</b><br/>
boolean ForceSpectatorTarget(string, string, int)<br/>
<font color="0x113355">Force spectators to look at a specific player. You have to pass the login of the spectator (or '' for all) and the login of the target (or '' for automatic), and an integer for the camera type to use (-1 = leave unchanged, 0 = replay, 1 = follow, 2 = free). Only available to Admin.</font></li>
<li><b>ForceSpectatorTargetId</b><br/>
boolean ForceSpectatorTargetId(int, int, int)<br/>
<font color="0x113355">Force spectators to look at a specific player. You have to pass the id of the spectator (or -1 for all) and the id of the target (or -1 for automatic), and an integer for the camera type to use (-1 = leave unchanged, 0 = replay, 1 = follow, 2 = free). Only available to Admin.</font></li>
<li><b>SpectatorReleasePlayerSlot</b><br/>
boolean SpectatorReleasePlayerSlot(string)<br/>
<font color="0x113355">Pass the login of the spectator. A spectator that once was a player keeps his player slot, so that he can go back to race mode. Calling this function frees this slot for another player to connect. Only available to Admin.</font></li>
<li><b>SpectatorReleasePlayerSlotId</b><br/>
boolean SpectatorReleasePlayerSlotId(int)<br/>
<font color="0x113355">Pass the playerid of the spectator. A spectator that once was a player keeps his player slot, so that he can go back to race mode. Calling this function frees this slot for another player to connect. Only available to Admin.</font></li>
<li><b>ManualFlowControlEnable</b><br/>
boolean ManualFlowControlEnable(boolean)<br/>
<font color="0x113355">Enable control of the game flow: the game will wait for the caller to validate state transitions. Only available to Admin.</font></li>
<li><b>ManualFlowControlProceed</b><br/>
boolean ManualFlowControlProceed()<br/>
<font color="0x113355">Allows the game to proceed. Only available to Admin.</font></li>
<li><b>ManualFlowControlIsEnabled</b><br/>
int ManualFlowControlIsEnabled()<br/>
<font color="0x113355">Returns whether the manual control of the game flow is enabled. 0 = no, 1 = yes by the xml-rpc client making the call, 2 = yes, by some other xml-rpc client. Only available to Admin.</font></li>
<li><b>ManualFlowControlGetCurTransition</b><br/>
string ManualFlowControlGetCurTransition()<br/>
<font color="0x113355">Returns the transition that is currently blocked, or '' if none. (That's exactly the value last received by the callback.) Only available to Admin.</font></li>
<li><b>CheckEndMatchCondition</b><br/>
string CheckEndMatchCondition()<br/>
<font color="0x113355">Returns the current match ending condition. Return values are: 'Playing', 'ChangeMap' or 'Finished'.</font></li>
<li><b>GetNetworkStats</b><br/>
struct GetNetworkStats()<br/>
<font color="0x113355">Returns a struct containing the networks stats of the server. The structure contains the following fields : <i>Uptime</i>, <i>NbrConnection</i>, <i>MeanConnectionTime</i>, <i>MeanNbrPlayer</i>, <i>RecvNetRate</i>, <i>SendNetRate</i>, <i>TotalReceivingSize</i>, <i>TotalSendingSize</i> and an array of structures named <i>PlayerNetInfos</i>. Each structure of the array PlayerNetInfos contains the following fields : <i>Login</i>, <i>IPAddress</i>, <i>LastTransferTime</i>, <i>DeltaBetweenTwoLastNetState</i>, <i>PacketLossRate</i>. Only available to SuperAdmin.</font></li>
<li><b>StartServerLan</b><br/>
boolean StartServerLan()<br/>
<font color="0x113355">Start a server on lan, using the current configuration. Only available to SuperAdmin.</font></li>
<li><b>StartServerInternet</b><br/>
boolean StartServerInternet(struct)<br/>
<font color="0x113355">Start a server on internet using the 'Login' and 'Password' specified in the struct passed as parameters. Only available to SuperAdmin.</font></li>
<li><b>GetStatus</b><br/>
struct GetStatus()<br/>
<font color="0x113355">Returns the current status of the server.</font></li>
<li><b>QuitGame</b><br/>
boolean QuitGame()<br/>
<font color="0x113355">Quit the application. Only available to SuperAdmin.</font></li>
<li><b>GameDataDirectory</b><br/>
string GameDataDirectory()<br/>
<font color="0x113355">Returns the path of the game datas directory. Only available to Admin.</font></li>
<li><b>GetTracksDirectory</b><br/>
string GetTracksDirectory()<br/>
<font color="0x113355">Returns the path of the tracks directory. Only available to Admin.</font></li>
<li><b>GetSkinsDirectory</b><br/>
string GetSkinsDirectory()<br/>
<font color="0x113355">Returns the path of the skins directory. Only available to Admin.</font></li>
</ul>
</body>
</html>

View File

@ -1,432 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>TrackMania Nations methods</title>
</head>
<body>
<h1>Available methods:</h1>
<ul>
<li><b>system.listMethods</b><br/>
array system.listMethods()<br/>
<font color="0x113355">Return an array of all available XML-RPC methods on this server.</font></li>
<li><b>system.methodSignature</b><br/>
array system.methodSignature(string)<br/>
<font color="0x113355">Given the name of a method, return an array of legal signatures. Each signature is an array of strings. The first item of each signature is the return type, and any others items are parameter types.</font></li>
<li><b>system.methodHelp</b><br/>
string system.methodHelp(string)<br/>
<font color="0x113355">Given the name of a method, return a help string.</font></li>
<li><b>system.multicall</b><br/>
array system.multicall(array)<br/>
<font color="0x113355">Process an array of calls, and return an array of results. Calls should be structs of the form {'methodName': string, 'params': array}. Each result will either be a single-item array containg the result value, or a struct of the form {'faultCode': int, 'faultString': string}. This is useful when you need to make lots of small calls without lots of round trips.</font></li>
<li><b>Authenticate</b><br/>
boolean Authenticate(string, string)<br/>
<font color="0x113355">Allow user authentication by specifying a login and a password, to gain access to the set of functionalities corresponding to this authorization level</font></li>
<li><b>ChangeAuthPassword</b><br/>
boolean ChangeAuthPassword(string, string)<br/>
<font color="0x113355">Change the password for the specified login/user. Only available to SuperAdmin.</font></li>
<li><b>EnableCallbacks</b><br/>
boolean EnableCallbacks(boolean)<br/>
<font color="0x113355">Allow the GameServer to call you back.</font></li>
<li><b>GetVersion</b><br/>
struct GetVersion()<br/>
<font color="0x113355">Returns a struct with the <i>Name</i>, <i>Version</i> and <i>Build</i> of the application remotely controled.</font></li>
<li><b>CallVote</b><br/>
boolean CallVote(string)<br/>
<font color="0x113355">Call vote for cmd. The command is a XML string corresponding to an XmlRpc request. Only available to Admin.</font></li>
<li><b>InternalCallVote</b><br/>
boolean InternalCallVote()<br/>
<font color="0x113355">Used internally by game.</font></li>
<li><b>CancelVote</b><br/>
boolean CancelVote()<br/>
<font color="0x113355">Cancel the current vote. Only available to Admin.</font></li>
<li><b>AddChatCommand</b><br/>
boolean AddChatCommand(string)<br/>
<font color="0x113355">Add a new command 'cmd' for the chat, i.e. a chat message that begins with '/cmd ' will not be transmitted to clients. Only available to Admin.</font></li>
<li><b>RemoveChatCommand</b><br/>
boolean RemoveChatCommand(string)<br/>
<font color="0x113355">Remove a chat command. Only available to Admin.</font></li>
<li><b>CleanChatCommand</b><br/>
boolean CleanChatCommand()<br/>
<font color="0x113355">Remove all chat commands. Only available to Admin.</font></li>
<li><b>GetChatCommandList</b><br/>
array GetChatCommandList(int, int)<br/>
<font color="0x113355">Returns the list of chat commands. This method takes two parameters. The first parameter specifies the maximum number of infos to be returned, and the second one the starting index in the list. The list is an array of structures. Each structure contains the following fields : <i>Name</i>.</font></li>
<li><b>ChatSend</b><br/>
boolean ChatSend(string)<br/>
<font color="0x113355">Send a text message to all clients. Only available to Admin.</font></li>
<li><b>ChatSendServerMessage</b><br/>
boolean ChatSendServerMessage(string)<br/>
<font color="0x113355">Send a text message to all clients without the server login. Only available to Admin.</font></li>
<li><b>ChatSendServerMessageToId</b><br/>
boolean ChatSendServerMessageToId(string, int)<br/>
<font color="0x113355">Send a text message to the client with the specified PlayerId without the server login. Only available to Admin.</font></li>
<li><b>ChatSendServerMessageToLogin</b><br/>
boolean ChatSendServerMessageToLogin(string, string)<br/>
<font color="0x113355">Send a text message to the client with the specified login without the server login. Only available to Admin.</font></li>
<li><b>ChatSendToLogin</b><br/>
boolean ChatSendToLogin(string, string)<br/>
<font color="0x113355">Send a text message to the client with the specified login. Only available to Admin.</font></li>
<li><b>ChatSendToId</b><br/>
boolean ChatSendToId(string, int)<br/>
<font color="0x113355">Send a text message to the client with the specified PlayerId. Only available to Admin.</font></li>
<li><b>GetChatLines</b><br/>
array GetChatLines()<br/>
<font color="0x113355">Returns the last chat lines. Maximum of 20 lines. Only available to Admin.</font></li>
<li><b>SendDisplayServerMessage</b><br/>
boolean SendDisplayServerMessage(string, string, string, int)<br/>
<font color="0x113355">Display a text message on all clients. The parameters are the text message to display, the label of the first button, the label of the second button, a timeout for the message box. This message is displayed in a message box with one or two buttons, if the label are not empty. The message box will disappear after the timeout if it's non-zero. Only available to Admin.</font></li>
<li><b>SendDisplayServerMessageToId</b><br/>
boolean SendDisplayServerMessageToId(int, string, string, string, int)<br/>
<font color="0x113355">Display a text message on the client with the specified UId. The parameters are the UId of the player, the text message to display, the label of the first button, the label of the second button, and a timeout for the message box. This message is displayed in a message box with one or two buttons, if the corresponding label are not empty. The message box will disappear after the timeout if it's non-zero. Only available to Admin.</font></li>
<li><b>SendDisplayServerMessageToLogin</b><br/>
boolean SendDisplayServerMessageToLogin(string, string, string, string, int)<br/>
<font color="0x113355">Display a text message on the client with the specified login. The parameters are the login of the player, the text message to display, the label of the first button, the label of the second button, and a timeout for the message box. This message is displayed in a message box with one or two buttons, if the corresponding label are not empty. The message box will disappear after the timeout if it's non-zero. Only available to Admin.</font></li>
<li><b>SendHideServerMessage</b><br/>
boolean SendHideServerMessage()<br/>
<font color="0x113355">Hide the displayed message on all clients. Only available to Admin.</font></li>
<li><b>SendHideServerMessageToId</b><br/>
boolean SendHideServerMessageToId(int)<br/>
<font color="0x113355">Hide the displayed message on the client with the specified UId. Only available to Admin.</font></li>
<li><b>SendHideServerMessageToLogin</b><br/>
boolean SendHideServerMessageToLogin(string)<br/>
<font color="0x113355">Hide the displayed message on the client with the specified login. Only available to Admin.</font></li>
<li><b>GetServerMessageResults</b> - <i>CRASHES SERVER WHEN CALLED FROM COMMAND LINE</i><br/>
array GetServerMessageResults()<br/>
<font color="0x113355">Returns the results of the message boxes, as an array of structs {login, playerid, result} result==0 -> no answer, result==1 or 2 -> answer from the player. Only available to Admin.</font></li>
<li><b>Kick</b><br/>
boolean Kick(string)<br/>
<font color="0x113355">Kick the player with the specified login. Only available to Admin.</font></li>
<li><b>KickId</b><br/>
boolean KickId(int)<br/>
<font color="0x113355">Kick the player with the specified PlayerId. Only available to Admin.</font></li>
<li><b>Ban</b><br/>
boolean Ban(string)<br/>
<font color="0x113355">Ban the player with the specified login. Only available to Admin.</font></li>
<li><b>BanId</b><br/>
boolean BanId(int)<br/>
<font color="0x113355">Ban the player with the specified PlayerId. Only available to Admin.</font></li>
<li><b>UnBan</b><br/>
boolean UnBan(string)<br/>
<font color="0x113355">Unban the player with the specified login. Only available to Admin.</font></li>
<li><b>CleanBanList</b><br/>
boolean CleanBanList()<br/>
<font color="0x113355">Clean the ban list of the server. Only available to Admin.</font></li>
<li><b>GetBanList</b><br/>
array GetBanList(int, int)<br/>
<font color="0x113355">Returns the list of players banned. This method takes two parameters. The first parameter specifies the maximum number of infos to be returned, and the second one the starting index in the list. The list is an array of structures. Each structure contains the following fields : <i>Login</i>, <i>ClientName</i> and <i>IPAddress</i>.</font></li>
<li><b>BlackList</b><br/>
boolean BlackList(string)<br/>
<font color="0x113355">Blacklist the player with the specified login. Only available to SuperAdmin.</font></li>
<li><b>UnBlackList</b><br/>
boolean UnBlackList(string)<br/>
<font color="0x113355">UnBlackList the player with the specified login. Only available to SuperAdmin.</font></li>
<li><b>CleanBlackList</b><br/>
boolean CleanBlackList()<br/>
<font color="0x113355">Clean the blacklist of the server. Only available to SuperAdmin.</font></li>
<li><b>GetBlackList</b><br/>
array GetBlackList(int, int)<br/>
<font color="0x113355">Returns the list of players blacklisted. This method takes two parameters. The first parameter specifies the maximum number of infos to be returned, and the second one the starting index in the list. The list is an array of structures. Each structure contains the following fields : <i>Login</i>.</font></li>
<li><b>AddGuest</b><br/>
boolean AddGuest(string)<br/>
<font color="0x113355">Add the player with the specified login on the guest list. Only available to Admin.</font></li>
<li><b>RemoveGuest</b><br/>
boolean RemoveGuest(string)<br/>
<font color="0x113355">Remove the player with the specified login from the guest list. Only available to Admin.</font></li>
<li><b>CleanGuestList</b><br/>
boolean CleanGuestList()<br/>
<font color="0x113355">Clean the guest list of the server. Only available to Admin.</font></li>
<li><b>GetGuestList</b><br/>
array GetGuestList(int, int)<br/>
<font color="0x113355">Returns the list of players on the guest list. This method takes two parameters. The first parameter specifies the maximum number of infos to be returned, and the second one the starting index in the list. The list is an array of structures. Each structure contains the following fields : <i>Login</i>.</font></li>
<li><b>WriteFile</b><br/>
boolean WriteFile(string, base64)<br/>
<font color="0x113355">Write the data to the specified file. The filename is relative to the Tracks path. Only available to Admin.</font></li>
<li><b>SetServerName</b><br/>
boolean SetServerName(string)<br/>
<font color="0x113355">Set a new server name in utf8 format. Only available to Admin. Max. length: 26 chars (incl. colors &amp; tags)</font></li>
<li><b>GetServerName</b><br/>
string GetServerName()<br/>
<font color="0x113355">Get the server name in utf8 format.</font></li>
<li><b>SetServerComment</b><br/>
boolean SetServerComment(string)<br/>
<font color="0x113355">Set a new server comment in utf8 format. Only available to Admin.</font></li>
<li><b>GetServerComment</b><br/>
string GetServerComment()<br/>
<font color="0x113355">Get the server comment in utf8 format.</font></li>
<li><b>SetServerPassword</b><br/>
boolean SetServerPassword(string)<br/>
<font color="0x113355">Set a new password for the server. Only available to Admin.</font></li>
<li><b>GetServerPassword</b><br/>
string GetServerPassword()<br/>
<font color="0x113355">Get the server password if called as Admin or Super Admin, else returns if a password is needed or not.</font></li>
<li><b>SetServerPasswordForSpectator</b><br/>
boolean SetServerPasswordForSpectator(string)<br/>
<font color="0x113355">Set a new password for the spectator mode. Only available to Admin.</font></li>
<li><b>GetServerPasswordForSpectator</b><br/>
string GetServerPasswordForSpectator()<br/>
<font color="0x113355">Get the password for spectator mode if called as Admin or Super Admin, else returns if a password is needed or not.</font></li>
<li><b>SetMaxPlayers</b><br/>
boolean SetMaxPlayers(int)<br/>
<font color="0x113355">Set a new maximum number of players. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetMaxPlayers</b><br/>
struct GetMaxPlayers()<br/>
<font color="0x113355">Get the current and next maximum number of players allowed on server. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetMaxSpectators</b><br/>
boolean SetMaxSpectators(int)<br/>
<font color="0x113355">Set a new maximum number of Spectators. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetMaxSpectators</b><br/>
struct GetMaxSpectators()<br/>
<font color="0x113355">Get the current and next maximum number of Spectators allowed on server. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>EnableP2PUpload</b><br/>
boolean EnableP2PUpload(boolean)<br/>
<font color="0x113355">Enable or disable peer-to-peer upload from server. Only available to Admin.</font></li>
<li><b>IsP2PUpload</b><br/>
boolean IsP2PUpload()<br/>
<font color="0x113355">Returns if the peer-to-peer upload from server is enabled.</font></li>
<li><b>EnableP2PDownload</b><br/>
boolean EnableP2PDownload(boolean)<br/>
<font color="0x113355">Enable or disable peer-to-peer download for server. Only available to Admin.</font></li>
<li><b>IsP2PDownload</b><br/>
boolean IsP2PDownload()<br/>
<font color="0x113355">Returns if the peer-to-peer download for server is enabled.</font></li>
<li><b>AllowChallengeDownload</b><br/>
boolean AllowChallengeDownload(boolean)<br/>
<font color="0x113355">Allow clients to download challenges from the server. Only available to Admin.</font></li>
<li><b>IsChallengeDownloadAllowed</b><br/>
boolean IsChallengeDownloadAllowed()<br/>
<font color="0x113355">Returns if clients can download challenges from the server.</font></li>
<li><b>SetLadderMode</b><br/>
boolean SetLadderMode(int)<br/>
<font color="0x113355">Set a new ladder mode between ladder inactive (0), normal mode (1), and forced ladder (2). Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetLadderMode</b><br/>
struct GetLadderMode()<br/>
<font color="0x113355">Get the current and next ladder mode on server. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetVehicleNetQuality</b><br/>
boolean SetVehicleNetQuality(int)<br/>
<font color="0x113355">Set the network vehicle quality to Fast (0) or High (1). Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetVehicleNetQuality</b><br/>
struct GetVehicleNetQuality()<br/>
<font color="0x113355">Get the current and next network vehicle quality on server. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetCallVoteTimeOut</b><br/>
boolean SetCallVoteTimeOut(int)<br/>
<font color="0x113355">Set a new timeout for waiting for votes. A zero value disables callvote. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetCallVoteTimeOut</b><br/>
struct GetCallVoteTimeOut()<br/>
<font color="0x113355">Get the current and next timeout for waiting for votes. The struct returned contains two fields 'CurrentValue' and 'NextValue'.</font></li>
<li><b>SetCallVoteRatio</b><br/>
boolean SetCallVoteRatio(double)<br/>
<font color="0x113355">Set a new ratio for accepting callvote. Must lie between 0 and 1. Only available to Admin.</font></li>
<li><b>GetCallVoteRatio</b><br/>
double GetCallVoteRatio()<br/>
<font color="0x113355">Get the current ratio for accepting callvote. This value lies between 0 and 1.</font></li>
<li><b>SetServerOptions</b><br/>
boolean SetServerOptions(struct)<br/>
<font color="0x113355">Set new server options using the struct passed as parameters. This struct must contain the following fields : <i>Name</i>, <i>Comment</i>, <i>Password</i>, <i>PasswordForSpectator</i>, <i>NextMaxPlayers</i>, <i>NextMaxSpectators</i>, <i>IsP2PUpload</i>, <i>IsP2PDownload</i>, <i>NextLadderMode</i>, <i>NextVehicleNetQuality</i>, <i>NextCallVoteTimeOut</i>, <i>CallVoteRatio</i> and <i>AllowChallengeDownload</i>. Only available to Admin. A change of NextMaxPlayers, NextMaxSpectators, NextLadderMode, NextVehicleNetQuality or NextCallVoteTimeOut requires a challenge restart to be taken into account.</font></li>
<li><b>GetServerOptions</b><br/>
struct GetServerOptions()<br/>
<font color="0x113355">Returns a struct containing the server options i.e. <i>Name</i>, <i>Comment</i>, <i>Password</i>, <i>PasswordForSpectator</i>, <i>CurrentMaxPlayers</i>, <i>NextMaxPlayers</i>, <i>CurrentMaxSpectators</i>, <i>NextMaxSpectators</i>, <i>IsP2PUpload</i>, <i>IsP2PDownload</i>, <i>CurrentLadderMode</i>, <i>NextLadderMode</i>, <i>CurrentVehicleNetQuality</i>, <i>NextVehicleNetQuality</i>, <i>CurrentCallVoteTimeOut</i>, <i>NextCallVoteTimeOut</i>, <i>CallVoteRatio</i> and <i>AllowChallengeDownload</i>.</font></li>
<li><b>LoadBlackList</b><br/>
boolean LoadBlackList(string)<br/>
<font color="0x113355">Load the black list file with the specified file name. Only available to SuperAdmin.</font></li>
<li><b>SaveBlackList</b><br/>
boolean SaveBlackList(string)<br/>
<font color="0x113355">Save the black list in the file with specified file name. Only available to SuperAdmin.</font></li>
<li><b>LoadGuestList</b><br/>
boolean LoadGuestList(string)<br/>
<font color="0x113355">Load the guest list file with the specified file name. Only available to Admin.</font></li>
<li><b>SaveGuestList</b><br/>
boolean SaveGuestList(string)<br/>
<font color="0x113355">Save the guest list in the file with specified file name. Only available to SuperAdmin.</font></li>
<li><b>GetLastConnectionErrorMessage</b><br/>
string GetLastConnectionErrorMessage()<br/>
<font color="0x113355">Returns the last error message for an internet connection. Only available to SuperAdmin.</font></li>
<li><b>ChallengeRestart</b><br/>
boolean ChallengeRestart()<br/>
<font color="0x113355">Restarts the challenge. Only available to Admin.</font></li>
<li><b>NextChallenge</b><br/>
boolean NextChallenge()<br/>
<font color="0x113355">Switch to next challenge. Only available to Admin.</font></li>
<li><b>StopServer</b><br/>
boolean StopServer()<br/>
<font color="0x113355">Stop the server. Only available to SuperAdmin.</font></li>
<li><b>ForceEndRound</b><br/>
boolean ForceEndRound()<br/>
<font color="0x113355">In Rounds or Laps mode, force the end of round without waiting for all players to giveup/finish. Only available to Admin.</font></li>
<li><b>SetGameInfos</b><br/>
boolean SetGameInfos(struct)<br/>
<font color="0x113355">Set new game settings using the struct passed as parameters. This struct must contain the following fields : <i>GameMode</i>, <i>RoundsPointsLimit</i>, <i>RoundsUseNewRules</i>, <i>TimeAttackLimit</i>, <i>TimeAttackSynchStartPeriod</i>, <i>TeamPointsLimit</i>, <i>TeamMaxPoints</i>, <i>TeamUseNewRules</i>, <i>LapsNbLaps</i>, <i>LapsTimeLimit</i> and <i>ChatTime</i>. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetCurrentGameInfo</b><br/>
struct GetCurrentGameInfo()<br/>
<font color="0x113355">Returns a struct containing the current game settings i.e. <i>GameMode</i>, <i>RoundsPointsLimit</i>, <i>RoundsUseNewRules</i>, <i>TimeAttackLimit</i>, <i>TimeAttackSynchStartPeriod</i>, <i>TeamPointsLimit</i>, <i>TeamMaxPoints</i>, <i>TeamUseNewRules</i>, <i>LapsNbLaps</i>, <i>LapsTimeLimit</i>, <i>ChatTime</i> and <i>NbChallenge</i>.</font></li>
<li><b>GetNextGameInfo</b><br/>
struct GetNextGameInfo()<br/>
<font color="0x113355">Returns a struct containing the game settings for the next challenge i.e. <i>GameMode</i>, <i>RoundsPointsLimit</i>, <i>RoundsUseNewRules</i>, <i>TimeAttackLimit</i>, <i>TimeAttackSynchStartPeriod</i>, <i>TeamPointsLimit</i>, <i>TeamMaxPoints</i>, <i>TeamUseNewRules</i>, <i>LapsNbLaps</i>, <i>LapsTimeLimit</i>, <i>ChatTime</i> and <i>NbChallenge</i>.</font></li>
<li><b>GetGameInfos</b><br/>
struct GetGameInfos()<br/>
<font color="0x113355">Returns a struct containing two other structures, the first containing the current game settings and the second the game settings for next challenge. The first structure is named <i>CurrentGameInfos</i> and the second <i>NextGameInfos</i>.</font></li>
<li><b>SetChatTime</b><br/>
boolean SetChatTime(int)<br/>
<font color="0x113355">Set a new chat time value in milliseconds. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetChatTime</b><br/>
struct GetChatTime()<br/>
<font color="0x113355">Get the current and next chat time. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetFinishTimeout</b><br/>
boolean SetFinishTimeout(int)<br/>
<font color="0x113355">Set a new finish timeout (for rounds/laps mode) value in milliseconds. 0 means default. 1 means adaptative to the duration of the challenge. Not available in 'nations'. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetFinishTimeout</b><br/>
struct GetFinishTimeout()<br/>
<font color="0x113355">Get the current and next FinishTimeout. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetGameMode</b><br/>
boolean SetGameMode(int)<br/>
<font color="0x113355">Set a new game mode between Rounds (0), TimeAttack (1), Team (2), Laps (3) and Stunts (4). Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetGameMode</b><br/>
int GetGameMode()<br/>
<font color="0x113355">Get the current game mode.</font></li>
<li><b>SetTimeAttackLimit</b><br/>
boolean SetTimeAttackLimit(int)<br/>
<font color="0x113355">Set a new time limit for time attack mode. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetTimeAttackLimit</b><br/>
struct GetTimeAttackLimit()<br/>
<font color="0x113355">Get the current and next time limit for time attack mode. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetTimeAttackSynchStartPeriod</b><br/>
boolean SetTimeAttackSynchStartPeriod(int)<br/>
<font color="0x113355">Set a new synchronised start period for time attack mode. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetTimeAttackSynchStartPeriod</b><br/>
struct GetTimeAttackSynchStartPeriod()<br/>
<font color="0x113355">Get the current and synchronised start period for time attack mode. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetLapsTimeLimit</b><br/>
boolean SetLapsTimeLimit(int)<br/>
<font color="0x113355">Set a new time limit for laps mode. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetLapsTimeLimit</b><br/>
struct GetLapsTimeLimit()<br/>
<font color="0x113355">Get the current and next time limit for laps mode. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetNbLaps</b><br/>
boolean SetNbLaps(int)<br/>
<font color="0x113355">Set a new number of laps for laps mode. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetNbLaps</b><br/>
struct GetNbLaps()<br/>
<font color="0x113355">Get the current and next number of laps for laps mode. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetRoundPointsLimit</b><br/>
boolean SetRoundPointsLimit(int)<br/>
<font color="0x113355">Set a new points limit for rounds mode. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetRoundPointsLimit</b><br/>
struct GetRoundPointsLimit()<br/>
<font color="0x113355">Get the current and next points limit for rounds mode. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetUseNewRulesRound</b><br/>
boolean SetUseNewRulesRound(int)<br/>
<font color="0x113355">Set if new rules are used for rounds mode. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetUseNewRulesRound</b><br/>
struct GetUseNewRulesRound()<br/>
<font color="0x113355">Get if the new rules are used for rounds mode (Current and next values). The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetTeamPointsLimit</b><br/>
boolean SetTeamPointsLimit(int)<br/>
<font color="0x113355">Set a new points limit for team mode. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetTeamPointsLimit</b><br/>
struct GetTeamPointsLimit()<br/>
<font color="0x113355">Get the current and next points limit for team mode. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetMaxPointsTeam</b><br/>
boolean SetMaxPointsTeam(int)<br/>
<font color="0x113355">Set a new number of maximum points per round for team mode. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetMaxPointsTeam</b><br/>
struct GetMaxPointsTeam()<br/>
<font color="0x113355">Get the current and next number of maximum points per round for team mode. The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>SetUseNewRulesTeam</b><br/>
boolean SetUseNewRulesTeam(int)<br/>
<font color="0x113355">Set if new rules are used for team mode. Only available to Admin. Requires a challenge restart to be taken into account.</font></li>
<li><b>GetUseNewRulesTeam</b><br/>
struct GetUseNewRulesTeam()<br/>
<font color="0x113355">Get if the new rules are used for team mode (Current and next values). The struct returned contains two fields <i>CurrentValue</i> and <i>NextValue</i>.</font></li>
<li><b>GetCurrentChallengeIndex</b><br/>
int GetCurrentChallengeIndex()<br/>
<font color="0x113355">Returns the current challenge index in the selection.</font></li>
<li><b>GetCurrentChallengeInfo</b><br/>
struct GetCurrentChallengeInfo()<br/>
<font color="0x113355">Returns a struct containing the infos for the current challenge. The struct contains the following fields : <i>Name</i>, <i>UId</i>, <i>FileName</i>, <i>Author</i>, <i>Environnement</i>, <i>Mood</i>, <i>BronzeTime</i>, <i>SilverTime</i>, <i>GoldTime</i>, <i>AuthorTime</i>, <i>CopperPrice</i> and <i>LapRace</i>.</font></li>
<li><b>GetChallengeInfo</b><br/>
struct GetChallengeInfo(string)<br/>
<font color="0x113355">Returns a struct containing the infos for the challenge with the specified filename. The struct contains the following fields : <i>Name</i>, <i>UId</i>, <i>FileName</i>, <i>Author</i>, <i>Environnement</i>, <i>Mood</i>, <i>BronzeTime</i>, <i>SilverTime</i>, <i>GoldTime</i>, <i>AuthorTime</i>, <i>CopperPrice</i> and <i>LapRace</i>.</font></li>
<li><b>GetChallengeList</b><br/>
array GetChallengeList(int, int)<br/>
<font color="0x113355">Returns a list of challenges among the current selection of the server. This method takes two parameters. The first parameter specifies the maximum number of infos to be returned, and the second one the starting index in the selection. The list is an array of structures. Each structure contains the following field : <i>Name</i>, <i>UId</i>, <i>FileName</i>, <i>Environnement</i>, <i>Mood</i>, <i>GoldTime</i> and <i>CopperPrice</i>.</font></li>
<li><b>AddChallenge</b><br/>
boolean AddChallenge(string)<br/>
<font color="0x113355">Add the challenge with the specified filename at the end of the current selection. Only available to Admin.</font></li>
<li><b>AddChallengeList</b><br/>
int AddChallengeList(array)<br/>
<font color="0x113355">Add the list of challenges with the specified filename at the end of the current selection. Only available to Admin.</font></li>
<li><b>RemoveChallenge</b><br/>
boolean RemoveChallenge(string)<br/>
<font color="0x113355">Remove the challenge with the specified filename from the current selection. Only available to Admin.</font></li>
<li><b>RemoveChallengeList</b><br/>
int RemoveChallengeList(array)<br/>
<font color="0x113355">Remove the list of challenges with the specified filenames from the current selection. The list of challenges to remove is an array of strings. Only available to Admin.</font></li>
<li><b>InsertChallenge</b><br/>
boolean InsertChallenge(string)<br/>
<font color="0x113355">Insert the challenge with the specified filename after the current challenge. Only available to Admin.</font></li>
<li><b>InsertChallengeList</b><br/>
int InsertChallengeList(array)<br/>
<font color="0x113355">Insert the list challenges with the specified filename after the current challenge. The list of challenges to insert is an array of strings. Only available to Admin.</font></li>
<li><b>ChooseNextChallenge</b><br/>
boolean ChooseNextChallenge(string)<br/>
<font color="0x113355">Set as next challenge the one with the specified filename, if it is present in the selection. Only available to Admin.</font></li>
<li><b>ChooseNextChallengeList</b><br/>
int ChooseNextChallengeList(array)<br/>
<font color="0x113355">Set as next challenge the list of challenges with the specified filenames, if they are present in the selection. Only available to Admin.</font></li>
<li><b>LoadMatchSettings</b><br/>
int LoadMatchSettings(string)<br/>
<font color="0x113355">Set a list of challenges defined in the playlist with the specified filename as the current selection of the server, and load the gameinfos from the same file. Only available to Admin.</font></li>
<li><b>AppendPlaylistFromMatchSettings</b><br/>
int AppendPlaylistFromMatchSettings(string)<br/>
<font color="0x113355">Add a list of challenges defined in the playlist with the specified filename at the end of the current selection. Only available to Admin.</font></li>
<li><b>SaveMatchSettings</b><br/>
int SaveMatchSettings(string)<br/>
<font color="0x113355">Save the current selection of challenges in the playlist with the specified filename, as well as the current gameinfos. Only available to Admin.</font></li>
<li><b>InsertPlaylistFromMatchSettings</b><br/>
int InsertPlaylistFromMatchSettings(string)<br/>
<font color="0x113355">Insert a list of challenges defined in the playlist with the specified filename after the current challenge. Only available to Admin.</font></li>
<li><b>GetPlayerList</b><br/>
array GetPlayerList(int, int)<br/>
<font color="0x113355">Returns the list of players on the server. This method takes two parameters. The first parameter specifies the maximum number of infos to be returned, and the second one the starting index in the list. The list is an array of structures. Each structure contains the following field : <i>Login</i>, <i>NickName</i>, <i>PlayerId</i>, <i>TeamId</i>, <i>IsSpectator</i>, <i>IsInOfficialMode</i> and <i>LadderRanking</i>.</font></li>
<li><b>GetPlayerInfo</b><br/>
struct GetPlayerInfo(string)<br/>
<font color="0x113355">Returns a struct containing the infos on the player with the specified login. The structure contains the following fields : <i>Login</i>, <i>NickName</i>, <i>IPAddress</i>, <i>ConnectionType</i>, <i>PlayerId</i>, <i>IsSpectator</i>, <i>IsInOfficialMode</i>, <i>HasJoinMatch</i>, a structure named <i>Avatar</i>, an array of structures named <i>Skins</i> and a structure named <i>LadderStats</i>. The structure <i>Avatar</i> and each structure of the array <i>Skins</i> contains two fields <i>FileName</i> and <i>Checksum</i>. The structure <i>LadderStats</i> contains the following fields : <i>Ranking</i>, <i>Score</i>, <i>LastMatchScore</i>, <i>NbrMatchWins</i>, <i>NbrMatchDraws</i>, <i>NbrMatchLosses</i>, <i>NbrTotalPlayers</i>, <i>TeamName</i>, <i>TeamRanking</i>, <i>NbrTotalTeams</i>.</font></li>
<li><b>GetCurrentRanking</b><br/>
array GetCurrentRanking(int, int)<br/>
<font color="0x113355">Returns the current ranking for the race in progress. This method takes two parameters. The first parameter specifies the maximum number of infos to be returned, and the second one the starting index in the ranking. The ranking returned is a list of structures. Each structure contains the following fields : <i>Login</i>, <i>NickName</i>, <i>PlayerId</i>, <i>Rank</i>, <i>BestTime</i>, <i>Score</i>, <i>NbrLapsFinished</i> and <i>LadderScore</i>. It also contains an array <i>BestCheckpoints</i> that contains the checkpoints times for the best race.</font></li>
<li><b>ForceScores</b><br/>
boolean ForceScores(array)<br/>
<font color="0x113355">Force the scores of the current game. Only available in rounds and team mode. You have to pass an array of structs with two fields: <i>PlayerId</i> and <i>Score</i>. Only available to Admin.</font></li>
<li><b>GetNetworkStats</b><br/>
struct GetNetworkStats()<br/>
<font color="0x113355">Returns a struct containing the networks stats of the server. The structure contains the following fields : <i>Uptime</i>, <i>NbrConnection</i>, <i>MeanConnectionTime</i>, <i>MeanNbrPlayer</i>, <i>RecvNetRate</i>, <i>SendNetRate</i>, <i>TotalReceivingSize</i>, <i>TotalSendingSize</i> and an array of structures named <i>PlayerNetInfos</i>. Each structure of the array PlayerNetInfos contains the following fields : <i>Login</i>, <i>IPAddress</i>, <i>LastTransferTime</i>, <i>DeltaBetweenTwoLastNetState</i>, <i>PacketLossRate</i>. Only available to SuperAdmin.</font></li>
<li><b>GetValidationReplay</b><br/>
base64 GetValidationReplay(string)<br/>
<font color="0x113355">Returns a replay containing the data needed to validate the current best time of the player.</font></li>
<li><b>StartServerLan</b><br/>
boolean StartServerLan()<br/>
<font color="0x113355">Start a server on lan, using the current configuration. Only available to SuperAdmin.</font></li>
<li><b>StartServerInternet</b><br/>
boolean StartServerInternet(struct)<br/>
<font color="0x113355">Start a server on internet using the 'Login' and 'Password' specified in the struct passed as parameters. Only available to SuperAdmin.</font></li>
<li><b>GetStatus</b><br/>
struct GetStatus()<br/>
<font color="0x113355">Returns the current status of the server.</font></li>
<li><b>QuitGame</b><br/>
boolean QuitGame()<br/>
<font color="0x113355">Quit the application. Only available to SuperAdmin.</font></li>
<li><b>GetBaseDirectory</b><br/>
string GetBaseDirectory()<br/>
<font color="0x113355">Returns the path of the dedicated server application. Only available to Admin.</font></li>
<li><b>GameDataDirectory</b><br/>
string GameDataDirectory()<br/>
<font color="0x113355">Returns the path of the game datas directory. Only available to Admin.</font></li>
<li><b>GetTracksDirectory</b><br/>
string GetTracksDirectory()<br/>
<font color="0x113355">Returns the path of the tracks directory. Only available to Admin.</font></li>
<li><b>GetSkinsDirectory</b><br/>
string GetSkinsDirectory()<br/>
<font color="0x113355">Returns the path of the skins directory. Only available to Admin.</font></li>
</ul>
</body>
</html>

View File

@ -1,24 +0,0 @@
0/ Save "aseco/plugins.xml" somewhere
1/ Copy "jfreu.config.php", "jfreu.plugin.php" , "chat.jfreu.php"
the "jfreu" directory in your aseco plugins directory (aseco/plugins/)
2/ Add "<plugin>jfreu.plugin.php</plugin>" before "</aseco_plugins>"
in "plugins.xml" in your aseco directory (aseco/plugins.xml)
3/ Edit "jfreu.config.php" in your aseco plugins directory (aseco/plugins/)
change the server name, ranklimit,...(customise the plugin ^^)
4/ Edit "jfreu/jfreu.lists.xml" and add VIP, team_vip & admins
5/ Run Aseco and enjoy. ("/help" & "/jfreu help" for new commands avilable)
New admin commands are : "/jfreu [command]" (ex: "/jfreu novote ON")
Any problem or suggestion -> http://jfreu.servegame.com (forum)
?/ To uninstall the plugin delete "jfreu.config.php", "jfreu.plugin.php",
"chat.jfreu.php" and the "jfreu" directory in your aseco plugins directory
(aseco/plugins/) and overwrite modified file with your saved one
("aseco/plugins.xml") or remove the "<plugin>jfreu.plugin.php</plugin>" line.

View File

@ -1,121 +0,0 @@
~~[ v0.13d ]~~
- Add : "/jfreu banfor X login" to ban a player for X min
- Fix : banFor X min ban for X min (not for X min - 30 sec)
- Fix : bug with non-included chat & settings files
- Upg : unspec command cancel the player's vote to unspec him.
- Upg : "unspec vote" ban the player for 5 min if vote result is NO.
- Upg : badwordsban ban the player for 10 min.
- Upg : in "unspec vote" +50% yes -> yes | +49% no -> no.
~~[ v0.13c ]~~
- Fix : "/jfreu kickHiRank ON/OFF" fixed : kick worst ranked players
when the server is "full".
- Fix : "/jfreu kickWorst X" fixed : kick X wost players.
~~[ v0.13b ]~~
- Add : the word between the server's name and the limit
(usually "Top") can be changed.
- Add : autoChangeName can be turned OFF
(server's name when the limit changes)
- Add : TEAM_VIP all team members are vip.
- Add : "/uptodate" command to know if the version of the
plugin is up to date.
- Add : NewPlayer message when a new player joins and ranklimit
is OFF.
- Add : "/jfreu removevip" & "/jfreu removeteamvip" to remove
a vip & a team_vip ingame (by an admin).
- Upg : Admins, VIP and TEAM_VIP added ingame are saved in a
xml file ("jfreu/jfreu.lists.xlm")
- Upg : All the plugin's admin commands are "jfreu commands" now,
to avoid the bug with "/admin help", now it is "/jfreu help"
the plugin's admin commands are "/jfreu [command]"
- Upg : Cancel custom vote ('unspec') when the player disconects.
~~[ v0.13a ]~~
- Add : Admin command "addadmin {login}" to add an admin.
- Add : Admin private message to login :
/admin messagetologin {login} {message}
- Add : Hardlimit : players, VIP, specs over the hardlimit
are kicked (without message in the chat)
- Add : Admins can change the hardlimit ingame.
- Add : SpecOnly command unspec to launch an unspec vote.
- Add : If a player leaves the game his vote is canceled.
- Fix : novote can be turned OFF.
- Fix : fix bug in "clean_nick" function.
- Fix : No more timeOut crash
- Fix : PM fixed (no more server's login at the begining)
- Upg : badWord bot more powerfull.
( "$zS$wHh$00FIII$wiiI$nT" is a badword )
- Upg : Colors in the plugin are aseco's colors.
- Upg : Ranklimit & Info commands send a PM to the player.
- Upg : Unspec and VIP not in server average if autorankVIP ON.
~~[ v0.12d ]~~
- Add : Admin command "unspec" to allow a "SpecOnly" to join
the race.
- Add : custom maxBadWords
- Add : BadWordsBan (ON/OFF) ban when 2x maxBadWords
- Add : Admin command KickWorst to kick worst ranked players
except vip.
- Add : admin cancelvote to cancel current vote
(kick/ban/nextmap/restartmap)
- Add : novote (ON/OFF) to autocancel votes
- Upg : kickhirank function use KickWorst function.
~~[ v0.12c ]~~
- Add : SpecOnly are kicked if they join the race
- Fix : bug with "admin help"
- Fix : bug with "autorankvip"
- Fix : bug with "autorankvip" default state
~~[ v0.12b ]~~
- Add : "BadWords" -> 3 "badwords" = kicked (on/off)
- Add : random information message at the end of the race
(editable) (on/off)
- Add : players over ranklimit can join the game as spec
- Add : kick hiRank players if server is "full"
(custom maxplayers) (on/off)
- Fix : problem with "chat.admin" overwritten
~~[ v0.11a ]~~
- Add : autoRankMinPlayer : autorank disabled when not enough
players then limit = Ranklimit.
autoRankMinPlayer value can be changed ingame (by admins)
Autorank limit = Ranklimit when not enough players
- Add : admin can add VIP ingame (deleted when aseco restarts)
- Add : admin can force Autorank limit (until a new player comes)
~~[ v0.10b ]~~
- Add : admin command : /admin player {login} {message}
- Fix : bug with AutoRank Offset.
- Fix : bug timeOut crash.
~~[ v0.09e ]~~
- Add : RankLimit can be turned on/off ingame (by an admin)
- Add : AutoRank offset value can be changed ingame (by an admin)
- Add : AutoRankLimit is changed when a player left the game
~~[ v0.08 ]~~
- Rank limit (new player with a rank over the limit is kicked)
- AutoRankLimit (DynaRank) : server's rank + offset = ranklimit
- Change the server's name when the limit is changed :
[ServerName]Top[Limit]
- Server's messages in chat : "[ServerName] your message"
- fake rec : ">> XXX took the 1. rank with a time of... !
- informations on account : IP/port/login/nick/score/rank
- AutoRankLimit can be turned on/off ingame (by an admin)
- Rank limit value can be changed ingame (by an admin)
- ...

View File

@ -1,23 +0,0 @@
////////////////////////////////////
//Plugin Auto TimeLimit
//Changes Timelimit for TimeAttack dynamically depending on the next
// track's author time
//
//Written by ck|cyrus
//martin@die-webber.com
//www.chaoskrieger.com
////////////////
// Installation
- Copy file "plugin.autotime.php" into your XAseco plugin directory
- Copy file "autotime.xml" into your XAseco main directory
- Add <plugin>plugin.autotime.php</plugin> at the END of your "plugins.xml"
- Open file "autotime.xml" and edit the variables to your liking
- Have fun and enjoy playing with nice timings!
////////////////
// SUPPORT:
Visit: http://www.tm-forum.com/viewtopic.php?t=6563
ICQ: 85020221

View File

@ -1,144 +0,0 @@
BEFORE ATTEMPTING TO INSTALL RASP, YOU MUST HAVE A FULLY WORKING VERSION OF ASECO 0.6.1b RUNNING ON A LOCAL DATABASE
Introduction
------------
Rasp is a plugin pack for the aseco server script. The core rasp plugin is the ranks and stats system which heavily relies on aseco's records system. The other plugins are extra features which you can add/remove as you please and are completely independent of the core plugin.
Features
--------
Here is a list of the features:
- In-built rank system which assigns a rank based on all records a player has made.
- Stats calculation which shows a player their personal best and average time on a track.
- Jukebox system which allows a player to select their favorite tracks to be played.
- Direct adding of tracks from http://nations.tm-exchange.com (Nations only)
- Karma system which works as a simple but effective replacement of the voting system.
- Built in IRC bot which links your server to a channel on an IRC server.
- /nextmap command which shows the track that will be played next on the server.
- /hi, /bye, /gg, /lol commands from FAST.
- /msg command which allows players to communicate privately via private message.
- Team match scoring & output
- New admin commands
Minimum Requirements
--------------------
-Php5 or above (haven't tested with php4 but feel free to try)
-MySQL 5.1 or above
-Stable installation of Aseco 0.6.1b
Installation
------------
--CORE PLUGIN--
Before installing the core plugin you MUST ensure Aseco 0.6.1b is running stable on your server. Resolve any issues with aseco before attempting to install rasp.
1. BACK UP your working ASECO files!!!!!!!!! All of them, including files in subdirectories!!!!!
2. Un-rar/un-zip the rasp files and upload the following to the appropriate directory on your server. All files must be within the aseco root folder and in their correct directories.
- all but five of the files are in their correct directories in the current zip file; use winzip, or similar, and extract with folder/subdirectory names to the main aseco folder
- overwrite existing files with all of the ones that are in the zip file
- newinstall/rasp.settings.php has default values in it for a new install. Move it to the includes folder only if this is a brand new install of RASP and you don't yet have an includes/rasp.settings.php file.
- newinstall/*.xml goes in the main ASECO directory. If you are already running ASECO/RASP, you can leave these alone.
3. Run the rasp.sql file on your aseco database, either with PhpMyAdmin or with console access to mysql.
4, 5, & 6 apply to new installs only. Existing installs can skip these steps.
4. Edit includes/rasp.settings.php as required.
5. Edit plugins.xml to display the line <plugin>plugin.rasp.php</plugin> or copy the one out of newinstall and edit as needed.
6. Edit rasp.xml, localdatabase.xml, publicdatabase.xml in the main ASECO directory as needed.
7. If you had an existing RASP installation (prior to 1.1), open newinstall/localdatabase.xml and copy over the <messages> section to your existing localdatabase.xml. Do the same for publicdatabase.xml.
8. If you had an existing RASP installation prior to 1.1, and are going to use the matchsave feature, edit matchsave.xml and make appropriate changes as necessary. If you don't want a continuous output file (append, instead of overwrite), you should be able to use nul: for Windows, and /dev/null for linux. If you don't want matchsave, don't add it to plugins.xml.
9. Restart Aseco!
Any problems go to http://www.tm-forum.com/viewtopic.php?t=3356
--ADDITIONAL PLUGINS--
The extra plugins can be used independently or alongside the core plugin. If
used independently you must ensure rasp.settings.php has been copied over to
the includes directory.
1. Place the plugin file inside the plugins folder for your aseco installation.
2. Insert the line <plugin>plugin.rasp_*plugin-name*.php</plugin> in plugins.xml
3. Modify includes/rasp.settings.php as required.
3. Restart aseco.
plugin.rasp_jukebox.php
-----------------------
This plugin adds the jukebox function to your server, as well as the jukebox extension for requesting tracks directly from TM-Exchange. There are several variables inside rasp.settings.php which correspond to this plugin.
To add a track to the jukebox type:
/jukebox <track_id>
To check what a track's ID is use /list. If you do /list xxx, you'll get a list of all tracks with "xxx" in their name, or author's name.
To find out the best & worst rated tracks, use /list karma +# or -#. You'll get back a list of all tracks with # or higher value for +, and all tracks with # or lower for -.
If an admin wants to clear the jukebox use /admin clearjukebox (requires the rasp version of chat.admin.php)
To add a track from TM-Exchange use:
/add <tmx_id>
The tmx_id is the number on the end of the external link which is at the top of a track's page in TMX.
Using the /add command successfuly will start a vote. You can specify the pass ratio in rasp.settings.php
If a player wants to vote for the track they must use /y.
If the vote is successful the track will be added to the jukebox. Once the track has been played it is removed from the map rotation. To add a track permenantly use /admin add <tmx_id> (requires the rasp version of chat.admin.php)
plugin.rasp_chat.php
--------------------
This plugin adds various chat commands to your server which were originally seen in FAST. These commands include /hi, /bye, /gg, /lol, /lool, /msg
To use the hi/bye/gg commands you must use the following syntax (with /hi used as an example)
/hi --displays the message "Hello all !"
/hi player_name --displays "Hello player_name !"
The /msg command is used for sending private messages.
/msg player_login *some text* --will send *some text* to the player whose login name is player_login.
/lol & /lool don't require any arguments.
plugin.rasp_karma.php
---------------------
This plugin adds a replacement to the built-in voting system for aseco. It is much easier to use and seems to get more usage than the original /vote command. Players type "/++" if they like a track and "/--" if they don't. The /karma command shows the track's current karma.
plugin.rasp_irc.php
-------------------
If this plugin is added it will link your server to an IRC channel. You MUST specify the IRC variables in rasp.settings.php before adding this plugin. If successful you will see a bot in your chosen channel which will relay all chat from your server. It also parses the messages typed by other users in the channel and relays them to the TM-server. It is recommended you use a seperate channel for this bot, as putting it in an existing channel will make it virtually un-usable for anything else if you have a busy server.
plugin.rasp_nextmap.php
-----------------------
This plugin is fairly simple. It adds one command to your server, /nextmap which shows the map to be played next on the server.
---------------------------------------------
Released under the GNU General Public License
Copyright (C) 2006 Iain Surgey
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 2
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, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

Binary file not shown.

View File

@ -1,119 +0,0 @@
<?php
/* vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2: */
/**
* ShareMania info plugin.
* Displays ShareMania track info
* Created by Xymph
*
* Dependencies: none
*/
require_once('includes/sminfofetcher.inc.php'); // provides access to SM info
Aseco::addChatCommand('sminfo', 'Displays ShareMania info {Track_ID/SM_ID}');
function chat_sminfo($aseco, $command) {
$player = $command['author'];
$login = $player->login;
$command['params'] = explode(' ', preg_replace('/ +/', ' ', $command['params']));
// check for optional Track/SM ID parameter
$id = $aseco->server->challenge->uid;
$name = $aseco->server->challenge->name;
if ($command['params'][0] != '') {
if (is_numeric($command['params'][0]) && $command['params'][0] > 0) {
$tid = ltrim($command['params'][0], '0');
// check for possible track ID
if ($tid <= count($player->tracklist)) {
// find UID by given track ID
$tid--;
$id = $player->tracklist[$tid]['uid'];
$name = $player->tracklist[$tid]['name'];
} else {
// consider it an SM ID
$id = $tid;
$name = '';
}
} else {
$message = '{#server}> {#highlite}' . $tid . '{#error} is not a valid Track/SM ID!';
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
return;
}
}
// obtain SM info
$data = new SMInfoFetcher($id);
if (!$data->name) {
$message = '{#server}> {#highlite}' . ($name != '' ? stripColors($name) : $id) .
'{#error} is not a known SM track, or ShareMania is down!';
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
return;
}
$data->name = stripNewlines($data->name);
// compile & send message
if ($aseco->server->getGame() == 'TMN') {
$stats = 'SM Info for: {#black}' . $data->name . '$z' . LF . LF;
$stats .= '$gSM ID : {#black}' . $data->id . LF;
$stats .= '$gUID : {#black}$n' . $data->uid . '$m' . LF;
$stats .= '$gAuthor : {#black}' . $data->author . LF;
$stats .= '$gUploaded : {#black}' . preg_replace('/^\d\d\d\d/', '\$n$0\$m', strftime('%Y-%m-%d %H:%M', $data->uploaded)) . LF;
if ($data->type == 'Stunts')
$stats .= '$gAuthorSc : {#black}' . $data->authorsc . LF;
else
$stats .= '$gAuthorTm : {#black}' . formatTime($data->authortm) . LF;
$stats .= '$gGame : {#black}' . $data->game . LF;
$stats .= '$gType : {#black}' . $data->type . LF;
$stats .= '$gEnviron : {#black}' . $data->envir . LF;
$stats .= '$gMood : {#black}' . $data->mood . LF;
$stats .= '$gNumLaps : {#black}' . $data->nblaps . LF;
$stats .= '$gCoppers : {#black}' . $data->coppers . LF;
$stats .= '$gRating : {#black}' . $data->rating . LF;
$stats .= '$gVotes : {#black}' . $data->votes . LF;
$stats .= '$gDownloads: {#black}' . $data->dnloads;
// display popup message
$aseco->client->query('SendDisplayServerMessageToLogin', $login, $aseco->formatColors($stats), 'OK', '', 0);
} elseif ($aseco->server->getGame() == 'TMF') {
$header = 'SM Info for: {#black}' . $data->name;
$links = array($data->imageurl, true,
'$l[' . $data->pageurl . ']Visit SM Page',
'$l[' . $data->dloadurl . ']Download Track');
$stats = array();
$stats[] = array('SM ID', '{#black}' . $data->id,
'Game', '{#black}' . $data->game);
$stats[] = array('UID', '{#black}$n' . $data->uid,
'Type', '{#black}' . $data->type);
$stats[] = array('Author', '{#black}' . $data->author,
'Environ', '{#black}' . $data->envir);
$stats[] = array('Uploaded', '{#black}' . strftime('%Y-%m-%d %H:%M', $data->uploaded),
'Mood', '{#black}' . $data->mood);
if ($data->type == 'Stunts')
$stats[] = array('AuthorSc', '{#black}' . $data->authorsc,
'NumLaps', '{#black}' . $data->nblaps);
else
$stats[] = array('AuthorTm', '{#black}' . formatTime($data->authortm),
'NumLaps', '{#black}' . $data->nblaps);
$stats[] = array('Rating', '{#black}' . $data->rating,
'Coppers', '{#black}' . $data->coppers);
$stats[] = array('Votes', '{#black}' . $data->votes,
'Downloads', '{#black}' . $data->dnloads);
// display custom ManiaLink message
display_manialink_track($login, $header, array('Icons64x64_1', 'Maximize', -0.01), $links, $stats, array(1.15, 0.2, 0.45, 0.2, 0.3), 'OK');
} else { // TMS/TMO
$stats = '{#server}ShareMania Info for: {#highlite}' . $data->name . '$z' . LF;
$stats .= '{#server}SM ID : {#highlite}' . $data->id . LF;
$stats .= '{#server}UID : {#highlite}' . $data->uid . LF;
$stats .= '{#server}Author : {#highlite}' . $data->author . LF;
$stats .= '{#server}Rating : {#highlite}' . $data->rating;
// show chat message
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($stats), $login);
}
} // chat_sminfo
?>

View File

@ -1,149 +0,0 @@
<?php
/* vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2: */
/**
* SMInfoFetcher - Fetch ShareMania info for TM tracks
* Created by Xymph <tm@gamers.org>
* Based on TMXInfoFetcher & http://www.sharemania.eu/api_tutorial.php
*
* v1.2: Added magic __set_state function to support var_export()
* v1.1: Optimized get_file URL parsing
* v1.0: Initial release
*/
class SMInfoFetcher {
public $uid, $id,
$name, $stname, $author,
$game, $type, $envir, $mood, $nblaps, $coppers,
$bronzetm, $silvertm, $goldtm, $authortm, $authorsc,
$rating, $votes, $dnloads, $uploaded,
$pageurl, $imageurl, $dloadurl;
/**
* Fetches a hell of a lot of data about a SM track
*
* @param String $id
* The challenge UID to search for (if a 26/27-char alphanum string),
* otherwise the SM ID to search for (if a number)
* @return SMInfoFetcher
* If $name is empty, track was not found
*/
public function SMInfoFetcher($id) {
// check for UID string
if (preg_match('/^\w{26,27}$/', $id)) {
$this->uid = $id;
$this->getData(true);
// check for SM ID
} elseif (is_numeric($id) && $id > 0) {
$this->id = floor($id);
$this->getData(false);
}
} // SMInfoFetcher
public function __set_state($import) {
$sm = new SMInfoFetcher(0);
$sm->uid = $import['uid'];
$sm->id = $import['id'];
$sm->name = $import['name'];
$sm->stname = $import['stname'];
$sm->author = $import['author'];
$sm->game = $import['game'];
$sm->type = $import['type'];
$sm->envir = $import['envir'];
$sm->mood = $import['mood'];
$sm->nblaps = $import['nblaps'];
$sm->coppers = $import['coppers'];
$sm->bronzetm = $import['bronzetm'];
$sm->silvertm = $import['silvertm'];
$sm->goldtm = $import['goldtm'];
$sm->authortm = $import['authortm'];
$sm->authorsc = $import['authorsc'];
$sm->rating = $import['rating'];
$sm->votes = $import['votes'];
$sm->dnloads = $import['dnloads'];
$sm->uploaded = $import['uploaded'];
$sm->pageurl = $import['pageurl'];
$sm->imageurl = $import['imageurl'];
$sm->dloadurl = $import['dloadurl'];
return $sm;
} // __set_state
private function getData($isuid) {
// get all track info
$file = $this->get_file('http://www.sharemania.eu/api.php?i&u&n&sn&a&gv&e&m&ty&nbl&c&t&p&pa&id=' . ($isuid ? $this->uid : $this->id));
if ($file === false || $file == -1)
return false;
// parse XML info
if (!$xml = @simplexml_load_string($file))
return false;
// extract all track info
if ($isuid)
$this->id = (string) $xml->header->i;
else
$this->uid = (string) $xml->header->u;
$this->name = (string) $xml->header->n;
$this->stname = (string) $xml->header->sn;
$this->author = (string) $xml->header->a;
$this->type = (string) $xml->header->ty;
$this->game = (string) $xml->header->gv;
$this->envir = (string) $xml->header->e;
$this->mood = (string) $xml->header->m;
$this->nblaps = (string) $xml->header->nbl;
$this->coppers = (string) $xml->header->c;
$this->bronzetm = (string) $xml->times->b;
$this->silvertm = (string) $xml->times->s;
$this->goldtm = (string) $xml->times->g;
$this->authortm = (string) $xml->times->at;
$this->authorsc = (string) $xml->times->as;
$this->rating = (string) $xml->infos->r;
$this->votes = (string) $xml->infos->v;
$this->dnloads = (string) $xml->infos->d;
$this->uploaded = (string) $xml->infos->ud;
$this->imageurl = (string) $xml->pic;
$this->pageurl = 'http://www.sharemania.eu/track.php?id=' . $this->id;
$this->dloadurl = 'http://www.sharemania.eu/download.php?id=' . $this->id;
} // getData
// Simple HTTP Get function with timeout
// ok: return string || error: return false || timeout: return -1
private function get_file($url) {
$url = parse_url($url);
$port = isset($url['port']) ? $url['port'] : 80;
$query = isset($url['query']) ? "?" . $url['query'] : "";
$fp = @fsockopen($url['host'], $port, $errno, $errstr, 4);
if (!$fp)
return false;
fwrite($fp, 'GET ' . $url['path'] . $query . " HTTP/1.0\r\n" .
'Host: ' . $url['host'] . "\r\n\r\n");
stream_set_timeout($fp, 2);
$res = '';
$info['timed_out'] = false;
while (!feof($fp) && !$info['timed_out']) {
$res .= fread($fp, 512);
$info = stream_get_meta_data($fp);
}
fclose($fp);
if ($info['timed_out']) {
return -1;
} else {
if (substr($res, 9, 3) != '200')
return false;
$page = explode("\r\n\r\n", $res, 2);
return trim($page[1]);
}
} // get_file
} // class SMInfoFetcher
?>

View File

@ -1,194 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<TITLE>TrackMania Nations - XASECO administrator abilities</TITLE>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<META NAME="author" CONTENT="Frans P. de Vries">
<META NAME="generator" CONTENT="vi :)">
<style type="text/css">
body { width: 960px; margin-left: 30px; font-family: Arial,Helvetica,sans-serif; font-size: 15px; }
li,div { padding: 3px; }
code,pre { font-size: 14px; }
pre { width: 90%; margin: 3px 0px; padding: 3px 0px 3px 12px; background-color: #F0F0F0; }
</style>
<META NAME="keywords" CONTENT="TrackMania, Forever, United, Nations, Original, Sunrise, racing, games, XASECO, ASECO, RASP, Jfreu, plugins, records, jukebox, Nadeo">
<META NAME="description" CONTENT="Information on the XASECO system for TrackMania Nations and Forever (& Original/Sunrise), racing games by Nadeo">
</HEAD>
<BODY TEXT="#000000" LINK="#ff0000" VLINK="#0000ff" ALINK="#00ff00" BGCOLOR="#ffffff">
<P ALIGN="center">
<A TARGET="_blank" HREF="http://eswc.trackmanianations.com/"><IMG SRC="banner.jpg" ALT="TrackMania Nations" BORDER="0" WIDTH="590" HEIGHT="149"></A>
<HR>
<H3>XASECO Administrator abilities:</H3>
<CENTER>
<TABLE WIDTH="80%" BORDER="1" CELLPADDING="4" CELLSPACING="0">
<THEAD>
<TR>
<TD><b>Ability</b></TD><TD><b>Description</b></TD><TD align="center"><b>MasterAdmin</b></TD><TD align="center"><b>Admin</b></TD><TD align="center"><b>Operator</b></TD>
</TR>
</THEAD>
<TBODY>
<TR><TD>help</TD><TD>use <b>/admin help</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>helpall</TD><TD>use <b>/admin helpall</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>setservername</TD><TD>use <b>/admin setservername</b></TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>setcomment</TD><TD>use <b>/admin setcomment</b></TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>setpwd</TD><TD>use <b>/admin setpwd</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>setspecpwd</TD><TD>use <b>/admin setspecpwd</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>setrefpwd (TMF)</TD><TD>use <b>/admin setrefpwd</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>setmaxplayers</TD><TD>use <b>/admin setmaxplayers</b></TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>setmaxspecs</TD><TD>use <b>/admin setmaxspecs</b></TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>setgamemode</TD><TD>use <b>/admin setgamemode</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>setrefmode (TMF)</TD><TD>use <b>/admin setrefmode</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>nextmap</TD><TD>use <b>/admin nextmap</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>next</TD><TD>use <b>/admin next</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>skipmap</TD><TD>use <b>/admin skipmap</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>skip</TD><TD>use <b>/admin skip</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>previous</TD><TD>use <b>/admin previous</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>prev</TD><TD>use <b>/admin prev</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>nextenv (TMUF)</TD><TD>use <b>/admin nextenv</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>restartmap</TD><TD>use <b>/admin restartmap</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>res</TD><TD>use <b>/admin res</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>replaymap</TD><TD>use <b>/admin replaymap</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>replay</TD><TD>use <b>/admin replay</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>dropjukebox</TD><TD>use <b>/admin dropjukebox</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>djb</TD><TD>use <b>/admin djb</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>clearjukebox</TD><TD>use <b>/admin clearjukebox</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>clearhist</TD><TD>use <b>/admin clearhist</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>cjb</TD><TD>use <b>/admin cjb</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>add</TD><TD>use <b>/admin add</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>addthis</TD><TD>use <b>/admin addthis</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>addlocal</TD><TD>use <b>/admin addlocal</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>warn</TD><TD>use <b>/admin warn</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>kick</TD><TD>use <b>/admin kick</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>kickghost</TD><TD>use <b>/admin kickghost</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>ban</TD><TD>use <b>/admin ban</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>unban</TD><TD>use <b>/admin unban</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>banip</TD><TD>use <b>/admin banip</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>unbanip</TD><TD>use <b>/admin unbanip</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>black</TD><TD>use <b>/admin black</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>unblack</TD><TD>use <b>/admin unblack</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>addguest</TD><TD>use <b>/admin addguest</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>removeguest</TD><TD>use <b>/admin removeguest</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>pass</TD><TD>use <b>/admin pass</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>cancel</TD><TD>use <b>/admin cancel</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>can</TD><TD>use <b>/admin can</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>endround</TD><TD>use <b>/admin endround</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>er</TD><TD>use <b>/admin er</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>players</TD><TD>use <b>/admin players</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>showbanlist</TD><TD>use <b>/admin showbanlist</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>listbans</TD><TD>use <b>/admin listbans</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>showiplist</TD><TD>use <b>/admin showiplist</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>listips</TD><TD>use <b>/admin listips</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>showblacklist</TD><TD>use <b>/admin showblacklist</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>listblacks</TD><TD>use <b>/admin listblacks</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>showguestlist</TD><TD>use <b>/admin showguestlist</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>listguests</TD><TD>use <b>/admin listguests</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>writeiplist</TD><TD>use <b>/admin writeiplist</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>readiplist</TD><TD>use <b>/admin readiplist</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>writeblacklist</TD><TD>use <b>/admin writeblacklist</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>readblacklist</TD><TD>use <b>/admin readblacklist</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>writeguestlist</TD><TD>use <b>/admin writeguestlist</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>readguestlist</TD><TD>use <b>/admin readguestlist</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>cleanbanlist</TD><TD>use <b>/admin cleanbanlist</b></TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>cleaniplist</TD><TD>use <b>/admin cleaniplist</b></TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>cleanblacklist</TD><TD>use <b>/admin cleanblacklist</b></TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>cleanguestlist</TD><TD>use <b>/admin cleanguestlist</b></TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>mergegbl</TD><TD>use <b>/admin mergegbl</b></TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>access</TD><TD>use <b>/admin access</b></TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>writetracklist</TD><TD>use <b>/admin writetracklist</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>readtracklist</TD><TD>use <b>/admin readtracklist</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>shuffle</TD><TD>use <b>/admin shuffle</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>shufflemaps</TD><TD>use <b>/admin shufflemaps</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>listdupes</TD><TD>use <b>/admin listdupes</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>remove</TD><TD>use <b>/admin remove</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>erase</TD><TD>use <b>/admin erase</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>removethis</TD><TD>use <b>/admin removethis</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>erasethis</TD><TD>use <b>/admin erasethis</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>mute</TD><TD>use <b>/admin mute</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>ignore</TD><TD>use <b>/admin ignore</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>unmute</TD><TD>use <b>/admin unmute</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>unignore</TD><TD>use <b>/admin unignore</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>mutelist</TD><TD>use <b>/admin mutelist</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>ignorelist</TD><TD>use <b>/admin ignorelist</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>listmutes</TD><TD>use <b>/admin listmutes</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>listignores</TD><TD>use <b>/admin listignores</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>cleanmutes</TD><TD>use <b>/admin cleanmutes</b></TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>cleanignores</TD><TD>use <b>/admin cleanignores</b></TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>addadmin</TD><TD>use <b>/admin addadmin</b></TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>removeadmin</TD><TD>use <b>/admin removeadmin</b></TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>addop</TD><TD>use <b>/admin addop</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>removeop</TD><TD>use <b>/admin removeop</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>listmasters</TD><TD>use <b>/admin listmasters</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>listadmins</TD><TD>use <b>/admin listadmins</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>listops</TD><TD>use <b>/admin listops</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>adminability</TD><TD>use <b>/admin adminability</b></TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>opability</TD><TD>use <b>/admin opability</b></TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>listabilities</TD><TD>use <b>/admin listabilities</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>writeabilities</TD><TD>use <b>/admin writeabilities</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>readabilities</TD><TD>use <b>/admin readabilities</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>wall</TD><TD>use <b>/admin wall</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>mta</TD><TD>use <b>/admin mta</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>delrec</TD><TD>use <b>/admin delrec</b></TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>prunerecs</TD><TD>use <b>/admin prunerecs</b></TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>rpoints (TMF)</TD><TD>use <b>/admin rpoints</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>match</TD><TD>use <b>/admin match</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>acdl</TD><TD>use <b>/admin acdl</b></TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>autotime</TD><TD>use <b>/admin autotime</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>disablerespawn (TMF)</TD><TD>use <b>/admin disablerespawn</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>forceshowopp (TMF)</TD><TD>use <b>/admin forceshowopp</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>scorepanel (TMF)</TD><TD>use <b>/admin scorepanel</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>roundsfinish (TMF)</TD><TD>use <b>/admin roundsfinish</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>forceteam (TMF)</TD><TD>use <b>/admin forceteam</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>forcespec (TMF)</TD><TD>use <b>/admin forcespec</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>specfree (TMF)</TD><TD>use <b>/admin specfree</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>panel (TMF)</TD><TD>use <b>/admin panel</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>style (TMF)</TD><TD>use <b>/admin style</b></TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>admpanel (TMF)</TD><TD>use <b>/admin admpanel</b></TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>donpanel (TMUF)</TD><TD>use <b>/admin donpanel</b></TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>recpanel (TMF)</TD><TD>use <b>/admin recpanel</b></TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>votepanel (TMF)</TD><TD>use <b>/admin votepanel</b></TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>coppers (TMUF)</TD><TD>use <b>/admin coppers</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>pay (TMUF)</TD><TD>use <b>/admin pay</b></TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>relays (TMF)</TD><TD>use <b>/admin relays</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>server</TD><TD>use <b>/admin server</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>pm</TD><TD>use <b>/admin pm</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>pmlog</TD><TD>use <b>/admin pmlog</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>call</TD><TD>use <b>/admin call</b></TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>unlock</TD><TD>use <b>/admin unlock</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>debug</TD><TD>use <b>/admin debug</b></TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>shutdown</TD><TD>use <b>/admin shutdown</b></TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>shutdownall</TD><TD>use <b>/admin shutdownall</b></TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>uptodate</TD><TD>use <b>/admin uptodate</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>chat_pma</TD><TD>use <b>/pma</b> to send a PM to player &amp; admins</TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>chat_bestworst</TD><TD><b>/best</b> &amp; <b>/worst</b> accept login/Player_ID</TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>chat_statsip</TD><TD><b>/stats</b> includes IP address</TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>chat_summary</TD><TD><b>/summary</b> accepts login/Player_ID</TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>chat_jukebox</TD><TD>use <b>/jukebox</b> even if $feature_jukebox is false</TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>chat_jb_multi</TD><TD><b>/jukebox</b> adds more than one track</TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>chat_jb_recent</TD><TD><b>/jukebox</b> adds recently played track</TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>chat_add_tref</TD><TD>use <b>/add trackref</b> to write TMX trackref file</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>chat_match</TD><TD>use <b>/match</b> to allow match control</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>chat_tc_listen</TD><TD><b>/tc</b> will copy team chat to admins</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>chat_jfreu</TD><TD>use all <b>/jfreu</b> commands</TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>chat_musicadmin (TMF)</TD><TD>use <b>/music</b> admin commands</TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
<TR><TD>noidlekick_play</TD><TD>no idlekick when admin is <b>player</b></TD><TD align="center">X</TD><TD align="center">&nbsp;</TD><TD align="center">&nbsp;</TD>
<TR><TD>noidlekick_spec</TD><TD>no idlekick when admin is <b>spectator</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">X</TD>
<TR><TD>server_coppers (TMUF)</TD><TD>view coppers amount in <b>/server</b></TD><TD align="center">X</TD><TD align="center">X</TD><TD align="center">&nbsp;</TD>
</TBODY>
</TABLE>
</CENTER>
<br><br>
<HR>
<ADDRESS>
Copyright &copy; 2007-2013 &ndash; Frans P. de Vries <A HREF="mailto:tm&#64;&#103;&#97;&#109;&#101;&#114;&#115;&#46;&#111;&#114;&#103;">&lt;tm&#64;&#103;&#97;&#109;&#101;&#114;&#115;&#46;&#111;&#114;&#103;&gt;</A>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
Last updated 08-Aug-2011
</ADDRESS>
</BODY>
</HTML>

Binary file not shown.

View File

@ -1,498 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<TITLE>TrackMania Nations - XASECO commands</TITLE>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<META NAME="author" CONTENT="Frans P. de Vries">
<META NAME="generator" CONTENT="vi :)">
<style type="text/css">
body { width: 960px; margin-left: 30px; font-family: Arial,Helvetica,sans-serif; font-size: 15px; }
li,div { padding: 3px; }
code,pre { font-size: 14px; }
pre { width: 90%; margin: 3px 0px; padding: 3px 0px 3px 12px; background-color: #F0F0F0; }
</style>
<META NAME="keywords" CONTENT="TrackMania, Forever, United, Nations, Original, Sunrise, racing, games, XASECO, ASECO, RASP, Jfreu, plugins, records, jukebox, Nadeo">
<META NAME="description" CONTENT="Information on the XASECO system for TrackMania Nations and Forever (& Original/Sunrise), racing games by Nadeo">
</HEAD>
<BODY TEXT="#000000" LINK="#ff0000" VLINK="#0000ff" ALINK="#00ff00" BGCOLOR="#ffffff">
<P ALIGN="center">
<A TARGET="_blank" HREF="http://eswc.trackmanianations.com/"><IMG SRC="banner.jpg" ALT="TrackMania Nations" BORDER="0" WIDTH="590" HEIGHT="149"></A>
<HR>
<A NAME="main"></A>
<H3>Important XASECO admin commands:</H3>
<CENTER>
<TABLE WIDTH="90%">
<TR><TD>/admin help | helpall</TD></TR>
<TR><TD>/jfreu help | helpall</TD></TR>
<TR><TD>&nbsp;</TD></TR>
<TR><TD>/players</TD></TR>
<TR><TD>/players &lt;string&gt;</TD><TD>finds online player(s)</TD></TR>
<TR><TD>/admin players</TD></TR>
<TR><TD>/admin players &lt;string&gt;</TD><TD>finds offline player(s)</TD></TR>
<TR><TD>/admin players live</TD><TD>lists online player(s)</TD></TR>
<TR><TD>&nbsp;</TD></TR>
<TR><TD>/pm &lt;login/id&gt; &lt;message&gt;</TD></TR>
<TR><TD>/pma &lt;login/id&gt; &lt;message&gt;</TD></TR>
<TR><TD>/pmlog</TD></TR>
<TR><TD>/chatlog</TD></TR>
<TR><TD>/msglog</TD></TR>
<TR><TD>&nbsp;</TD></TR>
<TR><TD>/admin pm &lt;message&gt;</TD></TR>
<TR><TD>/admin pmlog</TD></TR>
<TR><TD>/admin wall &lt;message&gt;</TD></TR>
<TR><TD>&nbsp;</TD></TR>
<TR><TD WIDTH="25%">/admin endround</TD><TD>/admin er</TD></TR>
<TR><TD WIDTH="25%">/admin resmap</TD><TD>/admin res</TD></TR>
<TR><TD WIDTH="25%">/admin nextmap</TD><TD>/admin next</TD></TR>
<TR><TD WIDTH="25%">/admin replaymap</TD><TD>/admin replay</TD></TR>
<TR><TD>&nbsp;</TD></TR>
<TR><TD WIDTH="25%">/admin pass</TD></TR>
<TR><TD WIDTH="25%">/admin cancel</TD><TD>/admin can</TD></TR>
<TR><TD WIDTH="25%">/admin dropjukebox &lt;#&gt;</TD><TD>/admin djb &lt;#&gt;</TD></TR>
<TR><TD WIDTH="25%">/admin clearjukebox</TD><TD>/admin cjb</TD></TR>
<TR><TD>&nbsp;</TD></TR>
<TR><TD>/admin warn &lt;login/id&gt;</TD></TR>
<TR><TD>/admin kick &lt;login/id&gt;</TD></TR>
<TR><TD>/admin kickghost &lt;login&gt;</TD></TR>
<TR><TD>/admin black &lt;login/id&gt;</TD></TR>
<TR><TD>/admin ban &lt;login/id&gt;</TD></TR>
<TR><TD>/admin banip &lt;IP&gt;</TD></TR>
<TR><TD>&nbsp;</TD></TR>
<TR><TD>/jfreu badword &lt;login/id&gt;</TD></TR>
<TR><TD WIDTH="25%">/jfreu banfor &lt;time&gt; &lt;login/id&gt;</TD><TD>&lt;time&gt; = &lt;xx&gt; mins or &lt;x&gt;H hours</TD></TR>
<TR><TD>/jfreu players</TD></TR>
<TR><TD>/jfreu players &lt;string&gt;</TD><TD>finds offline player(s)</TD></TR>
<TR><TD>/jfreu players live</TD><TD>lists online player(s)</TD></TR>
</TABLE>
</CENTER>
<A NAME="user"></A>
<H3>List of available user commands:</H3>
<CENTER>
<TABLE WIDTH="90%">
<TR><TD>/admin</TD><TD colspan="2">Provides admin commands (see: /admin help)</TD></TR>
<TR><TD>/help</TD><TD colspan="2">Shows all available commands</TD></TR>
<TR><TD>/helpall</TD><TD colspan="2">Displays help for available commands</TD></TR>
<TR><TD>/recs</TD><TD colspan="2">Displays all records on current track</TD></TR>
<TR><TD>/recs help</TD><TD WIDTH="5%">&nbsp;</TD><TD>Displays this help information</TD></TR>
<TR><TD>/recs pb</TD><TD WIDTH="5%">&nbsp;</TD><TD colspan="2">Shows your personal best on current track</TD></TR>
<TR><TD>/recs new</TD><TD WIDTH="5%">&nbsp;</TD><TD colspan="2">Shows newly driven records</TD></TR>
<TR><TD>/recs live</TD><TD WIDTH="5%">&nbsp;</TD><TD colspan="2">Shows records of online players</TD></TR>
<TR><TD>/recs first</TD><TD WIDTH="5%">&nbsp;</TD><TD colspan="2">Shows first ranked record on current track</TD></TR>
<TR><TD>/recs last</TD><TD WIDTH="5%">&nbsp;</TD><TD colspan="2">Shows last ranked record on current track</TD></TR>
<TR><TD>/recs next</TD><TD WIDTH="5%">&nbsp;</TD><TD colspan="2">Shows next better ranked record to beat</TD></TR>
<TR><TD>/recs diff</TD><TD WIDTH="5%">&nbsp;</TD><TD colspan="2">Shows your difference to first ranked record</TD></TR>
<TR><TD>/recs range</TD><TD WIDTH="5%">&nbsp;</TD><TD colspan="2">Shows difference first to last ranked record</TD></TR>
<TR><TD>/newrecs</TD><TD colspan="2">Shows newly driven records</TD></TR>
<TR><TD>/liverecs</TD><TD colspan="2">Shows records of online players</TD></TR>
<TR><TD>/best</TD><TD colspan="2">Displays your best records</TD></TR>
<TR><TD>/worst</TD><TD colspan="2">Displays your worst records</TD></TR>
<TR><TD>/summary</TD><TD colspan="2">Shows summary of all your records</TD></TR>
<TR><TD>/topsums</TD><TD colspan="2">Displays top 100 of top-3 record holders</TD></TR>
<TR><TD>/toprecs</TD><TD colspan="2">Displays top 100 ranked records holders</TD></TR>
<TR><TD>/firstrec</TD><TD colspan="2">Shows first ranked record on current track</TD></TR>
<TR><TD>/lastrec</TD><TD colspan="2">Shows last ranked record on current track</TD></TR>
<TR><TD>/nextrec</TD><TD colspan="2">Shows next better ranked record to beat</TD></TR>
<TR><TD>/diffrec</TD><TD colspan="2">Shows your difference to first ranked record</TD></TR>
<TR><TD>/recrange</TD><TD colspan="2">Shows difference first to last ranked record</TD></TR>
<TR><TD>/helpdedi | /dedihelp</TD><TD colspan="2">Displays info about the Dedimania records system</TD></TR>
<TR><TD>/dedirecs</TD><TD colspan="2">Displays all Dedimania records on current track</TD></TR>
<TR><TD>/dedirecs help</TD><TD WIDTH="5%">&nbsp;</TD><TD>Displays this help information</TD></TR>
<TR><TD>/dedirecs pb</TD><TD WIDTH="5%">&nbsp;</TD><TD colspan="2">Shows your personal best on current track</TD></TR>
<TR><TD>/dedirecs new</TD><TD WIDTH="5%">&nbsp;</TD><TD colspan="2">Shows newly driven records</TD></TR>
<TR><TD>/dedirecs live</TD><TD WIDTH="5%">&nbsp;</TD><TD colspan="2">Shows records of online players</TD></TR>
<TR><TD>/dedirecs first</TD><TD WIDTH="5%">&nbsp;</TD><TD colspan="2">Shows first ranked record on current track</TD></TR>
<TR><TD>/dedirecs last</TD><TD WIDTH="5%">&nbsp;</TD><TD colspan="2">Shows last ranked record on current track</TD></TR>
<TR><TD>/dedirecs next</TD><TD WIDTH="5%">&nbsp;</TD><TD colspan="2">Shows next better ranked record to beat</TD></TR>
<TR><TD>/dedirecs diff</TD><TD WIDTH="5%">&nbsp;</TD><TD colspan="2">Shows your difference to first ranked record</TD></TR>
<TR><TD>/dedirecs range</TD><TD WIDTH="5%">&nbsp;</TD><TD colspan="2">Shows difference first to last ranked record</TD></TR>
<TR><TD>/dedinew</TD><TD colspan="2">Shows newly driven Dedimania records</TD></TR>
<TR><TD>/dedilive</TD><TD colspan="2">Shows Dedimania records of online players</TD></TR>
<TR><TD>/dedipb</TD><TD colspan="2">Shows your Dedimania personal best on current track</TD></TR>
<TR><TD>/dedifirst</TD><TD colspan="2">Shows first Dedimania record on current track</TD></TR>
<TR><TD>/dedilast</TD><TD colspan="2">Shows last Dedimania record on current track</TD></TR>
<TR><TD>/dedinext</TD><TD colspan="2">Shows next better Dedimania record to beat</TD></TR>
<TR><TD>/dedidiff</TD><TD colspan="2">Shows your difference to first Dedimania record</TD></TR>
<TR><TD>/dedirange</TD><TD colspan="2">Shows difference first to last Dedimania record</TD></TR>
<TR><TD>/dedicps</TD><TD colspan="2">Sets Dedimania record checkpoints tracking</TD></TR>
<TR><TD>/dedistats</TD><TD colspan="2">Displays Dedimania track statistics</TD></TR>
<TR><TD>/dedicptms</TD><TD colspan="2">Displays all Dedimania records' checkpoints times</TD></TR>
<TR><TD>/dedisectms</TD><TD colspan="2">Displays all Dedimania records' sector times</TD></TR>
<TR><TD>/players</TD><TD colspan="2">Displays current list of nicks/logins</TD></TR>
<TR><TD>/ranks</TD><TD colspan="2">Displays list of online ranks/nicks</TD></TR>
<TR><TD>/clans</TD><TD colspan="2">Displays list of online clans/nicks</TD></TR>
<TR><TD>/topclans</TD><TD colspan="2">Displays top 10 best ranked clans</TD></TR>
<TR><TD>/wins</TD><TD colspan="2">Shows wins for current player</TD></TR>
<TR><TD>/laston</TD><TD colspan="2">Shows when a player was last online</TD></TR>
<TR><TD>/lastwin</TD><TD colspan="2">Re-opens the last closed multi-page window</TD></TR>
<TR><TD>/stats</TD><TD colspan="2">Displays statistics of current player</TD></TR>
<TR><TD>/statsall (TMN)</TD><TD colspan="2">Displays world statistics of a player</TD></TR>
<TR><TD>/settings</TD><TD colspan="2">Displays your personal settings</TD></TR>
<TR><TD>/server</TD><TD colspan="2">Displays info about this server</TD></TR>
<TR><TD>/xaseco</TD><TD colspan="2">Displays info about this XASECO</TD></TR>
<TR><TD>/plugins</TD><TD colspan="2">Displays list of active plugins</TD></TR>
<TR><TD>/nations</TD><TD colspan="2">Displays top 10 most visiting nations</TD></TR>
<TR><TD>/song</TD><TD colspan="2">Shows filename of current track's song</TD></TR>
<TR><TD>/mod</TD><TD colspan="2">Shows (file)name of current track's mod</TD></TR>
<TR><TD>/me</TD><TD colspan="2">Can be used to express emotions</TD></TR>
<TR><TD>/mute</TD><TD colspan="2">Mute another player's chat messages</TD></TR>
<TR><TD>/unmute</TD><TD colspan="2">UnMute another player's chat messages</TD></TR>
<TR><TD>/mutelist</TD><TD colspan="2">Display list of muted players</TD></TR>
<TR><TD>/refresh</TD><TD colspan="2">Refresh chat window</TD></TR>
<TR><TD>/tmxinfo</TD><TD colspan="2">Displays TMX info {Track_ID/TMX_ID} {sec}</TD></TR>
<TR><TD>/tmxrecs</TD><TD colspan="2">Displays TMX records {Track_ID/TMX_ID} {sec}</TD></TR>
<TR><TD>/track</TD><TD colspan="2">Shows info about the current track</TD></TR>
<TR><TD>/playtime</TD><TD colspan="2">Shows time current track has been playing</TD></TR>
<TR><TD>/time</TD><TD colspan="2">Shows current server time &amp; date</TD></TR>
<TR><TD>/cps</TD><TD colspan="2">Sets local record checkpoints tracking</TD></TR>
<TR><TD>/cpsspec</TD><TD colspan="2">Shows checkpoints of spectated player</TD></TR>
<TR><TD>/cptms</TD><TD colspan="2">Displays all local records' checkpoint times</TD></TR>
<TR><TD>/sectms</TD><TD colspan="2">Displays all local records' sector times</TD></TR>
<TR><TD>/pb</TD><TD colspan="2">Shows your personal best on current track</TD></TR>
<TR><TD>/rank</TD><TD colspan="2">Shows your current server rank</TD></TR>
<TR><TD>/top10</TD><TD colspan="2">Displays top 10 best ranked players</TD></TR>
<TR><TD>/top100</TD><TD colspan="2">Displays top 100 best ranked players</TD></TR>
<TR><TD>/topwins</TD><TD colspan="2">Displays top 100 victorious players</TD></TR>
<TR><TD>/active</TD><TD colspan="2">Displays top 100 most active players</TD></TR>
<TR><TD>/list</TD><TD colspan="2">Lists tracks currently on the server (see: /list help)</TD></TR>
<TR><TD>/list help</TD><TD WIDTH="5%">&nbsp;</TD><TD>Displays this help information</TD></TR>
<TR><TD>/list nofinish</TD><TD WIDTH="5%">&nbsp;</TD><TD>Tracks you don't have a rank on</TD></TR>
<TR><TD>/list norank</TD><TD WIDTH="5%">&nbsp;</TD><TD>Tracks you haven't completed</TD></TR>
<TR><TD>/list nogold</TD><TD WIDTH="5%">&nbsp;</TD><TD>Tracks you didn't beat gold time on</TD></TR>
<TR><TD>/list noauthor</TD><TD WIDTH="5%">&nbsp;</TD><TD>Tracks you didn't beat author time on</TD></TR>
<TR><TD>/list norecent</TD><TD WIDTH="5%">&nbsp;</TD><TD>Tracks you didn't play recently</TD></TR>
<TR><TD>/list best | worst</TD><TD WIDTH="5%">&nbsp;</TD><TD>Tracks with your best / worst records</TD></TR>
<TR><TD>/list longest | shortest</TD><TD WIDTH="5%">&nbsp;</TD><TD>The longest / shortest tracks</TD></TR>
<TR><TD>/list newest | oldest &lt;#&gt;</TD><TD WIDTH="5%">&nbsp;</TD><TD>The newest / oldest # tracks (default: 50)</TD></TR>
<TR><TD>/list &lt;xxx&gt;</TD><TD WIDTH="5%">&nbsp;</TD><TD>Where &lt;xxx&gt; is part of a track or author name</TD></TR>
<TR valign="top"><TD>/list env:&lt;zzz&gt; (TMUF)</TD><TD WIDTH="5%">&nbsp;</TD><TD>Where &lt;zzz&gt; is an environment from: stadium,<br>bay,coast,island,snow/alpine,desert/speed,rally</TD></TR>
<TR><TD>/list &lt;xxx&gt; env:&lt;zzz&gt;</TD><TD WIDTH="5%">&nbsp;</TD><TD>Combines the name and environment searches</TD></TR>
<TR><TD>/list novote</TD><TD WIDTH="5%">&nbsp;</TD><TD>Tracks you didn't karma vote for</TD></TR>
<TR><TD>/list karma &lt;#&gt;</TD><TD WIDTH="5%">&nbsp;</TD><TD>Display all tracks with karma &gt;= or &lt;= given value</TD></TR>
<TR><TD>/jukebox</TD><TD colspan="2">Sets a track to be played next (see: /jukebox help)</TD></TR>
<TR><TD>/jukebox help</TD><TD WIDTH="5%">&nbsp;</TD><TD>Displays this help information</TD></TR>
<TR><TD>/jukebox list</TD><TD WIDTH="5%">&nbsp;</TD><TD>Shows upcoming tracks</TD></TR>
<TR><TD>/jukebox display</TD><TD WIDTH="5%">&nbsp;</TD><TD>Displays upcoming tracks and requesters</TD></TR>
<TR><TD>/jukebox drop</TD><TD WIDTH="5%">&nbsp;</TD><TD>Drops your currently added track</TD></TR>
<TR><TD>/jukebox &lt;#&gt;</TD><TD WIDTH="5%">&nbsp;</TD><TD>Adds a track where &lt;#&gt; is track number from /list</TD></TR>
<TR><TD>/autojuke</TD><TD colspan="2">Jukeboxes track from /list (see: /autojuke help)</TD></TR>
<TR><TD>/autojuke help</TD><TD WIDTH="5%">&nbsp;</TD><TD>Displays this help information</TD></TR>
<TR><TD>/autojuke nofinish</TD><TD WIDTH="5%">&nbsp;</TD><TD>Tracks you don't have a rank on</TD></TR>
<TR><TD>/autojuke norank</TD><TD WIDTH="5%">&nbsp;</TD><TD>Tracks you haven't completed</TD></TR>
<TR><TD>/autojuke nogold</TD><TD WIDTH="5%">&nbsp;</TD><TD>Tracks you didn't beat gold time on</TD></TR>
<TR><TD>/autojuke noauthor</TD><TD WIDTH="5%">&nbsp;</TD><TD>Tracks you didn't beat author time on</TD></TR>
<TR><TD>/autojuke norecent</TD><TD WIDTH="5%">&nbsp;</TD><TD>Tracks you didn't play recently</TD></TR>
<TR><TD>/autojuke longest | shortest</TD><TD WIDTH="5%">&nbsp;</TD><TD>The longest / shortest tracks</TD></TR>
<TR><TD>/autojuke newest | oldest</TD><TD WIDTH="5%">&nbsp;</TD><TD>The newest / oldest # tracks</TD></TR>
<TR><TD>/autojuke novote</TD><TD WIDTH="5%">&nbsp;</TD><TD>Tracks you didn't karma vote for</TD></TR>
<TR><TD>/add</TD><TD colspan="2">Adds a track directly from TMX (&lt;ID&gt; {sec})</TD></TR>
<TR><TD>/add &lt;ID&gt; &lt;sec&gt; (TMF)</TD><TD colspan="2">Adds a track from a specific TMX section</TD></TR>
<TR><TD>/y</TD><TD colspan="2">Votes Yes for a TMX track or chat-based vote</TD></TR>
<TR><TD>/history</TD><TD colspan="2">Shows the 10 most recently played tracks</TD></TR>
<TR><TD>/xlist</TD><TD colspan="2">Lists tracks on TMX (see: /xlist help)</TD></TR>
<TR><TD>/xlist help</TD><TD WIDTH="5%">&nbsp;</TD><TD>Displays this help information</TD></TR>
<TR><TD>/xlist recent</TD><TD WIDTH="5%">&nbsp;</TD><TD>Lists the 10 most recent tracks</TD></TR>
<TR><TD>/xlist &lt;xxx&gt;</TD><TD WIDTH="5%">&nbsp;</TD><TD>Lists tracks matching (partial) name</TD></TR>
<TR><TD>/xlist auth:&lt;yyy&gt;</TD><TD WIDTH="5%">&nbsp;</TD><TD>Lists tracks matching (partial) author</TD></TR>
<TR valign="top"><TD>/xlist env:&lt;zzz&gt;</TD><TD WIDTH="5%">&nbsp;</TD><TD>Where &lt;zzz&gt; is an environment from: stadium,<br>bay,coast,island,snow/alpine,desert/speed,rally</TD></TR>
<TR><TD>/xlist &lt;xxx&gt; auth:&lt;yyy&gt; env:&lt;zzz&gt;</TD><TD WIDTH="5%">&nbsp;</TD><TD>Combines the name, author and/or env searches</TD></TR>
<TR valign="top"><TD>/xlist &lt;tmx&gt;</TD><TD WIDTH="5%">&nbsp;</TD><TD>Where &lt;tmx&gt; is a TMX section from:<br>TMO,TMS,TMN,TMNF,TMU<br>Can be appended to any of the above searches</TD></TR>
<TR><TD>/pm</TD><TD colspan="2">Sends a private message to login or Player_ID</TD></TR>
<TR><TD>/pma</TD><TD colspan="2">Sends a private message to player &amp; admins (admin-only)</TD></TR>
<TR><TD>/pmlog</TD><TD colspan="2">Displays log of your recent private messages</TD></TR>
<TR><TD>/hi</TD><TD colspan="2">Sends a Hi message to everyone</TD></TR>
<TR><TD>/bye</TD><TD colspan="2">Sends a Bye message to everyone</TD></TR>
<TR><TD>/thx</TD><TD colspan="2">Sends a Thanks message to everyone</TD></TR>
<TR><TD>/lol</TD><TD colspan="2">Sends a Lol message to everyone</TD></TR>
<TR><TD>/lool</TD><TD colspan="2">Sends a Lool message to everyone</TD></TR>
<TR><TD>/brb</TD><TD colspan="2">Sends a Be Right Back message to everyone</TD></TR>
<TR><TD>/afk</TD><TD colspan="2">Sends an Away From Keyboard message to everyone</TD></TR>
<TR><TD>/gg</TD><TD colspan="2">Sends a Good Game message to everyone</TD></TR>
<TR><TD>/gr</TD><TD colspan="2">Sends a Good Race message to everyone</TD></TR>
<TR><TD>/n1</TD><TD colspan="2">Sends a Nice One message to everyone</TD></TR>
<TR><TD>/bgm</TD><TD colspan="2">Sends a Bad Game message to everyone</TD></TR>
<TR><TD>/official</TD><TD colspan="2">Shows a helpful message ;-)</TD></TR>
<TR><TD>/bootme</TD><TD colspan="2">Boot yourself from the server</TD></TR>
<TR><TD>/karma</TD><TD colspan="2">Shows karma for the current track</TD></TR>
<TR><TD>/++</TD><TD colspan="2">Increases karma for the current track</TD></TR>
<TR><TD>/--</TD><TD colspan="2">Decreases karma for the current track</TD></TR>
<TR><TD>/nextmap</TD><TD colspan="2">Shows name of the next challenge</TD></TR>
<TR><TD>/nextrank</TD><TD colspan="2">Shows the next better ranked player</TD></TR>
<TR><TD>/helpvote | /votehelp</TD><TD colspan="2">Displays info about the chat-based votes</TD></TR>
<TR><TD>/endround</TD><TD colspan="2">Starts a vote to end current round</TD></TR>
<TR><TD>/ladder</TD><TD colspan="2">Starts a vote to restart track for ladder</TD></TR>
<TR><TD>/replay</TD><TD colspan="2">Starts a vote to replay this track</TD></TR>
<TR><TD>/skip</TD><TD colspan="2">Starts a vote to skip this track</TD></TR>
<TR><TD>/ignore</TD><TD colspan="2">Starts a vote to ignore a player</TD></TR>
<TR><TD>/kick</TD><TD colspan="2">Starts a vote to kick a player</TD></TR>
<TR><TD>/cancel</TD><TD colspan="2">Cancels your current vote</TD></TR>
<TR><TD>/chatlog</TD><TD colspan="2">Displays log of recent chat messages</TD></TR>
<TR><TD>/msglog (TMF)</TD><TD colspan="2">Displays log of recent system messages</TD></TR>
<TR><TD>/style (TMF)</TD><TD colspan="2">Selects window style (see: /style help)</TD></TR>
<TR><TD>/style help</TD><TD WIDTH="5%">&nbsp;</TD><TD>Displays this help information</TD></TR>
<TR><TD>/style list</TD><TD WIDTH="5%">&nbsp;</TD><TD>Displays available styles</TD></TR>
<TR><TD>/style default</TD><TD WIDTH="5%">&nbsp;</TD><TD>Resets style to server default</TD></TR>
<TR><TD>/style off</TD><TD WIDTH="5%">&nbsp;</TD><TD>Disables TMF window style</TD></TR>
<TR><TD>/style &lt;xxx&gt;</TD><TD WIDTH="5%">&nbsp;</TD><TD>Selects window style &lt;xxx&gt;</TD></TR>
<TR><TD>/donpanel (TMUF)</TD><TD colspan="2">Selects donate panel (see: /donpanel help)</TD></TR>
<TR><TD>/donpanel help</TD><TD WIDTH="5%">&nbsp;</TD><TD>Displays this help information</TD></TR>
<TR><TD>/donpanel list</TD><TD WIDTH="5%">&nbsp;</TD><TD>Displays available panels</TD></TR>
<TR><TD>/donpanel default</TD><TD WIDTH="5%">&nbsp;</TD><TD>Resets panel to server default</TD></TR>
<TR><TD>/donpanel off</TD><TD WIDTH="5%">&nbsp;</TD><TD>Disables donate panel</TD></TR>
<TR><TD>/donpanel &lt;xxx&gt;</TD><TD WIDTH="5%">&nbsp;</TD><TD>Selects donate panel &lt;xxx&gt;</TD></TR>
<TR><TD>/recpanel (TMF)</TD><TD colspan="2">Selects records panel (see: /recpanel help)</TD></TR>
<TR><TD>/recpanel help</TD><TD WIDTH="5%">&nbsp;</TD><TD>Displays this help information</TD></TR>
<TR><TD>/recpanel list</TD><TD WIDTH="5%">&nbsp;</TD><TD>Displays available panels</TD></TR>
<TR><TD>/recpanel default</TD><TD WIDTH="5%">&nbsp;</TD><TD>Resets panel to server default</TD></TR>
<TR><TD>/recpanel off</TD><TD WIDTH="5%">&nbsp;</TD><TD>Disables records panel</TD></TR>
<TR><TD>/recpanel &lt;xxx&gt;</TD><TD WIDTH="5%">&nbsp;</TD><TD>Selects records panel &lt;xxx&gt;</TD></TR>
<TR><TD>/votepanel (TMF)</TD><TD colspan="2">Selects records panel (see: /votepanel help)</TD></TR>
<TR><TD>/votepanel help</TD><TD WIDTH="5%">&nbsp;</TD><TD>Displays this help information</TD></TR>
<TR><TD>/votepanel list</TD><TD WIDTH="5%">&nbsp;</TD><TD>Displays available panels</TD></TR>
<TR><TD>/votepanel default</TD><TD WIDTH="5%">&nbsp;</TD><TD>Resets panel to server default</TD></TR>
<TR><TD>/votepanel off</TD><TD WIDTH="5%">&nbsp;</TD><TD>Disables vote panel</TD></TR>
<TR><TD>/votepanel &lt;xxx&gt;</TD><TD WIDTH="5%">&nbsp;</TD><TD>Selects vote panel &lt;xxx&gt;</TD></TR>
<TR><TD>/donate (TMUF)</TD><TD colspan="2">Donates coppers to server</TD></TR>
<TR><TD>/topdons (TMUF)</TD><TD colspan="2">Displays top 100 highest donators</TD></TR>
<TR><TD>/music (TMF)</TD><TD colspan="2">Handles server music (see: /music help)</TD></TR>
<TR><TD>/music help</TD><TD WIDTH="5%">&nbsp;</TD><TD>Displays this help information</TD></TR>
<TR><TD>/music settings</TD><TD WIDTH="5%">&nbsp;</TD><TD>Displays current music settings</TD></TR>
<TR><TD>/music list</TD><TD WIDTH="5%">&nbsp;</TD><TD>Displays all available songs</TD></TR>
<TR><TD>/music list &lt;xxx&gt;</TD><TD WIDTH="5%">&nbsp;</TD><TD>Searches song names/tags for &lt;xxx&gt;</TD></TR>
<TR><TD>/music current</TD><TD WIDTH="5%">&nbsp;</TD><TD>Shows the current song</TD></TR>
<TR><TD>/music reload (admin)</TD><TD WIDTH="5%">&nbsp;</TD><TD>Reloads musicserver.xml config file</TD></TR>
<TR><TD>/music next (admin)</TD><TD WIDTH="5%">&nbsp;</TD><TD>Skips to next song (upon next track)</TD></TR>
<TR><TD>/music sort (admin)</TD><TD WIDTH="5%">&nbsp;</TD><TD>Sorts the song list</TD></TR>
<TR><TD>/music shuffle (admin)</TD><TD WIDTH="5%">&nbsp;</TD><TD>Randomizes the song list</TD></TR>
<TR><TD>/music override (admin)</TD><TD WIDTH="5%">&nbsp;</TD><TD>Changes track override setting</TD></TR>
<TR><TD>/music autonext (admin)</TD><TD WIDTH="5%">&nbsp;</TD><TD>Changes automatic next song setting</TD></TR>
<TR><TD>/music allowjb (admin)</TD><TD WIDTH="5%">&nbsp;</TD><TD>Changes allow jukebox setting</TD></TR>
<TR><TD>/music stripdirs (admin)</TD><TD WIDTH="5%">&nbsp;</TD><TD>Changes strip subdirs setting</TD></TR>
<TR><TD>/music stripexts (admin)</TD><TD WIDTH="5%">&nbsp;</TD><TD>Changes strip extensions setting</TD></TR>
<TR><TD>/music off (admin)</TD><TD WIDTH="5%">&nbsp;</TD><TD>Disables music, auto next &amp; jukebox</TD></TR>
<TR><TD>/music jukebox</TD><TD WIDTH="5%">&nbsp;</TD><TD>Displays upcoming songs in jukebox</TD></TR>
<TR><TD>/music drop</TD><TD WIDTH="5%">&nbsp;</TD><TD>Drops your currently added song</TD></TR>
<TR><TD>/music &lt;#&gt;</TD><TD WIDTH="5%">&nbsp;</TD><TD>Adds a song to jukebox where &lt;#&gt; is song number</TD></TR>
<TR><TD>/rpoints (TMF)</TD><TD colspan="2">Shows current Rounds points system</TD></TR>
<TR><TD>/ranklimit</TD><TD colspan="2">Shows the current rank limit</TD></TR>
<TR><TD>/password</TD><TD colspan="2">Shows server's player/spectator password</TD></TR>
<TR><TD>/yes</TD><TD colspan="2">Votes Yes for unSpec</TD></TR>
<TR><TD>/no</TD><TD colspan="2">Votes No for unSpec</TD></TR>
<TR><TD>/unspec</TD><TD colspan="2">Launches an unSpec vote</TD></TR>
<TR><TD>/message</TD><TD colspan="2">Shows random informational message</TD></TR>
<TR><TD>/jfreu</TD><TD colspan="2">Jfreu admin commands (see: /jfreu help)</TD></TR>
<TR><TD>/version</TD><TD colspan="2">Shows server version (dedicated built-in command)</TD></TR>
<TR><TD>/serverlogin (TMF)</TD><TD colspan="2">Shows server login (dedicated built-in command)</TD></TR>
</TABLE>
</CENTER>
<A NAME="admin"></A>
<H3>List of available /admin commands:</H3>
<CENTER>
<TABLE WIDTH="90%">
<TR><TD>help</TD><TD colspan="2">Shows all available /admin commands</TD></TR>
<TR><TD>helpall</TD><TD colspan="2">Displays help for available /admin commands</TD></TR>
<TR><TD>setservername</TD><TD colspan="2">Changes the name of the server</TD></TR>
<TR><TD>setcomment</TD><TD colspan="2">Changes the server comment</TD></TR>
<TR><TD>setpwd</TD><TD colspan="2">Changes the player password</TD></TR>
<TR><TD>setspecpwd</TD><TD colspan="2">Changes the spectator password</TD></TR>
<TR><TD>setrefpwd (TMF)</TD><TD colspan="2">Changes the referee password</TD></TR>
<TR><TD>setmaxplayers</TD><TD colspan="2">Sets a new maximum of players</TD></TR>
<TR><TD>setmaxspecs</TD><TD colspan="2">Sets a new maximum of spectators</TD></TR>
<TR><TD>setgamemode</TD><TD colspan="2">Sets next mode {ta,rounds,team,laps,stunts,cup}</TD></TR>
<TR><TD>setrefmode (TMF)</TD><TD colspan="2">Sets referee mode {0=top3,1=all}</TD></TR>
<TR><TD>nextmap | next</TD><TD colspan="2">Forces server to load next track</TD></TR>
<TR><TD>skipmap | skip</TD><TD colspan="2">Forces server to load next track</TD></TR>
<TR><TD>previous | prev</TD><TD colspan="2">Forces server to load previous track</TD></TR>
<TR><TD>nextenv (TMUF)</TD><TD colspan="2">Loads next track in same environment</TD></TR>
<TR><TD>restartmap | res</TD><TD colspan="2">Restarts currently running track</TD></TR>
<TR><TD>replaymap | replay</TD><TD colspan="2">Replays current track (via jukebox)</TD></TR>
<TR><TD>dropjukebox | djb</TD><TD colspan="2">Drops a track from the jukebox</TD></TR>
<TR><TD>clearjukebox | cjb</TD><TD colspan="2">Clears the entire jukebox</TD></TR>
<TR><TD>clearhist</TD><TD colspan="2">Clears (part of) track history</TD></TR>
<TR><TD>add</TD><TD colspan="2">Adds tracks directly from TMX (&lt;ID&gt;... {sec})</TD></TR>
<TR><TD>add &lt;ID&gt; &lt;sec&gt; (TMF)</TD><TD colspan="2">Adds a track from a specific TMX section</TD></TR>
<TR><TD>addthis</TD><TD colspan="2">Adds current /add-ed track permanently</TD></TR>
<TR><TD>addlocal</TD><TD colspan="2">Adds a local track (&lt;filename&gt;)</TD></TR>
<TR><TD>warn</TD><TD colspan="2">Sends a kick/ban warning to a player</TD></TR>
<TR><TD>kick</TD><TD colspan="2">Kicks a player from server</TD></TR>
<TR><TD>kickghost</TD><TD colspan="2">Kicks a ghost player from server</TD></TR>
<TR><TD>ban</TD><TD colspan="2">Bans a player from server</TD></TR>
<TR><TD>unban</TD><TD colspan="2">UnBans a player from server</TD></TR>
<TR><TD>banip</TD><TD colspan="2">Bans an IP address from server</TD></TR>
<TR><TD>unbanip</TD><TD colspan="2">UnBans an IP address from server</TD></TR>
<TR><TD>black</TD><TD colspan="2">Blacklists a player from server</TD></TR>
<TR><TD>unblack</TD><TD colspan="2">UnBlacklists a player from server</TD></TR>
<TR><TD>addguest</TD><TD colspan="2">Adds a guest player to server</TD></TR>
<TR><TD>removeguest</TD><TD colspan="2">Removes a guest player from server</TD></TR>
<TR><TD>pass</TD><TD colspan="2">Passes a chat-based or TMX /add vote</TD></TR>
<TR><TD>cancel | can</TD><TD colspan="2">Cancels any running vote</TD></TR>
<TR><TD>endround | er</TD><TD colspan="2">Forces end of current round</TD></TR>
<TR><TD>players</TD><TD colspan="2">Displays list of known players {string}</TD></TR>
<TR><TD>players live</TD><TD colspan="2">Displays list of online players</TD></TR>
<TR><TD>showbanlist | listbans</TD><TD colspan="2">Displays current ban list</TD></TR>
<TR><TD>showiplist | listips</TD><TD colspan="2">Displays current banned IPs list</TD></TR>
<TR><TD>showblacklist | listblacks</TD><TD colspan="2">Displays current black list</TD></TR>
<TR><TD>showguestlist | listguests</TD><TD colspan="2">Displays current guest list</TD></TR>
<TR><TD>writeiplist</TD><TD colspan="2">Saves current banned IPs list (def: bannedips.xml)</TD></TR>
<TR><TD>readiplist</TD><TD colspan="2">Loads current banned IPs list (def: bannedips.xml)</TD></TR>
<TR><TD>writeblacklist</TD><TD colspan="2">Saves current black list (def: blacklist.txt)</TD></TR>
<TR><TD>readblacklist</TD><TD colspan="2">Loads current black list (def: blacklist.txt)</TD></TR>
<TR><TD>writeguestlist</TD><TD colspan="2">Saves current guest list (def: guestlist.txt)</TD></TR>
<TR><TD>readguestlist</TD><TD colspan="2">Loads current guest list (def: guestlist.txt)</TD></TR>
<TR><TD>cleanbanlist</TD><TD colspan="2">Cleans current ban list</TD></TR>
<TR><TD>cleaniplist</TD><TD colspan="2">Cleans current banned IPs list</TD></TR>
<TR><TD>cleanblacklist</TD><TD colspan="2">Cleans current black list</TD></TR>
<TR><TD>cleanguestlist</TD><TD colspan="2">Cleans current guest list</TD></TR>
<TR><TD>mergegbl</TD><TD colspan="2">Merges a global black list {URL}</TD></TR>
<TR><TD>access</TD><TD colspan="2">Handles player access control (see: /admin acess help)</TD></TR>
<TR><TD>access help</TD><TD WIDTH="5%">&nbsp;</TD><TD>Displays this help information</TD></TR>
<TR><TD>access list</TD><TD WIDTH="5%">&nbsp;</TD><TD>Displays current access control settings</TD></TR>
<TR><TD>access reload</TD><TD WIDTH="5%">&nbsp;</TD><TD>Reloads updated access control settings</TD></TR>
<TR><TD>writetracklist</TD><TD colspan="2">Saves current track list (def: tracklist.txt)</TD></TR>
<TR><TD>readtracklist</TD><TD colspan="2">Loads current track list (def: tracklist.txt)</TD></TR>
<TR><TD>shuffle | shufflemaps</TD><TD colspan="2">Randomizes current track list</TD></TR>
<TR><TD>listdupes</TD><TD colspan="2">Displays list of duplicate tracks</TD></TR>
<TR><TD>remove</TD><TD colspan="2">Removes a track from rotation</TD></TR>
<TR><TD>erase</TD><TD colspan="2">Removes a track from rotation &amp; delete track file</TD></TR>
<TR><TD>removethis</TD><TD colspan="2">Removes this track from rotation</TD></TR>
<TR><TD>erasethis</TD><TD colspan="2">Removes this track from rotation &amp; delete track file</TD></TR>
<TR><TD>mute | ignore</TD><TD colspan="2">Adds a player to global mute/ignore list</TD></TR>
<TR><TD>unmute | unignore</TD><TD colspan="2">Removes a player from global mute/ignore list</TD></TR>
<TR><TD>mutelist | listmutes</TD><TD colspan="2">Displays global mute/ignore list</TD></TR>
<TR><TD>ignorelist | listignores</TD><TD colspan="2">Displays global mute/ignore list</TD></TR>
<TR><TD>cleanmutes | cleanignores</TD><TD colspan="2">Cleans global mute/ignore list</TD></TR>
<TR><TD>addadmin</TD><TD colspan="2">Adds a new admin</TD></TR>
<TR><TD>removeadmin</TD><TD colspan="2">Removes an admin</TD></TR>
<TR><TD>addop</TD><TD colspan="2">Adds a new operator</TD></TR>
<TR><TD>removeop</TD><TD colspan="2">Removes an operator</TD></TR>
<TR><TD>listmasters</TD><TD colspan="2">Displays current masteradmin list</TD></TR>
<TR><TD>listadmins</TD><TD colspan="2">Displays current admin list</TD></TR>
<TR><TD>listops</TD><TD colspan="2">Displays current operator list</TD></TR>
<TR><TD>adminability</TD><TD colspan="2">Shows/changes admin ability {ON/OFF}</TD></TR>
<TR><TD>opability</TD><TD colspan="2">Shows/changes operator ability {ON/OFF}</TD></TR>
<TR><TD>listabilities</TD><TD colspan="2">Displays current abilities list</TD></TR>
<TR><TD>writeabilities</TD><TD colspan="2">Saves current abilities list (def: adminops.xml)</TD></TR>
<TR><TD>readabilities</TD><TD colspan="2">Loads current abilities list (def: adminops.xml)</TD></TR>
<TR><TD>wall | mta</TD><TD colspan="2">Displays popup message to all players</TD></TR>
<TR><TD>delrec</TD><TD colspan="2">Deletes specific record on current track</TD></TR>
<TR><TD>prunerecs</TD><TD colspan="2">Deletes records for specified track</TD></TR>
<TR><TD>rpoints (TMF)</TD><TD colspan="2">Sets custom Rounds points (see: /admin rpoints help)</TD></TR>
<TR><TD>rpoints help</TD><TD WIDTH="5%">&nbsp;</TD><TD>Displays this help information</TD></TR>
<TR><TD>rpoints list</TD><TD WIDTH="5%">&nbsp;</TD><TD>Displays available points systems</TD></TR>
<TR><TD>rpoints show</TD><TD WIDTH="5%">&nbsp;</TD><TD>Shows current points system</TD></TR>
<TR><TD>rpoints &lt;xxx&gt;</TD><TD WIDTH="5%">&nbsp;</TD><TD>Sets custom points system labelled &lt;xxx&gt;</TD></TR>
<TR><TD>rpoints X,Y,...,Z</TD><TD WIDTH="5%">&nbsp;</TD><TD>Sets custom points system with specified values</TD></TR>
<TR><TD>rpoints off</TD><TD WIDTH="5%">&nbsp;</TD><TD>Disables custom points system</TD></TR>
<TR><TD>rpoints f1old</TD><TD WIDTH="5%">&nbsp;</TD><TD>Sets Formula 1 GP old points</TD></TR>
<TR><TD>rpoints f1new</TD><TD WIDTH="5%">&nbsp;</TD><TD>Sets Formula 1 GP new points</TD></TR>
<TR><TD>rpoints motogp</TD><TD WIDTH="5%">&nbsp;</TD><TD>Sets MotoGP points</TD></TR>
<TR><TD>rpoints motogp5</TD><TD WIDTH="5%">&nbsp;</TD><TD>Sets MotoGP + 5 points</TD></TR>
<TR><TD>rpoints fet1</TD><TD WIDTH="5%">&nbsp;</TD><TD>Sets Formula ET Season 1 points</TD></TR>
<TR><TD>rpoints fet2</TD><TD WIDTH="5%">&nbsp;</TD><TD>Sets Formula ET Season 2 points</TD></TR>
<TR><TD>rpoints fet3</TD><TD WIDTH="5%">&nbsp;</TD><TD>Sets Formula ET Season 3 points</TD></TR>
<TR><TD>rpoints champcar</TD><TD WIDTH="5%">&nbsp;</TD><TD>Sets Champ Car World Series points</TD></TR>
<TR><TD>rpoints superstars</TD><TD WIDTH="5%">&nbsp;</TD><TD>Sets Superstars points</TD></TR>
<TR><TD>rpoints simple5</TD><TD WIDTH="5%">&nbsp;</TD><TD>Sets Simple 5 points</TD></TR>
<TR><TD>rpoints simple10</TD><TD WIDTH="5%">&nbsp;</TD><TD>Sets Simple 10 points</TD></TR>
<TR><TD>match</TD><TD colspan="2">{begin/end} to start/stop match tracking</TD></TR>
<TR><TD>acdl</TD><TD colspan="2">Sets AllowChallengeDownload {ON/OFF}</TD></TR>
<TR><TD>autotime</TD><TD colspan="2">Sets Auto TimeLimit {ON/OFF}</TD></TR>
<TR><TD>disablerespawn (TMF)</TD><TD colspan="2">Disable respawns at CPs {ON/OFF}</TD></TR>
<TR><TD>forceshowopp (TMF)</TD><TD colspan="2">Forces to show opponents {##/ALL/OFF}</TD></TR>
<TR><TD>scorepanel (TMF)</TD><TD colspan="2">Shows automatic scorepanel {ON/OFF}</TD></TR>
<TR><TD>roundsfinish (TMF)</TD><TD colspan="2">Shows rounds panel upon first finish {ON/OFF}</TD></TR>
<TR><TD>forceteam (TMF)</TD><TD colspan="2">Forces player into Blue or Red team</TD></TR>
<TR><TD>forcespec (TMF)</TD><TD colspan="2">Forces player into free spectator</TD></TR>
<TR><TD>specfree (TMF)</TD><TD colspan="2">Forces spectator into free mode</TD></TR>
<TR><TD>panel (TMF)</TD><TD colspan="2">Selects admin panel (see: /admin panel help)</TD></TR>
<TR><TD>panel help</TD><TD WIDTH="5%">&nbsp;</TD><TD>Displays this help information</TD></TR>
<TR><TD>panel list</TD><TD WIDTH="5%">&nbsp;</TD><TD>Displays available panels</TD></TR>
<TR><TD>panel default</TD><TD WIDTH="5%">&nbsp;</TD><TD>Resets panel to server default</TD></TR>
<TR><TD>panel off</TD><TD WIDTH="5%">&nbsp;</TD><TD>Disables admin panel</TD></TR>
<TR><TD>panel &lt;xxx&gt;</TD><TD WIDTH="5%">&nbsp;</TD><TD>Selects admin panel &lt;xxx&gt;</TD></TR>
<TR><TD>style (TMF)</TD><TD colspan="2">Selects default window style</TD></TR>
<TR><TD>admpanel (TMF)</TD><TD colspan="2">Selects default admin panel</TD></TR>
<TR><TD>donpanel (TMUF)</TD><TD colspan="2">Selects default donate panel</TD></TR>
<TR><TD>recpanel (TMF)</TD><TD colspan="2">Selects default records panel</TD></TR>
<TR><TD>votepanel (TMF)</TD><TD colspan="2">Selects default vote panel</TD></TR>
<TR><TD>coppers (TMUF)</TD><TD colspan="2">Shows server's coppers amount</TD></TR>
<TR><TD>pay (TMUF)</TD><TD colspan="2">Pays server coppers to login</TD></TR>
<TR><TD>relays (TMF)</TD><TD colspan="2">Displays relays list or shows relay master</TD></TR>
<TR><TD>server</TD><TD colspan="2">Displays server's detailed settings</TD></TR>
<TR><TD>pm</TD><TD colspan="2">Sends private message to all available admins</TD></TR>
<TR><TD>pmlog</TD><TD colspan="2">Displays log of recent private admin messages</TD></TR>
<TR><TD>call</TD><TD colspan="2">Executes direct server call (see: /admin call help)</TD></TR>
<TR><TD>unlock &lt;pwd&gt;</TD><TD colspan="2">Unlocks admin commands &amp; features</TD></TR>
<TR><TD>debug</TD><TD colspan="2">Toggles debugging output</TD></TR>
<TR><TD>shutdown</TD><TD colspan="2">Shuts down XASECO</TD></TR>
<TR><TD>shutdownall</TD><TD colspan="2">Shuts down Server &amp; XASECO</TD></TR>
<TR><TD>uptodate</TD><TD colspan="2">Checks current version of XASECO</TD></TR>
</TABLE>
</CENTER>
<A NAME="jfreu"></A>
<H3>List of available /jfreu commands:</H3>
<CENTER>
<TABLE WIDTH="90%">
<TR><TD>help</TD><TD colspan="2">Shows Jfreu commands</TD></TR>
<TR><TD>helpall</TD><TD colspan="2">Displays help for Jfreu commands</TD></TR>
<TR><TD>autochangename</TD><TD colspan="2">Auto change servername {ON/OFF}</TD></TR>
<TR><TD>setrank</TD><TD colspan="2">Sets ranklimiting {ON/OFF}</TD></TR>
<TR><TD>setlimit</TD><TD colspan="2">Sets ranklimit value</TD></TR>
<TR><TD>autorank</TD><TD colspan="2">Sets autoranking {ON/OFF}</TD></TR>
<TR><TD>offset</TD><TD colspan="2">Sets autorank offset (-999 - 999)</TD></TR>
<TR><TD>hardlimit</TD><TD colspan="2">Sets hardlimit value</TD></TR>
<TR><TD>autorankminplayers</TD><TD colspan="2">Sets min players for autorank {0-50}</TD></TR>
<TR><TD>autorankvip</TD><TD colspan="2">Include VIPs in autorank {ON/OFF}</TD></TR>
<TR><TD>maxplayers</TD><TD colspan="2">Sets maxplayers for Kick HiRank</TD></TR>
<TR><TD>kickhirank</TD><TD colspan="2">Kick HiRank when server full {ON/OFF}</TD></TR>
<TR><TD>listlimits</TD><TD colspan="2">Displays rank limit settings</TD></TR>
<TR><TD>kickworst</TD><TD colspan="2">Kicks worst players {count}</TD></TR>
<TR><TD>players</TD><TD colspan="2">Displays list of known players {string}</TD></TR>
<TR><TD>players live</TD><TD colspan="2">Displays list of online players</TD></TR>
<TR><TD>unspec</TD><TD colspan="2">UnSpecs player {login/ID} (clear SpecOnly)</TD></TR>
<TR><TD>addvip</TD><TD colspan="2">Adds a VIP {login/ID}</TD></TR>
<TR><TD>removevip</TD><TD colspan="2">Removes a VIP {login/ID}</TD></TR>
<TR><TD>addvipteam</TD><TD colspan="2">Adds a VIP_Team {team}</TD></TR>
<TR><TD>removevipteam</TD><TD colspan="2">Removes VIP_Team {team}</TD></TR>
<TR><TD>listvips</TD><TD colspan="2">Displays VIPs list</TD></TR>
<TR><TD>listvipteams</TD><TD colspan="2">Displays VIP_Teams list</TD></TR>
<TR><TD>writelists</TD><TD colspan="2">Saves VIP/VIP_Team lists (def: jfreu.vips.xml)</TD></TR>
<TR><TD>readlists</TD><TD colspan="2">Loads VIP/VIP_Team lists (def: jfreu.vips.xml)</TD></TR>
<TR><TD>badwords</TD><TD colspan="2">Sets badwords bot {ON/OFF}</TD></TR>
<TR><TD>badwordsban</TD><TD colspan="2">Sets badwords ban {ON/OFF}</TD></TR>
<TR><TD>badwordsnum</TD><TD colspan="2">Sets badwords limit {count}</TD></TR>
<TR><TD>badwordstime</TD><TD colspan="2">Sets banning period {mins}</TD></TR>
<TR><TD>badword</TD><TD colspan="2">Gives extra badword warning {login/ID}</TD></TR>
<TR><TD>banfor</TD><TD colspan="2">Bans player {mins/hoursH} {login/ID}</TD></TR>
<TR><TD>unban</TD><TD colspan="2">UnBans temporarily banned player</TD></TR>
<TR><TD>listbans</TD><TD colspan="2">Displays temporarily banned players</TD></TR>
<TR><TD>message</TD><TD colspan="2">Fakes message from server {msg}</TD></TR>
<TR><TD>player</TD><TD colspan="2">Fakes message from player {login/ID} {msg}</TD></TR>
<TR><TD>nopfkick</TD><TD colspan="2">Sets NoPfKick {map/time/OFF}</TD></TR>
<TR><TD>cancel</TD><TD colspan="2">Cancels current vote (kick/ban/nextmap/restart)</TD></TR>
<TR><TD>novote</TD><TD colspan="2">Auto-cancel CallVotes {ON/OFF}</TD></TR>
<TR><TD>unspecvote</TD><TD colspan="2">Allow /unspec votes {ON/OFF}</TD></TR>
<TR><TD>infomessages</TD><TD colspan="2">Sets info messages {ON/OFF}</TD></TR>
<TR><TD>writeconfig</TD><TD colspan="2">Saves Jfreu config (def: jfreu.config.xml)</TD></TR>
<TR><TD>readconfig</TD><TD colspan="2">Loads Jfreu config (def: jfreu.config.xml)</TD></TR>
</TABLE>
</CENTER>
<br>
<HR>
<ADDRESS>
Copyright &copy; 2007-2013 &ndash; Frans P. de Vries <A HREF="mailto:tm&#64;&#103;&#97;&#109;&#101;&#114;&#115;&#46;&#111;&#114;&#103;">&lt;tm&#64;&#103;&#97;&#109;&#101;&#114;&#115;&#46;&#111;&#114;&#103;&gt;</A>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
Last updated 02-Apr-2013
</ADDRESS>
</BODY>
</HTML>

View File

@ -1,421 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<TITLE>TrackMania Nations - XASECO</TITLE>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<META NAME="author" CONTENT="Frans P. de Vries">
<META NAME="generator" CONTENT="vi :)">
<style type="text/css">
body { width: 960px; margin-left: 30px; font-family: Arial,Helvetica,sans-serif; font-size: 15px; }
li,div { padding: 3px; }
code,pre { font-size: 14px; }
pre { width: 90%; margin: 3px 0px; padding: 3px 0px 3px 12px; background-color: #F0F0F0; }
</style>
<META NAME="keywords" CONTENT="TrackMania, Forever, United, Nations, Original, Sunrise, racing, games, XASECO, ASECO, RASP, Jfreu, plugins, records, jukebox, Nadeo">
<META NAME="description" CONTENT="Information on the XASECO system for TrackMania Forever and Nations (& Original/Sunrise), racing games by Nadeo">
</HEAD>
<BODY TEXT="#000000" LINK="#ff0000" VLINK="#0000ff" ALINK="#00ff00" BGCOLOR="#ffffff">
Welcome to this humble page for:
<P ALIGN="center">
<a target="_blank" href="http://eswc.trackmanianations.com/"><IMG SRC="banner.jpg" ALT="TrackMania Nations" BORDER="0" WIDTH="590" HEIGHT="149"></a>
<HR>
<H3>Introduction:</H3>
<CENTER>
<TABLE WIDTH="93%" CELLSPACING="10" BORDER="0"><TR><TD>
This is a simple hub page for TrackMania Nations ESWC. It aims to collect in one place useful information and references to official and community sites for this classic racing game by Nadeo. Here are relevant excerpts from the TMN ESWC press release:
<P>
"For the first time in the history of eSport, a video game has been specially developed for the Electronic Sports World Cup and is being offered free of charge to the players of the entire planet."
<P>
"This special version features a brand new environment, the Stadium, and a revolutionary new gameplay designed for Nadeo's own custom cars. Nadeo has pulled the technological rabbit from the hat with their own brand game engine, featuring the series' best graphics yet, finely tuned for the latest generation graphics cards, not forgetting simpler machines so that no one round the world has a technical freeze out on the race track. With the online in-game ladder, players can customise their cars and avatars and race in their nation's colours on the world's servers. Many Trackmania and Trackmania Sunrise players will already have access to the following exclusive features: peer 2 peer data exchange and skin and avatar customisation."
</TD></TR></TABLE>
</CENTER>
<H3>XASECO:</H3>
<CENTER>
<TABLE WIDTH="93%" CELLSPACING="10" BORDER="0"><TR><TD>
This page is also the initial home to <b>XASECO</b>, which stands
for <b>X</b>ymph's ASECO and is the new name for the system formerly
known as ASECO/RASP for classic TMN. It now supports TrackMania
Forever as well. <b>ASECO</b> is an abbreviation of "<b>A</b>utomatic
<b>SE</b>rver <b>CO</b>ntrol", a system for <b>TrackMania</b> Original,
Sunrise and (especially) <b>Nations</b> and <b>Forever</b> servers
to keep track of player records and provide useful player and admin
commands. <b>RASP</b> is a sizable set of plugins for ASECO that adds
server ranks, a track jukebox, a karma voting system, and lots more.
<P>
As evidenced by the many TrackMania (Nations) servers running it,
the ASECO/RASP system for TMO/TMS/TMN remained a very popular package
to keep track of records and offer players various useful commands
and features. But its original authors have moved on to TM United,
so I have been working at the system on my own since May 2007 to
improve and expand it. The number of changes is so large that I
decided (somewhat presumptuously perhaps) to call this system XASECO
<b>version 0.8</b>, subsequently updated to <b>v1.16</b>, many major
releases since ASECO 0.61b and RASP 1.5 that together combined into
version 0.7. TrackMania Forever is also supported since XASECO v0.96.
<P>
I don't believe there's a point in running a barebones (X)ASECO system
without at least the RASP plugins because those add so many basic
and useful features and commands which players enjoy, so they are
not released separately like before but as one combined system. The
remaining plugins included in this v1.16 release (Mistral's idle-kick,
and Jfreu's plugin) are however optional, as are the series of new
plugins I developed myself. My overall goal remained to stick to
'core functionality' as much as possible, rather than include into
the base system any of the variety of 'niche' plugins that exist out
there, while still providing a complete and integrated solution for
server control.
<P>
For a high-level outline of all of XASECO's features and plugins,
see the <a href="overview.html">Overview page</a>. For screenshots
of many of the TMF interface features, see this <a target="_blank"
href="http://www.tm-forum.com/viewtopic.php?t=16244">preview
thread</a>.
<P>
For a comprehensive overview of the new stuff, see the <A
href="Features_080.html">v0.8 initial release notes</a>, <A
href="Features_095.html">v0.81 - v0.95 oldest release notes</a>, <A
href="Features_103.html">v0.96 - v1.03 older release notes</a>, and
<a href="Features_116.html">v1.04 - v1.16 current release notes</a>.
<P>
And here is a complete overview of all available
commands in <a href="aseco_commands.html">HTML</a> and <A
href="aseco_commands.doc">Word</a>.
</TD></TR></TABLE>
</CENTER>
<a name="content"></a>
<H3>Content:</H3>
<UL>
<LI><a href="#install">Installation</a>
<LI><a href="#upgrade">Upgrading</a>
<LI><a href="#config">Configuration</a>
<LI><a href="#versions">Versions</a>
<LI><a href="#download">Download</a>
<LI><a href="#feedback">Feedback</a>
<LI><a href="#links">Links</a>
<LI><a href="#official">Official</a>
<LI><a href="#community">Community</a>
<LI><a href="#resources">Resources</a>
<LI><a href="#scripts">Scripts</a>
<LI><a href="#plugins">Third-party Plugins</a>
<LI><a href="#obsolete">Obsolete Plugins</a>
</UL>
<a name="install"></a>
<H3>Installation:</H3>
<UL>
<LI><u>New installation of v1.16</u>:<br><br>
See the <a target="_blank" href="http://docs.xaseco.org/install.php">XASECO Installation page</a> on XAseco.org,
or go directly to the <a href="quickstart.html">classic TMN &amp; XASECO quick start guide</a> or <a href="/tmf/quickstart.html">TMF &amp; XASECO quick start guide</a>.
<br><br>
For historical info, you can consult the old ASECO v0.61b readme.pdf
and corresponding Tutorial, as well as the old RASP v1.5 readme.txt,
in <a href="#resources">Server Resources</a> below.
<br><br>
<a name="upgrade"></a>
<LI><u>Upgrading from v1.15b to v1.16</u>:<br><br>
See the <a target="_blank" href="http://docs.xaseco.org/upgrade.php">XASECO Upgrade page</a> on XAseco.org for general instructions.
<br><br>
The following files were updated in v1.16: aseco.php, dedimania.xml,
includes/GbxRemote.bem.php, GbxRemote.inc.php, basic.inc.php,
gbxdatafetcher.inc.php, rasp.funcs.php, rasp.settings.php,
tmxinfosearcher.inc.php, types.inc.php, jfreu.config.php,
plugins/chat.dedimania.php, plugin.checkpoints.php,
plugin.dedimania.php, plugin.localdatabase.php,
plugin.rasp_nextmap.php.
<br><br>
<b>Important</b>:
<UL>
<LI>To register your server with the central Dedimania
database, you must copy the login and password values in the
<CODE>&lt;masterserver_account&gt;</CODE> section from your
server's dedicated.cfg (TMN) or dedicated_cfg.txt (TMF) file into
the corresponding section of the dedimania.xml file, and add
the 3-character nation abbreviation. Instead of the password
you can also use the community code for your server by using
the server login/password on the <a href="#official">official
site</a> for your game (TMO/TMS/TMN) or on this <a target="_blank"
href="http://official.trackmania.com/tmf-communitycode/">page for
TMF</a>.
<LI>Open port <b>8002</b> on your firewall/router for communication
with the central Dedimania server.
<LI>In the zip file, all *.XML and *.PHP config files are located
inside the <b>newinstall/</b> directory. This means that you can (and
have to) unzip the download and replace all the PHP code files, without
worrying about overwriting your customized config files. However, for
every XML/PHP config file that was updated (see above), you <u>must</u>
replace your version with the one from the newinstall/ directory, or
compare them and <u>add</u> any new/changed configuration settings
to your version to insure the system remains working correctly.
<LI>For a new installation, go into the newinstall/ directory and move
all *.XML files into the main directory (next to aseco.php), all *.PHP
files into the includes/ directory, and Aseco.bat|Aseco.sh|AsecoF.sh
also into the main directory.
</UL>
<br>
<LI><u>Upgrading from v0.7 to v0.8+ and from v0.8-v1.14 to v1.15b</u>:<br><br>
See the <a href="upgrades.html">archived Upgrade notes</a>.
</UL>
<a name="config"></a>
<H3>Configuration options:</H3>
<UL>
<LI>See the <a target="_blank" href="http://docs.xaseco.org/config.php">Configuration section</a> on XAseco.org. Here is the list of <a href="admin_abilities.html">default Admin and Operator abilities</a>.
</UL>
<a name="versions"></a>
<H3>Version Notes:</H3>
<UL>
<LI>See the <a target="_blank" href="http://www.xaseco.org/versions.php">XASECO Versions page</a> on XAseco.org.
</UL>
<a name="download"></a>
<H3>Download:</H3>
<UL>
<LI><a href="xaseco_116.zip">xaseco_116.zip</a>
</UL>
<a name="feedback"></a>
<H3>Feedback/questions:</H3>
<UL>
<LI>Please post to the <a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=30737">v1.16 thread</a> or the <a target="_blank" href="http://www.tm-forum.com/viewforum.php?f=127">XASECO1/2 forum</a> on TM-Forum. See also the older forum posts via the <a target="_blank" href="http://www.xaseco.org/versions.php">XASECO Versions page</a> on XAseco.org.
</UL>
<H3>Thanks:</H3>
<UL>
<LI>See the <a target="_blank" href="http://www.xaseco.org/contact.php">Credits &amp; Contact page</a> on XAseco.org.
</UL>
<a name="links"></a>
<H3>Links:</H3>
<UL>
<LI><a name="official"></a><u>Official</u>
<UL>
<LI>See the <a target="_blank" href="http://links.xaseco.org/official.php">Official Links page</a> on XAseco.org.
<br><br>
</UL>
<a name="community"></a>
<LI><u>Community</u>
<UL>
<LI><a target="_blank" href="/tm2/">TM² hub</a>
<LI><a target="_blank" href="/tmf/">TM Forever hub</a>
<LI><a target="_blank" href="/sm/">ShootMania hub</a>
<LI>See the <a target="_blank" href="http://links.xaseco.org/community.php">Community Links page</a> on XAseco.org.
<br><br>
</UL>
<a name="resources"></a>
<LI><u>Server Resources</u>
<UL>
<LI><a href="quickstart.html">TMN &amp; XASECO quick start guide</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=1350">TMO/TMS/TMN Dedicated Server</a>
<LI><a target="_blank" href="http://www.xaseco.org/initd.php">XASECO start-up scripts for Linux</a>
<LI><a target="_blank" href="http://server.xaseco.org/initd.php">Dedicated Server start-up scripts for Linux</a>
<LI>See the <a target="_blank" href="http://links.xaseco.org/resources.php">Resource Links page</a> on XAseco.org.
<br><br>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=2370">ASECO v0.61b</a>
<LI><a target="_blank" href="docs/ReadMe.pdf">ASECO v0.61b readme.pdf</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=4548">ASECO v0.61b tutorial for Windows</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=6674">RASP v1.5</a>
<LI><a target="_blank" href="docs/README.txt">RASP v1.5 readme.txt</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=5915">Jfreu v0.13d</a>
<br><br>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=6749">TMU Dedicated Server</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=9676">ASECO TMU v1.2.0</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=9681">RASP TMU v2.1.4</a>
<br><br>
</UL>
<a name="scripts"></a>
<LI><u>Miscellaneous Scripts</u>
<UL>
<LI>See the <a target="_blank" href="http://www.xaseco.org/tools.php">Scripts &amp; Tools page</a> on XAseco.org.
<br><br>
</UL>
<a name="plugins"></a>
<LI><u>Third-party (TMF) Plugins</u>
<UL>
<LI><a target="_blank" href="http://fish.stabb.de/">Fufi's plugins</a> (
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=17450">Menu</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=15897">Widgets</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=17741">AutoQueue</a>
)
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=24479">Milenco's plugin pack</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=23186">Milenco's plugins</a> ( Average, Finishes, Google, Restart, Slap, TopKarma, WhoKarma )
<LI><a target="_blank" href="http://www.nouseforname.de/xaseco.php">Nouseforname's plugins</a> (
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=23511">Betting</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?p=165591#p165591">Button</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=23740">Entrance</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=23501">Link</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=23526">Message</a>,
Random pay,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=24056">Records</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=25750">RSS reader</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?p=176608#p176608">Song</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=23738">Winning</a>
)
<LI><a target="_blank" href="http://www.undef.name/">undef.de's plugins</a> (
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=26138">Alternate Scoretable</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=25917">Auto Team Adjustment</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29298">Badwords Judge</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=28879">Best Checkpoint Times</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=23466">Cheated Records Killer</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=27398">Gerymania</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29386">Greeting Dude</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=23242">Info-Widget</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=25976">Personal Best Checkpoints</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29278">Personal Best Medals</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=25430">Personal Mommy</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=23355">Private Message window</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=26504">Records-Eyepiece</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=23407">Server Neighborhood</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29120">Teamspeak3 Info</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=28933">Third-Party Plugins UpToDate</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=22876">TM-Karma.com</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29262">Vote Manager</a>
)
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29449">Alternative Admin</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?p=157333#p157333">Auto EndRound</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=24458">Auto EndRound Enhanced</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=28310">AutoGreeter</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=26635">Auto Rank &amp; Score Kicker</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=17872">Auto Track Manager TMF</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=22232">Best Checkpoints widget</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=22204">Best Runs widget</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=22411">Betting</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29225">Bing Translate</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=26820">Buy TMU ad</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=21808">Chat coloured nickname</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?p=83901#p83901">Chatbot by Assembler Maniac</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=5197">Chatbot by El Fuego (Big Geordie)</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=26941">Chatbot by El Fuego (Big Geordie Mark II)</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=23967">Checkpoint info (FAST-like)</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=23547">Checkpoints counter</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=27326">Christmas</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29566">Countdown for Servername</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?p=171523#p171523">CP live</a> (<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?p=210695#p210695">update</a>)
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=25340">Cross server chat</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=23769">Custom chatbox</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=24608">Custom Scorepanel</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=23771">Custom TA timelimit</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29349">DBTools</a>
<LI><a target="_blank" href="http://www.doh-nuts.at/phpbb/viewtopic.php?f=59&amp;t=150">donateLog</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=25010">Email Admin</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=19493">EnterMessage</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=26544">Extended Chatlog</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=23899">Extended List</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=21931">Finish Copper Payout</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=18755">forceMods</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29748">Freezone</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=24237">GoalRace</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=27292">Google Translate</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=20756">hideChat</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=14419">IRC Bot</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29581">Karma Vote Widget</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=27320">Live-sectors for Laps/NASCAR</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=21534">Lottery</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=30411">matchOverlay</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=21957">Modified Join message</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=25537">Network info widget</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=27765">Nickname sync</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=2527">Offline stats (TMOS)</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=30163">Pay2Play</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=17801">Play Panel</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=28899">Quiz</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=28150">R-AutoLaps</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=19489">Random info messages</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=25629">Recdiff</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?p=154460#p154460">Records block</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=25722">Relayrace</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=28361">ReplayCharge</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=19280">Rounds finish panel</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=24526">Sector Records</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=20725">Sector Records, calendar &amp; custom chat</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=20566">ServerStats</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=17841">ShowInfo (EndRace)</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=24686">Show Version</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=20440">Song info widget</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=28108">SpykeAllCps</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=27895">SpykeScore</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=26818">Stalker's Tools</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=28922">SwearBox</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=19799">Switch server</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=23759">switchServer</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=27791">TeamRace</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=6151">Team ranking</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=23949">TeamSpeak 2</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=24809">TeamSpeak 3</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=22876">TM-Karma.com</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=25861">TM-Stats</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=22341">Tournament</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=22887">Trivia</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=24523">User Panel</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=26724">Vote Gamemode</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=19996">ZeroSwitch</a>
<LI><a target="_blank" href="http://plugins.xaseco.org/browse.php">XAseco.org Plugins Repository</a> (mirrors of almost all of the above)
<br><br>
</UL>
<a name="obsolete"></a>
<LI><u>Old/obsolete/TMN Plugins</u> (some appear to be compatible with v0.8+, or are already included in an updated form with the official distribution)
<UL>
<LI><a target="_blank" href="http://fish.stabb.de/">Fufi's mods</a> (Tools, UnSpec, NoCheat)
<LI><a target="_blank" href="http://home.agitated.net/tm/">slly's mods &amp; tools</a>
<LI><a target="_blank" href="http://www.die-webber.com/downloads.php?action=catdetails&amp;catid=16">die-webber mods &amp; tools</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=10740">Automatic Challenge Randomizer</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=6563">Auto TimeLimit</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=7066">Auto Track Manager TMN</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=15812">Chatbot by cow</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=10530">Globalstats</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=8632">Idlekick</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=10238">Jukebox credits</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?p=170119#p170119">Jukebox pay</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?p=103073#p103073">Jukebox votes</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=10010">No Chat</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=10172">Offline messages</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=10906">RemoteCP3 Authentication</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=5779">Team chat</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=10478">Votelimit</a>
</UL>
</UL>
<BR>
<HR>
<ADDRESS>
Copyright &copy; 2007-2013 &ndash; Frans P. de Vries <A HREF="mailto:tm&#64;&#103;&#97;&#109;&#101;&#114;&#115;&#46;&#111;&#114;&#103;">&lt;tm&#64;&#103;&#97;&#109;&#101;&#114;&#115;&#46;&#111;&#114;&#103;&gt;</A>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
Last updated 26-Jul-2013
</ADDRESS>
</BODY>
</HTML>

View File

@ -1,331 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<TITLE>TrackMania Nations - XASECO overview</TITLE>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<META NAME="author" CONTENT="Frans P. de Vries">
<META NAME="generator" CONTENT="vi :)">
<style type="text/css">
body { width: 960px; margin-left: 30px; font-family: Arial,Helvetica,sans-serif; font-size: 15px; }
li,div { padding: 3px; }
code,pre { font-size: 14px; }
pre { width: 90%; margin: 3px 0px; padding: 3px 0px 3px 12px; background-color: #F0F0F0; }
</style>
<META NAME="keywords" CONTENT="TrackMania, Forever, United, Nations, Original, Sunrise, racing, games, XASECO, ASECO, RASP, Jfreu, plugins, records, jukebox, Nadeo">
<META NAME="description" CONTENT="Information on the XASECO system for TrackMania Forever and Nations (& Original/Sunrise), racing games by Nadeo">
</HEAD>
<BODY TEXT="#000000" LINK="#ff0000" VLINK="#0000ff" ALINK="#00ff00" BGCOLOR="#ffffff">
<P ALIGN="center">
<A TARGET="_blank" HREF="http://eswc.trackmanianations.com/"><IMG SRC="banner.jpg" ALT="TrackMania Nations" BORDER="0" WIDTH="590" HEIGHT="149"></A>
<HR>
<H3>XASECO Overview</H3>
<OL>
<LI><H4>Introduction:</H4>
XASECO is a server controller for TMF (both Nations and United) and TMN
written in PHP using a MySQL database. It should also still support
TMO and TMS but I'm unable to test that. The main XASECO program
<b>aseco.php</b> is merely a framework to handle communication with
the dedicated server, handle events, provide logging, and offer support
functionality. All user features and commands are provided by plugins.
<LI><H4>Plugins:</H4>
XASECO runs fine with an empty <b>plugins.xml</b> list, it just
won't do very much. To provide user functionality, add files from
plugins/ directory to the list. Some plugins are essential, such as
plugin.localdatabase.php for communication with the database, while
many others are optional. However, some plugins depend on others being
present (sometimes in the correct order in plugins.xml), so it's best
to preserve as much of the default plugins.xml list as needed.
<LI><H4>Configs:</H4>
Configuration files consist of .XML files in the main directory, as
well as some of the .PHP files in the includes/ directory. The most
important one is <b>config.xml</b>, containing many of the basic
settings, messages, and server and admin definitions. Other config
files are typically related to one specific plugin or set of plugins
(like RASP with <b>rasp.xml</b> and <b>rasp.settings.php</b>).
<LI><H4>Database:</H4>
Using the MySQL database requires the <b>plugin.localdatabase.php</b>
plugin configured via <b>localdatabase.xml</b>. It stores information
about tracks, players, local records, all finishes, karma (or old
style) votes, player ranks, and more.
<LI><H4>Help:</H4>
The main <i>/help</i> command provided by <b>chat.help.php</b> lists
all available chat commands in a chat message, while <i>/helpall</i>
generates a window that includes descriptions. Other plugins
sometimes include a help command (<i>/helpdedi</i> for Dedimania,
<i>/helpvote</i> for chat-based votes) and some commands include a
help option (e.g. <i>/admin helpall</i>, <i>/list help</i>, etc).
<LI><H4>Players:</H4>
Player connects and disconnects are handled by the main aseco.php
program and relayed to plugins via the onPlayerConnect and
onPlayerDisconnect events. The <i>/players</i> command is provided
by the <b>chat.players.php</b> plugin, while <b>chat.players2.php</b>
provides a couple of related commands.
<LI><H4>Local Records:</H4>
Local records are determined and stored by the
<b>plugin.localdatabase.php</b> plugin, and can be displayed
by the <i>/recs</i> command from the <b>chat.records.php</b>
plugin. Additional record rankings and listings are provided by
the <b>chat.records2.php</b> plugin, while <b>chat.recrels.php</b>
offers record relation commands. The maximum number of records
per track is defined in <b>rasp.settings.php</b>.
<LI><H4>Dedimania Records:</H4>
Dedimania records are determined and stored on the central <A
HREF="http://www.dedimania.com/tmstats/?do=stat">Dedimania site</A>
by the <b>plugin.dedimania.php</b> plugin, and can be displayed by the
<i>/dedirecs</i> command from the <b>chat.dedimania.php</b> plugin.
Additional record rankings and listings, as well as record relations,
are provided by the same plugin. All related configuration options
and messages are provided in <b>dedimania.xml</b> (the maximum number
of records per track should be kept at 30). Detailed information can
be found in the <A HREF="Features_095.html">v0.95 release notes</A>.
<LI><H4>Checkpoints:</H4>
Players can keep track of their relative performance at
each checkpoint with the <i>/cps</i> command, provided by the
<b>plugin.checkpoints.php</b> plugin. Normally it uses the player's
own (or any other) local record as reference, if checkpoints are
available for that record, and shows whether each crossing is faster
or slower in the CPS panel above the main racing time (TMF) or in
a brief pop-up window (TMN). If the Dedimania system is enabled,
the <i>/dedicps</i> command can be used to compare the times with the
player's own (or any other) Dedimania record instead. Both settings
are stored for all players, and reloaded upon every visit. More
information can be found in the <A HREF="Features_093.html">v0.93</A>,
<A HREF="Features_098.html">v0.98</A> and <A
HREF="Features_106.html">v1.06</A> release notes.
<LI><H4>Anti-cheat checks:</H4>
When the <b>plugin.checkpoints.php</b> plugin is active, it also checks
checkpoints and finish times in several ways to reduce the chances of
cheated races resulting in local and Dedimania records. See the <A
HREF="Features_105.html">v1.05 release notes</A> for more information.
<LI><H4>Rounds:</H4>
When the <b>plugin.rounds.php</b> plugin is active in Rounds, Team and
Cup (TMF) mode, a report with each player's finish time is shown after
each run. It serves no purpose in TimeAttack, Laps and Stunts mode.
<LI><H4>Track Lists &amp; Jukebox:</H4>
The <b>plugin.rasp_jukebox.php</b> plugin provides the <i>/list</i>
command to list, search for and select from the available tracks
with a wide variety of options. Players can pick any track from the
list that hasn't been played recently, and add it to a jukebox of
tracks that's given precedence over tracks from the regular server
rotation. This is controlled by a number of configuration settings
in <b>rasp.settings.php</b>.
<LI><H4>TMX</H4>
Specific tracks can be downloaded and added directly from <A
TARGET="_blank" HREF="http://www.tm-exchange.com/">TMX</A> with the
<i>/add</i> command (in <b>plugin.rasp_jukebox.php</b>) and <i>/admin
add</i> command (in <b>chat.admin.php</b>). Searching on TMX can be
done with <i>/xlist</i>, while the <b>plugin.tmxinfo.php</b> plugin
offers commands to display track information. More information
can be found in the <A HREF="Features_093.html">v0.93</A> and <A
HREF="Features_101.html">v1.01</A> release notes.
<LI><H4>Karma:</H4>
Karma votes are an easy way for players to indicate via <i>/++</i>
or <i>/--</i> commands whether they like or don't like a track,
provided by the <b>plugin.rasp_karma.php</b> plugin and configured
by settings in <b>rasp.settings.php</b>. Some details can be found
in the <A HREF="Features_089.html">v0.89 release notes</A>.
<LI><H4>Ranks:</H4>
A player obtains a server rank by racing a minimum number (default 3,
configured in <b>rasp.settings.php</b>) of local ("ranked") records.
The average of a player's records over all server tracks determines
the ranking, managed by the <b>plugin.rasp.php</b> plugin with
<b>plugin.rasp_nextrank.php</b> providing a related command.
<LI><H4>Stats:</H4>
Player stats are displayed by the <i>/stats</i> command from
the <b>chat.stats.php</b> plugin, while server information is
provided by <i>/server</i>, <i>/xaseco</i> and <i>/plugins</i> from
<b>chat.server.php</b>. Related plugins <b>chat.laston.php</b>,
<b>chat.songmod.php</b>, <b>chat.wins.php</b> and
<b>plugin.track.php</b> offer associated commands.
<LI><H4>Tiered Admins:</H4>
The tiered admin system defines three ability levels: MasterAdmins
(specified in <b>config.xml</b>) who can run any admin command, and
Admins and Operators for whom the logins and abilities are specified
in <b>adminops.xml</b>. Typically, Operators are allowed to use
the fewest admin commands, and the abilities list extends beyond
the <i>/admin</i> command to special admin features of user commands
(such as jukeboxing tracks that were played too recently). Admins and
operators can be added and removed dynamically, or their abilities
updated, and <b>adminops.xml</b> will be automatically kept in sync.
See this table for the <A HREF="admin_abilities.html">default list
of abilities</A>, and detailed information can be found in the <A
HREF="Features_088.html">v0.88 release notes</A>.
<LI><H4>Chat-based Votes:</H4>
Chat-based votes allow players to vote on actions that
regular CallVotes don't support, such as ending a round or
replaying a track. When enabled in <b>rasp.settings.php</b>, the
<b>plugin.rasp_votes.php</b> plugin disables CallVotes completely and
offers several voting commands that can be voted on with the <i>/y</i>
command (there is no <i>/n</i> counterpart), and on TMF also via the
vote panel provided by <b>plugin.panels.php</b>. Vote configuration
is done in <b>votes.config.php</b>, and detailed information can be
found in the <A HREF="Features_084.html">v0.84 release notes</A>.
<LI><H4>Public/Private Messages:</H4>
The <b>plugin.rasp_chat.php</b> and <b>chat.me.php</b> plugins
offer a wide variety of commands to quickly shout out a message to
other players. Players' regular chat lines are logged and displayed
by the <b>plugin.chatlog.php</b> plugin. Private messages from one
player to another can be send with the <i>/pm</i> command, from an
admin to a player (Cc-ing all other admins) with <i>/pma</i>, and
from one admin to all other admins with <i>/admin pm</i>.
<LI><H4>Muting/Ignoring:</H4>
Muting (the TMN term) or ignoring (TMF) implies that chat messages
from a specified player are suppressed and aren't readable for other
players in the chat window. Admins can maintain a global list of
muted/ignored players, which on TMF uses the built-in Ignore features
and on TMN a simulated suppression system. The latter system is
also used when an individual player mutes another player using the
commands provided in the <b>plugin.muting.php</b> plugin. See the <A
HREF="Features_090.html">v0.90 release notes</A> for more information.
<LI><H4>Ban, Black- &amp; Guestlist:</H4>
A number of <i>/admin</i> commands from <b>chat.admin.php</b> can be
used to warn (with a pop-up message) or kick players, and to punish
repeat offenders with a ban or blacklist. Bans work by IP address and
are tracked only by the dedicated server, and therefore get purged
by a server restart. Blacklists work by login and are stored in
the <b>blacklist.txt</b> file, and therefore persist across server
restarts. Logins on the guestlist can enter the server even when
the maximum number of players or spectators is reached or when the
server is passworded, and are preserved in the <b>guestlist.txt</b>
file. In addition to these built-in mechanisms, XASECO provides
a list of banned IP addresses in the <b>bannedips.xml</b> file
that also transcends server restarts, with more info in the <A
HREF="Features_103.html">v1.03 release notes</A>.
<LI><H4>Player access</H4>
Besides the above local server mechanisms, player access can
also be managed with the <b>global blacklist</b>, and with
<b>access control</b> by nation (TMN) or zone (TMF). See the <A
HREF="Features_109.html">v1.09 release notes</A> for details. Lastly,
the full Jfreu plugin (below) allows player limiting by rank.
<LI><H4>Admin Commands:</H4>
Other <i>/admin</i> commands control the game flow (ending a round,
skipping to the next or previous track, restarting or replaying
a track), affect the server settings (player/spectator limits,
TMF panels, etc), manage tracks and the jukebox, and much more.
Security of the admin commands and features against unauthorized
use can be warranted with a lock password and by specifying
authorized IP addresses for each admin login. See the <A
HREF="Features_103.html">v1.03 release notes</A> for more information.
<LI><H4>Idlekick:</H4>
Inactive players and, optionally, spectators can be kicked
automatically at the end of each track after a specified number of
tracks by the <b>mistral.idlekick.php</b> plugin. Configuration
settings are included in the plugin itself. Some details can be
found in the <A HREF="Features_090.html">v0.90 release notes</A>.
<LI><H4>Auto TimeLimit:</H4>
With the <b>plugin.autotime.php</b> plugin enabled in TimeAttack mode,
the timelimit for each track is defined dynamically, based on the
track's author time and settings in <b>autotime.xml</b>. See the <A
HREF="Features_104.html">v1.04 release notes</A> for details.
<LI><H4>Jfreu:</H4>
The Jfreu plugins <b>jfreu.plugin.php</b> and <b>jfreu.chat.php</b>
provide a variety of features, including player connect/disconnect
messages, informational messages, rank limiting (with VIP
exceptions), bad word filtering, and more. The first two features
are also available separately in the <b>jfreu.lite.php</b>
plugin in case the rest isn't needed. They are configured via
<b>jfreu.config.php</b> and changed options are automatically stored in
the <b>jfreu/jfreu.config.xml</b> file. More information is available
in the <A HREF="Features_091.html">v0.91 release notes</A>.
<LI><H4>TMF Music:</H4>
The <b>plugin.musicserver.php</b> plugin offers support for playing
server controlled music instead of the default game music and,
optionally, even overriding a track's own song. The <i>/music</i>
command includes a simple jukebox feature as well as admin options,
and .OGG comments (ID3 tags) can also be displayed. Configuration
is done in <b>musicserver.xml</b>, and more information can
be found in the <A HREF="Features_099.html">v0.99</A>,
<A HREF="Features_102.html">v1.02</A> and <A
HREF="Features_104.html">v1.04</A> release notes.
<LI><H4>TMF Custom Rounds Points:</H4>
With the <b>plugin.rpoints.php</b> plugin enabled, admins can select
alternative points systems in Rounds mode instead of the standard
10,6,4,3,2,1. Various common systems (like Formula 1 GP and MotoGP)
are included, and completely custom systems can be defined as well.
See the <A HREF="Features_104.html">v1.04 release notes</A> for
details.
<LI><H4>TMF Styles &amp; Panels:</H4>
The main output window can be dynamically customized with a large
number of style templates from the <b>styles/</b> subdirectory, managed
by the <b>plugin.style.php</b> plugin. The <b>plugin.panels.php</b>
plugin provides four panels: the admin panel to easily activate a
handful of the most commonly used admin commands; the donate panel
to easily initiate a donation with a variety of copper amounts; the
records panel to display a track's relevant records; and a temporary
vote panel to easily respond to chat-based votes. Each panel
can be dynamically customized with a number of templates from the
<b>panels/</b> subdirectory. All players' style and panel preferences
are stored, and reloaded upon every visit. Detailed information
can be found in the <A HREF="Features_100.html">v1.00</A>,
<A HREF="Features_101.html">v1.01</A> and <A
HREF="Features_106.html">v1.06</A> release notes.
<LI><H4>TMF Stats Panels:</H4>
Instead of the rank chat messages at the end of each track, on TMF
a personal stats panel can be displayed for each player during the
scoreboard. The stats are: server rank, record average, records total,
wins total, session play time, and donation total (on TMUF servers).
Details are included in the <A HREF="Features_106.html">v1.06 release
notes</A>.
<LI><H4>TMF Message Window:</H4>
When enabled via <b>plugin.msglog.php</b>, the system message window
near the top of the screen can be used to temporarily display a wide
variety of global messages that normally flood the chat window.
These include new/improved/equalled records, record reports
before and after each track, rounds reports, Jfreu Info messages
and several more, all individually configured in their pertaining
config files. See the <A HREF="Features_102.html">v1.02</A> and <A
HREF="Features_103.html">v1.03</A> release notes for more information.
<LI><H4>TMUF Coppers:</H4>
Copper transactions are managed by the <b>plugin.donate.php</b>
plugin, allowing players to donate coppers to the server, and
admins (with the appropriate ability) to pay coppers to any
other login (including another server). More information is
available in the <A HREF="Features_099.html">v0.99</A> and <A
HREF="Features_101.html">v1.01</A> release notes.
</OL>
<BR>
<HR>
<ADDRESS>
Copyright &copy; 2007-2013 &ndash; Frans P. de Vries <A HREF="mailto:tm&#64;&#103;&#97;&#109;&#101;&#114;&#115;&#46;&#111;&#114;&#103;">&lt;tm&#64;&#103;&#97;&#109;&#101;&#114;&#115;&#46;&#111;&#114;&#103;&gt;</A>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
Last updated 08-Aug-2010
</ADDRESS>
</BODY>
</HTML>

View File

@ -1,254 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<TITLE>TrackMania Forever - TMF &amp; XASECO quick start guide</TITLE>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<META NAME="author" CONTENT="Frans P. de Vries">
<META NAME="generator" CONTENT="vi :)">
<style type="text/css">
body { width: 960px; margin-left: 30px; font-family: Arial,Helvetica,sans-serif; font-size: 15px; }
li,div { padding: 3px; }
code,pre { font-size: 14px; }
pre { width: 90%; margin: 3px 0px; padding: 3px 0px 3px 12px; background-color: #F0F0F0; }
</style>
<META NAME="keywords" CONTENT="TrackMania, Forever, United, Nations, Sunrise, Original, racing, games, XASECO, ASECO, RASP, plugins, records, jukebox, Nadeo">
<META NAME="description" CONTENT="Information on setting up a dedicated server and the XASECO system for TrackMania Nations/United Forever, racing games by Nadeo">
</HEAD>
<BODY TEXT="#000000" LINK="#ff0000" VLINK="#0000ff" ALINK="#00ff00" BGCOLOR="#ffffff">
<P ALIGN="center">
<A TARGET="_blank" HREF="http://www.trackmania.com/"><IMG SRC="banner.jpg" ALT="TrackMania Forever" BORDER="0" WIDTH="755" HEIGHT="245"></A>
<HR>
<H3>Quick Start Guide:</H3>
This is step-by-step guide to setting up a TrackMania Forever (TMF) dedicated server with XASECO for those lost in or confused by the <A HREF="/tmf/#resources">available readme's and tutorials</A>, and those just too lazy to read them. ;-)
<P>
It's written for Linux but should largely apply to Windows too, and your system needs to have a working MySQL 4.x or 5.x and PHP 5.x setup. To manage the database, enter the MySQL commands in the mysql command prompt, PhpMyAdmin or another tool of your choice. You need to run the TMF server and XASECO on the same machine, running them on separate machines is beyond the scope of this guide.
<P>
First, the dedicated server:
<OL>
<LI>Ideally, the TMF server and XASECO run under a user account rather than root, so create a user e.g. "<b>tmf</b>" with home directory "<b>/home/tmf</b>".
<LI>Login as (or switch to) user "tmf" so that all files created down the road receive the correct ownership and permissions.
<LI>The TMF server zip doesn't have a top-level directory, so create one first to keep all the server files together, e.g.:<br>
<div>
&nbsp;&nbsp;&nbsp;<b><CODE>mkdir TMF</CODE></b><br>
&nbsp;&nbsp;&nbsp;<b><CODE>cd TMF</CODE></b><br>
</div>
<LI>Download and unzip the latest TMF server (<A TARGET="_blank" HREF="http://www.tm-forum.com/viewtopic.php?t=14203">TrackmaniaServer_2011-02-21.zip</A>) into this TMF/ directory.
<LI>Create a dedicated login:
<OL type="a">
<LI>for TM Nations Forever, use your game client to create a new dedicated server login (note that this server won't be able to use coppers).
<LI>for TM United Forever, <A TARGET="_blank" HREF="https://player.trackmania.com/">log into the TMF Player Page</A> using your player login and password, and create a dedicated server login and password (different from your player password) after entering your full game key.
</OL>
<LI>Edit <b>TMF/GameData/Config/dedicated_cfg.txt</b>:
<OL type="a">
<LI>In the &lt;authorization_levels&gt; section, change all three <b>passwords</b>, but do <u>not</u> change the names (SuperAdmin, Admin, User).
<LI>In the &lt;masterserver_account&gt; section, enter the server <b>&lt;login&gt;</b> obtained above with its own <b>&lt;password&gt;</b>, and optionally the last three characters of your player key in <b>&lt;validation_key&gt;</b> if you want your TMUF server to be able to use coppers.
<LI>In the &lt;server_options&gt; section, give your server a <b>&lt;name&gt;</b> and configure the other options to your liking.
<LI>In the &lt;system_config&gt; section, set <b>&lt;connection_uploadrate&gt;</b> and <b>&lt;connection_downloadrate&gt;</b> to values closest to your connection's speed (in Kbps), and remember the three port numbers (default: 2350 for the server, 3450 for P2P and 5000 for XMLRPC; these can be changed to other free port numbers, but it's recommended to keep the defaults at least until your server comes online successfully).
<LI>For a TMNF server, <b>&lt;packmask&gt;</b> must be set to 'nations' or 'stadium'. For TMUF it can be empty or set to 'united', or to one environment like 'desert', 'island', etc, or to the three environments of the older games with 'original' or 'sunrise'.
</OL>
<LI>Choose and edit a match settings file, e.g. TMF/GameData/Tracks/MatchSettings/Nations/NationsBlue.txt, to your liking (see the <A TARGET="_blank" HREF="/tmf/docs/readme_dedicated.html">server readme</A> for details).
<LI>On your firewall/router, open the server port 2350 and the P2P port 3450 for both UDP and TCP traffic, but <u>not</u> the XMLRPC port 5000. For the Dedimania system in XASECO port <b>8002</b> needs to be open as well. For more information on this, <A target="_blank" HREF="http://www.portforward.com/">PortForward.com</A> may be useful.
<LI>A standard startup script is no longer included in the zip, so create one looking like this in RunTrackmaniaNations.sh (and make it executable with <CODE>chmod +x RunTrackmaniaNations.sh</CODE>):<br>
<div>
&nbsp;&nbsp;&nbsp;<b><CODE>./TrackmaniaServer /game_settings=MatchSettings/Nations/NationsBlue.txt /dedicated_cfg=dedicated_cfg.txt</CODE></b><br>
</div>
or in RunTrackmaniaNations.bat:<br>
<div>
&nbsp;&nbsp;&nbsp;<b><CODE>TrackmaniaServer.exe /game_settings=MatchSettings/Nations/NationsBlue.txt /dedicated_cfg=dedicated_cfg.txt</CODE></b><br>
</div>
Options <CODE>/internet</CODE> and <CODE>/autoquit</CODE> are now default, and the <CODE>/game=...</CODE> option (from TMN) is no longer needed due to the &lt;packmask&gt; setting.
<LI>Start the server:<br>
<div>
&nbsp;&nbsp;&nbsp;<b><CODE>cd ~/TMF/</CODE></b><br>
&nbsp;&nbsp;&nbsp;<b><CODE>./RunTrackmaniaNations.sh</CODE></b> (or <CODE>RunTrackmaniaNations.bat</CODE>)<br>
</div>
You should see output like the following:<br>
<PRE>
Starting TmForever v2011-02-21...
Initializing...
Configuration file : dedicated_cfg.txt
Loading system configuration...
...system configuration loaded
Loading cache...
...OK
Listening for xml-rpc commands on port 5000.
Trackmania server daemon started with pid=13512 (parent=13483).
</PRE>
If you get a Segmentation Fault here, the server cannot create files/directories due to ownership/permission problems (perhaps you forgot step 2?).
<LI>The first time the server starts, it creates a Default.SystemConfig.Gbx file as well as the blacklist.txt and guestlist.txt files in the GameData/Config/ directory, and a number of directories like Logs/, GameData/Cache/, GameData/Profiles/, GameData/Scores/, GameData/Tracks/Campaigns/, GameData/Tracks/Replays/, GameData/Tracks/Challenges/Downloaded/ and GameData/Tracks/Challenges/My Challenges/. The files in the Logs/ directory are useful to monitor your server's activity.
<LI>Start your TMF client and check in the Internet server browser that the server is running in your zone with your chosen server name and the Nadeo Advanced tracks.
<LI>Join your server, and have a friend join from elsewhere on the Internet, to verify that the server is accessible.
<LI>Ignore the private network warning that is always logged in ConsoleLog.*.txt.
<LI>To start &amp; stop your TMF server on Linux more easily, you can use this <A TARGET="_blank" HREF="http://server.xaseco.org/initd.php">start-up script</A>.
<LI>Collect your own tracks in GameData/Tracks/Challenges/My Challenges/, copy and edit a new match settings file in GameData/Tracks/MatchSettings/ that lists those tracks, use that file in RunTrackmaniaNations.sh (or RunTrackmaniaNations.bat), and restart your server. It should now be running your track selection. Congratulations. :-)
</OL>
<A NAME="xaseco"></A>
Secondly, the XASECO system:
<OL>
<LI>Create the XASECO database in MySQL (default "aseco" but any other name is okay too):<br>
<div>
&nbsp;&nbsp;&nbsp;<b><CODE>CREATE DATABASE aseco;</CODE></b><br>
</div>
Also create a separate user (e.g. "<b>tmf</b>") in MySQL with a <b>password</b>, and grant this user all rights to the "<b>aseco</b>" database. The basic MySQL commands are:<br>
<div>
&nbsp;&nbsp;&nbsp;<b><CODE>CREATE USER 'tmf'@'localhost';</CODE></b><br>
&nbsp;&nbsp;&nbsp;<b><CODE>SET PASSWORD FOR 'tmf'@'localhost' = password('password');</CODE></b><br>
&nbsp;&nbsp;&nbsp;<b><CODE>GRANT all ON aseco.* TO 'tmf'@'localhost';</CODE></b>
</div>
<LI>Login as (or switch to) user "tmf" so that all files created down the road receive the correct ownership and permissions.
<LI>Download and unzip XASECO (<A HREF="/tmn/#download">latest version</A>) into the "/home/tmf/" directory too, the default path will be <b>xaseco/</b> so that future releases can be unpacked into the same directory tree.<br>
In the zip file, all *.XML and config files are located inside the <b>newinstall/</b> directory. Go into the newinstall/ directory and move all *.XML files into the main directory (next to aseco.php), and move all *.PHP files into the includes/ directory.<br>
Also, move AsecoF.sh (on Linux) or Aseco.bat (on Windows) into the main directory and adjust it to your situation if necessary.
<LI>Setting up the database tables in MySQL is done automatically the first time XASECO runs, but if you prefer you can do it manually in advance:<br>
<div>
&nbsp;&nbsp;&nbsp;<b><CODE>USE aseco;</CODE></b><br>
&nbsp;&nbsp;&nbsp;<b><CODE>SOURCE /home/tmf/xaseco/localdb/aseco.sql;</CODE></b><br>
&nbsp;&nbsp;&nbsp;<b><CODE>SOURCE /home/tmf/xaseco/localdb/rasp.sql;</CODE></b><br>
&nbsp;&nbsp;&nbsp;<b><CODE>SOURCE /home/tmf/xaseco/localdb/extra.sql;</CODE></b>
</div>
<LI>Edit <b>xaseco/localdatabase.xml</b>:
<OL type="a">
<LI>Replace YOUR_MYSQL_LOGIN with the MySQL user you created above, e.g. <b>tmf</b>.
<LI>Replace YOUR_MYSQL_PASSWORD with the MySQL password you set above.
<LI>Use the same database name as you created above, e.g. <b>aseco</b>.
<LI>localhost is your own machine, so the server option is okay.
</OL>
<LI>Edit <b>xaseco/config.xml</b>:
<OL type="a">
<LI>In the &lt;masteradmins&gt; section, uncomment and replace YOUR_MASTERADMIN_LOGIN with your player login, and add further logins for other players you want to grant all XASECO admin rights.
<LI>In the &lt;tmserver&gt; section, replace YOUR_SUPERADMIN_PASSWORD with the password you chose for SuperAdmin in dedicated_cfg.txt (TMF step 6a above) but do <u>not</u> change the SuperAdmin login itself.
<LI>The &lt;port&gt; field should contain the same XMLRPC port number you chose in dedicated_cfg.txt (TMF step 6d above), default 5000.
<LI>IP 127.0.0.1 is your own machine again, so that option is okay too.
</OL>
<LI>Edit <b>xaseco/adminops.xml</b>:
<OL type="a">
<LI>In the &lt;admins&gt; section, uncomment and replace YOUR_ADMIN_LOGIN with an admin's login, and add further logins for other players you want to grant partial XASECO admin rights. Or leave the &lt;tmlogin&gt; entry commented out if there are none.
<LI>In the &lt;operators&gt; section, uncomment and replace YOUR_OPERATOR_LOGIN with an operator's login, and add further logins for other players you want to grant XASECO operator rights. Or leave the &lt;tmlogin&gt; entry commented out if there are none.
</OL>
<LI>Edit <b>xaseco/dedimania.xml</b> if you want to use the Dedimania world records system:
<OL type="a">
<LI>In the &lt;masterserver_account&gt; section, replace YOUR_SERVER_LOGIN and YOUR_SERVER_PASSWORD with the &lt;login&gt; and &lt;password&gt; values from your dedicated_cfg.txt file.
<LI>Also, replace YOUR_SERVER_NATION with your 3-character nation abbreviation.
<LI>Instead of the password you can also enter the community code for your server which can be obtained by using the server login/password on this <a target="_blank" href="http://official.trackmania.com/tmf-communitycode/">page for TMF</a>.
<LI>To disable Dedimania support, remove or comment out the chat.dedimania.php and plugin.dedimania.php entries in plugins.xml.
</OL>
<LI>Start the XASECO system:<br>
<div>
&nbsp;&nbsp;&nbsp;<b><CODE>cd ~/xaseco/</CODE></b><br>
&nbsp;&nbsp;&nbsp;<b><CODE>./Aseco.sh</CODE></b> (or <CODE>Aseco.bat</CODE>)<br>
</div>
You won't see output, but logfile.txt should contain something like the following:<br>
<PRE>
[XAseco] PHP Version is 5.3.x on Linux
[XAseco] Load settings [config.xml]
[XAseco] Load admin/ops lists [adminops.xml]
[XAseco] Load banned IPs list [bannedips.xml]
[XAseco] Load plugins list [plugins.xml]
[XAseco] Load plugin [plugin.localdatabase.php]
[XAseco] Load plugin [plugin.rounds.php]
[...snip plugins...]
[XAseco] Load plugin [jfreu.plugin.php]
[XAseco] Load plugin [mistral.idlekick.php]
[XAseco] Try to connect to TM dedicated server on 127.0.0.1:5000 timeout 180s
[XAseco] Try to authenticate with username 'SuperAdmin' and password 'PASSWORD'
[XAseco] Connection established successfully!
[Local DB] Load settings file
[Local DB] Try to connect to MySQL server on 'localhost' with database 'aseco'
[Local DB] MySQL Server Version is 5.1.56-log
[RASP] Cleaning up unused data
*-*-*-*-*-* RASP is running! *-*-*-*-*-*
|...Loading Settings
|...Loaded!
|...Checking database structure
|...Structure OK!
|...Calculating ranks
|...Done!
[04/xx,xx:11:17] Load default style [styles/DarkBlur.xml]
[04/xx,xx:11:17] Load default admin panel [panels/AdminBelowChat.xml]
[04/xx,xx:11:17] Load default donate panel [panels/DonateBelowCPList.xml]
[04/xx,xx:11:17] Load default records panel [panels/RecordsRightBottom.xml]
[04/xx,xx:11:17] Load default vote panel [panels/VoteBelowChat.xml]
[04/xx,xx:11:17] ************* (Dedimania) *************
[04/xx,xx:11:17] * Dataserver connection on Dedimania ...
[04/xx,xx:11:17] * Try connection on http://dedimania.net:8002/Dedimania ...
[04/xx,xx:11:18] Webaccess (dedimania.net:80): send: deflate, receive: gzip
[04/xx,xx:11:18] * Connection and status ok! :)
[04/xx,xx:11:18] * NEWS (Dedimania, 08/05): news
[04/xx,xx:11:18] ------------- (Dedimania) -------------
[04/xx,xx:11:18] Load stats panel [panels/StatsNations.xml]
[04/xx,xx:11:18] Load auto timelimit config [autotime.xml]
###############################################################################
XASECO v1.1x running on 127.0.0.1:5000
Name : YOUR SERVER NAME - YOUR_SERVER_LOGIN
Game : TmForever United - Stadium - TimeAttack
Version: 2.11.26 / 2011-02-21
Authors: Florian Schnell & Assembler Maniac
Re-Authored: Xymph
###############################################################################
Begin Race
[04/xx,xx:11:18] track changed [none] >> [Pro - 38~74~75~89~93]
[04/xx,xx:11:18] currently no record on Pro - 38~74~75~89~93
</PRE>
If you get an RPC Permission Error here, there is an XMLRPC port mismatch or the dedicated server isn't running (anymore).
<LI>To start &amp; stop your XASECO on Linux more easily, you can use this <A TARGET="_blank" HREF="http://www.xaseco.org/initd.php">start-up script</A>.
<LI>Edit the <A HREF="/tmn/#config">configuration options</A> to your liking, and restart XASECO. It should now be ready to manage tracks, receive players, and record... er... records. Congratulations. :-)
</OL>
Finally, to run another server on the same machine:
<OL>
<LI>Basically follow the same steps above, but use a second user account (e.g. "tmf2"), another new server login/password in dedicated_cfg.txt, a separate server name, a second set of ports (e.g. 2351, 3451 and 5001), a new database (e.g. "aseco2"), optionally a second MySQL account (e.g. "tmf2"), and the corresponding updates in localdatabase.xml and config.xml.
<LI>Don't use symbolic links in the GameData/ directory tree (e.g. to symlink the tracks from the first server to the second one), as the TMF server will crash without an error message.
</OL>
And for the last time, read the <A HREF="/tmf/#resources">readme's and tutorials</A> completely for a more thorough understanding of the entire setup.
<br><br>
<HR>
<ADDRESS>
Copyright &copy; 2007-2013 &ndash; Frans P. de Vries <A HREF="mailto:tm&#64;&#103;&#97;&#109;&#101;&#114;&#115;&#46;&#111;&#114;&#103;">&lt;tm&#64;&#103;&#97;&#109;&#101;&#114;&#115;&#46;&#111;&#114;&#103;&gt;</A>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
Last updated 08-May-2013
</ADDRESS>
</BODY>
</HTML>

View File

@ -1,226 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<TITLE>TrackMania Nations - TMN &amp; XASECO quick start guide</TITLE>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<META NAME="author" CONTENT="Frans P. de Vries">
<META NAME="generator" CONTENT="vi :)">
<style type="text/css">
body { width: 960px; margin-left: 30px; font-family: Arial,Helvetica,sans-serif; font-size: 15px; }
li,div { padding: 3px; }
code,pre { font-size: 14px; }
pre { width: 90%; margin: 3px 0px; padding: 3px 0px 3px 12px; background-color: #F0F0F0; }
</style>
<META NAME="keywords" CONTENT="TrackMania, Nations, Original, Sunrise, racing, games, XASECO, ASECO, RASP, Jfreu, plugins, records, jukebox, Nadeo">
<META NAME="description" CONTENT="Information on setting up a dedicated server and the XASECO system for TrackMania Nations, a racing game by Nadeo">
</HEAD>
<BODY TEXT="#000000" LINK="#ff0000" VLINK="#0000ff" ALINK="#00ff00" BGCOLOR="#ffffff">
<P ALIGN="center">
<A TARGET="_blank" HREF="http://eswc.trackmanianations.com/"><IMG SRC="banner.jpg" ALT="TrackMania Nations" BORDER="0" WIDTH="590" HEIGHT="149"></A>
<HR>
<H3>Quick Start Guide:</H3>
This is step-by-step guide to setting up a classic TrackMania Nations (TMN) dedicated server with XASECO for those lost in or confused by the <A HREF="/tmn/#resources">available readme's and tutorials</A>, and those just too lazy to read them. ;-)
<P>
It's written for Linux but should largely apply to Windows too, and your system needs to have a working MySQL 4.x or 5.x and PHP 5.x setup. To manage the database, enter the MySQL commands in the mysql command prompt, PhpMyAdmin or another tool of your choice. You need to run the TMN server and XASECO on the same machine, running them on separate machines is beyond the scope of this guide.
<P>
First, the dedicated server:
<OL>
<LI>Ideally, the TMN server and XASECO run under a user account rather than root, so create a user e.g. "<b>tmn</b>" with home directory "<b>/home/tmn</b>".
<LI>Login as (or switch to) user "tmn" so that all files created down the road receive the correct ownership and permissions.
<LI>Download and unzip the final TMN server (<A TARGET="_blank" HREF="http://www.tm-forum.com/viewtopic.php?t=1350">TmDedicatedServer_2006-05-30.zip</A>) into this home directory, the default path will be <b>TmDedicatedServer/</b>.
<LI>Edit <b>TmDedicatedServer/dedicated.cfg</b>:
<OL type="a">
<LI>In the &lt;authorization_levels&gt; section, change all three <b>passwords</b>, but do <u>not</u> change the names (SuperAdmin, Admin, User).
<LI>In the &lt;masterserver_account&gt; section, enter a <u>new</u> server <b>&lt;login&gt;</b> (different from your player login) with its own <b>&lt;password&gt;</b> (again different) and an appropriate and valid three-letter <b>&lt;nation&gt;</b>. If you're not sure your chosen login is new, use your TMN client to test it first, in both cases the account will be registered automatically with the masterserver.
<LI>In the &lt;server_options&gt; section, give your server a <b>&lt;name&gt;</b> and configure the other options to your liking.
<LI>In the &lt;system_config&gt; section, set <b>&lt;connection_type&gt;</b> to a value closest to your connection's speed (see the <A TARGET="_blank" HREF="/tmn/docs/readme_dedicated.html">server readme</A> for correct values), and remember the three port numbers (default: 2350 for the server, 3450 for P2P and 5000 for XMLRPC; these can be changed to other free port numbers, but it's recommended to keep the defaults at least until your server comes online successfully).
</OL>
<LI>Edit the default match settings file TmDedicatedServer/GameData/Tracks/MatchSettings/Internet/AdvancedTraining.txt to your liking (again, see the <A TARGET="_blank" HREF="/tmn/docs/readme_dedicated.html">server readme</A> for details).
<LI>On your firewall/router, open the server port 2350 and the P2P port 3450 for both UDP and TCP traffic, but <u>not</u> the XMLRPC port 5000. For the Dedimania system in XASECO port <b>8002</b> needs to be open as well. For more information on this, <A TARGET="_blank" HREF="http://www.portforward.com/">PortForward.com</A> may be useful.
<LI>Start the server:<br>
<div>
&nbsp;&nbsp;&nbsp;<b><CODE>cd ~/TmDedicatedServer/</CODE></b><br>
&nbsp;&nbsp;&nbsp;<b><CODE>./RunTrackmaniaNations.sh</CODE></b> (or <CODE>RunTrackmaniaNations.bat</CODE>)<br>
</div>
You should see output like the following:<br>
<PRE>
Starting TmNationsESWC v2006-05-30...
Unable to open '/home/tmn/TmDedicatedServer/Default.SystemConfig.GbxInitializing...
Configuration file : dedicated.cfg
Loading system configuration...
...system configuration loaded
Loading cache...
...OK
Listening for xml-rpc commands on port 5000.
Trackmania server daemon started with pid=28936 (parent=28935).
</PRE>
If you get a Segmentation Fault here, the server cannot create files/directories due to ownership/permission problems (perhaps you forgot step 2?).
<LI>The first time the server starts, it creates that Default.SystemConfig.Gbx file, as well as the blacklist.txt and guestlist.txt files and a number of directories like Logs/, GameData/Cache/, GameData/Profiles/, GameData/Scores/, GameData/Tracks/Campaigns/, GameData/Tracks/Replays/, GameData/Tracks/Challenges/Downloaded/ and GameData/Tracks/Challenges/My Challenges/. The files in the Logs/ directory are useful to monitor your server's activity.
<LI>Start your TMN client and check in the Internet server browser that the server is running in your Nation with your chosen server name and the Nadeo Advanced tracks.
<LI>Join your server, and have a friend join from elsewhere on the Internet, to verify that the server is accessible.
<LI>Ignore the private network warning that is always logged in ConsoleLog.*.txt.
<LI>To start &amp; stop your TMN server on Linux more easily, you can use this <A TARGET="_blank" HREF="http://www.tm-forum.com/viewtopic.php?t=10240">start-up script</A>.
<LI>Collect your own tracks in GameData/Tracks/Challenges/My Challenges/, copy and edit a new match settings file in GameData/Tracks/MatchSettings/Internet/ that lists those tracks, use that file in RunTrackmaniaNations.sh (or RunTrackmaniaNations.bat), and restart your server. It should now be running your track selection. Congratulations. :-)
</OL>
<A NAME="xaseco"></A>
Secondly, the XASECO system:
<OL>
<LI>Create the XASECO database in MySQL (default "aseco" but any other name is okay too):<br>
<div>
&nbsp;&nbsp;&nbsp;<b><CODE>CREATE DATABASE aseco;</CODE></b><br>
</div>
Also create a separate user (e.g. "<b>tmn</b>") in MySQL with a <b>password</b>, and grant this user all rights to the "<b>aseco</b>" database. The basic MySQL commands are:<br>
<div>
&nbsp;&nbsp;&nbsp;<b><CODE>CREATE USER 'tmn'@'localhost';</CODE></b><br>
&nbsp;&nbsp;&nbsp;<b><CODE>SET PASSWORD FOR 'tmn'@'localhost' = password('password');</CODE></b><br>
&nbsp;&nbsp;&nbsp;<b><CODE>GRANT all ON aseco.* TO 'tmn'@'localhost';</CODE></b>
</div>
<LI>Login as (or switch to) user "tmn" so that all files created down the road receive the correct ownership and permissions.
<LI>Download and unzip XASECO (<A HREF="/tmn/#download">latest version</A>) into the "/home/tmn/" directory too, the default path will be <b>xaseco/</b> so that future releases can be unpacked into the same directory tree.<br>
In the zip file, all *.XML and config files are located inside the <b>newinstall/</b> directory. Go into the newinstall/ directory and move all *.XML files into the main directory (next to aseco.php), and move all *.PHP files into the includes/ directory.<br>
Also, move Aseco.sh (on Linux) or Aseco.bat (on Windows) into the main directory and adjust it to your situation if necessary.
<LI>Setting up the database tables in MySQL is done automatically the first time XASECO runs, but if you prefer you can do it manually in advance:<br>
<div>
&nbsp;&nbsp;&nbsp;<b><CODE>USE aseco;</CODE></b><br>
&nbsp;&nbsp;&nbsp;<b><CODE>SOURCE /home/tmn/xaseco/localdb/aseco.sql;</CODE></b><br>
&nbsp;&nbsp;&nbsp;<b><CODE>SOURCE /home/tmn/xaseco/localdb/rasp.sql;</CODE></b><br>
&nbsp;&nbsp;&nbsp;<b><CODE>SOURCE /home/tmn/xaseco/localdb/extra.sql;</CODE></b>
</div>
<LI>Edit <b>xaseco/localdatabase.xml</b>:
<OL type="a">
<LI>Replace YOUR_MYSQL_LOGIN with the MySQL user you created above, e.g. <b>tmn</b>.
<LI>Replace YOUR_MYSQL_PASSWORD with the MySQL password you set above.
<LI>Use the same database name as you created above, e.g. <b>aseco</b>.
<LI>localhost is your own machine, so the server option is okay.
</OL>
<LI>Edit <b>xaseco/config.xml</b>:
<OL type="a">
<LI>In the &lt;masteradmins&gt; section, uncomment and replace YOUR_MASTERADMIN_LOGIN with your player login, and add further logins for other players you want to grant all XASECO admin rights.
<LI>In the &lt;tmserver&gt; section, replace YOUR_SUPERADMIN_PASSWORD with the password you chose for SuperAdmin in dedicated.cfg (TMN step 4a above) but do <u>not</u> change the SuperAdmin login itself.
<LI>The &lt;port&gt; field should contain the same XMLRPC port number you chose in dedicated.cfg (TMN step 4d above), default 5000.
<LI>IP 127.0.0.1 is your own machine again, so that option is okay too.
</OL>
<LI>Edit <b>xaseco/adminops.xml</b>:
<OL type="a">
<LI>In the &lt;admins&gt; section, uncomment and replace YOUR_ADMIN_LOGIN with an admin's login, and add further logins for other players you want to grant partial XASECO admin rights. Or leave the &lt;tmlogin&gt; entry commented out if there are none.
<LI>In the &lt;operators&gt; section, uncomment and replace YOUR_OPERATOR_LOGIN with an operator's login, and add further logins for other players you want to grant XASECO operator rights. Or leave the &lt;tmlogin&gt; entry commented out if there are none.
</OL>
<LI>Edit <b>xaseco/dedimania.xml</b> if you want to use the Dedimania world records system:
<OL type="a">
<LI>In the &lt;masterserver_account&gt; section, replace YOUR_SERVER_LOGIN and YOUR_SERVER_PASSWORD with the &lt;login&gt; and &lt;password&gt; values from
your dedicated.cfg file.
<LI>Also, replace YOUR_SERVER_NATION with the &lt;nation&gt; value.
<LI>Instead of the password you can also enter the community code for your server which can be obtained by using the server login/password on the <a target="_blank" href="http://links.xaseco.org/official.php">official site</a> for your game (TMO/TMS/TMN).
<LI>To disable Dedimania support, remove or comment out the chat.dedimania.php and plugin.dedimania.php entries in plugins.xml.
</OL>
<LI>Start the XASECO system:<br>
<div>
&nbsp;&nbsp;&nbsp;<b><CODE>cd ~/xaseco/</CODE></b><br>
&nbsp;&nbsp;&nbsp;<b><CODE>./Aseco.sh</CODE></b> (or <CODE>Aseco.bat</CODE>)<br>
</div>
You won't see output, but logfile.txt should contain something like the following:<br>
<PRE>
[XAseco] PHP Version is 5.3.x on Linux
[XAseco] Load settings [config.xml]
[XAseco] Load admin/ops lists [adminops.xml]
[XAseco] Load banned IPs list [bannedips.xml]
[XAseco] Load plugins list [plugins.xml]
[XAseco] Load plugin [plugin.localdatabase.php]
[XAseco] Load plugin [plugin.rounds.php]
[...snip plugins...]
[XAseco] Load plugin [jfreu.plugin.php]
[XAseco] Load plugin [mistral.idlekick.php]
[XAseco] Try to connect to TM dedicated server on 127.0.0.1:5000 timeout 180s
[XAseco] Try to authenticate with username 'SuperAdmin' and password 'PASSWORD'
[XAseco] Connection established successfully!
[Local DB] Load settings file
[Local DB] Try to connect to MySQL server on 'localhost' with database 'aseco'
[Local DB] MySQL Server Version is 5.1.56-log
[RASP] Cleaning up unused data
*-*-*-*-*-* RASP is running! *-*-*-*-*-*
|...Loading Settings
|...Loaded!
|...Checking database structure
|...Structure OK!
|...Calculating ranks
|...Done!
[12/xx,xx:11:17] ************* (Dedimania) *************
[12/xx,xx:11:17] * Dataserver connection on Dedimania ...
[12/xx,xx:11:17] * Try connection on http://dedimania.net:8002/Dedimania ...
[12/xx,xx:11:18] Webaccess (dedimania.net:80): send: deflate, receive: gzip
[12/xx,xx:11:18] * Connection and status ok! :)
[12/xx,xx:11:18] * NEWS (Dedimania, 08/05): news
[12/xx,xx:11:18] ------------- (Dedimania) -------------
[12/xx,xx:11:18] Load auto timelimit config [autotime.xml]
###############################################################################
XASECO v1.1x running on 127.0.0.1:5000
Name : YOUR SERVER NAME
Game : TmNationsESWC - TimeAttack
Version: 0.1.7.4 / 2006-05-30
Authors: Florian Schnell & Assembler Maniac
Re-Authored: Xymph
###############################################################################
Begin Race
[12/xx,xx:11:18] track changed [none] >> [Pro - 38~74~75~89~93]
[12/xx,xx:11:18] currently no record on Pro - 38~74~75~89~93
</PRE>
If you get an RPC Permission Error here, there is an XMLRPC port mismatch or the dedicated server isn't running (anymore).
<LI>To start &amp; stop your XASECO on Linux more easily, you can use this <A TARGET="_blank" HREF="http://www.tm-forum.com/viewtopic.php?p=123826#p123826">start-up script</A>.
<LI>Edit the <A HREF="/tmn/#config">configuration options</A> to your liking, and restart XASECO. It should now be ready to manage tracks, receive players, and record... er... records. Congratulations. :-)
</OL>
Finally, to run another server on the same machine:
<OL>
<LI>Basically follow the same steps above, but use a second user account (e.g. "tmn2"), another new server login/password in dedicated.cfg, a separate server name, a second set of ports (e.g. 2351, 3451 and 5001), a new database (e.g. "aseco2"), optionally a second MySQL account (e.g. "tmn2"), and the corresponding updates in localdatabase.xml and config.xml.
<LI>Don't use symbolic links in the GameData/ directory tree (e.g. to symlink the tracks from the first server to the second one), as the TMN server will crash without an error message.
</OL>
And for the last time, read the <A HREF="/tmn/#resources">readme's and tutorials</A> completely for a more thorough understanding of the entire setup.
<br><br>
<HR>
<ADDRESS>
Copyright &copy; 2007-2013 &ndash; Frans P. de Vries <A HREF="mailto:tm&#64;&#103;&#97;&#109;&#101;&#114;&#115;&#46;&#111;&#114;&#103;">&lt;tm&#64;&#103;&#97;&#109;&#101;&#114;&#115;&#46;&#111;&#114;&#103;&gt;</A>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
Last updated 08-May-2013
</ADDRESS>
</BODY>
</HTML>

View File

@ -1,432 +0,0 @@
#!/usr/bin/php -q
<?php
// vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2:
// Repair truncation issues with the Nation field in the XASECO players table
// Created Apr 2008 by Xymph <tm@gamers.org>
if (!mysql_connect('localhost','YOUR_MYSQL_LOGIN','YOUR_MYSQL_PASSWORD')) {
echo "could not connect\n";
exit;
}
if (!mysql_select_db('aseco')) {
echo "could not select\n";
exit;
}
// get all unique Nation strings
$query = 'SELECT Nation FROM players';
$resply = mysql_query($query);
$nations = array();
if (mysql_num_rows($resply) > 0) {
while ($rowply = mysql_fetch_object($resply)) {
$nations[] = $rowply->Nation;
}
mysql_free_result($resply);
} else {
echo "no players!\n";
}
$uniques = array_unique($nations);
echo 'Unique nations: ' . count($uniques) . "\n\n";
$count = 0;
foreach ($uniques as $oldnation) {
if (strlen($oldnation) == 0)
$newnation = 'OTH'; // default OTH(ER) for empty nations
// check for full, capitalized country name
elseif (strlen($oldnation) > 3)
$newnation = mapCountry($oldnation);
// check for trunctated, capitalized country name
elseif ($oldnation != strtoupper($oldnation))
$newnation = mapAbbrev($oldnation);
else // already all-caps abbreviation
continue;
// update Nation with 3-letter abbreviation
$query = 'UPDATE players
SET Nation="' . $newnation . '"
WHERE Nation="' . $oldnation . '"';
$result = mysql_query($query);
$count++;
}
echo 'Updated nations: ' . $count . "\n";
/**
* Map country names to 3-letter Nation abbreviations
* Created by Xymph
* Based on http://en.wikipedia.org/wiki/List_of_IOC_country_codes
*/
function mapCountry($country) {
$nations = array(
'Afghanistan' => 'AFG',
'Albania' => 'ALB',
'Algeria' => 'ALG',
'Andorra' => 'AND',
'Angola' => 'ANG',
'Argentina' => 'ARG',
'Armenia' => 'ARM',
'Aruba' => 'ARU',
'Australia' => 'AUS',
'Austria' => 'AUT',
'Azerbaijan' => 'AZE',
'Bahamas' => 'BAH',
'Bahrain' => 'BRN',
'Bangladesh' => 'BAN',
'Barbados' => 'BAR',
'Belarus' => 'BLR',
'Belgium' => 'BEL',
'Belize' => 'BIZ',
'Benin' => 'BEN',
'Bermuda' => 'BER',
'Bhutan' => 'BHU',
'Bolivia' => 'BOL',
'Bosnia&Herzegovina' => 'BIH',
'Botswana' => 'BOT',
'Brazil' => 'BRA',
'Brunei' => 'BRU',
'Bulgaria' => 'BUL',
'Burkina Faso' => 'BUR',
'Burundi' => 'BDI',
'Cambodia' => 'CAM',
'Cameroon' => 'CAR', // actually CMR
'Canada' => 'CAN',
'Cape Verde' => 'CPV',
'Central African Republic' => 'CAF',
'Chad' => 'CHA',
'Chile' => 'CHI',
'China' => 'CHN',
'Chinese Taipei' => 'TPE',
'Colombia' => 'COL',
'Congo' => 'CGO',
'Costa Rica' => 'CRC',
'Croatia' => 'CRO',
'Cuba' => 'CUB',
'Cyprus' => 'CYP',
'Czech Republic' => 'CZE',
'Czech republic' => 'CZE',
'DR Congo' => 'COD',
'Denmark' => 'DEN',
'Djibouti' => 'DJI',
'Dominica' => 'DMA',
'Dominican Republic' => 'DOM',
'Ecuador' => 'ECU',
'Egypt' => 'EGY',
'El Salvador' => 'ESA',
'Eritrea' => 'ERI',
'Estonia' => 'EST',
'Ethiopia' => 'ETH',
'Fiji' => 'FIJ',
'Finland' => 'FIN',
'France' => 'FRA',
'Gabon' => 'GAB',
'Gambia' => 'GAM',
'Georgia' => 'GEO',
'Germany' => 'GER',
'Ghana' => 'GHA',
'Greece' => 'GRE',
'Grenada' => 'GRN',
'Guam' => 'GUM',
'Guatemala' => 'GUA',
'Guinea' => 'GUI',
'Guinea-Bissau' => 'GBS',
'Guyana' => 'GUY',
'Haiti' => 'HAI',
'Honduras' => 'HON',
'Hong Kong' => 'HKG',
'Hungary' => 'HUN',
'Iceland' => 'ISL',
'India' => 'IND',
'Indonesia' => 'INA',
'Iran' => 'IRI',
'Iraq' => 'IRQ',
'Ireland' => 'IRL',
'Israel' => 'ISR',
'Italy' => 'ITA',
'Ivory Coast' => 'CIV',
'Jamaica' => 'JAM',
'Japan' => 'JPN',
'Jordan' => 'JOR',
'Kazakhstan' => 'KAZ',
'Kenya' => 'KEN',
'Kiribati' => 'KIR',
'Korea' => 'KOR',
'Kuwait' => 'KUW',
'Kyrgyzstan' => 'KGZ',
'Laos' => 'LAO',
'Latvia' => 'LAT',
'Lebanon' => 'LIB',
'Lesotho' => 'LES',
'Liberia' => 'LBR',
'Libya' => 'LBA',
'Liechtenstein' => 'LIE',
'Lithuania' => 'LTU',
'Luxembourg' => 'LUX',
'Macedonia' => 'MKD',
'Malawi' => 'MAW',
'Malaysia' => 'MAS',
'Mali' => 'MLI',
'Malta' => 'MLT',
'Mauritania' => 'MTN',
'Mauritius' => 'MRI',
'Mexico' => 'MEX',
'Moldova' => 'MDA',
'Monaco' => 'MON',
'Mongolia' => 'MGL',
'Montenegro' => 'MNE',
'Morocco' => 'MAR',
'Mozambique' => 'MOZ',
'Myanmar' => 'MYA',
'Namibia' => 'NAM',
'Nauru' => 'NRU',
'Nepal' => 'NEP',
'Netherlands' => 'NED',
'New Zealand' => 'NZL',
'Nicaragua' => 'NCA',
'Niger' => 'NIG',
'Nigeria' => 'NGR',
'Norway' => 'NOR',
'Oman' => 'OMA',
'Other Countries' => 'OTH',
'Pakistan' => 'PAK',
'Palau' => 'PLW',
'Palestine' => 'PLE',
'Panama' => 'PAN',
'Paraguay' => 'PAR',
'Peru' => 'PER',
'Philippines' => 'PHI',
'Poland' => 'POL',
'Portugal' => 'POR',
'Puerto Rico' => 'PUR',
'Qatar' => 'QAT',
'Romania' => 'ROM', // actually ROU
'Russia' => 'RUS',
'Rwanda' => 'RWA',
'Samoa' => 'SAM',
'San Marino' => 'SMR',
'Saudi Arabia' => 'KSA',
'Senegal' => 'SEN',
'Serbia' => 'SCG', // actually SRB
'Sierra Leone' => 'SLE',
'Singapore' => 'SIN',
'Slovakia' => 'SVK',
'Slovenia' => 'SLO',
'Somalia' => 'SOM',
'South Africa' => 'RSA',
'Spain' => 'ESP',
'Sri Lanka' => 'SRI',
'Sudan' => 'SUD',
'Suriname' => 'SUR',
'Swaziland' => 'SWZ',
'Sweden' => 'SWE',
'Switzerland' => 'SUI',
'Syria' => 'SYR',
'Taiwan' => 'TWN',
'Tajikistan' => 'TJK',
'Tanzania' => 'TAN',
'Thailand' => 'THA',
'Togo' => 'TOG',
'Tonga' => 'TGA',
'Trinidad and Tobago' => 'TRI',
'Tunisia' => 'TUN',
'Turkey' => 'TUR',
'Turkmenistan' => 'TKM',
'Tuvalu' => 'TUV',
'Uganda' => 'UGA',
'Ukraine' => 'UKR',
'United Arab Emirates' => 'UAE',
'United Kingdom' => 'GBR',
'United States of America' => 'USA',
'Uruguay' => 'URU',
'Uzbekistan' => 'UZB',
'Vanuatu' => 'VAN',
'Venezuela' => 'VEN',
'Vietnam' => 'VIE',
'Yemen' => 'YEM',
'Zambia' => 'ZAM',
'Zimbabwe' => 'ZIM',
);
if (array_key_exists($country, $nations)) {
$nation = $nations[$country];
} else {
$nation = "OTH";
}
return $nation;
} // end mapCountry
/*
* Map truncated country names to 3-letter Nation abbreviations
*/
function mapAbbrev($abbrev) {
$nations = array(
'Afg' => 'AFG',
'Alb' => 'ALB',
'Alg' => 'ALG',
'And' => 'AND',
'Ang' => 'ANG',
'Arg' => 'ARG',
'Arm' => 'ARM',
'Aru' => 'ARU',
'Aus' => 'AUT',
'Aze' => 'AZE',
'Bah' => 'BAH',
'Ban' => 'BAN',
'Bar' => 'BAR',
'Bel' => 'BEL',
'Ben' => 'BEN',
'Ber' => 'BER',
'Bhu' => 'BHU',
'Bol' => 'BOL',
'Bos' => 'BIH',
'Bot' => 'BOT',
'Bra' => 'BRA',
'Bru' => 'BRU',
'Bul' => 'BUL',
'Bur' => 'BDI',
'Cam' => 'CAM',
'Can' => 'CAN',
'Cap' => 'CPV',
'Cen' => 'CAF',
'Cha' => 'CHA',
'Chi' => 'CHN',
'Col' => 'COL',
'Con' => 'CGO',
'Cos' => 'CRC',
'Cro' => 'CRO',
'Cub' => 'CUB',
'Cyp' => 'CYP',
'Cze' => 'CZE',
'DR ' => 'COD',
'Den' => 'DEN',
'Dji' => 'DJI',
'Dom' => 'DOM',
'Ecu' => 'ECU',
'Egy' => 'EGY',
'El ' => 'ESA',
'Eri' => 'ERI',
'Est' => 'EST',
'Eth' => 'ETH',
'Fij' => 'FIJ',
'Fin' => 'FIN',
'Fra' => 'FRA',
'Gab' => 'GAB',
'Gam' => 'GAM',
'Geo' => 'GEO',
'Ger' => 'GER',
'Gha' => 'GHA',
'Gre' => 'GRE',
'Gua' => 'GUA',
'Gui' => 'GUI',
'Guy' => 'GUY',
'Hai' => 'HAI',
'Hon' => 'HKG',
'Hun' => 'HUN',
'Ice' => 'ISL',
'Ind' => 'IND',
'Ira' => 'IRI',
'Ire' => 'IRL',
'Isr' => 'ISR',
'Ita' => 'ITA',
'Ivo' => 'CIV',
'Jam' => 'JAM',
'Jap' => 'JPN',
'Jor' => 'JOR',
'Kaz' => 'KAZ',
'Ken' => 'KEN',
'Kir' => 'KIR',
'Kor' => 'KOR',
'Kuw' => 'KUW',
'Kyr' => 'KGZ',
'Lao' => 'LAO',
'Lat' => 'LAT',
'Leb' => 'LIB',
'Les' => 'LES',
'Lib' => 'LBA',
'Lie' => 'LIE',
'Lit' => 'LTU',
'Lux' => 'LUX',
'Mac' => 'MKD',
'Mal' => 'MAS',
'Mau' => 'MTN',
'Mex' => 'MEX',
'Mol' => 'MDA',
'Mon' => 'MNE',
'Mor' => 'MAR',
'Moz' => 'MOZ',
'Mya' => 'MYA',
'Nam' => 'NAM',
'Nau' => 'NRU',
'Nep' => 'NEP',
'Net' => 'NED',
'New' => 'NZL',
'Nic' => 'NCA',
'Nig' => 'NGR',
'Nor' => 'NOR',
'Oma' => 'OMA',
'Oth' => 'OTH',
'Pak' => 'PAK',
'Pal' => 'PLE',
'Pan' => 'PAN',
'Par' => 'PAR',
'Per' => 'PER',
'Phi' => 'PHI',
'Pol' => 'POL',
'Por' => 'POR',
'Pue' => 'PUR',
'Qat' => 'QAT',
'Rom' => 'ROM',
'Rus' => 'RUS',
'Rwa' => 'RWA',
'Sam' => 'SAM',
'San' => 'SMR',
'Sau' => 'KSA',
'Sen' => 'SEN',
'Ser' => 'SCG',
'Sie' => 'SLE',
'Sin' => 'SIN',
'Slo' => 'SVK',
'Som' => 'SOM',
'Sou' => 'RSA',
'Spa' => 'ESP',
'Sri' => 'SRI',
'Sud' => 'SUD',
'Sur' => 'SUR',
'Swa' => 'SWZ',
'Swe' => 'SWE',
'Swi' => 'SUI',
'Syr' => 'SYR',
'Tai' => 'TWN',
'Taj' => 'TJK',
'Tan' => 'TAN',
'Tha' => 'THA',
'Tog' => 'TOG',
'Ton' => 'TGA',
'Tri' => 'TRI',
'Tun' => 'TUN',
'Tur' => 'TUR',
'Tuv' => 'TUV',
'Uga' => 'UGA',
'Ukr' => 'UKR',
'Uni' => 'USA',
'Uru' => 'URU',
'Uzb' => 'UZB',
'Van' => 'VAN',
'Ven' => 'VEN',
'Vie' => 'VIE',
'Yem' => 'YEM',
'Zam' => 'ZAM',
'Zim' => 'ZIM',
);
if (array_key_exists($abbrev, $nations)) {
$nation = $nations[$abbrev];
} else {
$nation = "OTH";
}
return $nation;
} // end mapAbbrev
?>

View File

@ -1,128 +0,0 @@
#!/usr/bin/php -q
<?php
// vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2:
// Repair XASECO records table inconsistencies with rs_times table
// Created Dec 2007 by Xymph <tm@gamers.org>
// Updated Apr 2012 by Xymph <tm@gamers.org>
function stripColors($str) {
return
str_replace("\0", '$$',
preg_replace(
'/\\$(?:[0-9a-f]..|[g-z]|$)/iu', '',
str_replace('$$', "\0", $str)
)
)
;
}
date_default_timezone_set(@date_default_timezone_get());
$maxrecs = 50;
if (!mysql_connect('localhost','YOUR_MYSQL_LOGIN','YOUR_MYSQL_PASSWORD')) {
echo "could not connect\n";
exit;
}
if (!mysql_select_db('aseco')) {
echo "could not select\n";
exit;
}
$query = 'SELECT id,name FROM challenges ORDER BY id';
$reschl = mysql_query($query);
if (mysql_num_rows($reschl) > 0) {
echo 'Selected challenges: ' . mysql_num_rows($reschl) . "\n\n";
$tracks = 0;
$trackid = 0;
$add = 0;
$upd = 0;
$list = array();
while ($rowchl = mysql_fetch_object($reschl)) {
$query = 'SELECT playerid,score,date FROM records WHERE ChallengeID=' . $rowchl->id .
' ORDER BY score,date LIMIT ' . $maxrecs;
$resrec = mysql_query($query);
$query = 'SELECT DISTINCT playerid,score FROM rs_times t1 WHERE challengeid=' . $rowchl->id .
' AND score=(SELECT MIN(t2.score) FROM rs_times t2 WHERE challengeid=' . $rowchl->id .
' AND t1.playerid=t2.playerid) ORDER BY score,date LIMIT ' . $maxrecs;
$restms = mysql_query($query);
if (mysql_num_rows($resrec) > 0) {
$n = 1;
while ($rowrec = mysql_fetch_object($resrec)) {
$rowtms = mysql_fetch_object($restms);
if ($rowtms === false) {
printf("%3d : %32s\t-> rec %3d: no more rs_times entries - consistency error!\n", $rowchl->id, stripColors($rowchl->name), $n);
break;
}
// consistency check
if ($rowrec->playerid != $rowtms->playerid ||
$rowrec->score != $rowtms->score) {
// fetch corresponding date/time & checkpoints
$query = 'SELECT date,checkpoints FROM rs_times WHERE challengeid=' . $rowchl->id .
' AND playerid=' . $rowtms->playerid . ' ORDER BY score,date LIMIT 1';
$resdat = mysql_query($query);
$rowdat = mysql_fetch_object($resdat);
mysql_free_result($resdat);
$newdat = date('Y-m-d H:i:s', $rowdat->date);
// printf("%3d : %32s\t-> rec %3d: %5d/%5d differs from %d/%5d\n", $rowchl->id, stripColors($rowchl->name), $n, $rowrec->playerid, $rowrec->score, $rowtms->playerid, $rowtms->score);
$query = "INSERT INTO records
(ChallengeId, PlayerId, Score, Date, Checkpoints)
VALUES
(" . $rowchl->id . ", " . $rowtms->playerid . ", " .
$rowtms->score . ", '" . $newdat . "', '" .
$rowdat->checkpoints . "')";
$result = mysql_query($query);
// couldn't be inserted? then player had a record already
if (mysql_affected_rows() != 1) {
$query = "UPDATE records
SET Score=" . $rowtms->score . ", Checkpoints='" . $rowdat->checkpoints . "', Date='" . $newdat . "'
WHERE ChallengeId=" . $rowchl->id . " AND PlayerId=" . $rowtms->playerid;
$result = mysql_query($query);
// couldn't be updated? then something's going wrong
if (mysql_affected_rows() == -1) {
echo mysql_errno() . ': ' . mysql_error() . "\n";
exit;
} elseif (mysql_affected_rows() == 0) {
// printf("%3d : %32s\t-> rec %3d: skipped %d5/%5d %s\n", $rowchl->id, stripColors($rowchl->name), $n, $rowtms->playerid, $rowtms->score, $newdat);
} else { // mysql_affected_rows() == 1
printf("%3d : %32s\t-> rec %3d: updated %5d/%5d %s\n", $rowchl->id, stripColors($rowchl->name), $n, $rowtms->playerid, $rowtms->score, $newdat);
$upd++;
if ($trackid != $rowchl->id) {
$trackid = $rowchl->id;
$tracks++;
}
}
} else { // mysql_affected_rows() == 1
printf("%3d : %32s\t-> rec %3d: added %5d/%5d %s\n", $rowchl->id, stripColors($rowchl->name), $n, $rowtms->playerid, $rowtms->score, $newdat);
$add++;
if ($trackid != $rowchl->id) {
$trackid = $rowchl->id;
$tracks++;
}
}
}
$n++;
}
}
mysql_free_result($resrec);
mysql_free_result($restms);
}
echo "\n" . $add . ' added & ' . $upd . ' updated records on ' . $tracks . " tracks\n";
mysql_free_result($reschl);
} else {
echo "no challenges!\n";
}
?>

View File

@ -1,112 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<TITLE>ShootMania Storm</TITLE>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<META NAME="author" CONTENT="Frans P. de Vries">
<META NAME="generator" CONTENT="vi :)">
<style type="text/css">
body { width: 960px; margin-left: 30px; font-family: Arial,Helvetica,sans-serif; font-size: 15px; }
li,div { padding: 3px; }
code,pre { font-size: 14px; }
pre { width: 90%; margin: 3px 0px; padding: 3px 0px 3px 12px; background-color: #F0F0F0; }
</style>
<META NAME="keywords" CONTENT="ShootMania, Storm, ManiaPlanet, first-person, multiplayer, shooter, games, Nadeo">
<META NAME="description" CONTENT="Information on ShootMania Storm, a multiplayer shooter game by Nadeo">
</HEAD>
<BODY TEXT="#000000" LINK="#ff0000" VLINK="#0000ff" ALINK="#00ff00" BGCOLOR="#ffffff">
Welcome to this humble page for:
<P ALIGN="center">
<a target="_blank" href="http://www.shootmania.com/"><IMG SRC="banner.jpg" ALT="ShootMania Storm" TITLE="ShootMania Storm" BORDER="0" WIDTH="360" HEIGHT="276"></a>
<HR>
<H3>Introduction:</H3>
<CENTER>
<TABLE WIDTH="93%" CELLSPACING="10" BORDER="0"><TR><TD>
This is a simple hub page for ShootMania Storm. It aims to collect in one place useful information and references to official and community sites for this new multiplayer shooter game by Nadeo. Here are relevant excerpts from the Storm press releases:
<P>
"ShootMania Storm is the second offering from ManiaPlanet, following the successful launch of TrackMania 2 in 2011. For the first time in its history, Nadeo have decided to bring to FPS what made TrackMania such a phenomenon: its unique competitive spirit and a sense of fun."
<P>
"In conjunction with the online competitive multiplayer, ShootMania Storm will also feature extensive map editing capabilities, allowing players to customise, design and share their creations across the community, using the soon to be released, upgraded ManiaPlanet 2.0 gaming system."
</TD></TR></TABLE>
</CENTER>
<a name="content"></a>
<H3>Content:</H3>
<UL>
<!-- LI><a href="#downloads">SMS Downloads</a -->
<!-- LI><a href="#versions">SMS Versions</a -->
<LI><a href="#links">Links</a>
<LI><a href="#official">Official</a>
<LI><a href="#community">Community</a>
<LI><a href="#resources">Resources</a>
<LI><a href="#scripts">Scripts</a>
</UL>
<!-- a name="downloads"></a>
<H3>SMS Downloads:</H3>
<UL>
<LI>
</UL>
<a name="versions"></a>
<H3>SMS Versions:</H3>
<UL>
<LI>
</UL -->
<a name="links"></a>
<H3>Links:</H3>
<UL>
<LI><a name="official"></a><u>Official</u>
<UL>
<LI>See the <a target="_blank" href="http://links.xaseco.org/official.php">Official Links page</a> on XAseco.org.
<br><br>
<LI><a href="/tm2/maniaplanet-logo-pack.zip">ManiaPlanet logo pack</a>
<br><br>
</UL>
<a name="community"></a>
<LI><u>Community</u>
<UL>
<LI><a target="_blank" href="/tm2/">TM² / XASECO2 hub</a>
<LI><a target="_blank" href="/tmf/">TM Forever hub</a>
<LI><a target="_blank" href="/tmn/">TMN ESWC / XASECO hub</a>
<LI>See the <a target="_blank" href="http://links.xaseco.org/community.php">Community Links page</a> on XAseco.org.
<br><br>
</UL>
<a name="resources"></a>
<LI><u>Server Resources</u>
<UL>
<!-- LI><a href="/sm/quickstart.html">SMS quick start guide</a -->
<!-- LI><a target="_blank" href="http://forum.maniaplanet.com/viewtopic.php?p=XXX#pXXX">SMS Dedicated Server</a -->
<LI>See the <a target="_blank" href="http://links.xaseco.org/resources.php">Resource Links page</a> on XAseco.org.
<br><br>
</UL>
<a name="scripts"></a>
<LI><u>Miscellaneous Scripts</u>
<UL>
<LI>See the <a target="_blank" href="http://www.xaseco.org/tools.php">Scripts &amp; Tools page</a> on XAseco.org.
<br><br>
</UL>
</UL>
<BR>
<HR>
<ADDRESS>
Copyright &copy; 2007-2013 &ndash; Frans P. de Vries <A HREF="mailto:tm&#64;&#103;&#97;&#109;&#101;&#114;&#115;&#46;&#111;&#114;&#103;">&lt;tm&#64;&#103;&#97;&#109;&#101;&#114;&#115;&#46;&#111;&#114;&#103;&gt;</A>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
Last updated 02-Mar-2013
</ADDRESS>
</BODY>
</HTML>

View File

@ -1,296 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<TITLE>TrackMania² - XASECO2</TITLE>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<META NAME="author" CONTENT="Frans P. de Vries">
<META NAME="generator" CONTENT="vi :)">
<style type="text/css">
body { width: 960px; margin-left: 30px; font-family: Arial,Helvetica,sans-serif; font-size: 15px; }
li,div { padding: 3px; }
code,pre { font-size: 14px; }
pre { width: 90%; margin: 3px 0px; padding: 3px 0px 3px 12px; background-color: #F0F0F0; }
</style>
<META NAME="keywords" CONTENT="TrackMania, 2, Canyon, Stadium, Valley, Forever, United, Nations, ManiaPlanet, racing, games, XASECO2, XASECO, plugins, records, jukebox, Nadeo">
<META NAME="description" CONTENT="Information on the XASECO2 system for TrackMania², a racing game by Nadeo">
</HEAD>
<BODY TEXT="#000000" LINK="#ff0000" VLINK="#0000ff" ALINK="#00ff00" BGCOLOR="#ffffff">
Welcome to this humble page for:
<P ALIGN="center">
<a target="_blank" href="http://www.trackmania2.com/"><IMG SRC="banner_all.jpg" ALT="TrackMania²" TITLE="TrackMania²" BORDER="0" WIDTH="825" HEIGHT="100"></a>
<HR>
<H3>Introduction:</H3>
<CENTER>
<TABLE WIDTH="93%" CELLSPACING="10" BORDER="0"><TR><TD>
This is a simple hub page for TrackMania² Canyon, Stadium and Valley. It aims to collect in one place useful information and references to official and community sites for these racing games by Nadeo. Here are relevant excerpts from their announcements:
<P>
"TrackMania² Canyon will give players an adrenaline-filled experience, with insane jumps, controlled drifting and extreme speed. Driving in the Canyon is like running on a tightrope, only the fearless will succeed. It goes far beyond traditional driving games with a fully customisable world of tracks generated by the players themselves! With loops, wall rides, ramps and a multitude of other stunts, you're in for the ride of your life!"
<P>
"With over 12 million players, Stadium is the all time favorite racer on PC. A classic needs to stay true to its roots. The acclaimed gameplay of Stadium remains identical: same speed, same controls, same blocks!<br>
This core experience is improved by ManiaPlanet: better graphics and more tools for the community. Lots of competitions, new maps and game modes. The most creative community on PC can now benefit from ManiaPlanet cutting edge technologies."
<P>
"The third game of the TrackMania² series is taking place in a lush valley with a rally gameplay. Reaching a level of detail never achieved on a TrackMania game, the valley environment will blow you away at first glance. The challenging gameplay will offer you hours and hours of fun, trying to shave milliseconds off every tight corner. Precision and control are key on this playground. Drifting is a last resort and will make you lose time."
</TD></TR></TABLE>
</CENTER>
<H3>XASECO2:</H3>
<CENTER>
<TABLE WIDTH="93%" CELLSPACING="10" BORDER="0"><TR><TD>
This page is also the initial home to <b>XASECO2</b>, a port for
ManiaPlanet / TM² of the popular server controller for TM Forever
and previous TM games.
<P>
For a high-level outline of all of XASECO2's features and plugins, see
the <a href="overview.html">Overview page</a>. For a comprehensive
overview of the changes, see the <a href="Features_090.html">v0.90
initial release notes</a> and the <a href="Features_103.html">v0.93 -
v1.03 current release notes</a>.
<P>
And here is a complete overview of all available commands
in <a href="xaseco2_commands.html">HTML</a> and <A
href="xaseco2_commands.doc">Word</a>.
</TD></TR></TABLE>
</CENTER>
<a name="content"></a>
<H3>Content:</H3>
<UL>
<LI><a href="#downloads">TM² Downloads</a>
<LI><a href="#versions">TM² Versions</a>
<LI><a href="#install">Installation</a>
<LI><a href="#upgrade">Upgrading</a>
<LI><a href="#config">Configuration</a>
<LI><a href="#versions">Versions</a>
<LI><a href="#download">Download</a>
<LI><a href="#feedback">Feedback</a>
<LI><a href="#links">Links</a>
<LI><a href="#official">Official</a>
<LI><a href="#community">Community</a>
<LI><a href="#resources">Resources</a>
<LI><a href="#scripts">Scripts</a>
<LI><a href="#plugins">Third-party Plugins</a>
</UL>
<a name="downloads"></a>
<H3>TM² Downloads:</H3>
<UL>
<LI>See the <a target="_blank" href="http://links.xaseco.org/official.php#client">Game Client page</a> on XAseco.org.
</UL>
<a name="versions"></a>
<H3>TM² Versions:</H3>
<UL>
<LI>See the <a target="_blank" href="http://server.xaseco.org/versions2.php">TM² Client &amp; Server Versions page</a> on XAseco.org.
</UL>
<a name="install"></a>
<H3>Installation:</H3>
<UL>
<LI><u>New installation of v1.03</u>:<br><br>
See the <a target="_blank" href="http://docs.xaseco.org/install2.php">XASECO2 Installation page</a> on XAseco.org,
or go directly to the <a href="quickstart.html">TM² &amp; XASECO2 quick start guide</a>.
<br><br>
<a name="upgrade"></a>
<LI><u>Upgrading from v1.02 to v1.03</u>:<br><br>
See the <a target="_blank" href="http://docs.xaseco.org/upgrade2.php">XASECO2 Upgrade page</a> on XAseco.org for general instructions.
<br><br>
The following files were updated in v1.03: xaseco2.php, dedimania.xml,
includes/gbxdatafetcher.inc.php, mxinfosearcher.inc.php,
rasp.funcs.php, rasp.settings.php, plugins/chat.dedimania.php,
plugin.checkpoints.php, plugin.dedimania.php, plugin.rasp.php.
<br><br>
<b>Important</b>:
<UL>
<LI>To configure your server for the central Dedimania
database, you must copy the login value in the
<CODE>&lt;masterserver_account&gt;</CODE> section from
your server's dedicated_cfg.txt file into the corresponding
section of the dedimania.xml file. Further, <a target="_blank"
href="http://dedimania.net/tm2stats/?do=register">register your
server</a> with the Dedimania system, generate a DedimaniaCode,
and add that in dedimania.xml as well.
<LI>Open port <b>8082</b> on your firewall/router for communication
with the central Dedimania server.
<LI>In the zip file, all *.XML and *.PHP config files are located
inside the <b>newinstall/</b> directory. This means that you can (and
have to) unzip the download and replace all the PHP code files, without
worrying about overwriting your customized config files. However, for
every XML/PHP config file that was updated (see above), you <u>must</u>
replace your version with the one from the newinstall/ directory, or
compare them and <u>add</u> any new/changed configuration settings
to your version to insure the system remains working correctly.
<LI>For a new installation, go into the newinstall/ directory and move
all *.XML files into the main directory (next to xaseco2.php), all
*.PHP files into the includes/ directory, and XAseco2.bat|XAseco2.sh
also into the main directory.
</UL>
<br>
<LI><u>Upgrading from v0.90 to v1.02</u>:<br><br>
See the <a href="upgrades.html">archived Upgrade notes</a>.
</UL>
<a name="config"></a>
<H3>Configuration options:</H3>
<UL>
<LI>See the <a target="_blank" href="http://docs.xaseco.org/config.php">Configuration section</a> on XAseco.org.
Here is the list of <a href="admin_abilities.html">default Admin and Operator abilities</a>.
</UL>
<a name="versions"></a>
<H3>Versions:</H3>
<UL>
<LI>See the <a target="_blank" href="http://www.xaseco.org/versions2.php">XASECO2 Versions page</a> on XAseco.org.
</UL>
<a name="download"></a>
<H3>Download:</H3>
<UL>
<LI><a href="xaseco2_103.zip">xaseco2_103.zip</a>
</UL>
<a name="feedback"></a>
<H3>Feedback/questions:</H3>
<UL>
<LI>Please post to the <a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=30533">v1.03 thread</a> or the <a target="_blank" href="http://www.tm-forum.com/viewforum.php?f=127">XASECO1/2 forum</a> on TM-Forum. See also the older forum posts via the <a target="_blank" href="http://www.xaseco.org/versions2.php">XASECO2 Versions page</a> on XAseco.org.
</UL>
<a name="links"></a>
<H3>Links:</H3>
<UL>
<LI><a name="official"></a><u>Official</u>
<UL>
<LI>See the <a target="_blank" href="http://links.xaseco.org/official.php">Official Links page</a> on XAseco.org.
<br><br>
<LI><a href="maniaplanet-logo-pack.zip">ManiaPlanet logo pack</a>
<LI><a href="TM2canyonE32011staticassets.zip">TM² Canyon E3 press kit</a>
<br><br>
</UL>
<a name="community"></a>
<LI><u>Community</u>
<UL>
<LI><a target="_blank" href="/tmf/">TM Forever hub</a>
<LI><a target="_blank" href="/tmn/">TMN ESWC / XASECO hub</a>
<LI><a target="_blank" href="/sm/">ShootMania hub</a>
<LI>See the <a target="_blank" href="http://links.xaseco.org/community.php">Community Links page</a> on XAseco.org.
<br><br>
</UL>
<a name="resources"></a>
<LI><u>Server Resources</u>
<UL>
<LI><a href="/tm2/quickstart.html">TM² &amp; XASECO2 quick start guide</a>
<LI><a target="_blank" href="http://forum.maniaplanet.com/viewtopic.php?t=12494">TM² Dedicated Server</a>
<LI><a target="_blank" href="http://www.xaseco.org/initd2.php">XASECO2 start-up scripts for Linux</a>
<LI><a target="_blank" href="http://server.xaseco.org/initd2.php">Dedicated Server start-up scripts for Linux</a>
<LI>See the <a target="_blank" href="http://links.xaseco.org/resources.php">Resource Links page</a> on XAseco.org.
<br><br>
</UL>
<a name="scripts"></a>
<LI><u>Miscellaneous Scripts</u>
<UL>
<LI>See the <a target="_blank" href="http://www.xaseco.org/tools.php">Scripts &amp; Tools page</a> on XAseco.org.
<br><br>
</UL>
<a name="plugins"></a>
<LI><u>Third-party Plugins</u>
<UL>
<LI>Fufi's plugins ported by maniactwister:
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=28765">Menu</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=28763">Widgets</a>
<LI><a target="_blank" href="http://www.nouseforname.de/xaseco2.php">Nouseforname's plugins</a> (
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29414">Nouse Betting</a>,
Link,
Message,
Randompay,
RSS Reader
)
<LI><a target="_blank" href="http://mp.klaversma.eu/">TheM's plugins</a> (
<a target="_blank" href="http://forum.maniaplanet.com/viewtopic.php?p=94929#p94929">Fufi AutoQueue</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29607">Favourites</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29383">IRC Bot</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=30149">Karma Vote Widget</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29413">KnockOut</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29382">WhoKarma</a>
)
<LI><a target="_blank" href="http://www.undef.name/">undef.de's plugins</a> (
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=28936">Alternate Scoretable</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=25917">Auto Team Adjustment</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29299">Badwords Judge</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=28878">Best Checkpoint Times</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=28976">Cheated Records Killer</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=28978">Gerymania</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29386">Greeting Dude</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=23242">Info-Widget</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=30464">Lazy Buttons</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29108">Nickname sync</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=28977">Personal Best Checkpoints</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29277">Personal Best Medals</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29110">Personal Mommy</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=28937">Private Message window</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=28789">Records-Eyepiece</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29028">Server Neighborhood</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29112">Teamspeak3 Info</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=28935">Third-Party Plugins UpToDate</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=28875">TM-Karma.com</a>,
<a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29261">Vote Manager</a>
)
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29449">Alternative Admin</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29228">AutoQueue</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=28871">Checkpoint Records</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=23547">Checkpoints counter</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29566">Countdown for Servername</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=30502">Countdown widget</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=28962">Database Purge</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29349">DBTools</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=30543">FBLike</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=18755">forceMods</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29508">Handicap</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?p=198716#p198716">Jukebox pay</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=30315">Loadscreen</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=28900">ManiaRecords</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=30411">matchOverlay</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=21957">Modified Join message</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=30163">Pay2Play</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=28150">R-AutoLaps</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=28361">ReplayCharge</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=28946">ServerLink</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29267">SpecJam</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29181">SpykeAllCps</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=28922">SwearBox</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=29099">switchServer</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=30594">TeamRace</a>
<LI><a target="_blank" href="http://plugins.xaseco.org/browse2.php">XAseco.org Plugins Repository</a> (mirrors of almost all of the above)
</UL>
</UL>
<BR>
<HR>
<ADDRESS>
Copyright &copy; 2007-2013 &ndash; Frans P. de Vries <A HREF="mailto:tm&#64;&#103;&#97;&#109;&#101;&#114;&#115;&#46;&#111;&#114;&#103;">&lt;tm&#64;&#103;&#97;&#109;&#101;&#114;&#115;&#46;&#111;&#114;&#103;&gt;</A>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
Last updated 29-Jun-2013
</ADDRESS>
</BODY>
</HTML>

View File

@ -1,127 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<TITLE>TrackMania Forever</TITLE>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<META NAME="author" CONTENT="Frans P. de Vries">
<META NAME="generator" CONTENT="vi :)">
<style type="text/css">
body { width: 960px; margin-left: 30px; font-family: Arial,Helvetica,sans-serif; font-size: 15px; }
li,div { padding: 3px; }
code,pre { font-size: 14px; }
pre { width: 90%; margin: 3px 0px; padding: 3px 0px 3px 12px; background-color: #F0F0F0; }
</style>
<META NAME="keywords" CONTENT="TrackMania, Forever, United, Nations, Sunrise, Original, racing, games, XASECO, ASECO, RASP, plugins, records, jukebox, Nadeo">
<META NAME="description" CONTENT="Information on TrackMania Forever, a racing game by Nadeo">
</HEAD>
<BODY TEXT="#000000" LINK="#ff0000" VLINK="#0000ff" ALINK="#00ff00" BGCOLOR="#ffffff">
Welcome to this humble page for:
<P ALIGN="center">
<a target="_blank" href="http://www.trackmaniaforever.com/"><IMG SRC="banner.jpg" ALT="TrackMania Forever" TITLE="TrackMania Forever" BORDER="0" WIDTH="755" HEIGHT="245"></a>
<HR>
<H3>Introduction:</H3>
<CENTER>
<TABLE WIDTH="93%" CELLSPACING="10" BORDER="0"><TR><TD>
This is a simple hub page for TrackMania Forever, both Nations and United. It aims to collect in one place useful information and references to official and community sites for these upgraded racing games by Nadeo. Here are relevant excerpts from the Forever press releases:
<P>
"TrackMania Nations Forever offers a new complete 'Forever' version of the Stadium environment, a complete solo mode and 65 brand new, progressively difficult tracks. TrackMania Nations Forever will unite an even larger number of players thanks to its engaging multiplayer modes, innovative online functions and revolutionary interactivity between players."
<P>
"The release of TrackMania Nations Forever will also allow the convergence of the huge TrackMania community. For the first time, players of the free versions will be able to play online with players from the retail version of TrackMania United on servers dedicated to the Stadium environment that is common to both games. Players of the TrackMania United retail version also gain a brilliant free extension named 'United Forever'. In addition to being compatible with Nations Forever, this extension offers many bonuses - including tracks that have never been seen before, new design blocks for the game environments and a spectacular graphics update for the three historic environments Desert, Snow and Rally."
<P>
"The TrackMania Forever add-on also features a new 3D function that enhances the gameplay experience by optionally displaying the game in three dimensions when players wear special 3D glasses. Glasses will be provided in every new retail version of TrackMania United Forever. In order to offer even more interactivity, TrackMania United Forever lets player create and manage groups of friends in-game, much in the same way they would in Facebook or Myspace."
</TD></TR></TABLE>
</CENTER>
<a name="content"></a>
<H3>Content:</H3>
<UL>
<LI><a href="#downloads">TMF Downloads</a>
<LI><a href="#versions">TMF Versions</a>
<LI><a href="#links">Links</a>
<LI><a href="#official">Official</a>
<LI><a href="#community">Community</a>
<LI><a href="#resources">Resources</a>
<LI><a href="#scripts">Scripts</a>
</UL>
<a name="downloads"></a>
<H3>TMF Downloads:</H3>
<UL>
<LI>See the <a target="_blank" href="http://links.xaseco.org/official.php#client">Game Client page</a> on XAseco.org.
</UL>
<a name="versions"></a>
<H3>TMF Versions:</H3>
<UL>
<LI>See the <a target="_blank" href="http://server.xaseco.org/versions.php">TMF Client &amp; Server Versions page</a> on XAseco.org.
</UL>
<a name="links"></a>
<H3>Links:</H3>
<UL>
<LI><a name="official"></a><u>Official</u>
<UL>
<LI>See the <a target="_blank" href="http://links.xaseco.org/official.php">Official Links page</a> on XAseco.org.
<br><br>
<LI><a target="_blank" href="http://official.trackmania.com/tmf-playerpage/">TMF Player Page</a> (<a target="_blank" href="https://player.trackmania.com/">alternate link</a>)
<LI><a target="_blank" href="http://official.trackmania.com/tmf-communitycode/">TMF Community Code</a>
<LI><a target="_blank" href="http://official.trackmania.com/tmf-registerkey/">TMF Register Key</a> (superseded by Player Page)
<LI><a target="_blank" href="http://official.trackmania.com/tmf-dedicated/">TMF Dedicated Server</a> (superseded by Player Page)
<LI><a target="_blank" href="http://official.trackmania.com/tmf-ladderserver/">TMF Ladder Server</a> (superseded by Player Page)
<br><br>
<LI><a href="press_kit_tmnf.rar">TMNF press kit</a>
<LI><a href="images/logo_tmnf.jpg">TMNF main logo</a>
<LI><a href="images/home_tmnf.jpg">TMNF launch logo</a>
<LI><a href="images/nations_en.jpg">TMNF promo logo</a>
<LI><a href="images/united_en.jpg">TMUF promo logo</a>
<br><br>
</UL>
<a name="community"></a>
<LI><u>Community</u>
<UL>
<LI><a target="_blank" href="/tm2/">TM² hub</a>
<LI><a target="_blank" href="/tmn/">TMN ESWC hub</a>
<LI><a target="_blank" href="/sm/">ShootMania hub</a>
<LI>See the <a target="_blank" href="http://links.xaseco.org/community.php">Community Links page</a> on XAseco.org.
<br><br>
</UL>
<a name="resources"></a>
<LI><u>Server Resources</u>
<UL>
<LI><a href="/tm2/">XASECO2 (TM²C) v1.0x</a>
<LI><a href="/tmn/">XASECO (TMN/TMF) v1.1x</a>
<LI><a href="quickstart.html">TMF &amp; XASECO quick start guide</a>
<LI><a target="_blank" href="http://www.tm-forum.com/viewtopic.php?t=14203">TMF Dedicated Server</a>
<LI><a target="_blank" href="http://www.xaseco.org/initd.php">XASECO start-up scripts for Linux</a>
<LI><a target="_blank" href="http://server.xaseco.org/initd.php">Dedicated Server start-up scripts for Linux</a>
<LI>See the <a target="_blank" href="http://links.xaseco.org/resources.php">Resource Links page</a> on XAseco.org.
<br><br>
</UL>
<a name="scripts"></a>
<LI><u>Miscellaneous Scripts</u>
<UL>
<LI>See the <a target="_blank" href="http://www.xaseco.org/tools.php">Scripts &amp; Tools page</a> on XAseco.org.
<LI><a href="fufi.menu.v0.37.zip">Fufi Menu v0.37</a>
</UL>
</UL>
<BR>
<HR>
<ADDRESS>
Copyright &copy; 2007-2013 &ndash; Frans P. de Vries <A HREF="mailto:tm&#64;&#103;&#97;&#109;&#101;&#114;&#115;&#46;&#111;&#114;&#103;">&lt;tm&#64;&#103;&#97;&#109;&#101;&#114;&#115;&#46;&#111;&#114;&#103;&gt;</A>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
Last updated 26-Jul-2013
</ADDRESS>
</BODY>
</HTML>

View File

@ -1,76 +0,0 @@
#!/usr/bin/php -q
<?php
// vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2:
// Update a panel setting for all players in a XASECO[2] database
// Created Sep 2011 by Xymph <tm@gamers.org>
$panelpath = '/home/tmf/aseco/panels';
if (!isset($argv[1]) || !isset($argv[2])) {
echo 'usage: ' . basename($argv[0]) . ' {admin|donate|records|vote} PanelName' . "\n";
exit;
}
if (!file_exists($panelpath)) {
echo "Panel path '$panelpath' not found\n";
exit;
}
if ($argv[1] != 'admin' && $argv[1] != 'donate' &&
$argv[1] != 'records' && $argv[1] != 'vote') {
echo "unknown panel type\n";
exit;
}
$panelpath = rtrim($panelpath, '/');
if (!file_exists($panelpath . '/' . ucfirst($argv[1]) . $argv[2] . '.xml')) {
echo "unknown panel name\n";
exit;
}
if (!mysql_connect('localhost','YOUR_MYSQL_LOGIN','YOUR_MYSQL_PASSWORD')) {
echo "could not connect\n";
exit;
}
if (!mysql_select_db('aseco')) {
echo "could not select\n";
exit;
}
$query = 'SELECT PlayerID,Panels FROM players_extra ORDER BY PlayerID';
$resply = mysql_query($query);
if (mysql_num_rows($resply) > 0) {
echo 'Updating players_extra entries: ' . mysql_num_rows($resply) . " ...\n";
while ($rowply = mysql_fetch_object($resply)) {
$panels = explode('/', $rowply->Panels);
switch ($argv[1]) {
case 'admin':
$panels[0] = ucfirst($argv[1]) . $argv[2];
break;
case 'donate':
$panels[1] = ucfirst($argv[1]) . $argv[2];
break;
case 'records':
$panels[2] = ucfirst($argv[1]) . $argv[2];
break;
case 'vote':
$panels[3] = ucfirst($argv[1]) . $argv[2];
break;
}
$query = "UPDATE players_extra SET Panels = '" . implode('/', $panels) . "' WHERE PlayerID = " . $rowply->PlayerID;
$result = mysql_query($query);
if (mysql_affected_rows() == -1) {
mysql_free_result($resply);
echo "couldn't update panels for player ID " . $rowply->PlayerID . ":\n";
echo mysql_error() . "\n";
exit;
}
}
echo "Done\n";
mysql_free_result($resply);
} else {
echo "no players_extra!\n";
}
?>

File diff suppressed because it is too large Load Diff

View File

@ -1,93 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<access>
<!-- For a detailed explanation of this three-pass access control system,
see: http://httpd.apache.org/docs/2.0/mod/mod_access.html
The first pass checks all Allow or Deny entries, as specified by the
Order directive. The second pass checks all Deny or Allow entries.
The third pass applies to nations/zones which didn't match before.
The last value in Order thus controls the default behavior when no
match is found among Allow and Deny, and when both sections match.
From values are case-sensitive, upper- and lowercase characters must
match exactly with the players' nations/zones you want to control.
Special From value 'all' matches all nations/zones, and can be used
only once in either the Allow or Deny section, with no other From
fields in that section.
Examples of some common situations:
1. On TMN allow only players from the Benelux:
<order>Deny,Allow</order>
<allow>
<from>BEL</from>
<from>NED</from>
<from>LUX</from>
</allow>
<deny>
<from>all</from>
</deny>
2. The same policy can also be configured like this (note that
because Deny is last, it cannot contain 'all' or the allowed
nations would be denied as yet):
<order>Allow,Deny</order>
<allow>
<from>BEL</from>
<from>NED</from>
<from>LUX</from>
</allow>
<deny>
<from></from>
</deny>
3. On TMF allow all players except from France and Great Britain:
<order>Deny,Allow</order>
<allow>
<from></from>
</allow>
<deny>
<from>France</from>
<from>United Kingdom</from>
</deny>
And a more complex one:
On TMF allow only players from Germany and Austria, except Berlin,
Vienna, and the entire Bavaria region:
<order>Allow,Deny</order>
<allow>
<from>Germany</from>
<from>Austria</from>
</allow>
<deny>
<from>Germany|Berlin</from>
<from>Germany|Bavaria</from>
<from>Austria|Vienna</from>
</deny>
Configure your server's access policies below:
-->
<order>Deny,Allow</order>
<allow>
<from>all</from>
</allow>
<deny>
<from></from>
</deny>
<messages>
<denied>{#server}>> {#message}Player {#highlite}{1}$z$s{#message} denied access from {2} {#highlite}{3}{#message} [{#error}Kicked $z$s{#message}]</denied>
<dialog>{#message}Access from zone {#highlite}{1} {#message}denied$z</dialog>
<reload>{#server}> Player access control reloaded from {#highlite}access.xml</reload>
<xmlerr>{#server}> {#highlite}access.xml {#error}config error, player access control disabled!</xmlerr>
<missing>{#server}> {#error}Missing parameter, use {#highlite}$i /admin access help {#error}!</missing>
</messages>
</access>

View File

@ -1,320 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<lists>
<titles>
<masteradmin>MasterAdmin</masteradmin>
<admin>Admin</admin>
<operator>Operator</operator>
</titles>
<admins>
<!-- format:
<tmlogin>YOUR_ADMIN_LOGIN</tmlogin> <ipaddress></ipaddress>
-->
</admins>
<operators>
<!-- format:
<tmlogin>YOUR_OPERATOR_LOGIN</tmlogin> <ipaddress></ipaddress>
-->
</operators>
<admin_abilities>
<help>true</help>
<helpall>true</helpall>
<setservername>false</setservername>
<setcomment>false</setcomment>
<setpwd>true</setpwd>
<setspecpwd>true</setspecpwd>
<setrefpwd>true</setrefpwd>
<setmaxplayers>false</setmaxplayers>
<setmaxspecs>false</setmaxspecs>
<setgamemode>true</setgamemode>
<setrefmode>true</setrefmode>
<nextmap>true</nextmap>
<next>true</next>
<skipmap>true</skipmap>
<skip>true</skip>
<previous>true</previous>
<prev>true</prev>
<nextenv>true</nextenv>
<restartmap>true</restartmap>
<res>true</res>
<replaymap>true</replaymap>
<replay>true</replay>
<dropjukebox>true</dropjukebox>
<djb>true</djb>
<clearjukebox>true</clearjukebox>
<cjb>true</cjb>
<clearhist>true</clearhist>
<add>true</add>
<addthis>true</addthis>
<addlocal>true</addlocal>
<warn>true</warn>
<kick>true</kick>
<kickghost>true</kickghost>
<ban>true</ban>
<unban>true</unban>
<banip>true</banip>
<unbanip>true</unbanip>
<black>true</black>
<unblack>true</unblack>
<addguest>true</addguest>
<removeguest>true</removeguest>
<pass>true</pass>
<cancel>true</cancel>
<can>true</can>
<endround>true</endround>
<er>true</er>
<players>true</players>
<showbanlist>true</showbanlist>
<listbans>true</listbans>
<showiplist>true</showiplist>
<listips>true</listips>
<showblacklist>true</showblacklist>
<listblacks>true</listblacks>
<showguestlist>true</showguestlist>
<listguests>true</listguests>
<writeiplist>true</writeiplist>
<readiplist>true</readiplist>
<writeblacklist>true</writeblacklist>
<readblacklist>true</readblacklist>
<writeguestlist>true</writeguestlist>
<readguestlist>true</readguestlist>
<cleanbanlist>false</cleanbanlist>
<cleaniplist>false</cleaniplist>
<cleanblacklist>false</cleanblacklist>
<cleanguestlist>false</cleanguestlist>
<mergegbl>false</mergegbl>
<access>false</access>
<writetracklist>true</writetracklist>
<readtracklist>true</readtracklist>
<shuffle>true</shuffle>
<shufflemaps>true</shufflemaps>
<listdupes>true</listdupes>
<remove>true</remove>
<erase>true</erase>
<removethis>true</removethis>
<erasethis>true</erasethis>
<mute>true</mute>
<ignore>true</ignore>
<unmute>true</unmute>
<unignore>true</unignore>
<mutelist>true</mutelist>
<ignorelist>true</ignorelist>
<listmutes>true</listmutes>
<listignores>true</listignores>
<cleanmutes>false</cleanmutes>
<cleanignores>false</cleanignores>
<addadmin>false</addadmin>
<removeadmin>false</removeadmin>
<addop>true</addop>
<removeop>true</removeop>
<listmasters>true</listmasters>
<listadmins>true</listadmins>
<listops>true</listops>
<adminability>false</adminability>
<opability>false</opability>
<listabilities>true</listabilities>
<writeabilities>true</writeabilities>
<readabilities>true</readabilities>
<wall>true</wall>
<mta>true</mta>
<delrec>false</delrec>
<prunerecs>false</prunerecs>
<rpoints>true</rpoints>
<match>true</match>
<acdl>false</acdl>
<autotime>true</autotime>
<disablerespawn>true</disablerespawn>
<forceshowopp>true</forceshowopp>
<scorepanel>true</scorepanel>
<roundsfinish>true</roundsfinish>
<forceteam>true</forceteam>
<forcespec>true</forcespec>
<specfree>true</specfree>
<panel>true</panel>
<style>false</style>
<admpanel>false</admpanel>
<donpanel>false</donpanel>
<recpanel>false</recpanel>
<votepanel>false</votepanel>
<coppers>true</coppers>
<pay>false</pay>
<relays>true</relays>
<server>true</server>
<pm>true</pm>
<pmlog>true</pmlog>
<call>false</call>
<unlock>true</unlock>
<debug>false</debug>
<shutdown>false</shutdown>
<shutdownall>false</shutdownall>
<uptodate>true</uptodate>
<chat_pma>true</chat_pma>
<chat_bestworst>true</chat_bestworst>
<chat_statsip>true</chat_statsip>
<chat_settings>true</chat_settings>
<chat_summary>true</chat_summary>
<chat_jukebox>true</chat_jukebox>
<chat_jb_multi>true</chat_jb_multi>
<chat_jb_recent>true</chat_jb_recent>
<chat_add_tref>false</chat_add_tref>
<chat_match>false</chat_match>
<chat_tc_listen>false</chat_tc_listen>
<chat_jfreu>true</chat_jfreu>
<chat_musicadmin>true</chat_musicadmin>
<noidlekick_play>false</noidlekick_play>
<noidlekick_spec>true</noidlekick_spec>
<server_coppers>true</server_coppers>
</admin_abilities>
<operator_abilities>
<help>true</help>
<helpall>true</helpall>
<setservername>false</setservername>
<setcomment>false</setcomment>
<setpwd>false</setpwd>
<setspecpwd>false</setspecpwd>
<setrefpwd>false</setrefpwd>
<setmaxplayers>false</setmaxplayers>
<setmaxspecs>false</setmaxspecs>
<setgamemode>false</setgamemode>
<setrefmode>false</setrefmode>
<nextmap>true</nextmap>
<next>true</next>
<skipmap>true</skipmap>
<skip>true</skip>
<previous>true</previous>
<prev>true</prev>
<nextenv>true</nextenv>
<restartmap>true</restartmap>
<res>true</res>
<replaymap>true</replaymap>
<replay>true</replay>
<dropjukebox>true</dropjukebox>
<djb>true</djb>
<clearjukebox>true</clearjukebox>
<cjb>true</cjb>
<clearhist>false</clearhist>
<add>false</add>
<addthis>false</addthis>
<addlocal>false</addlocal>
<warn>true</warn>
<kick>true</kick>
<kickghost>true</kickghost>
<ban>false</ban>
<unban>false</unban>
<banip>false</banip>
<unbanip>false</unbanip>
<black>false</black>
<unblack>false</unblack>
<addguest>true</addguest>
<removeguest>true</removeguest>
<pass>true</pass>
<cancel>true</cancel>
<can>true</can>
<endround>true</endround>
<er>true</er>
<players>true</players>
<showbanlist>true</showbanlist>
<listbans>true</listbans>
<showiplist>true</showiplist>
<listips>true</listips>
<showblacklist>true</showblacklist>
<listblacks>true</listblacks>
<showguestlist>true</showguestlist>
<listguests>true</listguests>
<writeiplist>false</writeiplist>
<readiplist>false</readiplist>
<writeblacklist>false</writeblacklist>
<readblacklist>false</readblacklist>
<writeguestlist>false</writeguestlist>
<readguestlist>false</readguestlist>
<cleanbanlist>false</cleanbanlist>
<cleaniplist>false</cleaniplist>
<cleanblacklist>false</cleanblacklist>
<cleanguestlist>false</cleanguestlist>
<mergegbl>false</mergegbl>
<access>false</access>
<writetracklist>false</writetracklist>
<readtracklist>false</readtracklist>
<shuffle>false</shuffle>
<shufflemaps>false</shufflemaps>
<listdupes>false</listdupes>
<remove>false</remove>
<erase>false</erase>
<removethis>false</removethis>
<erasethis>false</erasethis>
<mute>true</mute>
<ignore>true</ignore>
<unmute>true</unmute>
<unignore>true</unignore>
<mutelist>true</mutelist>
<ignorelist>true</ignorelist>
<listmutes>true</listmutes>
<listignores>true</listignores>
<cleanmutes>false</cleanmutes>
<cleanignores>false</cleanignores>
<addadmin>false</addadmin>
<removeadmin>false</removeadmin>
<addop>false</addop>
<removeop>false</removeop>
<listmasters>true</listmasters>
<listadmins>true</listadmins>
<listops>true</listops>
<adminability>false</adminability>
<opability>false</opability>
<listabilities>true</listabilities>
<writeabilities>false</writeabilities>
<readabilities>false</readabilities>
<wall>false</wall>
<mta>false</mta>
<delrec>false</delrec>
<prunerecs>false</prunerecs>
<rpoints>false</rpoints>
<match>false</match>
<acdl>false</acdl>
<autotime>false</autotime>
<disablerespawn>false</disablerespawn>
<forceshowopp>false</forceshowopp>
<scorepanel>true</scorepanel>
<roundsfinish>true</roundsfinish>
<forceteam>true</forceteam>
<forcespec>true</forcespec>
<specfree>true</specfree>
<panel>true</panel>
<style>false</style>
<admpanel>false</admpanel>
<donpanel>false</donpanel>
<recpanel>false</recpanel>
<votepanel>false</votepanel>
<coppers>false</coppers>
<pay>false</pay>
<relays>true</relays>
<server>false</server>
<pm>false</pm>
<pmlog>false</pmlog>
<call>false</call>
<unlock>true</unlock>
<debug>false</debug>
<shutdown>false</shutdown>
<shutdownall>false</shutdownall>
<uptodate>false</uptodate>
<chat_pma>false</chat_pma>
<chat_bestworst>false</chat_bestworst>
<chat_statsip>false</chat_statsip>
<chat_settings>true</chat_settings>
<chat_summary>false</chat_summary>
<chat_jukebox>false</chat_jukebox>
<chat_jb_multi>false</chat_jb_multi>
<chat_jb_recent>false</chat_jb_recent>
<chat_add_tref>false</chat_add_tref>
<chat_match>false</chat_match>
<chat_tc_listen>false</chat_tc_listen>
<chat_jfreu>false</chat_jfreu>
<chat_musicadmin>false</chat_musicadmin>
<noidlekick_play>false</noidlekick_play>
<noidlekick_spec>true</noidlekick_spec>
<server_coppers>false</server_coppers>
</operator_abilities>
</lists>

File diff suppressed because it is too large Load Diff

View File

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<autotime>
<!-- Set the multiplicator for author time (e.g. 6x author -->
<!-- time = new timelimit); set to 0 to disable function -->
<multiplicator>6</multiplicator>
<!-- Set minimum timelimit in minutes -->
<mintime>3.5</mintime>
<!-- Set maximum timelimit in minutes -->
<maxtime>7</maxtime>
<!-- Set default timelimit in minutes if any error occurs -->
<defaulttime>5</defaulttime>
<!-- 2 = in TMF message window, 1 = in chat, 0 = none -->
<display>1</display>
<message>{#server}>> Set {1} timelimit for {#highlite}{2}{#server} : {#highlite}{3}{#server} (Author time: {#highlite}{4}{#server})</message>
</autotime>

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<ban_list>
<!-- format:
<ipaddress>xx.xx.xx.xx</ipaddress>
-->
</ban_list>

View File

@ -1,219 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<settings>
<aseco>
<masteradmins>
<!-- /ip:port in tmlogin only needed when joining server over LAN -->
<!-- ipaddress can be specified to guard each login against -->
<!-- unauthorized use of admin commands from other IP addresses -->
<!-- format:
<tmlogin>--$MASTERADMIN_LOGIN--</tmlogin> <ipaddress></ipaddress>
-->
</masteradmins>
<colors>
<error>$f00$i</error>
<welcome>$f00</welcome>
<server>$ff0</server>
<highlite>$fff</highlite>
<timelite>$bbb</timelite>
<record>$0f3</record>
<emotic>$fa0</emotic>
<music>$d80</music>
<message>$39f</message>
<rank>$ff3</rank>
<vote>$f8f</vote>
<karma>$ff0</karma>
<donate>$f0f</donate>
<admin>$ff0</admin>
<black>$000</black>
<grey>$888</grey>
<login>$00f</login>
<logina>$0c0</logina>
<nick>$f00</nick>
<interact>$ff0$i</interact>
<dedimsg>$28b</dedimsg>
<dedirec>$0b3</dedirec>
</colors>
<messages>
<!-- init messages -->
<startup>{#server}*** XASECO {#highlite}v{1}{#server} running on {#highlite}{2}{#server}:{#highlite}{3}{#server} ***</startup>
<welcome>{#welcome}Welcome {#highlite}{1}{#welcome} to {#highlite}{2}$z$s{br}{#welcome}This server uses {#highlite}XASECO v{3}{#welcome} to manage your records.</welcome>
<warning>$s{#welcome}This is an administrative warning.{br}{br}$gWhatever you wrote is against our server's{br}policy. Not respecting other players, or{br}using offensive language might result in a{br}{#welcome}kick, or ban {#message}the next time.{br}{br}$gThe server administrators.</warning>
<!-- record messages -->
<record_current>{#server}>> {#message}Current record on {#highlite}{1}{#message} is {#highlite}{2}{#message} by {#highlite}{3}</record_current>
<record_none>{#server}>> {#message}Currently no record on {#highlite}{1}{#message} ...</record_none>
<record_error>{#server}>> {#error}Could not get records from database... No records this round!</record_error>
<!-- ranking messages -->
<ranking>{#server}>> {#message}Local Record rankings on {#highlite}{1}{#message} {2} this round:</ranking>
<ranking_range>{#server}>> {#message}Local Record rankings on {#highlite}{1}{#message} {2} this round (range {#highlite}{3}{#message}):</ranking_range>
<ranking_new>{#server}>> {#message}Local Record rankings on {#highlite}{1}{#message} {2} this round ({#highlite}{3}{#message} new):</ranking_new>
<ranking_nonew>{#server}>> {#message}Local Record rankings on {#highlite}{1}{#message} {2} this round: none new so far</ranking_nonew>
<ranking_none>{#server}>> {#message}Local Record rankings on {#highlite}{1}{#message} {2} this round: no records!</ranking_none>
<!-- record misc. messages -->
<ranking_record_new_on>{#rank}{1}{#message}.$i{#highlite}{2}{#message}[{#highlite}{3}{#message}]$i, </ranking_record_new_on>
<ranking_record_new>{#rank}{1}{#message}.{#highlite}{2}{#message}[{#highlite}{3}{#message}], </ranking_record_new>
<ranking_record_on>{#rank}{1}{#message}.$i{#timelite}{2}{#message}[{#timelite}{3}{#message}]$i, </ranking_record_on>
<ranking_record>{#rank}{1}{#message}.{#timelite}{2}{#message}[{#timelite}{3}{#message}], </ranking_record>
<ranking_record2>{#rank}{1}{#message}.{#timelite}{2}{#message}, </ranking_record2>
<!-- record relation messages -->
<first_record>{#server}> {#record}The first Local record is: </first_record>
<last_record>{#server}> {#record}The last Local record is: </last_record>
<diff_record>{#server}> {#record}Difference between {1}{#record} and {2}{#record} is: {#highlite}{3}</diff_record>
<summary>{#server}> {#highlite}{1} $z$s{#record}has {#highlite}{2}{#record} Local record{3}, the top {4} being: </summary>
<sum_entry>{#highlite}{1} {#record}rec{2} #{#rank}{3}{#record}, </sum_entry>
<!-- win messages -->
<wins>{#server}> {#record}You have already won {#highlite}{1}{#record} race{2}</wins>
<win_new>{#server}> {#record}Congratulations, you won your {#highlite}{1}{#record}. race!</win_new>
<win_multi>{#server}>> {#record}Congratulations, {#highlite}{1}{#record} won his/her {#highlite}{2}{#record}. race!</win_multi>
<!-- muting messages -->
<mute>{#server}> Player {#highlite}{1}$z$s{#server} is muted!</mute>
<unmute>{#server}> Player {#highlite}{1}$z$s{#server} is unmuted!</unmute>
<muted>{#server}> {#highlite}{1}{#error} disabled because you are on the global mute list!</muted>
<!-- donate/pay messages -->
<donation>{#donate} Donate {#highlite}{1}{#donate} coppers to {#highlite}{2}$z</donation>
<thanks_all>{#server}>> {#highlite}{1}$z$s{#donate} received a donation of {#highlite}{2}{#donate} coppers from {#highlite}{3}$z$s{#donate}. Thank You!</thanks_all>
<thanks_you>{#server}> {#donate}You made a donation of {#highlite}{1}{#donate} coppers. Thank You!</thanks_you>
<donate_minimum>{#server}> {#error}Minimum donation amount is {#highlite}$i {1}{#error} coppers!</donate_minimum>
<donate_help>{#server}> {#error}Use {#highlite}$i /donate &lt;number&gt;{#error} to donate coppers to the server</donate_help>
<payment>{#donate} Send {#highlite}{1}{#donate} coppers to {#highlite}{2}$z</payment>
<pay_insuff>{#server}> {#error}Insufficient server coppers: {#highlite}$i {1}{#error}!</pay_insuff>
<pay_server>{#server}> {#error}Cannot pay this server itself!</pay_server>
<pay_confirm>{#server}> {#donate}Payment of {#highlite}{1}{#donate} coppers to {#highlite}{2}{#donate} confirmed! Remaining coppers: {#highlite}{3}</pay_confirm>
<pay_cancel>{#server}> {#donate}Payment to {#highlite}{1}{#donate} cancelled!</pay_cancel>
<pay_help>{#server}> {#error}Use {#highlite}$i /admin pay &lt;login&gt; $m&lt;number&gt;{#error} to send server coppers to a login</pay_help>
<!-- playtime/track messages -->
<playtime>{#server}> Current track {#highlite}{1}{#server} has been played for {#highlite}{2}</playtime>
<playtime_finish>{#server}>> Current track {#highlite}{1}{#server} finished after {#highlite}{2}</playtime_finish>
<playtime_replay> {#server}({#highlite}{1}{#server} replay{2}, total {#highlite}{3}{#server})</playtime_replay>
<track>{#server}> Current track {#highlite}{1} {#server}by {#highlite}{2} {#server}Author: {#highlite}{3} {#server}Gold: {#highlite}{4} {#server}Silver: {#highlite}{5} {#server}Bronze: {#highlite}{6} {#server}Cost: {#highlite}{7}</track>
<current_track>{#server}>> Current track {#highlite}{1} {#server}by {#highlite}{2} {#server}Author: {#highlite}{3}</current_track>
<!-- rounds points messages -->
<rpoints_named>{#server}> {1}Custom points system set to {#highlite}{2}{3}: {#highlite}{4},...</rpoints_named>
<rpoints_nameless>{#server}> {1}Custom points system set to: {#highlite}{2},...</rpoints_nameless>
<no_rpoints>{#server}> {1}No custom Rounds points system defined!</no_rpoints>
<!-- relay messages -->
<no_relays>{#server}> {#error}No relay servers connected</no_relays>
<relaymaster>{#server}> This server relays master server: {#highlite}{1}{#server} ({#highlite}{2}{#server})</relaymaster>
<notonrelay>{#server}> {#error}Command unavailable on relay server</notonrelay>
<!-- uptodate messages -->
<uptodate_ok>{#server}>> {#message}This XASECO version {#highlite}{1}{#message} is up to date</uptodate_ok>
<uptodate_new>{#server}>> {#message}New XASECO version {#highlite}{1}{#message} available from {#highlite}{2}</uptodate_new>
<!-- connection messages -->
<banip_dialog>{#welcome}Your IP was banned from this server.$z</banip_dialog>
<banip_error>{#welcome}Could not connect:{br}{br}Your IP was banned from this server!</banip_error>
<client_dialog>{#welcome}Obsolete client version, please $l[http://www.tm-forum.com/viewtopic.php?p=139752#p139752]upgrade$l.$z</client_dialog>
<client_error>{#welcome}Obsolete client version!{br}Please upgrade to the $l[http://www.tm-forum.com/viewtopic.php?p=139752#p139752]latest version$l.</client_error>
<connect_dialog>{#welcome}Connection problem, please retry.$z</connect_dialog>
<connect_error>{#welcome}$sThis is an administrative notice.$z{br}{br}XASECO encountered a very rare player connection{br}problem. Please re-join the server to correct it.{br}Apologies for the inconvenience.{br}{br}$sThe server administrators.</connect_error>
<!-- idlekick messages -->
<idlekick_play>{#server}>> IdleKick player {#highlite}{1}$z$s{#server} after {#highlite}{2}{#server} challenge{3}!</idlekick_play>
<idlespec_play>{#server}>> IdleSpec player {#highlite}{1}$z$s{#server} after {#highlite}{2}{#server} challenge{3}</idlespec_play>
<idlekick_spec>{#server}>> IdleKick spectator {#highlite}{1}$z$s{#server} after {#highlite}{2}{#server} challenge{3}!</idlekick_spec>
<!-- miscellaneous messages -->
<song>{#server}> Track {#highlite}{1} {#server}plays song: {#highlite}{2}</song>
<mod>{#server}> Track {#highlite}{1} {#server}uses mod: {#highlite}{2} {#server}({#highlite}{3}{#server})</mod>
<coppers>{#server}> Server {#highlite}{1}$z$s {#server}owns {#highlite}{2} {#server}coppers!</coppers>
<time>{#server}> {#interact}Current Server Time: {#highlite}$i {2}{#interact} on {#highlite}$i {2}</time>
<tmxrec>{#server}>> {#record}TMX World Record: {#highlite}{1}{#record} by {#highlite}{2}</tmxrec>
<round>$n{#message}R{#highlite}{1}{#message}> </round>
<no_cpsspec>{#server}> {#highlite}/cpsspec{#server} is not currently enabled on this server.</no_cpsspec>
<no_admin>{#server}> {#error}You have to be in admin list to do that!</no_admin>
<help_explanation>{#server}> Press the {#highlite}C{#server} key to see the whole list, and use {#highlite}/helpall{#server} for details</help_explanation>
<united_only>{#server}> {#error}This requires a TM United Forever {1}!</united_only>
<forever_only>{#server}> {#error}Command only available on TM Forever!</forever_only>
</messages>
<welcome_msg_window>False</welcome_msg_window>
<lock_password></lock_password>
<log_all_chat>False</log_all_chat>
<chatpmlog_times>True</chatpmlog_times>
<cheater_action>0</cheater_action>
<script_timeout>60</script_timeout>
<show_min_recs>8</show_min_recs>
<!-- 2 = full report, 1 = only track record, 0 = none -->
<!-- add 4 to show the report in the TMF message -->
<!-- window instead of the main chat window -->
<show_recs_before>2</show_recs_before>
<!-- 2 = full report, 1 = only top-5, 0 = none -->
<!-- add 4 to show the report in the TMF message -->
<!-- window instead of the main chat window -->
<show_recs_after>2</show_recs_after>
<show_recs_range>True</show_recs_range>
<!-- 2 = in TMF message window, 1 = in chat, 0 = none -->
<show_tmxrec>1</show_tmxrec>
<!-- 2 = in TMF message window, 1 = in chat, 0 = none -->
<show_playtime>1</show_playtime>
<!-- 2 = in TMF message window, 1 = in chat, 0 = none -->
<show_curtrack>0</show_curtrack>
<default_tracklist>tracklist.txt</default_tracklist>
<writetracklist_random>True</writetracklist_random>
<help_explanation>False</help_explanation>
<lists_colornicks>True</lists_colornicks>
<lists_colortracks>True</lists_colortracks>
<topclans_minplayers>2</topclans_minplayers>
<global_win_multiple>50</global_win_multiple>
<display_checkpoints>True</display_checkpoints>
<enable_cpsspec>False</enable_cpsspec>
<auto_enable_cps>True</auto_enable_cps>
<auto_enable_dedicps>False</auto_enable_dedicps>
<auto_admin_addip>True</auto_admin_addip>
<adminops_file>adminops.xml</adminops_file>
<bannedips_file>bannedips.xml</bannedips_file>
<blacklist_file>blacklist.txt</blacklist_file>
<guestlist_file>guestlist.txt</guestlist_file>
<trackhist_file>trackhistory.txt</trackhist_file>
<!-- the remaining settings are for TMF only -->
<admin_client_version>2.11.19</admin_client_version>
<player_client_version></player_client_version>
<default_rpoints></default_rpoints>
<afk_force_spec>True</afk_force_spec>
<clickable_lists>True</clickable_lists>
<show_rec_logins>True</show_rec_logins>
<!-- True = in TMF message window, False = in chat -->
<recs_in_window>False</recs_in_window>
<!-- True = in TMF message window, False = in chat -->
<rounds_in_window>False</rounds_in_window>
<!-- timeout of the TMF message window in seconds -->
<window_timeout>6</window_timeout>
<!-- True = display individual stats panels for each -->
<!-- player during the scoreboard & disable the rank -->
<!-- chat messages, False = show only rank messages -->
<sb_stats_panels>False</sb_stats_panels>
<!-- default windows style: none for old TMN-like, or -->
<!-- filename that should be at styles/<filename>.xml -->
<window_style>DarkBlur</window_style>
<!-- default panels: empty for no panel, otherwise a -->
<!-- filename that should be at panels/<filename>.xml -->
<admin_panel>AdminBelowChat</admin_panel>
<donate_panel>DonateBelowCPList</donate_panel>
<records_panel>RecordsRightBottom</records_panel>
<vote_panel>VoteBelowChat</vote_panel>
</aseco>
<tmserver>
<login>SuperAdmin</login>
<password>--$SERVER_SA_PASSWORD--</password>
<ip>127.0.0.1</ip>
<port>5000</port>
<timeout>180</timeout>
</tmserver>
</settings>

View File

@ -1,74 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<dedimania>
<database>
<welcome>{#welcome}Welcome to the Dedimania world record system at www.dedimania.com - see {#highlite}/helpdedi</welcome>
<timeout>{#dedimsg}Dedimania system timed out - retrying in {#highlite}{1}{#dedimsg} minutes</timeout>
<name>Dedimania</name>
<!-- Dedimania communication link, do not modify this! -->
<url>http://dedimania.net:8002/Dedimania</url>
<!-- Log Dedimania news in logfile? -->
<log_news>True</log_news>
<!-- Show welcome message in chat? -->
<show_welcome>True</show_welcome>
<!-- Minimum number of records you'd always like to see at -->
<!-- the start and end of tracks, and with /dedilive (-2) -->
<show_min_recs>8</show_min_recs>
<!-- Display existing records at start of a new track? -->
<!-- 2 = in message window, 1 = in chat, 0 = none -->
<show_recs_before>1</show_recs_before>
<!-- Display (possibly) updated records at end of a track? -->
<!-- 2 = in message window, 1 = in chat, 0 = none -->
<show_recs_after>1</show_recs_after>
<!-- Display records range if there are no new records? -->
<show_recs_range>True</show_recs_range>
<!-- Do you want XASECO to display newly driven records? -->
<display_recs>True</display_recs>
<!-- Show logins on TMF for players in /dedirecs ? -->
<show_rec_logins>True</show_rec_logins>
<!-- Display records in TMF message window or in chat? -->
<recs_in_window>False</recs_in_window>
<!-- Limit the highest record that will be displayed to -->
<!-- all? Only the pertaining player sees higher records, -->
<!-- so typically this is the same as your Server MaxRank -->
<limit_recs>30</limit_recs>
</database>
<!-- Dedimania server registration, copy these from dedicated.cfg -->
<!-- Instead of password you can also use the community code for -->
<!-- your server by using the login/password on the official site -->
<!-- For the nation, please use the 3-character abbreviation from -->
<!-- http://en.wikipedia.org/wiki/List_of_IOC_country_codes -->
<masterserver_account>
<login></login>
<password></password>
<nation></nation>
</masterserver_account>
<messages>
<!-- ranking messages -->
<ranking>{#server}>> {#dedimsg}Dedimania Record rankings on {#highlite}{1}{#dedimsg} {2} this round:</ranking>
<ranking_range>{#server}>> {#dedimsg}Dedimania Record rankings on {#highlite}{1}{#dedimsg} {2} this round (range {#highlite}{3}{#dedimsg}):</ranking_range>
<ranking_new>{#server}>> {#dedimsg}Dedimania Record rankings on {#highlite}{1}{#dedimsg} {2} this round ({#highlite}{3}{#dedimsg} new):</ranking_new>
<ranking_nonew>{#server}>> {#dedimsg}Dedimania Record rankings on {#highlite}{1}{#dedimsg} {2} this round: none new so far</ranking_nonew>
<ranking_none>{#server}>> {#dedimsg}Dedimania Record rankings on {#highlite}{1}{#dedimsg} {2} this round: no records!</ranking_none>
<!-- record messages -->
<record_new>{#server}>> {#highlite}{1}{#dedirec} secured his/her {#rank}{2}{#dedirec}. Dedimania Record! {3}: {#highlite}{4}{#dedirec} $n({#rank}{5}{#highlite}{6}{#dedirec})</record_new>
<record_equal>{#server}>> {#highlite}{1}{#dedirec} equaled his/her {#rank}{2}{#dedirec}. Dedimania Record! {3}: {#highlite}{4}</record_equal>
<record_new_rank>{#server}>> {#highlite}{1}{#dedirec} gained the {#rank}{2}{#dedirec}. Dedimania Record! {3}: {#highlite}{4}{#dedirec} $n({#rank}{5}{#highlite}{6}{#dedirec})</record_new_rank>
<record_first>{#server}>> {#highlite}{1}{#dedirec} claimed the {#rank}{2}{#dedirec}. Dedimania Record! {3}: {#highlite}{4}</record_first>
<!-- record relation messages -->
<first_record>{#server}> {#dedirec}The first Dedimania record is: </first_record>
<last_record>{#server}> {#dedirec}The last Dedimania record is: </last_record>
<diff_record>{#server}> {#dedirec}Difference between {1}{#dedirec} and {2}{#dedirec} is: {#highlite}{3}</diff_record>
<!-- pb messages -->
<pb>{#server}> {#dedirec}Dedimania Personal Best: {#highlite}{1}{#dedirec}({#rank}{2}{#dedirec})</pb>
<pb_none>{#server}> {#error}You don't have a Dedimania record on this track yet...</pb_none>
<!-- ban messages -->
<banned_login>{#server}>> {#highlite}{1} {#server}({#highlite}{2}{#server}) {#error}is banned from Dedimania!</banned_login>
<banned_finish>{#server}> {#error}Finish ignored by Dedimania as you are banned!</banned_finish>
</messages>
</dedimania>

View File

@ -1,28 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html><head>
<meta http-equiv = "Content-Type" content = "text/html;charset = UTF-8" />
<title>Race Results for {DATE} - {TIME} on {TRACK}</title>
<style type="text/css">
body {
background:#CCCCCC;
color:##DBE1DD;
margin-left: 10px;
margin-right: 10px;
margin-top:5px;
padding: 1px 1px 1px 1px;
font-family: sans-serif;
font-size: 80%;
}
</style></head><body>
{HEADER}
<p><table>
<tr><td>Track: {TRACK}</td><td>{DATE} - {TIME}</td></tr></table>
<table><tr><th>Rank</th><th>Name</th><th>Time</th><th>Team</th><th>Points</th></tr>
<!-- Player Data Begin -->
<tr><td>{RANK}</td><td>{NICK}</td><td>{TIME}</td><td>{TEAM}</td><td>{POINTS}</td></tr>
<!-- Player Data End -->
</table></p><p><table><tr><th>Team</th><th>Total</th>{MATCHCELL}</tr>
<!-- Team Data Begin -->
<tr><td>{TEAM}</td><td>{POINTS}</td>{MATCHPOINTS}</tr>
<!-- Team Data End -->
</table></p></body></html>

View File

@ -1,891 +0,0 @@
<?php
/* vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2: */
/*
IXR - The Incutio XML-RPC Library - (c) Incutio Ltd 2002
Version 1.61 - Simon Willison, 11th July 2003 (htmlentities -> htmlspecialchars)
Site: http://scripts.incutio.com/xmlrpc/
Manual: http://scripts.incutio.com/xmlrpc/manual.php
Errors: http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php
Made available under the Artistic License: http://www.opensource.org/licenses/artistic-license.php
Modified to support protocol 'GbxRemote 2' ('GbxRemote 1')
This version is for BigEndian machines. For LittleEndian (e.g. Intel PC)
machines use the original GbxRemote.inc.php instead.
Release 2007-09-22 - Slig:
Modified to support >256KB received data (and now >2MB data produce a specific error message)
Modified readCB() to wait the initial timeout only before first read packet
Modified readCB() to return true if there is data to get with getCBResponses()
Modified to support amd64 (for $recvhandle)
Modified IXR_ClientMulticall_Gbx::addCall() to fit Aseco 0.6.1
Added IXR_Client_Gbx::bytes_sent & bytes_received counters
Fix for a changed feature since php5.1.1 about reference parameter assignment (was used in stream_select)
Workaround for stream_select return value bug with amd64
Release 2008-01-20 - Slig / Xymph / Assembler Maniac:
Workaround for fread delay bug in some cases
Added IXR_Client_Gbx::resetError() method (by Xymph)
Some comments and strings code cleanup (by Xymph)
Fix stream_set_timeout($this->socket,...) (thx to CavalierDeVache)
Added a default timeout value to IXR_Client_Gbx::readCB($timeout)
Changed calls with timeout on a stream to use microseconds instead of seconds (by AM)
Removed IXR_Client_Gbx::bytes_sent & bytes_received counters - not used (by AM)
Release 2008-02-05 - Slig:
Changed some socket read/write timeouts back to seconds to avoid 'transport error'
Changed max data received from 2MB to 4MB
Release 2008-05-20 - Xymph:
Prevented unpack() warnings in IXR_Client_Gbx::query() when the connection dies
Changed IXR_Client_Gbx::resetError() to assign 'false' for correct isError()
Tweaked some 'transport error' messages
Release 2009-04-08 - Gou1:
Added method IXR_Client_Gbx::queryIgnoreResult()
Added methods IXR_Client_Gbx::sendRequest() & IXR_Client_Gbx::getResult()
IXR_Client_Gbx::queryIgnoreResult checks if the request is larger than 512KB to avoid errors
If larger than 512KB and method is system.multicall, try to divide the request into
two separate requests with two separate IXR_Client_Gbx::queryIgnoreResult() calls
Release 2009-06-03 - Xymph:
Suppress possible repetitive CRT warning at stream_select
Release 2011-04-09 - Xymph / La beuze:
Added optional timeout mechanism to IXR_Client_Gbx::InitWithIp()
Release 2011-05-22 - Xymph:
Added non-error (true) return status to IXR_Client_Gbx::queryIgnoreResult()
Updated status codes and messages for transport/endian errors
Prevented possible PHP warning in IXR_Client_Gbx::getErrorCode() and getErrorMessage()
Release 2011-12-04 - Xymph:
Prevented possible PHP warning in IXR_Value::calculateType
Release 2013-02-18 - Xymph:
Removed unnecessary breaks after returns in IXR_Value::getXml() switch
*/
if (!defined('LF')) {
define('LF', "\n");
}
class IXR_Value {
public $data;
public $type;
function IXR_Value ($data, $type = false) {
$this->data = $data;
if (!$type) {
$type = $this->calculateType();
}
$this->type = $type;
if ($type == 'struct') {
// Turn all the values in the array into new IXR_Value objects
foreach ($this->data as $key => $value) {
$this->data[$key] = new IXR_Value($value);
}
}
if ($type == 'array') {
for ($i = 0, $j = count($this->data); $i < $j; $i++) {
$this->data[$i] = new IXR_Value($this->data[$i]);
}
}
}
function calculateType() {
if ($this->data === true || $this->data === false) {
return 'boolean';
}
if (is_integer($this->data)) {
return 'int';
}
if (is_double($this->data)) {
return 'double';
}
// Deal with IXR object types base64 and date
if (is_object($this->data) && ($this->data instanceof IXR_Date)) {
return 'date';
}
if (is_object($this->data) && ($this->data instanceof IXR_Base64)) {
return 'base64';
}
// If it is a normal PHP object convert it into a struct
if (is_object($this->data)) {
$this->data = get_object_vars($this->data);
return 'struct';
}
if (!is_array($this->data)) {
return 'string';
}
// We have an array - is it an array or a struct?
if ($this->isStruct($this->data)) {
return 'struct';
} else {
return 'array';
}
}
function getXml() {
// Return XML for this value
switch ($this->type) {
case 'boolean':
return '<boolean>' . ($this->data ? '1' : '0') . '</boolean>';
case 'int':
return '<int>' . $this->data . '</int>';
case 'double':
return '<double>' . $this->data . '</double>';
case 'string':
return '<string>' . htmlspecialchars($this->data) . '</string>';
case 'array':
$return = '<array><data>' . LF;
foreach ($this->data as $item) {
$return .= ' <value>' . $item->getXml() . '</value>' . LF;
}
$return .= '</data></array>';
return $return;
case 'struct':
$return = '<struct>' . LF;
foreach ($this->data as $name => $value) {
$return .= ' <member><name>' . $name . '</name><value>';
$return .= $value->getXml() . '</value></member>' . LF;
}
$return .= '</struct>';
return $return;
case 'date':
case 'base64':
return $this->data->getXml();
}
return false;
}
function isStruct($array) {
// Nasty function to check if an array is a struct or not
$expected = 0;
foreach ($array as $key => $value) {
if ((string)$key != (string)$expected) {
return true;
}
$expected++;
}
return false;
}
}
class IXR_Message {
public $message;
public $messageType; // methodCall / methodResponse / fault
public $faultCode;
public $faultString;
public $methodName;
public $params;
// Current variable stacks
protected $_arraystructs = array(); // Stack to keep track of the current array/struct
protected $_arraystructstypes = array(); // Stack to keep track of whether things are structs or array
protected $_currentStructName = array(); // A stack as well
protected $_param;
protected $_value;
protected $_currentTag;
protected $_currentTagContents;
// The XML parser
protected $_parser;
function IXR_Message ($message) {
$this->message = $message;
}
function parse() {
// first remove the XML declaration
$this->message = preg_replace('/<\?xml(.*)?\?'.'>/', '', $this->message);
if (trim($this->message) == '') {
return false;
}
$this->_parser = xml_parser_create();
// Set XML parser to take the case of tags into account
xml_parser_set_option($this->_parser, XML_OPTION_CASE_FOLDING, false);
// Set XML parser callback functions
xml_set_object($this->_parser, $this);
xml_set_element_handler($this->_parser, 'tag_open', 'tag_close');
xml_set_character_data_handler($this->_parser, 'cdata');
if (!xml_parse($this->_parser, $this->message)) {
/* die(sprintf('GbxRemote XML error: %s at line %d',
xml_error_string(xml_get_error_code($this->_parser)),
xml_get_current_line_number($this->_parser))); */
return false;
}
xml_parser_free($this->_parser);
// Grab the error messages, if any
if ($this->messageType == 'fault') {
$this->faultCode = $this->params[0]['faultCode'];
$this->faultString = $this->params[0]['faultString'];
}
return true;
}
function tag_open($parser, $tag, $attr) {
$this->currentTag = $tag;
switch ($tag) {
case 'methodCall':
case 'methodResponse':
case 'fault':
$this->messageType = $tag;
break;
// Deal with stacks of arrays and structs
case 'data': // data is to all intents and purposes more interesting than array
$this->_arraystructstypes[] = 'array';
$this->_arraystructs[] = array();
break;
case 'struct':
$this->_arraystructstypes[] = 'struct';
$this->_arraystructs[] = array();
break;
}
}
function cdata($parser, $cdata) {
$this->_currentTagContents .= $cdata;
}
function tag_close($parser, $tag) {
$valueFlag = false;
switch ($tag) {
case 'int':
case 'i4':
$value = (int)trim($this->_currentTagContents);
$this->_currentTagContents = '';
$valueFlag = true;
break;
case 'double':
$value = (double)trim($this->_currentTagContents);
$this->_currentTagContents = '';
$valueFlag = true;
break;
case 'string':
$value = (string)trim($this->_currentTagContents);
$this->_currentTagContents = '';
$valueFlag = true;
break;
case 'dateTime.iso8601':
$value = new IXR_Date(trim($this->_currentTagContents));
// $value = $iso->getTimestamp();
$this->_currentTagContents = '';
$valueFlag = true;
break;
case 'value':
// If no type is indicated, the type is string
if (trim($this->_currentTagContents) != '') {
$value = (string)$this->_currentTagContents;
$this->_currentTagContents = '';
$valueFlag = true;
}
break;
case 'boolean':
$value = (boolean)trim($this->_currentTagContents);
$this->_currentTagContents = '';
$valueFlag = true;
break;
case 'base64':
$value = base64_decode($this->_currentTagContents);
$this->_currentTagContents = '';
$valueFlag = true;
break;
// Deal with stacks of arrays and structs
case 'data':
case 'struct':
$value = array_pop($this->_arraystructs);
array_pop($this->_arraystructstypes);
$valueFlag = true;
break;
case 'member':
array_pop($this->_currentStructName);
break;
case 'name':
$this->_currentStructName[] = trim($this->_currentTagContents);
$this->_currentTagContents = '';
break;
case 'methodName':
$this->methodName = trim($this->_currentTagContents);
$this->_currentTagContents = '';
break;
}
if ($valueFlag) {
/*
if (!is_array($value) && !is_object($value)) {
$value = trim($value);
}
*/
if (count($this->_arraystructs) > 0) {
// Add value to struct or array
if ($this->_arraystructstypes[count($this->_arraystructstypes)-1] == 'struct') {
// Add to struct
$this->_arraystructs[count($this->_arraystructs)-1][$this->_currentStructName[count($this->_currentStructName)-1]] = $value;
} else {
// Add to array
$this->_arraystructs[count($this->_arraystructs)-1][] = $value;
}
} else {
// Just add as a paramater
$this->params[] = $value;
}
}
}
}
class IXR_Request {
public $method;
public $args;
public $xml;
function IXR_Request($method, $args) {
$this->method = $method;
$this->args = $args;
$this->xml = '<?xml version="1.0" encoding="utf-8" ?><methodCall><methodName>' . $this->method . '</methodName><params>';
foreach ($this->args as $arg) {
$this->xml .= '<param><value>';
$v = new IXR_Value($arg);
$this->xml .= $v->getXml();
$this->xml .= '</value></param>' . LF;
}
$this->xml .= '</params></methodCall>';
}
function getLength() {
return strlen($this->xml);
}
function getXml() {
return $this->xml;
}
}
class IXR_Error {
public $code;
public $message;
function IXR_Error($code, $message) {
$this->code = $code;
$this->message = $message;
}
function getXml() {
$xml = <<<EOD
<methodResponse>
<fault>
<value>
<struct>
<member>
<name>faultCode</name>
<value><int>{$this->code}</int></value>
</member>
<member>
<name>faultString</name>
<value><string>{$this->message}</string></value>
</member>
</struct>
</value>
</fault>
</methodResponse>
EOD;
return $xml;
}
}
class IXR_Date {
public $year;
public $month;
public $day;
public $hour;
public $minute;
public $second;
function IXR_Date($time) {
// $time can be a PHP timestamp or an ISO one
if (is_numeric($time)) {
$this->parseTimestamp($time);
} else {
$this->parseIso($time);
}
}
function parseTimestamp($timestamp) {
$this->year = date('Y', $timestamp);
$this->month = date('Y', $timestamp);
$this->day = date('Y', $timestamp);
$this->hour = date('H', $timestamp);
$this->minute = date('i', $timestamp);
$this->second = date('s', $timestamp);
}
function parseIso($iso) {
$this->year = substr($iso, 0, 4);
$this->month = substr($iso, 4, 2);
$this->day = substr($iso, 6, 2);
$this->hour = substr($iso, 9, 2);
$this->minute = substr($iso, 12, 2);
$this->second = substr($iso, 15, 2);
}
function getIso() {
return $this->year.$this->month.$this->day.'T'.$this->hour.':'.$this->minute.':'.$this->second;
}
function getXml() {
return '<dateTime.iso8601>'.$this->getIso().'</dateTime.iso8601>';
}
function getTimestamp() {
return mktime($this->hour, $this->minute, $this->second, $this->month, $this->day, $this->year);
}
}
class IXR_Base64 {
public $data;
function IXR_Base64($data) {
$this->data = $data;
}
function getXml() {
return '<base64>'.base64_encode($this->data).'</base64>';
}
}
//////////////////////////////////////////////////////////
// Nadeo modifications //
// (many thanks to slig for adding callback support) //
//////////////////////////////////////////////////////////
class IXR_Client_Gbx {
public $socket;
public $message = false;
public $cb_message = array();
public $reqhandle;
public $protocol = 0;
// Storage place for an error message
public $error = false;
function bigEndianTest() {
list($endiantest) = array_values(unpack('L1L', pack('V', 1)));
if ($endiantest == 1) {
echo "Machine reports itself as LittleEndian, float handling will work correctly with unpack\r\n";
echo "Use original GbxRemote.inc.php instead of GbxRemote.bem.php\r\n";
die('App Terminated');
return false;
}
return true;
} // bigEndianTest
function IXR_Client_Gbx() {
$this->socket = false;
$this->reqhandle = 0x80000000;
}
function InitWithIp($ip, $port, $timeout = null) {
if (!$this->bigEndianTest()) {
$this->error = new IXR_Error(-31999, 'endian error - script doesn\'t match machine type');
return false;
}
// open connection, with timeout if specified
if (!isset($timeout)) {
$this->socket = @fsockopen($ip, $port, $errno, $errstr);
} else {
$init_time = microtime(true);
$init_timeout = 5; // retry every 5s
while (true) {
$this->socket = @fsockopen($ip, $port, $errno, $errstr, $init_timeout);
if ($this->socket || (microtime(true) - $init_time >= $timeout))
break;
}
}
if (!$this->socket) {
$this->error = new IXR_Error(-32300, "transport error - could not open socket (error: $errno, $errstr)");
return false;
}
// handshake
$array_result = big_endian_unpack('Vsize', fread($this->socket, 4));
$size = $array_result['size'];
if ($size > 64) {
$this->error = new IXR_Error(-32300, 'transport error - wrong lowlevel protocol header');
return false;
}
$handshake = fread($this->socket, $size);
if ($handshake == 'GBXRemote 1') {
$this->protocol = 1;
} else if ($handshake == 'GBXRemote 2') {
$this->protocol = 2;
} else {
$this->error = new IXR_Error(-32300, 'transport error - wrong lowlevel protocol version');
return false;
}
return true;
}
function Init($port) {
return $this->InitWithIp('localhost', $port);
}
function Terminate() {
if ($this->socket) {
fclose($this->socket);
$this->socket = false;
}
}
protected function sendRequest(IXR_Request $request) {
$xml = $request->getXml();
@stream_set_timeout($this->socket, 20); // timeout 20s (to write the request)
// send request
$this->reqhandle++;
if ($this->protocol == 1) {
$bytes = pack('Va*', strlen($xml), $xml);
} else {
$bytes = pack('VVa*', strlen($xml), $this->reqhandle, $xml);
}
$bytes_to_write = strlen($bytes);
while ($bytes_to_write > 0) {
$r = @fwrite($this->socket, $bytes);
if ($r === false || $r == 0) {
// connection interrupted
return false; // or die?
}
$bytes_to_write -= $r;
if ($bytes_to_write == 0)
break;
$bytes = substr($bytes, $r);
}
return true;
}
protected function getResult() {
$contents = '';
$contents_length = 0;
do {
$size = 0;
$recvhandle = 0;
@stream_set_timeout($this->socket, 20); // timeout 20s (to read the reply header)
// Get result
if ($this->protocol == 1) {
$contents = fread($this->socket, 4);
if (strlen($contents) == 0) {
$this->error = new IXR_Error(-32300, 'transport error - cannot read size');
return false;
}
$array_result = big_endian_unpack('Vsize', $contents);
$size = $array_result['size'];
$recvhandle = $this->reqhandle;
} else {
$contents = fread($this->socket, 8);
if (strlen($contents) == 0) {
$this->error = new IXR_Error(-32300, 'transport error - cannot read size/handle');
return false;
}
$array_result = big_endian_unpack('Vsize/Vhandle', $contents);
$size = $array_result['size'];
$recvhandle = $array_result['handle'];
// -- amd64 support --
$bits = sprintf('%b', $recvhandle);
if (strlen($bits) == 64) {
$recvhandle = bindec(substr($bits, 32));
}
}
if ($recvhandle == 0 || $size == 0) {
$this->error = new IXR_Error(-32300, 'transport error - connection interrupted!');
return false;
}
if ($size > 4096*1024) {
$this->error = new IXR_Error(-32300, "transport error - response too large ($size)");
return false;
}
$contents = '';
$contents_length = 0;
@stream_set_timeout($this->socket, 0, 10000); // timeout 10 ms (for successive reads until end)
while ($contents_length < $size) {
$contents .= fread($this->socket, $size-$contents_length);
$contents_length = strlen($contents);
}
if (($recvhandle & 0x80000000) == 0) {
// this is a callback, not our answer! handle= $recvhandle, xml-rpc= $contents
// just add it to the message list for the user to read
$new_cb_message = new IXR_Message($contents);
if ($new_cb_message->parse() && $new_cb_message->messageType != 'fault') {
array_push($this->cb_message, array($new_cb_message->methodName, $new_cb_message->params));
}
}
} while ((int)$recvhandle != (int)$this->reqhandle);
$this->message = new IXR_Message($contents);
if (!$this->message->parse()) {
// XML error
$this->error = new IXR_Error(-32700, 'parse error. not well formed');
return false;
}
// Is the message a fault?
if ($this->message->messageType == 'fault') {
$this->error = new IXR_Error($this->message->faultCode, $this->message->faultString);
return false;
}
// Message must be OK
return true;
}
function query() {
$args = func_get_args();
$method = array_shift($args);
if (!$this->socket || $this->protocol == 0) {
$this->error = new IXR_Error(-32300, 'transport error - client not initialized');
return false;
}
$request = new IXR_Request($method, $args);
// Check if request is larger than 512 Kbytes
if (($size = $request->getLength()) > 512*1024-8) {
$this->error = new IXR_Error(-32300, "transport error - request too large ($size)");
return false;
}
// Send request
$ok = $this->sendRequest($request);
if (!$ok) {
$this->error = new IXR_Error(-32300, 'transport error - connection interrupted!');
return false;
}
// Get result
return $this->getResult();
}
// Non-blocking query method: doesn't read the response
function queryIgnoreResult() {
$args = func_get_args();
$method = array_shift($args);
if (!$this->socket || $this->protocol == 0) {
$this->error = new IXR_Error(-32300, 'transport error - client not initialized');
return false;
}
$request = new IXR_Request($method, $args);
// Check if the request is greater than 512 Kbytes to avoid errors
// If the method is system.multicall, make two calls (possibly recursively)
if (($size = $request->getLength()) > 512*1024-8) {
if ($method = 'system.multicall' && isset($args[0])) {
$count = count($args[0]);
// If count is 1, query cannot be reduced
if ($count < 2) {
$this->error = new IXR_Error(-32300, "transport error - request too large ($size)");
return false;
}
$length = floor($count/2);
$args1 = array_slice($args[0], 0, $length);
$args2 = array_slice($args[0], $length, ($count-$length));
$res1 = $this->queryIgnoreResult('system.multicall', $args1);
$res2 = $this->queryIgnoreResult('system.multicall', $args2);
return ($res1 && $res2);
}
// If the method is not a multicall, just stop
else {
$this->error = new IXR_Error(-32300, "transport error - request too large ($size)");
return false;
}
}
// Send request
$ok = $this->sendRequest($request);
if (!$ok) {
$this->error = new IXR_Error(-32300, 'transport error - connection interrupted!');
return false;
}
return true;
}
function readCB($timeout = 2000) { // timeout 2 ms
if (!$this->socket || $this->protocol == 0) {
$this->error = new IXR_Error(-32300, 'transport error - client not initialized');
return false;
}
if ($this->protocol == 1)
return false;
$something_received = count($this->cb_message)>0;
$contents = '';
$contents_length = 0;
@stream_set_timeout($this->socket, 0, 10000); // timeout 10 ms (to read available data)
// (assignment in arguments is forbidden since php 5.1.1)
$read = array($this->socket);
$write = NULL;
$except = NULL;
$nb = @stream_select($read, $write, $except, 0, $timeout);
// workaround for stream_select bug with amd64
if ($nb !== false)
$nb = count($read);
while ($nb !== false && $nb > 0) {
$timeout = 0; // we don't want to wait for the full time again, just flush the available data
$size = 0;
$recvhandle = 0;
// Get result
$contents = fread($this->socket, 8);
if (strlen($contents) == 0) {
$this->error = new IXR_Error(-32300, 'transport error - cannot read size/handle');
return false;
}
$array_result = big_endian_unpack('Vsize/Vhandle', $contents);
$size = $array_result['size'];
$recvhandle = $array_result['handle'];
if ($recvhandle == 0 || $size == 0) {
$this->error = new IXR_Error(-32300, 'transport error - connection interrupted!');
return false;
}
if ($size > 4096*1024) {
$this->error = new IXR_Error(-32300, "transport error - response too large ($size)");
return false;
}
$contents = '';
$contents_length = 0;
while ($contents_length < $size) {
$contents .= fread($this->socket, $size-$contents_length);
$contents_length = strlen($contents);
}
if (($recvhandle & 0x80000000) == 0) {
// this is a callback. handle= $recvhandle, xml-rpc= $contents
//echo 'CALLBACK('.$contents_length.')[ '.$contents.' ]' . LF;
$new_cb_message = new IXR_Message($contents);
if ($new_cb_message->parse() && $new_cb_message->messageType != 'fault') {
array_push($this->cb_message, array($new_cb_message->methodName, $new_cb_message->params));
}
$something_received = true;
}
// (assignment in arguments is forbidden since php 5.1.1)
$read = array($this->socket);
$write = NULL;
$except = NULL;
$nb = @stream_select($read, $write, $except, 0, $timeout);
// workaround for stream_select bug with amd64
if ($nb !== false)
$nb = count($read);
}
return $something_received;
}
function getResponse() {
// methodResponses can only have one param - return that
return $this->message->params[0];
}
function getCBResponses() {
// (look at the end of basic.php for an example)
$messages = $this->cb_message;
$this->cb_message = array();
return $messages;
}
function isError() {
return is_object($this->error);
}
function resetError() {
$this->error = false;
}
function getErrorCode() {
if ($this->isError())
return $this->error->code;
else
return 0;
}
function getErrorMessage() {
if ($this->isError())
return $this->error->message;
else
return '';
}
}
class IXR_ClientMulticall_Gbx extends IXR_Client_Gbx {
public $calls = array();
function addCall($methodName, $args) {
$struct = array('methodName' => $methodName, 'params' => $args);
$this->calls[] = $struct;
return (count($this->calls) - 1);
}
function multiquery($ignoreResult = false) {
// Prepare multicall, then call the parent::query() (or queryIgnoreResult) method
if ($ignoreResult) {
$result = parent::queryIgnoreResult('system.multicall', $this->calls);
} else {
$result = parent::query('system.multicall', $this->calls);
}
$this->calls = array(); // reset for next calls
return $result;
}
}
/**
* The following code is a workaround for php's unpack function which
* does not have the capability of unpacking double precision floats
* that were packed in the opposite byte order of the current machine.
*/
function big_endian_unpack($format, $data) {
$ar = unpack($format, $data);
$vals = array_values($ar);
$f = explode('/', $format);
$i = 0;
foreach ($f as $f_k => $f_v) {
$repeater = intval(substr($f_v, 1));
if ($repeater == 0)
$repeater = 1;
if ($f_v{1} == '*') {
$repeater = count($ar) - $i;
}
if ($f_v{0} != 'd') {
$i += $repeater;
continue;
}
$j = $i + $repeater;
for ($a = $i; $a < $j; ++$a) {
$p = pack('d', $vals[$i]);
$p = strrev($p);
list($vals[$i]) = array_values(unpack('d1d', $p));
++$i;
}
}
$a = 0;
foreach ($ar as $ar_k => $ar_v) {
$ar[$ar_k] = $vals[$a];
++$a;
}
return $ar;
}
?>

View File

@ -1,854 +0,0 @@
<?php
/* vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2: */
/*
IXR - The Incutio XML-RPC Library - (c) Incutio Ltd 2002
Version 1.61 - Simon Willison, 11th July 2003 (htmlentities -> htmlspecialchars)
Site: http://scripts.incutio.com/xmlrpc/
Manual: http://scripts.incutio.com/xmlrpc/manual.php
Errors: http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php
Made available under the Artistic License: http://www.opensource.org/licenses/artistic-license.php
Modified to support protocol 'GbxRemote 2' ('GbxRemote 1')
This version is for LittleEndian (e.g. Intel PC) machines. For BegEndian
machines use GbxRemote.bem.php as GbxRemote.inc.php instead.
Release 2007-09-22 - Slig:
Modified to support >256KB received data (and now >2MB data produce a specific error message)
Modified readCB() to wait the initial timeout only before first read packet
Modified readCB() to return true if there is data to get with getCBResponses()
Modified to support amd64 (for $recvhandle)
Modified IXR_ClientMulticall_Gbx::addCall() to fit Aseco 0.6.1
Added IXR_Client_Gbx::bytes_sent & bytes_received counters
Fix for a changed feature since php5.1.1 about reference parameter assignment (was used in stream_select)
Workaround for stream_select return value bug with amd64
Release 2008-01-20 - Slig / Xymph / Assembler Maniac:
Workaround for fread delay bug in some cases
Added IXR_Client_Gbx::resetError() method (by Xymph)
Some comments and strings code cleanup (by Xymph)
Fix stream_set_timeout($this->socket,...) (thx to CavalierDeVache)
Added a default timeout value to IXR_Client_Gbx::readCB($timeout)
Changed calls with timeout on a stream to use microseconds instead of seconds (by AM)
Removed IXR_Client_Gbx::bytes_sent & bytes_received counters - not used (by AM)
Release 2008-02-05 - Slig:
Changed some socket read/write timeouts back to seconds to avoid 'transport error'
Changed max data received from 2MB to 4MB
Release 2008-05-20 - Xymph:
Prevented unpack() warnings in IXR_Client_Gbx::query() when the connection dies
Changed IXR_Client_Gbx::resetError() to assign 'false' for correct isError()
Tweaked some 'transport error' messages
Release 2009-04-08 - Gou1:
Added method IXR_Client_Gbx::queryIgnoreResult()
Added methods IXR_Client_Gbx::sendRequest() & IXR_Client_Gbx::getResult()
IXR_Client_Gbx::queryIgnoreResult checks if the request is larger than 512KB to avoid errors
If larger than 512KB and method is system.multicall, try to divide the request into
two separate requests with two separate IXR_Client_Gbx::queryIgnoreResult() calls
Release 2009-06-03 - Xymph:
Suppress possible repetitive CRT warning at stream_select
Release 2011-04-09 - Xymph / La beuze:
Added optional timeout mechanism to IXR_Client_Gbx::InitWithIp()
Release 2011-05-22 - Xymph:
Added non-error (true) return status to IXR_Client_Gbx::queryIgnoreResult()
Updated status codes and messages for transport/endian errors
Prevented possible PHP warning in IXR_Client_Gbx::getErrorCode() and getErrorMessage()
Release 2011-12-04 - Xymph:
Prevented possible PHP warning in IXR_Value::calculateType
Release 2013-02-18 - Xymph:
Removed unnecessary breaks after returns in IXR_Value::getXml() switch
*/
if (!defined('LF')) {
define('LF', "\n");
}
class IXR_Value {
public $data;
public $type;
function IXR_Value ($data, $type = false) {
$this->data = $data;
if (!$type) {
$type = $this->calculateType();
}
$this->type = $type;
if ($type == 'struct') {
// Turn all the values in the array into new IXR_Value objects
foreach ($this->data as $key => $value) {
$this->data[$key] = new IXR_Value($value);
}
}
if ($type == 'array') {
for ($i = 0, $j = count($this->data); $i < $j; $i++) {
$this->data[$i] = new IXR_Value($this->data[$i]);
}
}
}
function calculateType() {
if ($this->data === true || $this->data === false) {
return 'boolean';
}
if (is_integer($this->data)) {
return 'int';
}
if (is_double($this->data)) {
return 'double';
}
// Deal with IXR object types base64 and date
if (is_object($this->data) && ($this->data instanceof IXR_Date)) {
return 'date';
}
if (is_object($this->data) && ($this->data instanceof IXR_Base64)) {
return 'base64';
}
// If it is a normal PHP object convert it into a struct
if (is_object($this->data)) {
$this->data = get_object_vars($this->data);
return 'struct';
}
if (!is_array($this->data)) {
return 'string';
}
// We have an array - is it an array or a struct?
if ($this->isStruct($this->data)) {
return 'struct';
} else {
return 'array';
}
}
function getXml() {
// Return XML for this value
switch ($this->type) {
case 'boolean':
return '<boolean>' . ($this->data ? '1' : '0') . '</boolean>';
case 'int':
return '<int>' . $this->data . '</int>';
case 'double':
return '<double>' . $this->data . '</double>';
case 'string':
return '<string>' . htmlspecialchars($this->data) . '</string>';
case 'array':
$return = '<array><data>' . LF;
foreach ($this->data as $item) {
$return .= ' <value>' . $item->getXml() . '</value>' . LF;
}
$return .= '</data></array>';
return $return;
case 'struct':
$return = '<struct>' . LF;
foreach ($this->data as $name => $value) {
$return .= ' <member><name>' . $name . '</name><value>';
$return .= $value->getXml() . '</value></member>' . LF;
}
$return .= '</struct>';
return $return;
case 'date':
case 'base64':
return $this->data->getXml();
}
return false;
}
function isStruct($array) {
// Nasty function to check if an array is a struct or not
$expected = 0;
foreach ($array as $key => $value) {
if ((string)$key != (string)$expected) {
return true;
}
$expected++;
}
return false;
}
}
class IXR_Message {
public $message;
public $messageType; // methodCall / methodResponse / fault
public $faultCode;
public $faultString;
public $methodName;
public $params;
// Current variable stacks
protected $_arraystructs = array(); // Stack to keep track of the current array/struct
protected $_arraystructstypes = array(); // Stack to keep track of whether things are structs or array
protected $_currentStructName = array(); // A stack as well
protected $_param;
protected $_value;
protected $_currentTag;
protected $_currentTagContents;
// The XML parser
protected $_parser;
function IXR_Message ($message) {
$this->message = $message;
}
function parse() {
// first remove the XML declaration
$this->message = preg_replace('/<\?xml(.*)?\?'.'>/', '', $this->message);
if (trim($this->message) == '') {
return false;
}
$this->_parser = xml_parser_create();
// Set XML parser to take the case of tags into account
xml_parser_set_option($this->_parser, XML_OPTION_CASE_FOLDING, false);
// Set XML parser callback functions
xml_set_object($this->_parser, $this);
xml_set_element_handler($this->_parser, 'tag_open', 'tag_close');
xml_set_character_data_handler($this->_parser, 'cdata');
if (!xml_parse($this->_parser, $this->message)) {
/* die(sprintf('GbxRemote XML error: %s at line %d',
xml_error_string(xml_get_error_code($this->_parser)),
xml_get_current_line_number($this->_parser))); */
return false;
}
xml_parser_free($this->_parser);
// Grab the error messages, if any
if ($this->messageType == 'fault') {
$this->faultCode = $this->params[0]['faultCode'];
$this->faultString = $this->params[0]['faultString'];
}
return true;
}
function tag_open($parser, $tag, $attr) {
$this->currentTag = $tag;
switch ($tag) {
case 'methodCall':
case 'methodResponse':
case 'fault':
$this->messageType = $tag;
break;
// Deal with stacks of arrays and structs
case 'data': // data is to all intents and purposes more interesting than array
$this->_arraystructstypes[] = 'array';
$this->_arraystructs[] = array();
break;
case 'struct':
$this->_arraystructstypes[] = 'struct';
$this->_arraystructs[] = array();
break;
}
}
function cdata($parser, $cdata) {
$this->_currentTagContents .= $cdata;
}
function tag_close($parser, $tag) {
$valueFlag = false;
switch ($tag) {
case 'int':
case 'i4':
$value = (int)trim($this->_currentTagContents);
$this->_currentTagContents = '';
$valueFlag = true;
break;
case 'double':
$value = (double)trim($this->_currentTagContents);
$this->_currentTagContents = '';
$valueFlag = true;
break;
case 'string':
$value = (string)trim($this->_currentTagContents);
$this->_currentTagContents = '';
$valueFlag = true;
break;
case 'dateTime.iso8601':
$value = new IXR_Date(trim($this->_currentTagContents));
// $value = $iso->getTimestamp();
$this->_currentTagContents = '';
$valueFlag = true;
break;
case 'value':
// If no type is indicated, the type is string
if (trim($this->_currentTagContents) != '') {
$value = (string)$this->_currentTagContents;
$this->_currentTagContents = '';
$valueFlag = true;
}
break;
case 'boolean':
$value = (boolean)trim($this->_currentTagContents);
$this->_currentTagContents = '';
$valueFlag = true;
break;
case 'base64':
$value = base64_decode($this->_currentTagContents);
$this->_currentTagContents = '';
$valueFlag = true;
break;
// Deal with stacks of arrays and structs
case 'data':
case 'struct':
$value = array_pop($this->_arraystructs);
array_pop($this->_arraystructstypes);
$valueFlag = true;
break;
case 'member':
array_pop($this->_currentStructName);
break;
case 'name':
$this->_currentStructName[] = trim($this->_currentTagContents);
$this->_currentTagContents = '';
break;
case 'methodName':
$this->methodName = trim($this->_currentTagContents);
$this->_currentTagContents = '';
break;
}
if ($valueFlag) {
/*
if (!is_array($value) && !is_object($value)) {
$value = trim($value);
}
*/
if (count($this->_arraystructs) > 0) {
// Add value to struct or array
if ($this->_arraystructstypes[count($this->_arraystructstypes)-1] == 'struct') {
// Add to struct
$this->_arraystructs[count($this->_arraystructs)-1][$this->_currentStructName[count($this->_currentStructName)-1]] = $value;
} else {
// Add to array
$this->_arraystructs[count($this->_arraystructs)-1][] = $value;
}
} else {
// Just add as a paramater
$this->params[] = $value;
}
}
}
}
class IXR_Request {
public $method;
public $args;
public $xml;
function IXR_Request($method, $args) {
$this->method = $method;
$this->args = $args;
$this->xml = '<?xml version="1.0" encoding="utf-8" ?><methodCall><methodName>' . $this->method . '</methodName><params>';
foreach ($this->args as $arg) {
$this->xml .= '<param><value>';
$v = new IXR_Value($arg);
$this->xml .= $v->getXml();
$this->xml .= '</value></param>' . LF;
}
$this->xml .= '</params></methodCall>';
}
function getLength() {
return strlen($this->xml);
}
function getXml() {
return $this->xml;
}
}
class IXR_Error {
public $code;
public $message;
function IXR_Error($code, $message) {
$this->code = $code;
$this->message = $message;
}
function getXml() {
$xml = <<<EOD
<methodResponse>
<fault>
<value>
<struct>
<member>
<name>faultCode</name>
<value><int>{$this->code}</int></value>
</member>
<member>
<name>faultString</name>
<value><string>{$this->message}</string></value>
</member>
</struct>
</value>
</fault>
</methodResponse>
EOD;
return $xml;
}
}
class IXR_Date {
public $year;
public $month;
public $day;
public $hour;
public $minute;
public $second;
function IXR_Date($time) {
// $time can be a PHP timestamp or an ISO one
if (is_numeric($time)) {
$this->parseTimestamp($time);
} else {
$this->parseIso($time);
}
}
function parseTimestamp($timestamp) {
$this->year = date('Y', $timestamp);
$this->month = date('Y', $timestamp);
$this->day = date('Y', $timestamp);
$this->hour = date('H', $timestamp);
$this->minute = date('i', $timestamp);
$this->second = date('s', $timestamp);
}
function parseIso($iso) {
$this->year = substr($iso, 0, 4);
$this->month = substr($iso, 4, 2);
$this->day = substr($iso, 6, 2);
$this->hour = substr($iso, 9, 2);
$this->minute = substr($iso, 12, 2);
$this->second = substr($iso, 15, 2);
}
function getIso() {
return $this->year.$this->month.$this->day.'T'.$this->hour.':'.$this->minute.':'.$this->second;
}
function getXml() {
return '<dateTime.iso8601>'.$this->getIso().'</dateTime.iso8601>';
}
function getTimestamp() {
return mktime($this->hour, $this->minute, $this->second, $this->month, $this->day, $this->year);
}
}
class IXR_Base64 {
public $data;
function IXR_Base64($data) {
$this->data = $data;
}
function getXml() {
return '<base64>'.base64_encode($this->data).'</base64>';
}
}
//////////////////////////////////////////////////////////
// Nadeo modifications //
// (many thanks to slig for adding callback support) //
//////////////////////////////////////////////////////////
class IXR_Client_Gbx {
public $socket;
public $message = false;
public $cb_message = array();
public $reqhandle;
public $protocol = 0;
// Storage place for an error message
public $error = false;
function bigEndianTest() {
list($endiantest) = array_values(unpack('L1L', pack('V', 1)));
if ($endiantest != 1) {
echo "Machine reports itself as BigEndian, float handling must be altered\r\n";
echo "Overwrite GbxRemote.inc.php with GbxRemote.bem.php\r\n";
die('App Terminated');
return false;
}
return true;
} // bigEndianTest
function IXR_Client_Gbx() {
$this->socket = false;
$this->reqhandle = 0x80000000;
}
function InitWithIp($ip, $port, $timeout = null) {
if (!$this->bigEndianTest()) {
$this->error = new IXR_Error(-31999, 'endian error - script doesn\'t match machine type');
return false;
}
// open connection, with timeout if specified
if (!isset($timeout)) {
$this->socket = @fsockopen($ip, $port, $errno, $errstr);
} else {
$init_time = microtime(true);
$init_timeout = 5; // retry every 5s
while (true) {
$this->socket = @fsockopen($ip, $port, $errno, $errstr, $init_timeout);
if ($this->socket || (microtime(true) - $init_time >= $timeout))
break;
}
}
if (!$this->socket) {
$this->error = new IXR_Error(-32300, "transport error - could not open socket (error: $errno, $errstr)");
return false;
}
// handshake
$array_result = unpack('Vsize', fread($this->socket, 4));
$size = $array_result['size'];
if ($size > 64) {
$this->error = new IXR_Error(-32300, 'transport error - wrong lowlevel protocol header');
return false;
}
$handshake = fread($this->socket, $size);
if ($handshake == 'GBXRemote 1') {
$this->protocol = 1;
} else if ($handshake == 'GBXRemote 2') {
$this->protocol = 2;
} else {
$this->error = new IXR_Error(-32300, 'transport error - wrong lowlevel protocol version');
return false;
}
return true;
}
function Init($port) {
return $this->InitWithIp('localhost', $port);
}
function Terminate() {
if ($this->socket) {
fclose($this->socket);
$this->socket = false;
}
}
protected function sendRequest(IXR_Request $request) {
$xml = $request->getXml();
@stream_set_timeout($this->socket, 20); // timeout 20s (to write the request)
// send request
$this->reqhandle++;
if ($this->protocol == 1) {
$bytes = pack('Va*', strlen($xml), $xml);
} else {
$bytes = pack('VVa*', strlen($xml), $this->reqhandle, $xml);
}
$bytes_to_write = strlen($bytes);
while ($bytes_to_write > 0) {
$r = @fwrite($this->socket, $bytes);
if ($r === false || $r == 0) {
// connection interrupted
return false; // or die?
}
$bytes_to_write -= $r;
if ($bytes_to_write == 0)
break;
$bytes = substr($bytes, $r);
}
return true;
}
protected function getResult() {
$contents = '';
$contents_length = 0;
do {
$size = 0;
$recvhandle = 0;
@stream_set_timeout($this->socket, 20); // timeout 20s (to read the reply header)
// Get result
if ($this->protocol == 1) {
$contents = fread($this->socket, 4);
if (strlen($contents) == 0) {
$this->error = new IXR_Error(-32300, 'transport error - cannot read size');
return false;
}
$array_result = unpack('Vsize', $contents);
$size = $array_result['size'];
$recvhandle = $this->reqhandle;
} else {
$contents = fread($this->socket, 8);
if (strlen($contents) == 0) {
$this->error = new IXR_Error(-32300, 'transport error - cannot read size/handle');
return false;
}
$array_result = unpack('Vsize/Vhandle', $contents);
$size = $array_result['size'];
$recvhandle = $array_result['handle'];
// -- amd64 support --
$bits = sprintf('%b', $recvhandle);
if (strlen($bits) == 64) {
$recvhandle = bindec(substr($bits, 32));
}
}
if ($recvhandle == 0 || $size == 0) {
$this->error = new IXR_Error(-32300, 'transport error - connection interrupted!');
return false;
}
if ($size > 4096*1024) {
$this->error = new IXR_Error(-32300, "transport error - response too large ($size)");
return false;
}
$contents = '';
$contents_length = 0;
@stream_set_timeout($this->socket, 0, 10000); // timeout 10 ms (for successive reads until end)
while ($contents_length < $size) {
$contents .= fread($this->socket, $size-$contents_length);
$contents_length = strlen($contents);
}
if (($recvhandle & 0x80000000) == 0) {
// this is a callback, not our answer! handle= $recvhandle, xml-rpc= $contents
// just add it to the message list for the user to read
$new_cb_message = new IXR_Message($contents);
if ($new_cb_message->parse() && $new_cb_message->messageType != 'fault') {
array_push($this->cb_message, array($new_cb_message->methodName, $new_cb_message->params));
}
}
} while ((int)$recvhandle != (int)$this->reqhandle);
$this->message = new IXR_Message($contents);
if (!$this->message->parse()) {
// XML error
$this->error = new IXR_Error(-32700, 'parse error. not well formed');
return false;
}
// Is the message a fault?
if ($this->message->messageType == 'fault') {
$this->error = new IXR_Error($this->message->faultCode, $this->message->faultString);
return false;
}
// Message must be OK
return true;
}
function query() {
$args = func_get_args();
$method = array_shift($args);
if (!$this->socket || $this->protocol == 0) {
$this->error = new IXR_Error(-32300, 'transport error - client not initialized');
return false;
}
$request = new IXR_Request($method, $args);
// Check if request is larger than 512 Kbytes
if (($size = $request->getLength()) > 512*1024-8) {
$this->error = new IXR_Error(-32300, "transport error - request too large ($size)");
return false;
}
// Send request
$ok = $this->sendRequest($request);
if (!$ok) {
$this->error = new IXR_Error(-32300, 'transport error - connection interrupted!');
return false;
}
// Get result
return $this->getResult();
}
// Non-blocking query method: doesn't read the response
function queryIgnoreResult() {
$args = func_get_args();
$method = array_shift($args);
if (!$this->socket || $this->protocol == 0) {
$this->error = new IXR_Error(-32300, 'transport error - client not initialized');
return false;
}
$request = new IXR_Request($method, $args);
// Check if the request is greater than 512 Kbytes to avoid errors
// If the method is system.multicall, make two calls (possibly recursively)
if (($size = $request->getLength()) > 512*1024-8) {
if ($method = 'system.multicall' && isset($args[0])) {
$count = count($args[0]);
// If count is 1, query cannot be reduced
if ($count < 2) {
$this->error = new IXR_Error(-32300, "transport error - request too large ($size)");
return false;
}
$length = floor($count/2);
$args1 = array_slice($args[0], 0, $length);
$args2 = array_slice($args[0], $length, ($count-$length));
$res1 = $this->queryIgnoreResult('system.multicall', $args1);
$res2 = $this->queryIgnoreResult('system.multicall', $args2);
return ($res1 && $res2);
}
// If the method is not a multicall, just stop
else {
$this->error = new IXR_Error(-32300, "transport error - request too large ($size)");
return false;
}
}
// Send request
$ok = $this->sendRequest($request);
if (!$ok) {
$this->error = new IXR_Error(-32300, 'transport error - connection interrupted!');
return false;
}
return true;
}
function readCB($timeout = 2000) { // timeout 2 ms
if (!$this->socket || $this->protocol == 0) {
$this->error = new IXR_Error(-32300, 'transport error - client not initialized');
return false;
}
if ($this->protocol == 1)
return false;
$something_received = count($this->cb_message)>0;
$contents = '';
$contents_length = 0;
@stream_set_timeout($this->socket, 0, 10000); // timeout 10 ms (to read available data)
// (assignment in arguments is forbidden since php 5.1.1)
$read = array($this->socket);
$write = NULL;
$except = NULL;
$nb = @stream_select($read, $write, $except, 0, $timeout);
// workaround for stream_select bug with amd64
if ($nb !== false)
$nb = count($read);
while ($nb !== false && $nb > 0) {
$timeout = 0; // we don't want to wait for the full time again, just flush the available data
$size = 0;
$recvhandle = 0;
// Get result
$contents = fread($this->socket, 8);
if (strlen($contents) == 0) {
$this->error = new IXR_Error(-32300, 'transport error - cannot read size/handle');
return false;
}
$array_result = unpack('Vsize/Vhandle', $contents);
$size = $array_result['size'];
$recvhandle = $array_result['handle'];
if ($recvhandle == 0 || $size == 0) {
$this->error = new IXR_Error(-32300, 'transport error - connection interrupted!');
return false;
}
if ($size > 4096*1024) {
$this->error = new IXR_Error(-32300, "transport error - response too large ($size)");
return false;
}
$contents = '';
$contents_length = 0;
while ($contents_length < $size) {
$contents .= fread($this->socket, $size-$contents_length);
$contents_length = strlen($contents);
}
if (($recvhandle & 0x80000000) == 0) {
// this is a callback. handle= $recvhandle, xml-rpc= $contents
//echo 'CALLBACK('.$contents_length.')[ '.$contents.' ]' . LF;
$new_cb_message = new IXR_Message($contents);
if ($new_cb_message->parse() && $new_cb_message->messageType != 'fault') {
array_push($this->cb_message, array($new_cb_message->methodName, $new_cb_message->params));
}
$something_received = true;
}
// (assignment in arguments is forbidden since php 5.1.1)
$read = array($this->socket);
$write = NULL;
$except = NULL;
$nb = @stream_select($read, $write, $except, 0, $timeout);
// workaround for stream_select bug with amd64
if ($nb !== false)
$nb = count($read);
}
return $something_received;
}
function getResponse() {
// methodResponses can only have one param - return that
return $this->message->params[0];
}
function getCBResponses() {
// (look at the end of basic.php for an example)
$messages = $this->cb_message;
$this->cb_message = array();
return $messages;
}
function isError() {
return is_object($this->error);
}
function resetError() {
$this->error = false;
}
function getErrorCode() {
if ($this->isError())
return $this->error->code;
else
return 0;
}
function getErrorMessage() {
if ($this->isError())
return $this->error->message;
else
return '';
}
}
class IXR_ClientMulticall_Gbx extends IXR_Client_Gbx {
public $calls = array();
function addCall($methodName, $args) {
$struct = array('methodName' => $methodName, 'params' => $args);
$this->calls[] = $struct;
return (count($this->calls) - 1);
}
function multiquery($ignoreResult = false) {
// Prepare multicall, then call the parent::query() (or queryIgnoreResult) method
if ($ignoreResult) {
$result = parent::queryIgnoreResult('system.multicall', $this->calls);
} else {
$result = parent::query('system.multicall', $this->calls);
}
$this->calls = array(); // reset for next calls
return $result;
}
}
?>

View File

@ -1,218 +0,0 @@
<?php
/* vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2: */
////////////////////////////////////////////////////////////////
//
// File: Adds to GbxRemote.inc.php
// Date: 10.07.2007
// Author: Gilles Masson
// Updated: Xymph
//
// xmlrpc_request() or RequestStd class to build a methodCall request (xml-rpc string)
// xmlrpc_response() or ResponseStd class to build a method response (xml-rpc string)
// xmlrpc_error() to build an error response (xml-rpc string)
// rpc_method() to build a method array (for method call in a multicall)
// rpc_response() to build a response array (for method response in a multicall)
// rpc_error() to build an error array (for method error in a multicall)
// xml_decode_rpc() to build a data array from a xml-rpc string
// -----------------------------------------------------------------------
// Build a methodCall request in xml-rpc format from methodname and array params
// (methodname + array_params ==> xml-rpc string)
// -----------------------------------------------------------------------
// $method is the method name.
// $params should be an array containing the method parameters.
// For system.multicall, there should be one parameter, which is an array
// containing the methods structs {'methodName':string, 'params':array}
// -----------------------------------------------------------------------
function xmlrpc_request($method, $params = null) {
// in case the first level array was forgotten in a multicall then add it...
if ($method == 'system.multicall' && isset($params[0]['methodName']))
$params = array($params);
$xml = '<?xml version="1.0" encoding="UTF-8" ?>'
. "\n<methodCall>\n<methodName>$method</methodName>\n<params>\n";
if (is_array($params)) {
foreach ($params as $param) {
$xml .= "<param>\n<value>";
$v = new IXR_Value($param);
$xml .= $v->getXml();
$xml .= "</value>\n</param>\n";
}
}
$xml .= "</params>\n</methodCall>";
return $xml;
}
// -----------------------------------------------------------------------
// Build a methodCall response in xml-rpc format from arrays args
// (array_args ==> xml-rpc string)
// -----------------------------------------------------------------------
// $args should be an array containing the response
// -----------------------------------------------------------------------
function xmlrpc_response($args = null) {
$xml = '<?xml version="1.0" encoding="UTF-8" ?>'
. "\n<methodResponse>\n<params>\n<param>\n";
if ($args !== null) {
$xml .= '<value>';
$v = new IXR_Value($args);
$xml .= $v->getXml();
$xml .= "</value>\n";
}
$xml .= "</param>\n</params>\n</methodResponse>";
return $xml;
}
// -----------------------------------------------------------------------
// Build an error response in xml-rpc format
// (error code + message ==> xml-rpc string)
// -----------------------------------------------------------------------
// $code is the error code
// $message is the error string
// -----------------------------------------------------------------------
function xmlrpc_error($code, $message) {
$xml = '<?xml version="1.0" encoding="UTF-8" ?>'
. "\n<methodResponse>\n<fault>\n"
. "<value><struct>\n"
. "<member><name>faultCode</name><value><int>$code</int></value>\n</member>\n"
. "<member><name>faultString</name><value><string>$message</string></value></member>\n"
. "</struct></value>\n"
. "</fault>\n</methodResponse>";
return $xml;
}
// -----------------------------------------------------------------------
// Build a method struct (array) usable for a method call in a multicall
// (method name + params array ==> method struct array
// -----------------------------------------------------------------------
// $name is the method name
// $params is the params array
// -----------------------------------------------------------------------
function rpc_method($name, $params = null) {
if (!is_array($params))
$params = array();
return array('methodName' => $name, 'params' => $params);
}
// -----------------------------------------------------------------------
// Build a response struct (array) usable as a reply for a method in a multicall
// (method name + params array ==> method struct array
// -----------------------------------------------------------------------
// $params is the methode response array
// -----------------------------------------------------------------------
function rpc_response($response = null) {
if (!is_array($response))
$response = array();
return array($response);
}
// -----------------------------------------------------------------------
// Build an error struct (array) usable as an error for a method in a multicall
// (error code + message ==> error struct array)
// -----------------------------------------------------------------------
// $code is the error code
// $message is the error string
// -----------------------------------------------------------------------
function rpc_error($code, $message) {
return array('faultCode' => $code, 'faultString' => $message);
}
// -----------------------------------------------------------------------
// Build a data array from a text xml-rpc
// (xml-rpc string ==> array)
// -----------------------------------------------------------------------
// $xml is the xml-rpc text to decode
// If there is an error then null is returned, you can then look infos
// in global $_xmlrpc_decode_obj
// -----------------------------------------------------------------------
function xml_decode_rpc($xml) {
global $_xmlrpc_decode_obj;
$_xmlrpc_decode_obj = new IXR_Message($xml);
if (!$_xmlrpc_decode_obj->parse() || !isset($_xmlrpc_decode_obj->params[0]))
return null;
return $_xmlrpc_decode_obj->params[0];
}
// -----------------------------------------------------------------------
// use this class constructor to build a methodCall request
// -----------------------------------------------------------------------
class IXR_RequestStd {
var $method;
var $params;
var $xml;
// see xmlrpc_request
function IXR_RequestStd($method, $params = null) {
$this->method = $method;
// in case the first level array was forgotten in a multicall then add it...
if ($method == 'system.multicall' && isset($params[0]['methodName']))
$this->params = array($params);
else
$this->params = $params;
$this->xml = xmlrpc_request($this->method, $this->params);
}
function getLength() {
return strlen($this->xml);
}
function getXml() {
return $this->xml;
}
}
// -----------------------------------------------------------------------
// use this class constructor to build a methodCall response
// -----------------------------------------------------------------------
class IXR_ResponseStd {
var $args;
var $xml;
// see xmlrpc_response
function IXR_ResponseStd($args) {
$this->args = $args;
$this->xml = xmlrpc_response($this->args);
}
function getLength() {
return strlen($this->xml);
}
function getXml() {
return $this->xml;
}
}
?>

View File

@ -1,830 +0,0 @@
<?php
/* vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2: */
// Updated by Xymph
/**
* Writes a logfile of all output messages, either in a single big file
* or in monthly chunks inside the logs/ directory.
*/
function doLog($text) {
global $logfile;
if (MONTHLY_LOGSDIR) {
// create logs/ directory if needed
$dir = './logs';
if (!file_exists($dir)) mkdir($dir);
// define monthly file inside dir
$file = $dir . '/logfile-' . date('Ym') . '.txt';
// if new monthly file, close old logfile
if (!file_exists($file) && $logfile) {
fclose($logfile);
$logfile = false;
}
} else {
// original single big file
$file = 'logfile.txt';
}
if (!$logfile) {
$logfile = fopen($file, 'a+');
}
fwrite($logfile, $text);
} // doLog
/**
* Case-insensitive file_exists replacement function.
* Returns matching path, otherwise false.
* Created by Xymph
*/
function file_exists_nocase($filepath) {
// try case-sensitive path first
if (file_exists($filepath)) return $filepath;
// extract directory path
if (DIRECTORY_SEPARATOR == '/')
preg_match('|^(.+/)([^/]+)$|', $filepath, $paths);
else // '\'
preg_match('|^(.+\\\\)([^\\\\]+)$|', $filepath, $paths);
$dirpath = $paths[1];
// $filename = $paths[2];
// collect all files inside directory
$checkpaths = glob($dirpath . '*');
if ($checkpaths === false || empty($checkpaths)) return false;
// check case-insensitive paths
foreach ($checkpaths as $path)
if (strtolower($filepath) == strtolower($path))
return $path;
return false;
} // file_exists_nocase
/**
* Puts an element at a specific position into an array.
* Increases original size by one element.
*/
function insertArrayElement(&$array, $value, $pos) {
// get current size
$size = count($array);
// if position is in array range
if ($pos < 0 && $pos >= $size) {
return false;
}
// shift values down
for ($i = $size-1; $i >= $pos; $i--) {
$array[$i+1] = $array[$i];
}
// now put in the new element
$array[$pos] = $value;
return true;
} // insertArrayElement
/**
* Removes an element from a specific position in an array.
* Decreases original size by one element.
*/
function removeArrayElement(&$array, $pos) {
// get current size
$size = count($array);
// if position is in array range
if ($pos < 0 && $pos >= $size) {
return false;
}
// remove specified element
unset($array[$pos]);
// shift values up
$array = array_values($array);
return true;
} // removeArrayElement
/**
* Moves an element from one position to the other.
* All items between are shifted down or up as needed.
*/
function moveArrayElement(&$array, $from, $to) {
// get current size
$size = count($array);
// destination and source have to be among the array borders!
if ($from < 0 || $from >= $size || $to < 0 || $to >= $size) {
return false;
}
// backup the element we have to move
$moving_element = $array[$from];
if ($from > $to) {
// shift values between downwards
for ($i = $from-1; $i >= $to; $i--) {
$array[$i+1] = $array[$i];
}
} else { // $from < $to
// shift values between upwards
for ($i = $from; $i <= $to; $i++) {
$array[$i] = $array[$i+1];
}
}
// now put in the element which was to move
$array[$to] = $moving_element;
return true;
} // moveArrayElement
/**
* Formats a string from the format sssshh0
* into the format mmm:ss.hh (or mmm:ss if $hsec is false)
*/
function formatTime($MwTime, $hsec = true) {
if ($MwTime == -1) {
return '???';
} else {
$minutes = floor($MwTime/(1000*60));
$seconds = floor(($MwTime - $minutes*60*1000)/1000);
$hseconds = substr($MwTime, strlen($MwTime)-3, 2);
if ($hsec) {
$tm = sprintf('%02d:%02d.%02d', $minutes, $seconds, $hseconds);
} else {
$tm = sprintf('%02d:%02d', $minutes, $seconds);
}
}
if ($tm[0] == '0') {
$tm = substr($tm, 1);
}
return $tm;
} // formatTime
/**
* Formats a string from the format sssshh0
* into the format hh:mm:ss.hh (or hh:mm:ss if $hsec is false)
*/
function formatTimeH($MwTime, $hsec = true) {
if ($MwTime == -1) {
return '???';
} else {
$hseconds = substr($MwTime, strlen($MwTime)-3, 2);
$MwTime = substr($MwTime, 0, strlen($MwTime)-3);
$hours = floor($MwTime / 3600);
$MwTime = $MwTime - ($hours * 3600);
$minutes = floor($MwTime / 60);
$MwTime = $MwTime - ($minutes * 60);
$seconds = floor($MwTime);
if ($hsec) {
return sprintf('%02d:%02d:%02d.%02d', $hours, $minutes, $seconds, $hseconds);
} else {
return sprintf('%02d:%02d:%02d', $hours, $minutes, $seconds);
}
}
} // formatTimeH
/**
* Formats a text.
* Replaces parameters in the text which are marked with {n}
*/
function formatText($text) {
// get all function's parameters
$args = func_get_args();
// first parameter is the text to format
$text = array_shift($args);
// further parameters will be replaced in the text
$i = 1;
foreach ($args as $param)
$text = str_replace('{' . $i++ . '}', $param, $text);
// and return the modified text
return $text;
} // formatText
/**
* Make String for SQL use that single quoted & got special chars replaced.
*/
function quotedString($input) {
return "'" . mysql_real_escape_string($input) . "'";
} // quotedString
/**
* Check login string for LAN postfix (pre/post v2.11.21).
*/
function isLANLogin($login) {
$n="(25[0-5]|2[0-4]\d|[01]?\d\d|\d)";
return (preg_match("/(\/{$n}\\.{$n}\\.{$n}\\.{$n}:\d+)$/", $login) ||
preg_match("/(_{$n}\\.{$n}\\.{$n}\\.{$n}_\d+)$/", $login));
} // isLANLogin
/**
* Summary: Strips all display formatting from an input string, suitable for display
* within the game ('$$' escape pairs are preserved) and for logging
* Params : $input - The input string to strip formatting from
* $for_tm - Optional flag to double up '$' into '$$' (default, for TM) or not (for logs, etc)
* Returns: The content portions of $input without formatting
* Authors: Bilge/Assembler Maniac/Xymph/Slig
*
* "$af0Brat$s$fffwurst" will become "Bratwurst".
* 2007-08-27 Xymph - replaced with Bilge/AM's code (w/o the H&L tags bit)
* http://www.tm-forum.com/viewtopic.php?p=55867#p55867
* 2008-04-24 Xymph - extended to handle the H/L/P tags for TMF
* http://www.tm-forum.com/viewtopic.php?p=112856#p112856
* 2009-05-16 Slig - extended to emit non-TM variant & handle incomplete colors
* http://www.tm-forum.com/viewtopic.php?p=153368#p153368
* 2010-10-05 Slig - updated to handle incomplete colors & tags better
* http://www.tm-forum.com/viewtopic.php?p=183410#p183410
* 2010-10-09 Xymph - updated to handle $[ and $] properly
* http://www.tm-forum.com/viewtopic.php?p=183410#p183410
*/
function stripColors($input, $for_tm = true) {
return
//Replace all occurrences of a null character back with a pair of dollar
//signs for displaying in TM, or a single dollar for log messages etc.
str_replace("\0", ($for_tm ? '$$' : '$'),
//Replace links (introduced in TMU)
preg_replace(
'/
#Strip TMF H, L & P links by stripping everything between each square
#bracket pair until another $H, $L or $P sequence (or EoS) is found;
#this allows a $H to close a $L and vice versa, as does the game
\\$[hlp](.*?)(?:\\[.*?\\](.*?))*(?:\\$[hlp]|$)
/ixu',
//Keep the first and third capturing groups if present
'$1$2',
//Replace various patterns beginning with an unescaped dollar
preg_replace(
'/
#Match a single dollar sign and any of the following:
\\$
(?:
#Strip color codes by matching any hexadecimal character and
#any other two characters following it (except $)
[0-9a-f][^$][^$]
#Strip any incomplete color codes by matching any hexadecimal
#character followed by another character (except $)
|[0-9a-f][^$]
#Strip any single style code (including an invisible UTF8 char)
#that is not an H, L or P link or a bracket ($[ and $])
|[^][hlp]
#Strip the dollar sign if it is followed by [ or ], but do not
#strip the brackets themselves
|(?=[][])
#Strip the dollar sign if it is at the end of the string
|$
)
#Ignore alphabet case, ignore whitespace in pattern & use UTF-8 mode
/ixu',
//Replace any matches with nothing (i.e. strip matches)
'',
//Replace all occurrences of dollar sign pairs with a null character
str_replace('$$', "\0", $input)
)
)
)
;
} // stripColors
/**
* Strips only size tags from TM strings.
* "$w$af0Brat$n$fffwurst" will become "$af0Brat$fffwurst".
* 2009-03-27 Xymph - derived from stripColors above
* http://www.tm-forum.com/viewtopic.php?f=127&t=20602
* 2009-05-16 Slig - extended to emit non-TM variant
* http://www.tm-forum.com/viewtopic.php?p=153368#p153368
*/
function stripSizes($input, $for_tm = true) {
return
//Replace all occurrences of a null character back with a pair of dollar
//signs for displaying in TM, or a single dollar for log messages etc.
str_replace("\0", ($for_tm ? '$$' : '$'),
//Replace various patterns beginning with an unescaped dollar
preg_replace(
'/
#Match a single dollar sign and any of the following:
\\$
(?:
#Strip any size code
[nwo]
#Strip the dollar sign if it is at the end of the string
|$
)
#Ignore alphabet case, ignore whitespace in pattern & use UTF-8 mode
/ixu',
//Replace any matches with nothing (i.e. strip matches)
'',
//Replace all occurrences of dollar sign pairs with a null character
str_replace('$$', "\0", $input)
)
)
;
} // stripSizes
/**
* Strips only newlines from TM strings.
*/
function stripNewlines($input) {
return str_replace(array("\n\n", "\r", "\n"),
array(' ', '', ''), $input);
} // stripNewlines
/**
* Univeral show help for user, admin & Jfreu commands.
* Created by Xymph
*
* $width is the width of the first column in the ManiaLink window on TMF
*/
function showHelp($player, $chat_commands, $head,
$showadmin = false, $dispall = false, $width = 0.3) {
global $aseco;
// display full help for TMN
if ($aseco->server->getGame() == 'TMN' && $dispall) {
$head = "Currently supported $head commands:" . LF;
if (!empty($chat_commands)) {
// define admin or non-admin padding string
$pad = ($showadmin ? '$f00... ' : '$f00/');
$help = '';
$lines = 0;
$player->msgs = array();
$player->msgs[0] = 1;
// create list of chat commands
foreach ($chat_commands as $cc) {
// collect either admin or non-admin commands
if ($cc->isadmin == $showadmin) {
$help .= $pad . $cc->name . ' $000' . $cc->help . LF;
if (++$lines > 14) {
$player->msgs[] = $head . $help;
$lines = 0;
$help = '';
}
}
}
// add if last batch exists
if ($help != '')
$player->msgs[] = $head . $help;
// display popup message
if (count($player->msgs) == 2) {
$aseco->client->query('SendDisplayServerMessageToLogin', $player->login, $player->msgs[1], 'OK', '', 0);
} else { // > 2
$aseco->client->query('SendDisplayServerMessageToLogin', $player->login, $player->msgs[1], 'Close', 'Next', 0);
}
}
// display full help for TMF
} elseif ($aseco->server->getGame() == 'TMF' && $dispall) {
$head = "Currently supported $head commands:";
if (!empty($chat_commands)) {
// define admin or non-admin padding string
$pad = ($showadmin ? '$f00... ' : '$f00/');
$help = array();
$lines = 0;
$player->msgs = array();
$player->msgs[0] = array(1, $head, array(1.3, $width, 1.3 - $width), array('Icons64x64_1', 'TrackInfo', -0.01));
// create list of chat commands
foreach ($chat_commands as $cc) {
// collect either admin or non-admin commands
if ($cc->isadmin == $showadmin) {
$help[] = array($pad . $cc->name, $cc->help);
if (++$lines > 14) {
$player->msgs[] = $help;
$lines = 0;
$help = array();
}
}
}
// add if last batch exists
if (!empty($help))
$player->msgs[] = $help;
// display ManiaLink message
display_manialink_multi($player);
}
// show help for TMS or TMO, and plain help for TMF/TMN
} else {
$head = "Currently supported $head commands:" . LF;
$help = $aseco->formatColors('{#interact}' . $head);
foreach ($chat_commands as $cc) {
// collect either admin or non-admin commands
if ($cc->isadmin == $showadmin) {
$help .= $cc->name . ', ';
}
}
// show chat message
$help = substr($help, 0, strlen($help) - 2); // strip trailing ", "
$aseco->client->query('ChatSendToLogin', $help, $player->login);
}
} // showHelp
/**
* Map country names to 3-letter Nation abbreviations
* Created by Xymph
* Based on http://en.wikipedia.org/wiki/List_of_IOC_country_codes
* See also http://en.wikipedia.org/wiki/Comparison_of_IOC,_FIFA,_and_ISO_3166_country_codes
*/
function mapCountry($country) {
$nations = array(
'Afghanistan' => 'AFG',
'Albania' => 'ALB',
'Algeria' => 'ALG',
'Andorra' => 'AND',
'Angola' => 'ANG',
'Argentina' => 'ARG',
'Armenia' => 'ARM',
'Aruba' => 'ARU',
'Australia' => 'AUS',
'Austria' => 'AUT',
'Azerbaijan' => 'AZE',
'Bahamas' => 'BAH',
'Bahrain' => 'BRN',
'Bangladesh' => 'BAN',
'Barbados' => 'BAR',
'Belarus' => 'BLR',
'Belgium' => 'BEL',
'Belize' => 'BIZ',
'Benin' => 'BEN',
'Bermuda' => 'BER',
'Bhutan' => 'BHU',
'Bolivia' => 'BOL',
'Bosnia&Herzegovina' => 'BIH',
'Botswana' => 'BOT',
'Brazil' => 'BRA',
'Brunei' => 'BRU',
'Bulgaria' => 'BUL',
'Burkina Faso' => 'BUR',
'Burundi' => 'BDI',
'Cambodia' => 'CAM',
'Cameroon' => 'CAR', // actually CMR
'Canada' => 'CAN',
'Cape Verde' => 'CPV',
'Central African Republic' => 'CAF',
'Chad' => 'CHA',
'Chile' => 'CHI',
'China' => 'CHN',
'Chinese Taipei' => 'TPE',
'Colombia' => 'COL',
'Congo' => 'CGO',
'Costa Rica' => 'CRC',
'Croatia' => 'CRO',
'Cuba' => 'CUB',
'Cyprus' => 'CYP',
'Czech Republic' => 'CZE',
'Czech republic' => 'CZE',
'DR Congo' => 'COD',
'Denmark' => 'DEN',
'Djibouti' => 'DJI',
'Dominica' => 'DMA',
'Dominican Republic' => 'DOM',
'Ecuador' => 'ECU',
'Egypt' => 'EGY',
'El Salvador' => 'ESA',
'Eritrea' => 'ERI',
'Estonia' => 'EST',
'Ethiopia' => 'ETH',
'Fiji' => 'FIJ',
'Finland' => 'FIN',
'France' => 'FRA',
'Gabon' => 'GAB',
'Gambia' => 'GAM',
'Georgia' => 'GEO',
'Germany' => 'GER',
'Ghana' => 'GHA',
'Greece' => 'GRE',
'Grenada' => 'GRN',
'Guam' => 'GUM',
'Guatemala' => 'GUA',
'Guinea' => 'GUI',
'Guinea-Bissau' => 'GBS',
'Guyana' => 'GUY',
'Haiti' => 'HAI',
'Honduras' => 'HON',
'Hong Kong' => 'HKG',
'Hungary' => 'HUN',
'Iceland' => 'ISL',
'India' => 'IND',
'Indonesia' => 'INA',
'Iran' => 'IRI',
'Iraq' => 'IRQ',
'Ireland' => 'IRL',
'Israel' => 'ISR',
'Italy' => 'ITA',
'Ivory Coast' => 'CIV',
'Jamaica' => 'JAM',
'Japan' => 'JPN',
'Jordan' => 'JOR',
'Kazakhstan' => 'KAZ',
'Kenya' => 'KEN',
'Kiribati' => 'KIR',
'Korea' => 'KOR',
'Kuwait' => 'KUW',
'Kyrgyzstan' => 'KGZ',
'Laos' => 'LAO',
'Latvia' => 'LAT',
'Lebanon' => 'LIB',
'Lesotho' => 'LES',
'Liberia' => 'LBR',
'Libya' => 'LBA',
'Liechtenstein' => 'LIE',
'Lithuania' => 'LTU',
'Luxembourg' => 'LUX',
'Macedonia' => 'MKD',
'Malawi' => 'MAW',
'Malaysia' => 'MAS',
'Mali' => 'MLI',
'Malta' => 'MLT',
'Mauritania' => 'MTN',
'Mauritius' => 'MRI',
'Mexico' => 'MEX',
'Moldova' => 'MDA',
'Monaco' => 'MON',
'Mongolia' => 'MGL',
'Montenegro' => 'MNE',
'Morocco' => 'MAR',
'Mozambique' => 'MOZ',
'Myanmar' => 'MYA',
'Namibia' => 'NAM',
'Nauru' => 'NRU',
'Nepal' => 'NEP',
'Netherlands' => 'NED',
'New Zealand' => 'NZL',
'Nicaragua' => 'NCA',
'Niger' => 'NIG',
'Nigeria' => 'NGR',
'Norway' => 'NOR',
'Oman' => 'OMA',
'Other Countries' => 'OTH',
'Pakistan' => 'PAK',
'Palau' => 'PLW',
'Palestine' => 'PLE',
'Panama' => 'PAN',
'Paraguay' => 'PAR',
'Peru' => 'PER',
'Philippines' => 'PHI',
'Poland' => 'POL',
'Portugal' => 'POR',
'Puerto Rico' => 'PUR',
'Qatar' => 'QAT',
'Romania' => 'ROM', // actually ROU
'Russia' => 'RUS',
'Rwanda' => 'RWA',
'Samoa' => 'SAM',
'San Marino' => 'SMR',
'Saudi Arabia' => 'KSA',
'Senegal' => 'SEN',
'Serbia' => 'SCG', // actually SRB
'Sierra Leone' => 'SLE',
'Singapore' => 'SIN',
'Slovakia' => 'SVK',
'Slovenia' => 'SLO',
'Somalia' => 'SOM',
'South Africa' => 'RSA',
'Spain' => 'ESP',
'Sri Lanka' => 'SRI',
'Sudan' => 'SUD',
'Suriname' => 'SUR',
'Swaziland' => 'SWZ',
'Sweden' => 'SWE',
'Switzerland' => 'SUI',
'Syria' => 'SYR',
'Taiwan' => 'TWN',
'Tajikistan' => 'TJK',
'Tanzania' => 'TAN',
'Thailand' => 'THA',
'Togo' => 'TOG',
'Tonga' => 'TGA',
'Trinidad and Tobago' => 'TRI',
'Tunisia' => 'TUN',
'Turkey' => 'TUR',
'Turkmenistan' => 'TKM',
'Tuvalu' => 'TUV',
'Uganda' => 'UGA',
'Ukraine' => 'UKR',
'United Arab Emirates' => 'UAE',
'United Kingdom' => 'GBR',
'United States of America' => 'USA',
'Uruguay' => 'URU',
'Uzbekistan' => 'UZB',
'Vanuatu' => 'VAN',
'Venezuela' => 'VEN',
'Vietnam' => 'VIE',
'Yemen' => 'YEM',
'Zambia' => 'ZAM',
'Zimbabwe' => 'ZIM',
);
if (array_key_exists($country, $nations)) {
$nation = $nations[$country];
} else {
$nation = 'OTH';
if ($country != '')
trigger_error('Could not map country: ' . $country, E_USER_WARNING);
}
return $nation;
} // mapCountry
/**
* Find TMX data for the given track
* Created by Xymph
*/
require_once('includes/tmxinfofetcher.inc.php'); // provides access to TMX info
function findTMXdata($uid, $envir, $exever, $records = false) {
// determine likely search order
if ($envir == 'Stadium') {
// check for old TMN
if (strcmp($exever, '0.1.8.0') < 0)
$sections = array('TMN', 'TMNF', 'TMU');
// check for new TMF
elseif (strcmp($exever, '2.11.0') >= 0)
$sections = array('TMNF', 'TMU');
else
$sections = array('TMU'); // TMNF section opened after TMF beta
} elseif ($envir == 'Bay' || $envir == 'Coast' || $envir == 'Island') {
// check for old TMS
if (strcmp($exever, '0.1.5.0') <= 0)
$sections = array('TMS', 'TMU');
else
$sections = array('TMU'); // TMS section closed after TMU release
} else { // $envir == 'Alpine' || 'Snow' || 'Desert' || 'Speed' || 'Rally'
// check for old TMO
if (strcmp($exever, '0.1.5.0') <= 0)
$sections = array('TMO', 'TMU');
else
$sections = array('TMU'); // TMO section closed after TMU release
}
// search TMX for track
foreach ($sections as $section) {
$tmxdata = new TMXInfoFetcher($section, $uid, $records);
if ($tmxdata->name) {
return $tmxdata;
}
}
return false;
} // findTMXdata
/**
* Simple HTTP Get function with timeout
* ok: return string || error: return false || timeout: return -1
* if $openonly == true, don't read data but return true upon connect
*/
function http_get_file($url, $openonly = false) {
global $aseco;
$url = parse_url($url);
$port = isset($url['port']) ? $url['port'] : 80;
$query = isset($url['query']) ? '?' . $url['query'] : '';
$fp = @fsockopen($url['host'], $port, $errno, $errstr, 4);
if (!$fp)
return false;
if ($openonly) {
fclose($fp);
return true;
}
$uri = '';
foreach (explode('/', $url['path']) as $subpath)
$uri .= rawurlencode($subpath) . '/';
$uri = substr($uri, 0, strlen($uri)-1); // strip trailing '/'
fwrite($fp, 'GET ' . $uri . $query . " HTTP/1.0\r\n" .
'Host: ' . $url['host'] . "\r\n" .
'User-Agent: XASECO-' . XASECO_VERSION . ' (' . PHP_OS . '; ' .
$aseco->server->game . ")\r\n\r\n");
stream_set_timeout($fp, 2);
$res = '';
$info['timed_out'] = false;
while (!feof($fp) && !$info['timed_out']) {
$res .= fread($fp, 512);
$info = stream_get_meta_data($fp);
}
fclose($fp);
if ($info['timed_out']) {
return -1;
} else {
if (substr($res, 9, 3) != '200')
return false;
$page = explode("\r\n\r\n", $res, 2);
return $page[1];
}
} // http_get_file
/**
* Return valid UTF-8 string, replacing faulty byte values with a given string
* Created by (OoR-F)~fuckfish (fish@stabb.de)
* http://www.tm-forum.com/viewtopic.php?p=117639#p117639
* Based on the original tm_substr function by Slig (slig@free.fr)
* Updated by Xymph; More info: http://en.wikipedia.org/wiki/UTF-8
*/
function validateUTF8String($input, $invalidRepl = '') {
$str = (string) $input;
$len = strlen($str); // byte string length
$pos = 0; // current byte pos in string
$new = '';
while ($pos < $len) {
$co = ord($str[$pos]);
// 4-6 bytes UTF8 => unsupported
if ($co >= 240) {
// bad multibyte char
$new .= $invalidRepl;
$pos++;
// 3 bytes UTF8 => 1110bbbb 10bbbbbb 10bbbbbb
} elseif ($co >= 224) {
if (($pos+2 < $len) &&
(ord($str[$pos+1]) >= 128 && ord($str[$pos+1]) < 192) &&
(ord($str[$pos+2]) >= 128 && ord($str[$pos+2]) < 192)) {
// ok, it was 1 character, increase counters
$new .= substr($str, $pos, 3);
$pos += 3;
} else {
// bad multibyte char
$new .= $invalidRepl;
$pos++;
}
// 2 bytes UTF8 => 110bbbbb 10bbbbbb
} elseif ($co >= 194) {
if (($pos+1 < $len) &&
(ord($str[$pos+1]) >= 128 && ord($str[$pos+1]) < 192)) {
// ok, it was 1 character, increase counters
$new .= substr($str, $pos, 2);
$pos += 2;
} else {
// bad multibyte char
$new .= $invalidRepl;
$pos++;
}
// 2 bytes overlong encoding => unsupported
} elseif ($co >= 192) {
// bad multibyte char 1100000b
$new .= $invalidRepl;
$pos++;
// 1 byte ASCII => 0bbbbbbb, or invalid => 10bbbbbb or 11111bbb
} else { // $co < 192
// erroneous middle multibyte char?
if ($co >= 128 || $co == 0)
$new .= $invalidRepl;
else
$new .= $str[$pos];
$pos++;
}
}
return $new;
} // validateUTF8String
/**
* Convert php.ini memory shorthand string to integer bytes
* http://www.php.net/manual/en/function.ini-get.php#96996
*/
function shorthand2bytes($size_str) {
switch (substr($size_str, -1)) {
case 'M': case 'm': return (int)$size_str * 1048576;
case 'K': case 'k': return (int)$size_str * 1024;
case 'G': case 'g': return (int)$size_str * 1073741824;
default: return (int)$size_str;
}
} // return_bytes
/**
* Convert boolean value to text string
*/
function bool2text($boolval) {
if ($boolval)
return 'True';
else
return 'False';
} // bool2text
?>

View File

@ -1,131 +0,0 @@
<?php
// vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2:
require('GbxRemote.inc.php');
/**
* GBXChallInfo - Return GetCurrentChallengeInfo data for TrackMania tracks
* Created by Xymph <tm@gamers.org>
*
* v1.2: Allow getting info from tracks already on the server w/o removing them
* v1.1: Fix PHP notices about redefinition of constants
* v1.0: Initial release
*/
class GBXChallengeInfo {
public $name, $uid, $filename, $author, $envir, $mood,
$bronzetm, $silvertm, $goldtm, $authortm,
$coppers, $laprace, $nblaps, $nbcps, $nbrcps, $error;
/**
* Fetches current ChallengeInfo for a GBX challenge
* Loads track into server, selects it, gets info, and removes it from server
*
* @param String $filename
* The challenge filename (must be a path below .../GameData/Tracks/)
* @return GBXChallengeInfo
* If $uid is empty, GBX data couldn't be extracted and $error contains
* an error message
*/
public function GBXChallengeInfo($filename) {
$ip = 'localhost';
$port = 5000;
$user = 'SuperAdmin';
$pass = 'YOUR_SUPERADMIN_PASSWORD';
$this->uid = '';
$this->error = '';
$client = new IXR_Client_Gbx;
// connect to the server
if (!$client->InitWithIp($ip, $port)) {
$this->error = 'Connection failed - Error ' . $client->getErrorCode() . ': ' . $client->getErrorMessage();
return false;
}
// log into the server
if (!$client->query('Authenticate', $user, $pass)) {
$this->error = 'Login failed - Error ' . $client->getErrorCode() . ': ' . $client->getErrorMessage();
} else {
// add the challenge
$ret = $client->query('AddChallenge', $filename);
$already = ($client->getErrorMessage() == 'Challenge already added.');
if (!$ret && !$already) {
$this->error = 'AddChallenge failed - Error ' . $client->getErrorCode() . ': ' . $client->getErrorMessage();
} else {
// select the challenge
if (!$client->query('ChooseNextChallenge', $filename)) {
$this->error = 'ChooseNextChallenge failed - Error ' . $client->getErrorCode() . ': ' . $client->getErrorMessage();
// switch to our challenge
} elseif (!$client->query('NextChallenge')) {
$this->error = 'NextChallenge 1 failed - Error ' . $client->getErrorCode() . ': ' . $client->getErrorMessage();
} else {
// allow for challenge switch but time out after 5 seconds
$retry = 5;
while (true) {
sleep(1);
// obtain challenge details
if ($client->query('GetCurrentChallengeInfo')) {
$info = $client->getResponse();
// check for our challenge
if ($info['FileName'] == $filename) {
break;
}
} else {
$this->error = 'GetCurrentChallengeInfo failed - Error ' . $client->getErrorCode() . ': ' . $client->getErrorMessage();
break;
}
if ($retry-- == 0) {
$this->error = 'GetCurrentChallengeInfo timed out after 5 seconds';
break;
}
}
// extract our challenge details
if ($this->error == '') {
$this->name = $info['Name'];
$this->uid = $info['UId'];
$this->filename = $info['FileName'];
$this->author = $info['Author'];
$this->envir = $info['Environnement'];
$this->mood = $info['Mood'];
$this->bronzetm = $info['BronzeTime'];
$this->silvertm = $info['SilverTime'];
$this->goldtm = $info['GoldTime'];
$this->authortm = $info['AuthorTime'];
$this->coppers = $info['CopperPrice'];
$this->laprace = $info['LapRace'];
$this->nblaps = $info['NbLaps'];
$this->nbcps = $info['NbCheckpoints'];
$this->nbrcps = $info['NbCheckpoints'];
if ($this->laprace && $this->nblaps > 1)
$this->nbrcps *= $this->nblaps;
}
}
}
// check if challenge wasn't already there
if (!$already) {
// remove the challenge
if (!$client->query('RemoveChallenge', $filename)) {
$this->error = 'RemoveChallenge failed - Error ' . $client->getErrorCode() . ': ' . $client->getErrorMessage();
}
// switch away from our challenge
sleep(5);
if (!$client->query('NextChallenge')) {
$this->error = 'NextChallenge 2 failed - Error ' . $client->getErrorCode() . ': ' . $client->getErrorMessage();
}
}
}
$client->Terminate();
}
}
?>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,154 +0,0 @@
<?php
/* vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2: */
/**
* Ogg_Comments - Extract comments (ID3 tags) from .ogg files
* Created by Xymph <tm@gamers.org>
* Derived from Ogg.class.php v1.3e by Nicolas Ricquemaque <f1iqf@hotmail.com>
* For more info see: http://opensource.grisambre.net/ogg/
* Ogg format: http://en.wikipedia.org/wiki/Ogg
* Comments : http://www.xiph.org/vorbis/doc/v-comment.html
*
* v1.1: Improved get_1block URL parsing; added User-Agent to the GET request
* v1.0: Initial release
*/
define('BLOCKSIZE', 512);
class Ogg_Comments {
public $comments = array();
/**
* Fetches all comments from a .ogg local file or URL
*
* @param String $path
* The .ogg file or URL
* @param Boolean $utf8
* If true, return fields in UTF-8, otherwise in ASCII/ISO-8859-1
* @return Ogg_Comments
* If $comments is empty, no .ogg file
*/
public function Ogg_Comments($path, $utf8 = false) {
// check for local file or URL
if (strpos($path, '://') === false) {
if (!$fp = @fopen($path, 'rb'))
return false;
$file = fread($fp, BLOCKSIZE);
fclose($fp);
if ($file === false)
return false;
} else {
$file = $this->get_1block($path);
if ($file === false || $file == -1)
return false;
}
// read OGG pages
for ($pos = 0; ($pos = strpos($file, 'OggS', $pos)) !== false; $pos++) {
// check stream version
if (ord($file[$pos+4]) != 0)
continue;
// compute offset of packet after header
$offset = $pos + 27 + ord($file[$pos+26]);
// check for second (== comments) packet
if ($this->read_intle($file, $pos+18) == 1) {
// check for vorbis comments
if (ord($file[$offset]) != 0x03 ||
substr($file, $offset+1, 6) != 'vorbis')
continue;
// read vendor string
$offset += 7;
$vndlen = $this->read_intle($file, $offset);
$this->comments['VENDOR'] = $this->decode_field(substr($file, $offset+4, $vndlen), $utf8);
// read comments count
$offset += 4 + $vndlen;
$cmtcnt = $this->read_intle($file, $offset);
// read/parse all comment fields
$offset += 4;
for ($i = 0; $i < $cmtcnt; $i++) {
$cmtlen = $this->read_intle($file, $offset);
$comment = substr($file, $offset+4, $cmtlen);
$offset += 4 + $cmtlen;
// store field name=value pair
$comment = explode('=', $comment, 2);
// check for repeated field & append
if (isset($this->comments[strtoupper($comment[0])]))
$this->comments[strtoupper($comment[0])] .= ', ' . $this->decode_field($comment[1], $utf8);
else
$this->comments[strtoupper($comment[0])] = $this->decode_field($comment[1], $utf8);
}
}
// check whether done
if (isset($this->comments['VENDOR']))
break;
}
} // Ogg_Comments
// Read 32-bits Little Endian integer
private function read_intle(&$buf, $pos) {
return (ord($buf[$pos+0]) + (ord($buf[$pos+1]) << 8) +
(ord($buf[$pos+2]) << 16) + (ord($buf[$pos+3]) << 24));
} // read_intle
// Decode comment field into specified charset
private function decode_field($str, $utf8) {
if ($utf8)
// return UTF8 or encode it in UTF8
return ((utf8_encode(utf8_decode($str)) == $str) ?
$str : utf8_encode($str));
else
// decode it to ASCII or return ASCII
return ((utf8_encode(utf8_decode($str)) == $str) ?
utf8_decode($str) : $str);
} // decode_field
// Simple HTTP Get 1 Block function with timeout
// ok: return string || error: return false || timeout: return -1
private function get_1block($url) {
$url = parse_url($url);
$port = isset($url['port']) ? $url['port'] : 80;
$query = isset($url['query']) ? '?' . $url['query'] : '';
$fp = @fsockopen($url['host'], $port, $errno, $errstr, 4);
if (!$fp)
return false;
$uri = '';
foreach (explode('/', $url['path']) as $subpath)
$uri .= rawurlencode($subpath) . '/';
$uri = substr($uri, 0, strlen($uri)-1); // strip trailing '/'
fwrite($fp, 'GET ' . $uri . $query . " HTTP/1.0\r\n" .
'Host: ' . $url['host'] . "\r\n" .
'User-Agent: Ogg_Comments (' . PHP_OS . ")\r\n\r\n");
stream_set_timeout($fp, 2);
$res = '';
$info['timed_out'] = false;
for ($i = 0; $i < 2; $i++)
if (feof($fp) || $info['timed_out']) {
break;
} else {
$res .= fread($fp, BLOCKSIZE);
$info = stream_get_meta_data($fp);
}
fclose($fp);
if ($info['timed_out']) {
return -1;
} else {
if (substr($res, 9, 3) != '200')
return false;
$page = explode("\r\n\r\n", $res, 2);
return trim($page[1]);
}
} // get_1block
} // class Ogg_Comments
?>

File diff suppressed because it is too large Load Diff

View File

@ -1,290 +0,0 @@
<?php
/* vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2: */
/**
* TMNDataFetcher - Fetch TMN ladder/nation/server stats for a login
* Created by (OoR-F)~fuckfish (fish@stabb.de)
* Updated by Xymph <tm@gamers.org>
*
* v1.8: Improved error reporting via $error; fixed file check in extendedInfo
* processing; added magic __set_state function to support var_export()
* v1.7: Improve handling of empty API responses
* v1.6: Fixed $teamrank type into int; added User-Agent to the GET request
* v1.5: Tweaked initial get_file return value check
* v1.4: Fixed get_file return value checks; fixed $nationrank check
* v1.3: Optimized get_file URL parsing
* v1.2: Added get_file function to handle master server timeouts
* v1.1: General code cleanup; added more comments; added $lastmatch,
* $totalplayers, $nationplayers, $nationpos, $nationpoints,
* $totalnations, $servernick, $serverdesc, $servernation;
* renamed $actualserver to $serverlogin
* v1.0: Initial release
*/
class TMNDataFetcher {
public $version, $extended, $error,
$login, $nickname, $worldrank, $totalplayers,
$points, $lastmatch, $wins, $losses, $draws,
$stars, $stardays, $teamname, $teamrank, $totalteams,
$nation, $nationrank, $nationplayers,
$nationpos, $nationpoints, $totalnations,
$online, $serverlogin, $servernick, $serverdesc, $servernation;
/**
* Fetches a hell of a lot of data about a TMN login
*
* @param String $login
* The TMN login to search for
* @param Boolean $extendedInfo
* If true, the script also searches for the server that the
* player is on at the moment (also determines online-state)
* @return TMNDataFetcher
* If $nickname is empty, login was not found
*/
function TMNDataFetcher($login, $extendedInfo) {
$this->version = '0.1.7.9';
$this->error = '';
$this->extended = $extendedInfo;
$this->login = strtolower($login);
$this->getData();
} // TMNDataFetcher
public static function __set_state($import) {
$tmn = new TMNDataFetcher('', true);
$tmn->version = $import['version'];
$tmn->extended = $import['extended'];
$tmn->error = '';
$tmn->login = $import['login'];
$tmn->nickname = $import['nickname'];
$tmn->worldrank = $import['worldrank'];
$tmn->totalplayers = $import['totalplayers'];
$tmn->points = $import['points'];
$tmn->lastmatch = $import['lastmatch'];
$tmn->wins = $import['wins'];
$tmn->losses = $import['losses'];
$tmn->draws = $import['draws'];
$tmn->stars = $import['stars'];
$tmn->stardays = $import['stardays'];
$tmn->teamname = $import['teamname'];
$tmn->teamrank = $import['teamrank'];
$tmn->totalteams = $import['totalteams'];
$tmn->nation = $import['nation'];
$tmn->nationrank = $import['nationrank'];
$tmn->nationplayers = $import['nationplayers'];
$tmn->nationpos = $import['nationpos'];
$tmn->nationpoints = $import['nationpoints'];
$tmn->totalnations = $import['totalnations'];
$tmn->online = $import['online'];
$tmn->serverlogin = $import['serverlogin'];
$tmn->servernick = $import['servernick'];
$tmn->serverdesc = $import['serverdesc'];
$tmn->servernation = $import['servernation'];
return $tmn;
} // __set_state
private function getData() {
$url = 'http://game.trackmanianations.com/online_game/getplayerinfos.php?ver=' . $this->version . '&lang=en&login=' . $this->login;
$line = $this->get_file($url);
if ($line === false) {
$this->error = 'Connection or response error on ' . $url;
return;
} else if ($line === -1) {
$this->error = 'Timed out while reading data from ' . $url;
return;
} else if ($line == '' || strpos($line, '<br>') !== false) {
$this->error = 'No data returned from ' . $url;
return;
}
$array = explode(';', $line);
if (!isset($array[6])) {
$this->error = 'Cannot parse data returned data from ' . $url;
return;
}
// 0 = $array[0];
// login = $array[1];
$this->nickname = urldecode($array[2]);
$this->nation = $array[3];
// empty = $array[4];
$this->stars = $array[5];
$this->stardays = $array[6];
$url = 'http://ladder.trackmanianations.com/ladder/getstats.php?ver=' . $this->version . '&laddertype=g&login=' . $this->login;
$line = $this->get_file($url);
if ($line === false) {
$this->error = 'Connection or response error on ' . $url;
return;
} else if ($line === -1) {
$this->error = 'Timed out while reading data from ' . $url;
return;
} else if ($line == '' || strpos($line, '<br>') !== false) {
$this->error = 'No data returned from ' . $url;
return;
}
$array = explode(';', $line);
if (!isset($array[10])) {
$this->error = 'Cannot parse data returned data from ' . $url;
return;
}
// 0 = $array[0];
$this->totalplayers = $array[1];
$this->wins = $array[2];
$this->losses = $array[3];
$this->draws = $array[4];
$this->worldrank = $array[5];
$this->points = $array[6];
$this->lastmatch = $array[7];
$this->teamname = urldecode($array[8]);
$this->teamrank = (int)$array[9];
$this->totalteams = $array[10];
$url = 'http://ladder.trackmanianations.com/ladder/getstats.php?ver=' . $this->version . '&laddertype=g&login=' . $this->login . '&country=' . $this->nation;
$line = $this->get_file($url);
if ($line === false) {
$this->error = 'Connection or response error on ' . $url;
return;
} else if ($line === -1) {
$this->error = 'Timed out while reading data from ' . $url;
return;
} else if ($line == '' || strpos($line, '<br>') !== false) {
$this->error = 'No data returned from ' . $url;
return;
}
$array = explode(';', $line);
// 0 = $array[1];
if (isset($array[5]))
$this->nationrank = $array[5];
else
$this->nationrank = '';
// the remaining fields are the same as the world stats above
$url = 'http://ladder.trackmanianations.com/ladder/getrankings.php?ver=' . $this->version . '&laddertype=g&start=0&limit=0&country=' . $this->nation;
$line = $this->get_file($url);
if ($line === false) {
$this->error = 'Connection or response error on ' . $url;
return;
} else if ($line === -1) {
$this->error = 'Timed out while reading data from ' . $url;
return;
} else if ($line == '' || strpos($line, '<br>') !== false) {
$this->error = 'No data returned from ' . $url;
return;
}
$array = explode(';', $line);
if (!isset($array[1])) {
$this->error = 'Cannot parse data returned data from ' . $url;
return;
}
// 0 = $array[1];
$this->nationplayers = $array[1];
// 1;login;nickname;nation;points = $array[2-6];
// 2;login;nickname;nation;points = $array[7-11]; etc.etc.
$url = 'http://ladder.trackmanianations.com/ladder/getcountriesrankings.php?ver=' . $this->version . '&laddertype=g&lang=en&start=0&limit=100';
$line = $this->get_file($url);
if ($line === false) {
$this->error = 'Connection or response error on ' . $url;
return;
} else if ($line === -1) {
$this->error = 'Timed out while reading data from ' . $url;
return;
} else if ($line == '' || strpos($line, '<br>') !== false) {
$this->error = 'No data returned from ' . $url;
return;
}
$array = explode(';', $line);
if (!isset($array[1])) {
$this->error = 'Cannot parse data returned data from ' . $url;
return;
}
// 0 = $array[1];
$this->totalnations = $array[1];
// 1;nation;points = $array[2-4];
// 2;nation;points = $array[5-7]; etc.etc.
$i = 2;
while (isset($array[$i]) && $array[$i] != '') {
if ($array[$i+1] == $this->nation) {
$this->nationpos = $array[$i];
$this->nationpoints = $array[$i+2];
break;
}
$i += 3;
}
$this->online = false;
// check online status too?
if ($this->extended) {
$page = $this->get_file('http://game.trackmanianations.com/online_game/www_serverslist.php');
if ($page === false || $page == -1 || $page == '')
// no error message if main info was already fetched
return;
$lines = explode('<host>', $page);
foreach ($lines as $line) {
if (stripos($line, '<player>' . $this->login . '</player>') !== false) {
$this->online = true;
$this->serverlogin = substr($line, 0, strpos($line, '</host>'));
break;
}
}
if ($this->online) {
$page = $this->get_file('http://game.trackmanianations.com/online_game/browse_top.php?ver=0.1.7.9&lang=en&key=XXXX-XXXX-XXXX-XXXX-XXX&nb=100&page=1&flatall=1');
if ($page === false || $page == -1 || $page == '')
// no error message if main info was already fetched
return;
$server = $this->serverlogin; // can't use object member inside pattern
if (preg_match("/^${server};([^;]+);([^;]+);([A-Z]+);/m", $page, $fields)) {
$this->serverdesc = $fields[1];
$this->servernick = ($fields[2] != 'x' ? urldecode($fields[2]) : '');
$this->servernation = $fields[3];
}
}
}
} // getData
// Simple HTTP Get function with timeout
// ok: return string || error: return false || timeout: return -1
private function get_file($url) {
$url = parse_url($url);
$port = isset($url['port']) ? $url['port'] : 80;
$query = isset($url['query']) ? "?" . $url['query'] : "";
$fp = @fsockopen($url['host'], $port, $errno, $errstr, 4);
if (!$fp)
return false;
fwrite($fp, 'GET ' . $url['path'] . $query . " HTTP/1.0\r\n" .
'Host: ' . $url['host'] . "\r\n" .
'User-Agent: TMNDataFetcher (' . PHP_OS . ")\r\n\r\n");
stream_set_timeout($fp, 2);
$res = '';
$info['timed_out'] = false;
while (!feof($fp) && !$info['timed_out']) {
$res .= fread($fp, 512);
$info = stream_get_meta_data($fp);
}
fclose($fp);
if ($info['timed_out']) {
return -1;
} else {
if (substr($res, 9, 3) != '200')
return false;
$page = explode("\r\n\r\n", $res, 2);
return trim($page[1]);
}
} // get_file
} // class TMNDataFetcher
?>

View File

@ -1,297 +0,0 @@
<?php
/* vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2: */
/**
* TMXInfoFetcher - Fetch TMX info/records for TMO/TMS/TMN/TMU(F)/TMNF tracks
* Created by Xymph <tm@gamers.org>
* Inspired by TMNDataFetcher & "Stats for TMN Aseco+RASP"
*
* v1.19: Allowed 24-char UIDs too
* v1.18: Added 'replayurl' to the entries in $recordslist
* v1.17: Allowed 25-char UIDs too
* v1.16: Improved error reporting via $error; parsed more comment formatting
* v1.15: Added User-Agent to the GET request
* v1.14: Fixed PHP Strict level warning
* v1.13: Fixed handling of empty API responses
* v1.12: Renamed $worldrec into $custimg to correct its meaning; fixed
* $replayid check
* v1.11: Added another check for valid $replayid
* v1.10: Added magic __set_state function to support var_export()
* v1.9: Fixed fetch records run-time warnings
* v1.8: Optimized get_file URL parsing
* v1.7: Added $worldrec (boolean); changed $visible to boolean; renamed
* $download to $dloadurl, $imgurl to $imageurl & $imgurlsmall to
* $thumburl; minor tweaks
* v1.6: Added check for valid $replayid & $replayurl
* v1.5: Added TMNF compatibility
* v1.4: Added get_file function to handle TMX site timeouts
* v1.3: Added $awards, $comments, $replayid, $replayurl; renamed $comment to
* $acomment (to better distinguish author comment from # of comments)
* v1.2: Allowed 26-char UIDs too; added $pageurl
* v1.1: Allowed TMX IDs too
* v1.0: Initial release
*/
class TMXInfoFetcher {
public $section, $prefix, $uid, $id, $records, $error,
$name, $userid, $author, $uploaded, $updated,
$visible, $type, $envir, $mood, $style, $routes,
$length, $diffic, $lbrating, $awards, $comments, $custimg,
$game, $acomment, $pageurl, $replayid, $replayurl,
$imageurl, $thumburl, $dloadurl, $recordlist;
/**
* Fetches a hell of a lot of data about a TMX track
*
* @param String $game
* TMX section for 'TMO', 'TMS', 'TMN', 'TMU', 'TMNF'
* @param String $id
* The challenge UID to search for (if a 24-27 char alphanum string),
* otherwise the TMX ID to search for (if a number)
* @param Boolean $records
* If true, the script also returns the world records (max. 10)
* @return TMXInfoFetcher
* If $error is not an empty string, it's an error message
*/
public function TMXInfoFetcher($game, $id, $records) {
$this->section = $game;
switch ($game) {
case 'TMO':
$this->prefix = 'original';
break;
case 'TMS':
$this->prefix = 'sunrise';
break;
case 'TMN':
$this->prefix = 'nations';
break;
case 'TMU':
$this->prefix = 'united';
break;
case 'TMNF':
$this->prefix = 'tmnforever';
break;
default:
$this->prefix = '';
return;
}
$this->error = '';
$this->records = $records;
// check for UID string
if (preg_match('/^\w{24,27}$/', $id)) {
$this->uid = $id;
$this->getData(true);
// check for TMX ID
} elseif (is_numeric($id) && $id > 0) {
$this->id = floor($id);
$this->getData(false);
}
} // TMXInfoFetcher
public static function __set_state($import) {
$tmx = new TMXInfoFetcher('', 0, false);
$tmx->section = $import['section'];
$tmx->prefix = $import['prefix'];
$tmx->uid = $import['uid'];
$tmx->id = $import['id'];
$tmx->records = $import['records'];
$tmx->error = '';
$tmx->name = $import['name'];
$tmx->userid = $import['userid'];
$tmx->author = $import['author'];
$tmx->uploaded = $import['uploaded'];
$tmx->updated = $import['updated'];
$tmx->visible = $import['visible'];
$tmx->type = $import['type'];
$tmx->envir = $import['envir'];
$tmx->mood = $import['mood'];
$tmx->style = $import['style'];
$tmx->routes = $import['routes'];
$tmx->length = $import['length'];
$tmx->diffic = $import['diffic'];
$tmx->lbrating = $import['lbrating'];
$tmx->awards = $import['awards'];
$tmx->comments = $import['comments'];
$tmx->custimg = $import['custimg'];
$tmx->game = $import['game'];
$tmx->acomment = $import['acomment'];
$tmx->pageurl = $import['pageurl'];
$tmx->replayid = $import['replayid'];
$tmx->replayurl = $import['replayurl'];
$tmx->imageurl = $import['imageurl'];
$tmx->thumburl = $import['thumburl'];
$tmx->dloadurl = $import['dloadurl'];
$tmx->recordlist = null;
return $tmx;
} // __set_state
private function getData($isuid) {
// get main track info
$url = 'http://' . $this->prefix . '.tm-exchange.com/apiget.aspx?action=apitrackinfo&' . ($isuid ? 'u' : '') . 'id=' . ($isuid ? $this->uid : $this->id);
$file = $this->get_file($url);
if ($file === false) {
$this->error = 'Connection or response error on ' . $url;
return;
} else if ($file === -1) {
$this->error = 'Timed out while reading data from ' . $url;
return;
} else if ($file == '') {
$this->error = 'No data returned from ' . $url;
return;
}
// check for API error message
if (strpos($file, chr(27)) !== false) {
$this->error = 'Cannot decode main track info';
return;
}
// separate columns on Tabs
$fields = explode(chr(9), $file);
if ($isuid)
$this->id = $fields[0];
$this->name = $fields[1];
$this->userid = $fields[2];
$this->author = $fields[3];
$this->uploaded = $fields[4];
$this->updated = $fields[5];
$this->visible = (strtolower($fields[6]) == 'true');
$this->type = $fields[7];
$this->envir = $fields[8];
$this->mood = $fields[9];
$this->style = $fields[10];
$this->routes = $fields[11];
$this->length = $fields[12];
$this->diffic = $fields[13];
$this->lbrating = ($fields[14] > 0 ? $fields[14] : 'Classic!');
$this->game = $fields[15];
$search = array(chr(31), '[b]', '[/b]', '[i]', '[/i]', '[u]', '[/u]', '[url]', '[/url]');
$replace = array('<br/>', '<b>', '</b>', '<i>', '</i>', '<u>', '</u>', '<i>', '</i>');
$this->acomment = str_ireplace($search, $replace, $fields[16]);
$this->acomment = preg_replace('/\[url=".*"\]/', '<i>', $this->acomment);
$this->pageurl = 'http://' . $this->prefix . '.tm-exchange.com/main.aspx?action=trackshow&id=' . $this->id;
$this->imageurl = 'http://' . $this->prefix . '.tm-exchange.com/get.aspx?action=trackscreen&id=' . $this->id;
$this->thumburl = 'http://' . $this->prefix . '.tm-exchange.com/get.aspx?action=trackscreensmall&id=' . $this->id;
$this->dloadurl = 'http://' . $this->prefix . '.tm-exchange.com/get.aspx?action=trackgbx&id=' . $this->id;
$this->awards = 0;
$this->comments = 0;
$this->custimg = false;
$this->replayid = 0;
$this->replayurl = '';
// get misc. track info
$url = 'http://' . $this->prefix . '.tm-exchange.com/apiget.aspx?action=apisearch&trackid=' . $this->id;
$file = $this->get_file($url);
if ($file === false || $file === -1 || $file == '')
// no error message if main info was already fetched
return;
// check for API error message
if (strpos($file, chr(27)) !== false)
return;
// separate columns on Tabs
$fields = explode(chr(9), $file);
// id = $fields[0];
// name = $fields[1];
// userid = $fields[2];
// author = $fields[3];
// type = $fields[4];
// envir = $fields[5];
// mood = $fields[6];
// style = $fields[7];
// routes = $fields[8];
// length = $fields[9];
// diffic = $fields[10];
// lbrating = ($fields[11] > 0 ? $fields[11] : 'Classic!');
$this->awards = $fields[12];
$this->comments = $fields[13];
$this->custimg = (strtolower($fields[14]) == 'true');
// game = $fields[15];
$this->replayid = $fields[16];
// unknown = $fields[17-21];
// uploaded = $fields[22];
// updated = $fields[23];
if ($this->replayid > 0) {
$this->replayurl = 'http://' . $this->prefix . '.tm-exchange.com/get.aspx?action=recordgbx&id=' . $this->replayid;
}
// fetch records too?
$this->recordlist = array();
if ($this->records) {
$url = 'http://' . $this->prefix . '.tm-exchange.com/apiget.aspx?action=apitrackrecords&id=' . $this->id;
$file = $this->get_file($url);
if ($file === false || $file === -1 || $file == '')
// no error message if main info was already fetched
return;
$file = explode("\r\n", $file);
$i = 0;
while ($i < 10 && isset($file[$i]) && $file[$i] != '') {
// separate columns on Tabs
$fields = explode(chr(9), $file[$i]);
$this->recordlist[$i++] = array(
'replayid' => $fields[0],
'userid' => $fields[1],
'name' => $fields[2],
'time' => $fields[3],
'replayat' => $fields[4],
'trackat' => $fields[5],
'approved' => $fields[6],
'score' => $fields[7],
'expires' => $fields[8],
'lockspan' => $fields[9],
'replayurl'=> 'http://' . $this->prefix . '.tm-exchange.com/get.aspx?action=recordgbx&id=' . $fields[0],
);
}
}
} // getData
// Simple HTTP Get function with timeout
// ok: return string || error: return false || timeout: return -1
private function get_file($url) {
$url = parse_url($url);
$port = isset($url['port']) ? $url['port'] : 80;
$query = isset($url['query']) ? "?" . $url['query'] : "";
$fp = @fsockopen($url['host'], $port, $errno, $errstr, 4);
if (!$fp)
return false;
fwrite($fp, 'GET ' . $url['path'] . $query . " HTTP/1.0\r\n" .
'Host: ' . $url['host'] . "\r\n" .
'User-Agent: TMXInfoFetcher (' . PHP_OS . ")\r\n\r\n");
stream_set_timeout($fp, 2);
$res = '';
$info['timed_out'] = false;
while (!feof($fp) && !$info['timed_out']) {
$res .= fread($fp, 512);
$info = stream_get_meta_data($fp);
}
fclose($fp);
if ($info['timed_out']) {
return -1;
} else {
if (substr($res, 9, 3) != '200')
return false;
$page = explode("\r\n\r\n", $res, 2);
return trim($page[1]);
}
} // get_file
} // class TMXInfoFetcher
?>

View File

@ -1,288 +0,0 @@
<?php
/* vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2: */
/**
* TMXInfoSearcher - Search TMX info for TMO/TMS/TMN/TMU(F)/TMNF tracks
* Created by Xymph <tm@gamers.org>
* Based on TMXInfoFetcher & http://united.tm-exchange.com/main.aspx?action=threadshow&id=619302
*
* v1.7: Added Countable interface to searcher class
* v1.6: Fixed an error checking bug
* v1.5: Improved error reporting via $error
* v1.4: Added User-Agent to the GET request
* v1.3: Renamed $worldrec into $custimg to correct its meaning; fixed
* $replayid check
* v1.2: Fixed TMXInfo processing false $track
* v1.1: Optimized get_file URL parsing
* v1.0: Initial release
*/
class TMXInfoSearcher implements Iterator,Countable {
public $error;
protected $tracks = array();
private $section;
private $prefix;
/**
* Searches TMX for tracks matching name, author and/or environment;
* or search TMX for the 10 most recent tracks
*
* @param String $game
* TMX section for 'TMO', 'TMS', 'TMN', 'TMU', 'TMNF'
* @param String $name
* The track name to search for (partial, case-insensitive match)
* @param String $author
* The track author to search for (partial, case-insensitive match)
* @param String $env
* The environment to search for (exact case-insensitive match
* from: Desert, Snow, Rally, Bay, Coast, Island, Stadium);
* ignored when searching TMN or TMNF
* @param Boolean $recent
* If true, ignore search parameters and just return 10 newest tracks
* (max. one per author)
* @return TMXInfoSearcher
* If ->valid() is false, no matching track was found;
* otherwise, an iterator of TMXInfo objects for a 'foreach' loop.
* Returns at most 500 tracks ($maxpage * 20) for TMNF/TMU(F),
* and at most 20 tracks for the other TMX sections.
*/
public function __construct($game, $name, $author, $env, $recent) {
$this->section = $game;
switch ($game) {
case 'TMO':
$this->prefix = 'original';
break;
case 'TMS':
$this->prefix = 'sunrise';
break;
case 'TMN':
$this->prefix = 'nations';
$env = ''; // ignore possible environment
break;
case 'TMU':
$this->prefix = 'united';
break;
case 'TMNF':
$this->prefix = 'tmnforever';
$env = ''; // ignore possible environment
break;
default:
$this->prefix = '';
$this->error = 'Unknown TMX section: ' . $game;
return;
}
$this->error = '';
if ($recent) {
$this->tracks = $this->getRecent();
} else {
$this->tracks = $this->getList($name, $author, $env);
}
} // __construct
// define standard Iterator functions
public function rewind() {
reset($this->tracks);
}
public function current() {
return new TMXInfo($this->section, $this->prefix, current($this->tracks));
}
public function next() {
return new TMXInfo($this->section, $this->prefix, next($this->tracks));
}
public function key() {
return key($this->tracks);
}
public function valid() {
return (current($this->tracks) !== false);
}
// define standard Countable function
public function count() {
return count($this->tracks);
}
private function getRecent() {
// get 10 most recent tracks
$url = 'http://' . $this->prefix . '.tm-exchange.com/apiget.aspx?action=apirecent';
$file = $this->get_file($url);
if ($file === false) {
$this->error = 'Connection or response error on ' . $url;
return array();
} else if ($file === -1) {
$this->error = 'Timed out while reading data from ' . $url;
return array();
} else if ($file == '') {
$this->error = 'No data returned from ' . $url;
return array();
}
// check for API error message
if (strpos($file, chr(27)) !== false) {
$this->error = 'Cannot decode recent track info from ' . $url;
return array();
}
// return list of tracks as array of strings
return explode("\r\n", $file);
} // getRecent
private function getList($name, $author, $env) {
// older TMX sections don't support multi-page results :(
$maxpage = 1;
if ($this->prefix == 'tmnforever' || $this->prefix == 'united')
$maxpage = 25; // max. 500 tracks
// compile search URL
$url = 'http://' . $this->prefix . '.tm-exchange.com/apiget.aspx?action=apisearch';
if ($name != '')
$url .= '&track=' . $name;
if ($author != '')
$url .= '&author=' . $author;
if ($env != '')
$url .= '&env=' . $env;
$url .= '&page=';
$tracks = '';
$page = 0;
$done = false;
// get results 20 tracks at a time
while ($page < $maxpage && !$done) {
$file = $this->get_file($url . $page);
if ($file === false) {
$this->error = 'Connection or response error on ' . $url;
return array();
} else if ($file === -1) {
$this->error = 'Timed out while reading data from ' . $url;
return array();
} else if ($file == '') {
if ($tracks == '') {
$this->error = 'No data returned from ' . $url;
return array();
} else {
break;
}
}
// check for API error message
if (strpos($file, chr(27)) !== false) {
$this->error = 'Cannot decode searched track info from ' . $url;
return array();
}
// check for results
if ($file != '') {
// no line break before first page
$tracks .= ($page++ > 0 ? "\r\n" : '') . $file;
} else {
$done = true;
}
}
// return list of tracks as array of strings
if ($tracks != '')
return explode("\r\n", $tracks);
else
return array();
} // getList
// Simple HTTP Get function with timeout
// ok: return string || error: return false || timeout: return -1
private function get_file($url) {
$url = parse_url($url);
$port = isset($url['port']) ? $url['port'] : 80;
$query = isset($url['query']) ? "?" . $url['query'] : "";
$fp = @fsockopen($url['host'], $port, $errno, $errstr, 4);
if (!$fp)
return false;
fwrite($fp, 'GET ' . $url['path'] . $query . " HTTP/1.0\r\n" .
'Host: ' . $url['host'] . "\r\n" .
'User-Agent: TMXInfoSearcher (' . PHP_OS . ")\r\n\r\n");
stream_set_timeout($fp, 2);
$res = '';
$info['timed_out'] = false;
while (!feof($fp) && !$info['timed_out']) {
$res .= fread($fp, 512);
$info = stream_get_meta_data($fp);
}
fclose($fp);
if ($info['timed_out']) {
return -1;
} else {
if (substr($res, 9, 3) != '200')
return false;
$page = explode("\r\n\r\n", $res, 2);
return trim($page[1]);
}
} // get_file
} // class TMXInfoSearcher
class TMXInfo {
public $section, $prefix, $id, $name, $userid, $author,
$type, $envir, $mood, $style, $routes, $length, $diffic,
$lbrating, $awards, $comments, $custimg, $game, $uploaded, $updated,
$pageurl, $replayid, $replayurl, $imageurl, $thumburl, $dloadurl;
/**
* Returns track object with a hell of a lot of data from TMX track string
*
* @param String $section
* TMX section
* @param String $prefix
* TMX URL prefix
* @param String $track
* The TMX track string from TMXInfoSearcher
* @return TMXInfo
*/
public function TMXInfo($section, $prefix, $track) {
$this->section = $section;
$this->prefix = $prefix;
if ($track) {
// separate columns on Tabs
$fields = explode(chr(9), $track);
$this->id = $fields[0];
$this->name = $fields[1];
$this->userid = $fields[2];
$this->author = $fields[3];
$this->type = $fields[4];
$this->envir = $fields[5];
$this->mood = $fields[6];
$this->style = $fields[7];
$this->routes = $fields[8];
$this->length = $fields[9];
$this->diffic = $fields[10];
$this->lbrating = ($fields[11] > 0 ? $fields[11] : 'Classic!');
$this->awards = $fields[12];
$this->comments = $fields[13];
$this->custimg = (strtolower($fields[14]) == 'true');
$this->game = $fields[15];
$this->replayid = $fields[16];
// unknown = $fields[17-21];
$this->uploaded = $fields[22];
$this->updated = $fields[23];
$this->pageurl = 'http://' . $prefix . '.tm-exchange.com/main.aspx?action=trackshow&id=' . $this->id;
$this->imageurl = 'http://' . $prefix . '.tm-exchange.com/get.aspx?action=trackscreen&id=' . $this->id;
$this->thumburl = 'http://' . $prefix . '.tm-exchange.com/get.aspx?action=trackscreensmall&id=' . $this->id;
$this->dloadurl = 'http://' . $prefix . '.tm-exchange.com/get.aspx?action=trackgbx&id=' . $this->id;
if ($this->replayid > 0) {
$this->replayurl = 'http://' . $prefix . '.tm-exchange.com/get.aspx?action=recordgbx&id=' . $this->replayid;
} else {
$this->replayurl = '';
}
}
} // TMXInfo
} // class TMXInfo
?>

View File

@ -1,511 +0,0 @@
<?php
/* vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2: */
// Updated by Xymph
/**
* Structure of a Record.
*/
class Record {
var $player;
var $challenge;
var $score;
var $date;
var $checks;
var $new;
var $pos;
} // class Record
/**
* Manages a list of records.
* Add records to the list and remove them.
*/
class RecordList {
var $record_list;
var $max;
// instantiates a record list with max $limit records
function RecordList($limit) {
$this->record_list = array();
$this->max = $limit;
}
function setLimit($limit) {
$this->max = $limit;
}
function getRecord($rank) {
if (isset($this->record_list[$rank]))
return $this->record_list[$rank];
else
return false;
}
function setRecord($rank, $record) {
if (isset($this->record_list[$rank])) {
return $this->record_list[$rank] = $record;
} else {
return false;
}
}
function moveRecord($from, $to) {
moveArrayElement($this->record_list, $from, $to);
}
function addRecord($record, $rank = -1) {
// if no rank was set for this record, then put it to the end of the list
if ($rank == -1) {
$rank = count($this->record_list);
}
// do not insert a record behind the border of the list
if ($rank >= $this->max) return;
// do not insert a record with no score
if ($record->score <= 0) return;
// if the given object is a record
if (get_class($record) == 'Record') {
// if records are getting too much, drop the last from the list
if (count($this->record_list) >= $this->max) {
array_pop($this->record_list);
}
// insert the record at the specified position
return insertArrayElement($this->record_list, $record, $rank);
}
}
function delRecord($rank = -1) {
// do not remove a record outside the current list
if ($rank < 0 || $rank >= count($this->record_list)) return;
// remove the record from the specified position
return removeArrayElement($this->record_list, $rank);
}
function count() {
return count($this->record_list);
}
function clear() {
$this->record_list = array();
}
} // class RecordList
/**
* Structure of a Player.
* Can be instantiated with an RPC 'GetPlayerInfo' or
* 'GetDetailedPlayerInfo' response.
*/
class Player {
var $id;
var $pid;
var $login;
var $nickname;
var $teamname;
var $ip;
var $client;
var $ipport;
var $zone;
var $nation;
var $prevstatus;
var $isspectator;
var $isofficial;
var $rights;
var $language;
var $avatar;
var $teamid;
var $unlocked;
var $ladderrank;
var $ladderscore;
var $created;
var $wins;
var $newwins;
var $timeplayed;
var $tracklist;
var $playerlist;
var $msgs;
var $pmbuf;
var $mutelist;
var $mutebuf;
var $style;
var $panels;
var $speclogin;
var $dedirank;
function getWins() {
return $this->wins + $this->newwins;
}
function getTimePlayed() {
return $this->timeplayed + $this->getTimeOnline();
}
function getTimeOnline() {
return $this->created > 0 ? time() - $this->created : 0;
}
// instantiates the player with an RPC response
function Player($rpc_infos = null) {
$this->id = 0;
if ($rpc_infos) {
$this->pid = $rpc_infos['PlayerId'];
$this->login = $rpc_infos['Login'];
$this->nickname = $rpc_infos['NickName'];
$this->ipport = $rpc_infos['IPAddress'];
$this->ip = preg_replace('/:\d+/', '', $rpc_infos['IPAddress']); // strip port
$this->prevstatus = false;
$this->isspectator = $rpc_infos['IsSpectator'];
$this->isofficial = $rpc_infos['IsInOfficialMode'];
$this->teamname = $rpc_infos['LadderStats']['TeamName'];
if (isset($rpc_infos['Nation'])) { // TMN (TMS/TMO?)
$this->zone = $rpc_infos['Nation'];
$this->nation = $rpc_infos['Nation'];
$this->ladderrank = $rpc_infos['LadderStats']['Ranking'];
$this->ladderscore = $rpc_infos['LadderStats']['Score'];
$this->client = '';
$this->rights = false;
$this->language = '';
$this->avatar = '';
$this->teamid = 0;
} else { // TMF
$this->zone = substr($rpc_infos['Path'], 6); // strip 'World|'
$this->nation = explode('|', $rpc_infos['Path']);
if (isset($this->nation[1]))
$this->nation = $this->nation[1];
else
$this->nation = '';
$this->ladderrank = $rpc_infos['LadderStats']['PlayerRankings'][0]['Ranking'];
$this->ladderscore = round($rpc_infos['LadderStats']['PlayerRankings'][0]['Score'], 2);
$this->client = $rpc_infos['ClientVersion'];
$this->rights = ($rpc_infos['OnlineRights'] == 3); // United = true
$this->language = $rpc_infos['Language'];
$this->avatar = $rpc_infos['Avatar']['FileName'];
$this->teamid = $rpc_infos['TeamId'];
}
$this->created = time();
} else {
// set defaults
$this->pid = 0;
$this->login = '';
$this->nickname = '';
$this->ipport = '';
$this->ip = '';
$this->prevstatus = false;
$this->isspectator = false;
$this->isofficial = false;
$this->teamname = '';
$this->zone = '';
$this->nation = '';
$this->ladderrank = 0;
$this->ladderscore = 0;
$this->rights = false;
$this->created = 0;
}
$this->wins = 0;
$this->newwins = 0;
$this->timeplayed = 0;
$this->unlocked = false;
$this->pmbuf = array();
$this->mutelist = array();
$this->mutebuf = array();
$this->style = array();
$this->panels = array();
$this->speclogin = '';
$this->dedirank = 0;
}
} // class Player
/**
* Manages players on the server.
* Add player and remove them.
*/
class PlayerList {
var $player_list;
// instantiates the empty player list
function PlayerList() {
$this->player_list = array();
}
function nextPlayer() {
if (is_array($this->player_list)) {
$player_item = current($this->player_list);
next($this->player_list);
return $player_item;
} else {
$this->resetPlayers();
return false;
}
}
function resetPlayers() {
if (is_array($this->player_list)) {
reset($this->player_list);
}
}
function addPlayer($player) {
if (get_class($player) == 'Player' && $player->login != '') {
$this->player_list[$player->login] = $player;
return true;
} else {
return false;
}
}
function removePlayer($login) {
if (isset($this->player_list[$login])) {
$player = $this->player_list[$login];
unset($this->player_list[$login]);
} else {
$player = false;
}
return $player;
}
function getPlayer($login) {
if (isset($this->player_list[$login]))
return $this->player_list[$login];
else
return false;
}
} // class PlayerList
/**
* Can store challenge information.
* You can instantiate with an RPC 'GetChallengeInfo' response.
*/
class Challenge {
var $id;
var $name;
var $uid;
var $filename;
var $author;
var $environment;
var $mood;
var $bronzetime;
var $silvertime;
var $goldtime;
var $authortime;
var $copperprice;
var $laprace;
var $forcedlaps;
var $nblaps;
var $nbchecks;
var $score;
var $starttime;
var $gbx;
var $tmx;
// instantiates the challenge with an RPC response
function Challenge($rpc_infos = null) {
$this->id = 0;
if ($rpc_infos) {
$this->name = stripNewlines($rpc_infos['Name']);
$this->uid = $rpc_infos['UId'];
$this->filename = $rpc_infos['FileName'];
$this->author = $rpc_infos['Author'];
$this->environment = $rpc_infos['Environnement'];
$this->mood = $rpc_infos['Mood'];
$this->bronzetime = $rpc_infos['BronzeTime'];
$this->silvertime = $rpc_infos['SilverTime'];
$this->goldtime = $rpc_infos['GoldTime'];
$this->authortime = $rpc_infos['AuthorTime'];
$this->copperprice = $rpc_infos['CopperPrice'];
$this->laprace = $rpc_infos['LapRace'];
$this->forcedlaps = 0;
if (isset($rpc_infos['NbLaps']))
$this->nblaps = $rpc_infos['NbLaps'];
else
$this->nblaps = 0;
if (isset($rpc_infos['NbCheckpoints']))
$this->nbchecks = $rpc_infos['NbCheckpoints'];
else
$this->nbchecks = 0;
} else {
// set defaults
$this->name = 'undefined';
}
}
} // class Challenge
/**
* Contains information about an RPC call.
*/
class RPCCall {
var $index;
var $id;
var $callback;
var $call;
// instantiates the RPC call with the parameters
function RPCCall($id, $index, $callback, $call) {
$this->id = $id;
$this->index = $index;
$this->callback = $callback;
$this->call = $call;
}
} // class RPCCall
/**
* Contains information about a chat command.
*/
class ChatCommand {
var $name;
var $help;
var $isadmin;
// instantiates the chat command with the parameters
function ChatCommand($name, $help, $isadmin) {
$this->name = $name;
$this->help = $help;
$this->isadmin = $isadmin;
}
} // class ChatCommand
/**
* Stores basic information of the server XASECO is running on.
*/
class Server {
var $id;
var $name;
var $game;
var $serverlogin;
var $nickname;
var $zone;
var $rights;
var $ip;
var $port;
var $timeout;
var $version;
var $build;
var $packmask;
var $laddermin;
var $laddermax;
var $login;
var $pass;
var $maxplay;
var $maxspec;
var $challenge;
var $records;
var $players;
var $mutelist;
var $gamestate;
var $gameinfo;
var $gamedir;
var $trackdir;
var $votetime;
var $voterate;
var $uptime;
var $starttime;
var $isrelay;
var $relaymaster;
var $relayslist;
// game states
const RACE = 'race';
const SCORE = 'score';
function getGame() {
switch ($this->game) {
case 'TmForever':
return 'TMF';
case 'TmNationsESWC':
return 'TMN';
case 'TmSunrise':
return 'TMS';
case 'TmOriginal':
return 'TMO';
default: // TMU was never supported
return 'Unknown';
}
}
// instantiates the server with default parameters
function Server($ip, $port, $login, $pass) {
$this->ip = $ip;
$this->port = $port;
$this->login = $login;
$this->pass = $pass;
$this->starttime = time();
}
} // class Server
/**
* Contains information to the current game which is played.
*/
class Gameinfo {
var $mode;
var $numchall;
var $rndslimit;
var $timelimit;
var $teamlimit;
var $lapslimit;
var $cuplimit;
var $forcedlaps;
const RNDS = 0;
const TA = 1;
const TEAM = 2;
const LAPS = 3;
const STNT = 4;
const CUP = 5;
// returns current game mode as string
function getMode() {
switch ($this->mode) {
case self::RNDS:
return 'Rounds';
case self::TA:
return 'TimeAttack';
case self::TEAM:
return 'Team';
case self::LAPS:
return 'Laps';
case self::STNT:
return 'Stunts';
case self::CUP:
return 'Cup';
default:
return 'Undefined';
}
}
// instantiates the game info with an RPC response
function Gameinfo($rpc_infos = null) {
if ($rpc_infos) {
$this->mode = $rpc_infos['GameMode'];
$this->numchall = $rpc_infos['NbChallenge'];
if (isset($rpc_infos['RoundsUseNewRules']) && $rpc_infos['RoundsUseNewRules'])
$this->rndslimit = $rpc_infos['RoundsPointsLimitNewRules'];
else
$this->rndslimit = $rpc_infos['RoundsPointsLimit'];
$this->timelimit = $rpc_infos['TimeAttackLimit'];
if (isset($rpc_infos['TeamUseNewRules']) && $rpc_infos['TeamUseNewRules'])
$this->teamlimit = $rpc_infos['TeamPointsLimitNewRules'];
else
$this->teamlimit = $rpc_infos['TeamPointsLimit'];
$this->lapslimit = $rpc_infos['LapsTimeLimit'];
if (isset($rpc_infos['CupPointsLimit']))
$this->cuplimit = $rpc_infos['CupPointsLimit'];
if (isset($rpc_infos['RoundsForcedLaps']))
$this->forcedlaps = $rpc_infos['RoundsForcedLaps'];
else
$this->forcedlaps = 0;
} else {
$this->mode = -1;
}
}
} // class Gameinfo
?>

View File

@ -1,26 +0,0 @@
<?php
/* vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2: */
// Alternative base64 url compatible decode and encode functions
// Written by Ferdinand Dosser
// Updated by Xymph
// urlsafe base64 alternative encode
function urlsafe_base64_encode($string) {
$data = base64_encode($string);
$data = str_replace(array('+','/','='), array('-','_',''), $data);
return $data;
} // urlsafe_base64_encode
// urlsafe base64 alternative decode
function urlsafe_base64_decode($string) {
$data = str_replace(array('-','_'), array('+','/'), $string);
$mod4 = strlen($data) % 4;
if ($mod4) {
$data .= substr('====', $mod4);
}
return base64_decode($data);
} // urlsafe_base64_decode
?>

File diff suppressed because it is too large Load Diff

View File

@ -1,121 +0,0 @@
<?php
/* vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2: */
/**
* Builds an easy structured array out of a xml file.
* Element names will be the keys and the data the values.
*
* Updated by Xymph
*/
class Examsly {
var $data;
var $struct;
var $parser;
var $stack;
var $utf8enc;
/**
* Parses a XML structure into an array.
*/
function parseXml($source, $isfile = true, $utf8enc = false) {
// clear last results
$this->stack = array();
$this->struct = array();
$this->utf8enc = $utf8enc;
// create the parser
$this->parser = xml_parser_create();
xml_set_object($this->parser, $this);
xml_set_element_handler($this->parser, 'openTag', 'closeTag');
xml_set_character_data_handler($this->parser, 'tagData');
// load the xml file
if ($isfile)
$this->data = @file_get_contents($source);
else
$this->data = $source;
// escape '&' characters
$this->data = str_replace('&', '<![CDATA[&]]>', $this->data);
// parse xml file
$parsed = xml_parse($this->parser, $this->data);
// display errors
if (!$parsed) {
$code = xml_get_error_code($this->parser);
$err = xml_error_string($code);
$line = xml_get_current_line_number($this->parser);
trigger_error("[XML Error $code] $err on line $line", E_USER_WARNING);
return false;
}
return $this->struct;
}
private function openTag($parser, $name, $attributes) {
$this->stack[] = $name;
$this->struct[$name] = '';
}
private function tagData($parser, $data) {
if (trim($data)) {
$index = $this->stack[count($this->stack)-1];
// use raw, don't decode '+' into space
if ($this->utf8enc)
$this->struct[$index] .= rawurldecode($data);
else
$this->struct[$index] .= utf8_decode(rawurldecode($data));
}
}
private function closeTag($parser, $name) {
if (count($this->stack) > 1) {
$from = array_pop($this->stack);
$to = $this->stack[count($this->stack)-1];
$this->struct[$to][$from][] = $this->struct[$from];
unset($this->struct[$from]);
}
}
/**
* Parses an array into an XML structure.
*/
function parseArray($array) {
$xmlstring = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';
$xmlstring .= $this->parseArrayElements($array);
return $xmlstring;
}
private function parseArrayElements($array, $opt_tag = '') {
// read each element of the array
for ($i = 0; $i < count($array); $i++) {
// check if array is associative
if (is_numeric(key($array))) {
$xml .= '<'.$opt_tag.'>';
if (is_array(current($array))) {
$xml .= $this->parseArrayElements(current($array), key($array));
} else {
// use raw, don't encode space into '+'
$xml .= rawurlencode(utf8_encode(current($array)));
}
$xml .= '</'.$opt_tag.'>';
} else {
if (is_array(current($array))) {
$xml .= $this->parseArrayElements(current($array), key($array));
} else {
$xml .= '<'.key($array).'>';
// use raw, don't encode space into '+'
$xml .= rawurlencode(utf8_encode(current($array)));
$xml .= '</'.key($array).'>';
}
}
next($array);
}
return $xml;
}
}
?>

View File

@ -1,385 +0,0 @@
<?php
/* vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2: */
////////////////////////////////////////////////////////////////
//
// File: XMLRPC DB ACCESS 2.1
// Date: 28.05.2009
// Author: Gilles Masson
// Updated: Xymph
//
////////////////////////////////////////////////////////////////
class XmlrpcDB {
//-----------------------------
// Fields
//-----------------------------
var $_webaccess;
var $_url;
var $_server;
var $_callbacks;
var $_requests;
var $_auth_cb;
var $_bad;
var $_bad_time;
var $_debug;
//-----------------------------
// Methods
//-----------------------------
function XmlrpcDB($webaccess, $url, $game, $login, $password, $tool, $version, $nation, $packmask = '') {
$this->_debug = 0; // max debug level = 3
$this->_webaccess = $webaccess;
$this->_url = $url;
$this->_server = array('Game' => $game,
'Login' => $login,
'Password' => $password,
'Tool' => $tool,
'Version' => $version,
'Nation' => $nation,
'Packmask' => $packmask,
'PlayersGame' => true
);
$this->_auth_cb = array('xmlrpc_auth_cb');
$this->_bad = false;
$this->_bad_time = -1;
// in case webaccess URL connection was previously in error, ask to retry
$this->_webaccess->retry($this->_url);
// prepare to add requests
$this->_initRequest();
} // XmlrpcDB
// change the packmask value
function setPackmask($packmask = '') {
$this->_server['Packmask'] = $packmask;
} // setPackmask
// is the connection in recurrent error?
function isBad() {
return $this->_bad;
} // isBad
// get time since the error state was set
function badTime() {
return (time() - $this->_bad_time);
} // badTime
// stop the bad state: will try again at next RequestWait(),
// sendRequestsWait() or sendRequests()
function retry() {
$this->_bad = false;
$this->_bad_time = -1;
// set webaccess object to retry on that URL too
$this->_webaccess->retry($this->_url);
} // retry
// clear all requests, and get them if asked
function clearRequests($get_requests = false) {
if ($get_requests) {
$return = array($_requests, $_callbacks);
$this->_initRequest();
return $return;
}
$this->_initRequest();
} // clearRequests
// add a request
function addRequest($callback, $method) {
$args = func_get_args();
$callback = array_shift($args);
$method = array_shift($args);
return $this->addRequestArray($callback, $method, $args);
} // addRequest
// add a request
function addRequestArray($callback, $method, $args) {
$this->_callbacks[] = $callback;
$this->_requests[] = array('methodName' => $method, 'params' => $args);
return count($this->_requests) - 1;
} // addRequestArray
// send added requests, callbacks will be called when response come
function sendRequests() {
global $aseco;
if (count($this->_callbacks) > 1) {
$this->addRequest(null, 'dedimania.WarningsAndTTR');
$webdatas = $this->_makeXMLdatas();
$response = $this->_webaccess->request($this->_url,
array( array($this, '_callCB'), $this->_callbacks, $this->_requests),
$webdatas, true);
$this->_initRequest();
if ($response === false) {
if (!$this->_bad) {
$this->_bad = true;
$this->_bad_time = time();
}
if ($this->_debug > 2)
$aseco->console_text('XmlrpcDB->sendRequests - this' . CRLF . print_r($this, true));
return false;
}
}
return true;
} // sendRequests
// send added requests, wait response, then call callbacks
function sendRequestsWait() {
global $aseco;
if (count($this->_callbacks) > 1) {
$this->addRequest(null, 'dedimania.WarningsAndTTR');
$webdatas = $this->_makeXMLdatas();
$response = $this->_webaccess->request($this->_url,
null, $webdatas, true);
if ($response === false) {
if (!$this->_bad) {
$this->_bad = true;
$this->_bad_time = time();
}
if ($this->_debug > 0)
$aseco->console_text('XmlrpcDB->sendRequestsWait - this' . CRLF . print_r($this, true));
$this->_initRequest();
return false;
} else {
$this->_callCB($response, $this->_callbacks, $this->_requests);
$this->_initRequest();
}
}
return true;
} // sendRequestsWait
// send a request, wait response, and return the response
function RequestWait($method) {
$args = func_get_args();
$method = array_shift($args);
return $this->RequestWaitArray($method, $args);
} // RequestWait
// send a request, wait response, and return the response
function RequestWaitArray($method, $args) {
global $aseco;
if ($this->sendRequestsWait() === false) {
if (!$this->_bad) {
$this->_bad = true;
$this->_bad_time = time();
}
return false;
}
$reqnum = $this->addRequestArray(null, $method, $args);
$this->addRequest(null, 'dedimania.WarningsAndTTR');
$webdatas = $this->_makeXMLdatas();
$response = $this->_webaccess->request($this->_url, null, $webdatas, true);
if (isset($response['Message']) && is_string($response['Message'])) {
if ($this->_debug > 1)
$aseco->console_text('XmlrpcDB->RequestWaitArray() - response[Message]' . CRLF . print_r($response['Message'], true));
$xmlrpc_message = new IXR_Message($response['Message']);
if ($xmlrpc_message->parse() && $xmlrpc_message->messageType != 'fault') {
if ($this->_debug > 1) {
$aseco->console_text('XmlrpcDB->RequestWaitArray() - message' . CRLF . print_r($xmlrpc_message->message, true));
$aseco->console_text('XmlrpcDB->RequestWaitArray() - params' . CRLF . print_r($xmlrpc_message->params, true));
}
//$datas = array('methodName' => $xmlrpc_message->methodName, 'params' => $xmlrpc_message->params);
$datas = $this->_makeResponseDatas($xmlrpc_message->methodName, $xmlrpc_message->params, $this->_requests);
} else {
if ($this->_debug > 0)
$aseco->console_text('XmlrpcDB->RequestWaitArray() - message fault' . CRLF . print_r($xmlrpc_message->message, true));
$datas = array();
}
} else {
$datas = array();
}
if ($this->_debug > 0)
$aseco->console_text('XmlrpcDB->RequestWaitArray() - datas' . CRLF . print_r($datas, true));
if (isset($datas['params']) && isset($datas['params'][$reqnum])) {
$response['Data'] = $datas['params'][$reqnum];
$param_end = end($datas['params']);
if (isset($param_end['globalTTR']) && !isset($response['Data']['globalTTR']))
$response['Data']['globalTTR'] = $param_end['globalTTR'];
} else {
$response['Data'] = $datas;
}
if ($this->_debug > 0)
$aseco->console_text('XmlrpcDB->RequestWaitArray() - response[Data]' . CRLF . print_r($response['Data'], true));
$this->_initRequest();
return $response;
} // RequestWaitArray
// init the request and callback array
function _initRequest() {
$this->_callbacks = array();
$this->_requests = array();
$this->addRequest($this->_auth_cb, 'dedimania.Authenticate', $this->_server);
} // _initRequest
// make the xmlrpc string, encode it in base64, and pass it as value
// to xmlrpc URL post parameter
function _makeXMLdatas() {
global $aseco;
$xmlrpc_request = new IXR_RequestStd('system.multicall', $this->_requests);
if ($this->_debug > 1)
$aseco->console_text('XmlrpcDB->_makeXMLdatas() - getXml()' . CRLF . print_r($xmlrpc_request->getXml(), true));
return $xmlrpc_request->getXml();
} // _makeXMLdatas
function _callCB($response, $callbacks, $requests) {
global $aseco;
$globalTTR = 0;
if (isset($response['Message']) && is_string($response['Message'])) {
$xmlrpc_message = new IXR_Message($response['Message']);
if ($xmlrpc_message->parse() && $xmlrpc_message->messageType != 'fault') {
if ($this->_debug > 1)
$aseco->console_text('XmlrpcDB->_callCB() - message' . CRLF . print_r($xmlrpc_message->message, true));
//$datas = array('methodName' => $xmlrpc_message->methodName, 'params' => $xmlrpc_message->params);
$datas = $this->_makeResponseDatas($xmlrpc_message->methodName, $xmlrpc_message->params, $requests);
if (isset($datas['params']) && is_array($datas['params'])) {
$param_end = end($datas['params']);
if (isset($param_end['globalTTR']))
$globalTTR = $param_end['globalTTR'];
} else {
if ($this->_debug > 0)
$aseco->console_text('XmlrpcDB->_callCB() - message fault' . CRLF . print_r($xmlrpc_message->message, true));
$datas = array();
}
} else {
if ($this->_debug > 0)
$aseco->console_text('XmlrpcDB->_callCB() - message fault' . CRLF . print_r($xmlrpc_message->message, true));
$datas = array();
}
} else {
if (!isset($response['Error']) ||
(strpos($response['Error'], 'connection failed') === false && strpos($response['Error'], 'Request timeout') === false)) {
$infos = array('Url'=>$this->_url, 'Requests'=>$requests, 'Callbacks'=>$callbacks, 'Response'=>$response);
$serinfos = serialize($infos);
$aseco->console_text('XmlrpcDB->_callCB() - no response message:' . CRLF . $serinfos);
}
$datas = array();
}
for ($i = 0; $i < count($callbacks); $i++) {
if ($callbacks[$i] != null) {
$callback = $callbacks[$i][0];
if (isset($datas['params']) && isset($datas['params'][$i])) {
$response['Data'] = $datas['params'][$i];
if (!isset($response['Data']['globalTTR']))
$response['Data']['globalTTR'] = $globalTTR;
} else {
$response['Data'] = $datas;
}
$callbacks[$i][0] = $response;
call_user_func_array($callback, $callbacks[$i]);
}
}
} // _callCB
// build the datas array from XAseco or Dedimania server
// remove the first array level into params if needed
// add methodResponse name if needed
// rename sub responses params array from [0] to ['params'] if needed
function _makeResponseDatas($methodname, $params, $requests) {
global $aseco;
if (is_array($params) && count($params) == 1 && is_array($params[0]))
$params = $params[0];
if ($this->_debug > 2)
$aseco->console_text('XmlrpcDB->_makeResponseDatas() - requests' . CRLF . print_r($requests, true));
if ($this->_debug > 1)
$aseco->console_text('XmlrpcDB->_makeResponseDatas() - params' . CRLF . print_r($params, true));
if (is_array($params) && is_array($params[0]) && !isset($params[0]['methodResponse'])) {
$params2 = array();
foreach ($params as $key => $param) {
$errors = null;
if (isset($param['faultCode'])) {
$errors[] = array('Code' => $param['faultCode'], 'Message' => $param['faultString']);
}
if (isset($requests[$key]['methodName']))
$methodresponse = $requests[$key]['methodName'];
else
$methodresponse = 'Unknown';
$ttr = 0.000001;
if (isset($param[0]))
$param = $param[0];
else
$param = array();
$params2[$key] = array('methodResponse' => $methodresponse,
'params' => $param,
'errors' => $errors,
'TTR' => $ttr,
'globalTTR' => $ttr
);
if ($methodresponse == 'dedimania.WarningsAndTTR') {
if ($this->_debug > 1) {
$aseco->console_text('XmlrpcDB->_makeResponseDatas() - param' . CRLF . print_r($param, true));
$aseco->console_text('XmlrpcDB->_makeResponseDatas() - params2' . CRLF . print_r($params2, true));
}
$globalTTR = $param['globalTTR'];
foreach ($param['methods'] as $key3 => $param3) {
$key2 = 0;
while ($key2 < count($params2) && $params2[$key2]['methodResponse'] != $param3['methodName']) {
$params2[$key2]['globalTTR'] = $globalTTR;
$key2++;
}
if ($this->_debug > 1)
$aseco->console_text("XmlrpcDB->_makeResponseDatas() - key2=$key2 - key3=$key3 - param3" . CRLF . print_r($param3, true));
if ($key2 < count($params2)) {
$params2[$key2]['errors'] = $param3['errors'];
$params2[$key2]['TTR'] = $param3['TTR'];
$params2[$key2]['globalTTR'] = $globalTTR;
}
}
}
}
if ($this->_debug > 1)
$aseco->console_text('XmlrpcDB->_makeResponseDatas() - params2' . CRLF . print_r($params2, true));
return array('methodName' => $methodname, 'params' => $params2);
} else {
return array('methodName' => $methodname, 'params' => $params);
}
} // _makeResponseDatas
} // class XmlrpcDB
// Dedimania.Authenticate callback used to catch errors
function xmlrpc_auth_cb($response) {
global $aseco;
if (isset($response['Data']['errors']) && $response['Data']['errors'] != '') {
if (is_array($response['Data']['errors']))
$aseco->console('xmlrpc_auth_cb() - response[Data][errors]' . CRLF . print_r($response['Data']['errors'], true));
else
$aseco->console('xmlrpc_auth_cb() - response[Data][errors]' . CRLF . print_r($response, true));
}
} // xmlrpc_auth_cb
?>

View File

@ -1,136 +0,0 @@
<?php
/* vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2: */
/**
* Jfreu's plugin 0.13d
* Configuration settings.
* This file is included by jfreu.plugin.php or jfreu.lite.php, so don't
* list it in plugins.xml!
* Updated by Xymph
*/
//-> paths to config, vip/vip_team & bans files
$conf_file = 'plugins/jfreu/jfreu.config.xml';
$vips_file = 'plugins/jfreu/jfreu.vips.xml';
$bans_file = 'plugins/jfreu/jfreu.bans.xml';
//-> Server's base name: (ex: '$000Jfreu')
// Max. length: 26 chars (incl. colors & tags, and optional "TopXXX")
$servername = 'YOUR SERVER NAME';
//-> Word between the servername and the limit (usually " Top")
$top = ' $449TOP';
//-> Change the servername when the limit changes: "Servername TopXXX" (0 = OFF, 1 = ON)
$autochangename = 0;
//-> ranklimit: ranklimiting default state (0 = OFF, 1 = ON)
$ranklimit = 0;
//-> limit: ranklimit default value (when autorank is OFF)
$limit = 500000;
//-> spec ranklimit
$hardlimit = 1000000;
//-> autorank: autorank default state (0 = OFF, 1 = ON)
$autorank = 0;
//-> offset (average + offset = Auto-RankLimit)
$offset = 999;
//-> autorankminplayers (autorank disabled when not enough players)
$autorankminplayers = 10;
//-> autorankvip: include VIP/unSpec in autorank calculation (0 = OFF, 1 = ON)
$autorankvip = 0;
//-> kick hirank when server is full and new player arrives (0 = OFF, 1 = ON)
$kickhirank = 0;
//-> maxplayers value for kickhirank (must be less than server's <max_players>)
$maxplayers = 20;
//-> allow user /unspec vote (0 = OFF, 1 = ON)
$unspecvote = 1;
//-> player join/leave messages
$player_join = '{#server}>> {1}: {#highlite}{2}$z$s{#message} Nation: {#highlite}{3}{#message} Ladder: {#highlite}{4}';
$player_joins = '{#server}>> {1}: {#highlite}{2}$z$s{#message} Nation: {#highlite}{3}{#message} Ladder: {#highlite}{4}{#message} Server: {#highlite}{5}';
$player_left = '{#server}>> {#highlite}{1}$z$s{#message} has left the game. Played: {#highlite}{2}';
//-> random info messages at the end of the race (0 = OFF, 1 = in chat, 2 = in TMF message window)
$infomessages = 1;
//-> prefix for info messages
$message_start = '$z$s$ff0>> [$f00INFO$ff0] $fff';
//-> random information messages (if you add a message don't forget to change the number) (999 messages max :-P)
// $message1 = 'Jfreu\'s plugin: "http://reload.servegame.com/plugin/"';
$message1 = 'Information about and download of this XASECO on ' . XASECO_TMN;
$message2 = 'Use "/list" -> "/jukebox ##" to add a track in the jukebox.';
$message3 = 'Please don\'t sound your horn throughout the entire track.';
$message4 = 'When going AFK, please set your car to Spectator mode.';
$message5 = 'Don\'t use Enter to skip intros - instead use Space & Enter';
$message6 = 'For player & server info use the "/stats" and "/server" commands.';
$message7 = 'Looking for the name of this server? Use the "/server" command.';
$message8 = 'Use "/list nofinish" to find tracks you haven\'t completed yet, then /jukebox them!';
$message9 = 'Use "/list norank" to find tracks you aren\'t ranked on, then /jukebox them!';
$message10 = 'Can you beat the Gold time on all tracks? Use "/list nogold" to find out!';
$message11 = 'Can you beat the Author time on all tracks? Use "/list noauthor" to find out!';
$message12 = 'Wondering which tracks you haven\'t played recently? Use "/list norecent" to find out!';
$message13 = 'Use the "/best" & "/worst" commands to find your best and worst records!';
$message14 = 'Use the "/clans" & "/topclans" commands to see clan members and ranks!';
$message15 = 'Use the "/ranks" commands to see the server ranks of all online players!';
$message16 = 'Who is the most victorious player? Use "/topwins" to find out!';
$message17 = 'Who has the most ranked records? Use "/toprecs" to find out!';
$message18 = 'Wondering what tracks were played recently? Use the "/history" command.';
$message19 = 'Looking for the next better ranked record to beat? Use "/nextrec"!';
$message20 = 'Find the difference between your personal best and the track record with the "/diffrec" command!';
$message21 = 'Check how many records were driven on the current track with the "/newrecs" command!';
$message22 = 'Check how many records, and the 3 best ones, you have with the "/summary" command!';
$message23 = 'Who has the most top-3 ranked records? Use "/topsums" to find out!';
$message24 = 'Jukeboxed the wrong track? Use "/jukebox drop" to remove it!';
$message25 = 'Forgot what someone said? Use "/chatlog" to check the chat history!';
$message26 = 'Forgot what someone pm-ed you? Use "/pmlog" to check your PM history!';
$message27 = 'Looking for the next better ranked player to beat? Use "/nextrank"!';
$message28 = 'Use "/list newest <#>" to find the newest tracks added to the server, then /jukebox them!';
$message29 = 'Find the longest and shortest tracks with the "/list longest / shortest" commands!';
$message30 = 'Use "/mute" and "/unmute" to mute / unmute other players, and "/mutelist" to list them!';
$message31 = 'Wondering when a player was last online? Use "/laston <login>" to find out!';
$message32 = 'Looking for any player\'s world stats? Use the "/statsall <login>" command!';
$message33 = 'Use checkpoints tracking in Rounds/Team/Cup modes with the "/cps" command!';
$message34 = 'Find the TMX info & records for a track with the "/tmxinfo" & "/tmxrecs" commands!';
$message35 = 'Looking for the name of the current track\'s song? Use the "/song" command!';
$message36 = 'Looking for the name of the current track\'s mod? Use the "/mod" command!';
$message37 = 'Use the "/style" command to select your personal window style!';
$message38 = 'Use the "/recpanel" command to select your personal records panel!';
$message39 = 'Use the "/votepanel" command to select your personal vote panel!';
$message40 = 'Find out all about the Dedimania world records system with "/helpdedi"!';
$message41 = 'Check out the XASECO[2] site at ' . XASECO_ORG . ' !';
global $feature_votes;
if ($feature_votes) {
$message42 = 'Find out all about the chat-based voting commands with "/helpvote"!';
}
if (function_exists('send_window_message')) {
$message43 = 'Missed a system message? Use "/msglog" to check the message history!';
}
//-> Badwords checking (0 = OFF, 1 = ON)
$badwords = 0;
//-> Badwords banning (0 = OFF, 1 = ON)
$badwordsban = 0;
//-> Number of badwords allowed
$badwordsnum = 3;
//-> Banning period (minutes)
$badwordstime = 10;
//-> Badwords to check for
$badwordslist = array(
'putain','ptain','klote','kIote','kanker','kenker',
'arschl','wichs','fick','fikk','salop','siktirgit','gvd',
'hitler','nutte','dick','cock','faitchier','bordel','shit',
'encul','sucks','a.q','conerie','scheise','scheiße','scheis',
'baskasole','cocugu','kodugumun','cazo','hoer','bitch',
'penis','fotze','maul','frese','pizda','gay','fuck','tyfus',
'sugi','cacat','pisat','labagiu','gaozar','muist','orospu',
'pédé','cunt','godve','godfe','kut','kudt','lul','iui');
//-> novote (auto-cancel votes) (0 = OFF, 1 = ON)
$novote = 0;
?>

View File

@ -1,22 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<settings>
<!-- MySQL Server Settings -->
<mysql_server>--$DB_HOST--</mysql_server>
<mysql_login>--$DB_LOGIN--</mysql_login>
<mysql_password>--$DB_LOGIN_PASSWORD--</mysql_password>
<mysql_database>--$DB_NAME--</mysql_database>
<!-- Do you want XASECO to display newly driven records? -->
<display>true</display>
<!-- Limit the highest record that will be displayed to all? -->
<!-- If lower than $maxrecs, records above this limit will -->
<!-- only be displayed to the pertaining player -->
<limit>50</limit>
<messages>
<!-- record messages -->
<record_new>{#server}>> {#highlite}{1}{#record} secured his/her {#rank}{2}{#record}. Local Record! {3}: {#highlite}{4}{#record} $n({#rank}{5}{#highlite}{6}{#record})</record_new>
<record_equal>{#server}>> {#highlite}{1}{#record} equaled his/her {#rank}{2}{#record}. Local Record! {3}: {#highlite}{4}</record_equal>
<record_new_rank>{#server}>> {#highlite}{1}{#record} gained the {#rank}{2}{#record}. Local Record! {3}: {#highlite}{4}{#record} $n({#rank}{5}{#highlite}{6}{#record})</record_new_rank>
<record_first>{#server}>> {#highlite}{1}{#record} claimed the {#rank}{2}{#record}. Local Record! {3}: {#highlite}{4}</record_first>
</messages>
</settings>

View File

@ -1,56 +0,0 @@
-- Database: `aseco`
--
-- --------------------------------------------------------
--
-- Tablestructure for Table `challenges`
--
CREATE TABLE IF NOT EXISTS `challenges` (
`Id` mediumint(9) NOT NULL auto_increment,
`Uid` varchar(27) NOT NULL default '',
`Name` varchar(100) NOT NULL default '',
`Author` varchar(30) NOT NULL default '',
`Environment` varchar(10) NOT NULL default '',
PRIMARY KEY (`Id`),
UNIQUE KEY `Uid` (`Uid`)
) ENGINE=MyISAM;
-- --------------------------------------------------------
--
-- Tablestructure for Table `players`
--
CREATE TABLE IF NOT EXISTS `players` (
`Id` mediumint(9) NOT NULL auto_increment,
`Login` varchar(50) NOT NULL default '',
`Game` varchar(3) NOT NULL default '',
`NickName` varchar(100) NOT NULL default '',
`Nation` varchar(3) NOT NULL default '',
`UpdatedAt` datetime NOT NULL default '1970-01-01 00:00:00',
`Wins` mediumint(9) NOT NULL default 0,
`TimePlayed` int(10) unsigned NOT NULL default 0,
`TeamName` char(60) NOT NULL default '',
PRIMARY KEY (`Id`),
UNIQUE KEY `Login` (`Login`),
KEY `Game` (`Game`)
) ENGINE=MyISAM;
-- --------------------------------------------------------
--
-- Tablestructure for Table `records`
--
CREATE TABLE IF NOT EXISTS `records` (
`Id` int(11) NOT NULL auto_increment,
`ChallengeId` mediumint(9) NOT NULL default 0,
`PlayerId` mediumint(9) NOT NULL default 0,
`Score` int(11) NOT NULL default 0,
`Date` datetime NOT NULL default '1970-01-01 00:00:00',
`Checkpoints` text NOT NULL,
PRIMARY KEY (`Id`),
UNIQUE KEY `PlayerId` (`PlayerId`,`ChallengeId`),
KEY `ChallengeId` (`ChallengeId`)
) ENGINE=MyISAM;

View File

@ -1,18 +0,0 @@
-- Database: `aseco`
--
-- --------------------------------------------------------
--
-- Tablestructure for Table `players_extra`
--
CREATE TABLE IF NOT EXISTS `players_extra` (
`playerID` mediumint(9) NOT NULL default 0,
`cps` smallint(3) NOT NULL default -1,
`dedicps` smallint(3) NOT NULL default -1,
`donations` mediumint(9) NOT NULL default 0,
`style` varchar(20) NOT NULL default '',
`panels` varchar(255) NOT NULL default '',
PRIMARY KEY (`playerID`),
KEY `donations` (`donations`)
) ENGINE=MyISAM;

View File

@ -1,47 +0,0 @@
-- Database: `aseco`
--
-- --------------------------------------------------------
--
-- Tablestructure for Table `rs_karma`
--
CREATE TABLE IF NOT EXISTS `rs_karma` (
`Id` int(11) NOT NULL auto_increment,
`ChallengeId` mediumint(9) NOT NULL default 0,
`PlayerId` mediumint(9) NOT NULL default 0,
`Score` tinyint(4) NOT NULL default 0,
PRIMARY KEY (`Id`),
UNIQUE KEY `PlayerId` (`PlayerId`,`ChallengeId`),
KEY `ChallengeId` (`ChallengeId`)
) ENGINE=MyISAM;
-- --------------------------------------------------------
--
-- Tablestructure for Table `rs_rank`
--
CREATE TABLE IF NOT EXISTS `rs_rank` (
`playerID` mediumint(9) NOT NULL default 0,
`avg` float NOT NULL default 0,
KEY `playerID` (`playerID`)
) ENGINE=MyISAM;
-- --------------------------------------------------------
--
-- Tablestructure for Table `rs_times`
--
CREATE TABLE IF NOT EXISTS `rs_times` (
`ID` int(11) NOT NULL auto_increment,
`challengeID` mediumint(9) NOT NULL default 0,
`playerID` mediumint(9) NOT NULL default 0,
`score` int(11) NOT NULL default 0,
`date` int(10) unsigned NOT NULL default 0,
`checkpoints` text NOT NULL,
PRIMARY KEY (`ID`),
KEY `playerID` (`playerID`,`challengeID`),
KEY `challengeID` (`challengeID`)
) ENGINE=MyISAM;

View File

@ -1,100 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<matchsave_settings>
<!-- use the following section to force known logins to a specific team -->
<teamforce_teams>
<team>
<name>XXX</name>
<logins>
<login>xxx-max</login>
<login>siteguru</login>
<!-- ... add as many logins as you like -->
</logins>
</team>
<!-- ... add as many teams as you like -->
<default_team_name>Challengers</default_team_name> <!-- This is the team where all other players end up when teamforce is enabled -->
</teamforce_teams>
<!-- now the design stuff, colors and so on -->
<str_points_this_round>$i$0AFPoints This Round</str_points_this_round>
<str_points_this_match>$i$AF0Points This Match</str_points_this_match>
<col_chat_plugin>{#emotic}</col_chat_plugin>
<col_chat_default>{#message}</col_chat_default>
<col_chat_highlite>{#server}</col_chat_highlite>
<col_window_default>$000</col_window_default>
<col_window_highlite>$f00</col_window_highlite>
<col_window_highlite_team>$0af</col_window_highlite_team>
<col_window_special>$i$n</col_window_special>
<col_window_separator>$fff</col_window_separator>
<col_window_hint>$n$888</col_window_hint>
<col_round_points>{#highlite}</col_round_points>
<col_match_points>{#highlite}</col_match_points>
<col_teamname_round>$0af</col_teamname_round>
<col_teamname_round_highlite>{#server}</col_teamname_round_highlite>
<col_teamname_match>$af0</col_teamname_match>
<col_teamname_match_highlite>{#server}</col_teamname_match_highlite>
<!-- help messages - they show up when the points are displayed, but only if you activate them -->
<help_enabled>True</help_enabled>
<!-- you can add more random messages (these will only show up if the player does not belong to a team-->
<hlp_no_team>{#server}To join a team type "{#welcome}/team {#message}yourteamname{#server}"</hlp_no_team>
<hlp_random_msg_no_team>{#server}See all team options by typing "{#welcome}/team {#message}help{#server}"</hlp_random_msg_no_team>
<hlp_random_msg_no_team>{#server}Join a team and chat with your teammates via "{#welcome}/tc {#message}Hello Teammates{#server}"</hlp_random_msg_no_team>
<hlp_random_msg_no_team>{#server}See the current match standings by typing "{#welcome}/standings{#server}"</hlp_random_msg_no_team>
<!-- you can add more random messages (these will only show up if the player already belongs to a team-->
<hlp_change_team>{#server}Change your teamname with "{#welcome}/team {#message}yourteamname{#server}"</hlp_change_team>
<hlp_random_msg>{#server}See all team options by typing "{#welcome}/team {#message}help{#server}"</hlp_random_msg>
<hlp_random_msg>{#server}See the current match standings by typing "{#welcome}/standings{#server}"</hlp_random_msg>
<hlp_random_msg>{#server}Chat with your teammates by typing "{#welcome}/tc {#message}Hello Teammates{#server}"</hlp_random_msg>
<!-- last but not least, edit the startup configuration below -->
<show_teamname_changes_to_public>true</show_teamname_changes_to_public> <!-- Determines whether a teamname change will be shown to all players or not (affects only the /teamname or /team command)-->
<admin_can_read_teamchat>True</admin_can_read_teamchat> <!-- If true admins can read the teamchat of other teams -->
<teamchat_enabled>true</teamchat_enabled> <!-- Enable or disable teamchat -->
<teamchat_prefix>{#highlite}[Team]</teamchat_prefix> <!-- Prefix shown in front of each teamchat line -->
<team_force_enabled>False</team_force_enabled> <!-- Determines whether all players are forced to be in a team -->
<others_can_score>True</others_can_score> <!-- Determines whether teamless players' scores are tracked or not -->
<teamname_colors_allowed>False</teamname_colors_allowed> <!-- Determines if the teamnames are allowed to be color coded -->
<teamname_max_length>12</teamname_max_length> <!-- Determines how long a teamname is allowed to be -->
<match_results_timeout>5000</match_results_timeout> <!-- Match Result window timeout in milliseconds -->
<save_to_db>True</save_to_db> <!-- Shall the teamnames be saved to a database -->
<save_to_file>True</save_to_file> <!-- Shall the results be written to files -->
<!-- some filenames -->
<template_name>html.tpl</template_name>
<output_name>race_results.html</output_name>
<output_name_last>race_results_last.html</output_name_last>
<output_name_match>match_results.html</output_name_match>
<!-- path to your playlist directory, enable one of these two: -->
<!-- Windows -->
<!-- <playlist_dir>D:/TMDedicated/GameData/Tracks/MatchSettings</playlist_dir> -->
<!-- Linux -->
<playlist_dir>/home/tmf/TMF/GameData/Tracks/MatchSettings</playlist_dir>
<!-- basic settings -->
<max_player_count>16</max_player_count>
<format_date>Y-m-d</format_date>
<format_time>H:i</format_time>
<points>10, 8, 6, 4, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0</points>
<!-- enable the whole plugin -->
<enabled>True</enabled>
</matchsave_settings>

View File

@ -1,55 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<settings>
<!-- override a track's custom music? -->
<override_track>False</override_track>
<!-- automatically load next song upon next track? -->
<auto_nextsong>True</auto_nextsong>
<!-- automatically shuffle songs at start-up & reload? -->
<auto_shuffle>False</auto_shuffle>
<!-- allow jukeboxing songs by players? -->
<allow_jukebox>True</allow_jukebox>
<!-- strip subdirs when showing song files? -->
<strip_subdirs>False</strip_subdirs>
<!-- strip extensions when showing song files? -->
<strip_exts>False</strip_exts>
<!-- read tags from all .ogg songs? -->
<cache_tags>True</cache_tags>
<!-- use read-only cache file? -->
<cache_readonly>False</cache_readonly>
<!-- filename in main directory to store tags -->
<cache_file>musictagscache.xml</cache_file>
<!-- full http link to directory holding the song files -->
<!-- http server must allow direct download of those files -->
<!-- OR a path below the server's GameData directory (e.g. -->
<!-- "Music/") which allows serving songs without webserver -->
<music_server>YOUR_SERVER_URL</music_server>
<!-- list of song files at your music server in .ogg or .mux -->
<!-- avoid spaces and special characters in the filenames and -->
<!-- http link, and observe correct upper/lowercase characters -->
<song_files>
<song>YOUR_FIRST_SONG.ogg</song>
<song>YOUR_SECOND_SONG.mux</song>
<song>YOUR_THIRD_SONG.ogg</song>
<!-- and so on -->
</song_files>
<messages>
<current>{#server}> {#music}The current song is: {#highlite}{1}</current>
<next>{#server}>> {#music}{1}$z$s {#highlite}{2}$z$s{#music} loaded the next song: {#highlite}{3}</next>
<reloaded>{#server}>> {#music}{1}$z$s {#highlite}{2}$z$s{#music} reloaded music config and cleared jukebox!</reloaded>
<sorted>{#server}>> {#music}{1}$z$s {#highlite}{2}$z$s{#music} sorted song list and cleared jukebox!</sorted>
<shuffled>{#server}>> {#music}{1}$z$s {#highlite}{2}$z$s{#music} shuffled song list and cleared jukebox!</shuffled>
<jukebox>{#server}>> {#highlite}{1}{#music} jukeboxed song: {#highlite}{2}</jukebox>
<jukebox_already>{#server}> {#music}You already have a song in the jukebox! Wait till it's been played before adding another.</jukebox_already>
<jukebox_dupl>{#server}> {#music}This song has already been added to the jukebox, pick another one.</jukebox_dupl>
<jukebox_notfound>{#server}> {#music}Song_ID not found - Type {#highlite}/music list{#music} to see all songs.</jukebox_notfound>
<jukebox_drop>{#server}>> {#music}Player {#highlite}{1}{#music} dropped his/her song {#highlite}{2}{#music} from jukebox!</jukebox_drop>
<jukebox_nodrop>{#server}> {#music}You don't have a song in the jukebox, use {#highlite}/music Song_ID{#music} to add one...</jukebox_nodrop>
<jukebox_empty>{#server}> {#music}No songs in the jukebox, use {#highlite}/music Song_ID{#music} to add one...</jukebox_empty>
<no_jukebox>{#server}> {#highlite}/music #{#music} is not currently enabled on this server.</no_jukebox>
<shutdown>{#server}>> {#music}{1}$z$s {#highlite}{2}$z$s{#music} disabled server music!</shutdown>
</messages>
</settings>

View File

@ -1,34 +0,0 @@
Panels
======
This directory holds Admin, Donate, Records and Vote panel templates,
managed by plugin.panels.php.
Templates define the complete ManiaLink panel with position, size and
fonts, so you have full control to develop custom panels.
To create a new template, copy an existing one to a new filename and
edit that, as the existing set will be overwritten in future releases.
Use ManiaLink http://smurf1.free.fr/mle/index.xml
and webpage http://smurf1.free.fr/mle/list.php
to select styles and fonts. Note that not every (sub)style and font
fits everywhere due to size variations.
New Admin templates must stick to manialink id="3" and preserve
action="21" through action="27" for the buttons.
New Donate templates must stick to manialink id="6" and preserve
action="30" through action="36" for the buttons.
New Record templates must stick to manialink id="4" and preserve the
mapping of text="%PB%" to action="7", "%LCL%" to "8", "%DED%" to "9"
and "%TMX%" to "10".
New Vote templates must stick to manialink id="5" and preserve
action="18" for the Yes button and action="19" for the No button.
If you create a nice template for any panel that's sufficiently distinct
from the standard ones, send it to me and I might include it in the
next XAseco release. :)
Xymph

View File

@ -1,10 +0,0 @@
<manialink id="3"><frame posn="48.1 -28.5 0">
<quad sizen="16 3.5" style="Bgs1InRace" substyle="NavButton"/>
<quad posn="0.8 -0.8 2" sizen="2 2.1" style="Icons64x64_1" substyle="ClipRewind" action="21"/>
<quad posn="2.9 -0.8 2" sizen="2 2.1" style="Icons64x64_1" substyle="ClipPause" action="22"/>
<quad posn="5.0 -0.8 2" sizen="2 2.1" style="Icons64x64_1" substyle="ClipPlay" action="23"/>
<quad posn="7.1 -0.8 2" sizen="2 2.1" style="Icons64x64_1" substyle="Refresh" action="24"/>
<quad posn="9.0 -0.2 2" sizen="2.4 3.3" style="Icons64x64_1" substyle="ArrowGreen" action="25"/>
<quad posn="10.8 -0.2 2" sizen="2.4 3.3" style="Icons64x64_1" substyle="ArrowRed" action="26"/>
<quad posn="12.9 -0.3 2" sizen="2.4 3" style="Icons64x64_1" substyle="Buddy" action="27"/>
</frame></manialink>

View File

@ -1,10 +0,0 @@
<manialink id="3"><frame posn="34.1 -27.8 0">
<quad sizen="30 4.2" style="Bgs1InRace" substyle="NavButton"/>
<quad posn="1 -0.6 2" sizen="3 3" style="Icons64x64_1" substyle="ClipRewind" action="21"/>
<quad posn="5 -0.6 2" sizen="3 3" style="Icons64x64_1" substyle="ClipPause" action="22"/>
<quad posn="9 -0.6 2" sizen="3 3" style="Icons64x64_1" substyle="ClipPlay" action="23"/>
<quad posn="13 -0.6 2" sizen="3 3.1" style="Icons64x64_1" substyle="Refresh" action="24"/>
<quad posn="17 -0.2 2" sizen="3.5 4" style="Icons64x64_1" substyle="ArrowGreen" action="25"/>
<quad posn="21 -0.2 2" sizen="3.5 4" style="Icons64x64_1" substyle="ArrowRed" action="26"/>
<quad posn="25.2 -0.2 2" sizen="3.5 4" style="Icons64x64_1" substyle="Buddy" action="27"/>
</frame></manialink>

View File

@ -1,10 +0,0 @@
<manialink id="3"><frame posn="-56 -29.2 0">
<quad sizen="16 3.5" style="Bgs1InRace" substyle="NavButton"/>
<quad posn="0.8 -0.8 2" sizen="2 2.1" style="Icons64x64_1" substyle="ClipRewind" action="21"/>
<quad posn="2.9 -0.8 2" sizen="2 2.1" style="Icons64x64_1" substyle="ClipPause" action="22"/>
<quad posn="5.0 -0.8 2" sizen="2 2.1" style="Icons64x64_1" substyle="ClipPlay" action="23"/>
<quad posn="7.1 -0.8 2" sizen="2 2.1" style="Icons64x64_1" substyle="Refresh" action="24"/>
<quad posn="9.0 -0.2 2" sizen="2.4 3.3" style="Icons64x64_1" substyle="ArrowGreen" action="25"/>
<quad posn="10.8 -0.2 2" sizen="2.4 3.3" style="Icons64x64_1" substyle="ArrowRed" action="26"/>
<quad posn="12.9 -0.3 2" sizen="2.4 3" style="Icons64x64_1" substyle="Buddy" action="27"/>
</frame></manialink>

View File

@ -1,10 +0,0 @@
<manialink id="3"><frame posn="-56 -28.5 0">
<quad sizen="30 4.2" style="Bgs1InRace" substyle="NavButton"/>
<quad posn="1 -0.6 2" sizen="3 3" style="Icons64x64_1" substyle="ClipRewind" action="21"/>
<quad posn="5 -0.6 2" sizen="3 3" style="Icons64x64_1" substyle="ClipPause" action="22"/>
<quad posn="9 -0.6 2" sizen="3 3" style="Icons64x64_1" substyle="ClipPlay" action="23"/>
<quad posn="13 -0.6 2" sizen="3 3.1" style="Icons64x64_1" substyle="Refresh" action="24"/>
<quad posn="17 -0.2 2" sizen="3.5 4" style="Icons64x64_1" substyle="ArrowGreen" action="25"/>
<quad posn="21 -0.2 2" sizen="3.5 4" style="Icons64x64_1" substyle="ArrowRed" action="26"/>
<quad posn="25.2 -0.2 2" sizen="3.5 4" style="Icons64x64_1" substyle="Buddy" action="27"/>
</frame></manialink>

View File

@ -1,10 +0,0 @@
<manialink id="3"><frame posn="54.4 -33.5 0">
<quad sizen="10.4 6.5" style="Bgs1InRace" substyle="NavButton"/>
<quad posn="0.8 -0.8 2" sizen="2 2.1" style="Icons64x64_1" substyle="ClipRewind" action="21"/>
<quad posn="2.9 -0.8 2" sizen="2 2.1" style="Icons64x64_1" substyle="ClipPause" action="22"/>
<quad posn="5.0 -0.8 2" sizen="2 2.1" style="Icons64x64_1" substyle="ClipPlay" action="23"/>
<quad posn="7.1 -0.8 2" sizen="2 2.1" style="Icons64x64_1" substyle="Refresh" action="24"/>
<quad posn="1.0 -2.9 2" sizen="2.5 3.4" style="Icons64x64_1" substyle="ArrowGreen" action="25"/>
<quad posn="3.5 -2.9 2" sizen="2.5 3.4" style="Icons64x64_1" substyle="ArrowRed" action="26"/>
<quad posn="6.6 -3.0 2" sizen="2.3 3" style="Icons64x64_1" substyle="Buddy" action="27"/>
</frame></manialink>

View File

@ -1,11 +0,0 @@
<!-- admin panel made by nouseforname -->
<manialink id="3"><frame posn="48.6 -35 5">
<quad sizen="16 3.5" style="Bgs1InRace" substyle="NavButton"/>
<quad posn="0.8 -0.8 2" sizen="2 2.1" style="Icons64x64_1" substyle="ClipRewind" action="21"/>
<quad posn="2.9 -0.8 2" sizen="2 2.1" style="Icons64x64_1" substyle="ClipPause" action="22"/>
<quad posn="5.0 -0.8 2" sizen="2 2.1" style="Icons64x64_1" substyle="ClipPlay" action="23"/>
<quad posn="7.1 -0.8 2" sizen="2 2.1" style="Icons64x64_1" substyle="Refresh" action="24"/>
<quad posn="9.0 -0.2 2" sizen="2.4 3.3" style="Icons64x64_1" substyle="ArrowGreen" action="25"/>
<quad posn="10.8 -0.2 2" sizen="2.4 3.3" style="Icons64x64_1" substyle="ArrowRed" action="26"/>
<quad posn="12.8 -0.3 2" sizen="2.4 3" style="Icons64x64_1" substyle="Buddy" action="27"/>
</frame></manialink>

View File

@ -1,10 +0,0 @@
<manialink id="3"><frame posn="-33.5 -45.6 0">
<quad sizen="21.8 2.5" style="Bgs1InRace" substyle="NavButton"/>
<quad posn="1 -0.4 2" sizen="1.7 1.7" style="Icons64x64_1" substyle="ClipRewind" action="21"/>
<quad posn="4 -0.4 2" sizen="1.7 1.7" style="Icons64x64_1" substyle="ClipPause" action="22"/>
<quad posn="7 -0.4 2" sizen="1.7 1.7" style="Icons64x64_1" substyle="ClipPlay" action="23"/>
<quad posn="10 -0.4 2" sizen="1.7 1.8" style="Icons64x64_1" substyle="Refresh" action="24"/>
<quad posn="13 0.1 2" sizen="2.1 2.8" style="Icons64x64_1" substyle="ArrowGreen" action="25"/>
<quad posn="16 0.1 2" sizen="2.1 2.8" style="Icons64x64_1" substyle="ArrowRed" action="26"/>
<quad posn="19.1 -0.2 2" sizen="1.8 2.1" style="Icons64x64_1" substyle="Buddy" action="27"/>
</frame></manialink>

View File

@ -1,10 +0,0 @@
<manialink id="3"><frame posn="-7.9 -34.9 0">
<quad sizen="16 3.5" style="Bgs1InRace" substyle="NavButton"/>
<quad posn="0.8 -0.8 2" sizen="2 2.1" style="Icons64x64_1" substyle="ClipRewind" action="21"/>
<quad posn="2.9 -0.8 2" sizen="2 2.1" style="Icons64x64_1" substyle="ClipPause" action="22"/>
<quad posn="5.0 -0.8 2" sizen="2 2.1" style="Icons64x64_1" substyle="ClipPlay" action="23"/>
<quad posn="7.1 -0.8 2" sizen="2 2.1" style="Icons64x64_1" substyle="Refresh" action="24"/>
<quad posn="9.0 -0.2 2" sizen="2.4 3.3" style="Icons64x64_1" substyle="ArrowGreen" action="25"/>
<quad posn="10.8 -0.2 2" sizen="2.4 3.3" style="Icons64x64_1" substyle="ArrowRed" action="26"/>
<quad posn="12.9 -0.3 2" sizen="2.4 3" style="Icons64x64_1" substyle="Buddy" action="27"/>
</frame></manialink>

View File

@ -1,10 +0,0 @@
<manialink id="3"><frame posn="-11.4 -34.2 0">
<quad sizen="23 4.2" style="Bgs1InRace" substyle="NavButton"/>
<quad posn="1 -0.6 2" sizen="3 3" style="Icons64x64_1" substyle="ClipRewind" action="21"/>
<quad posn="4 -0.6 2" sizen="3 3" style="Icons64x64_1" substyle="ClipPause" action="22"/>
<quad posn="7 -0.6 2" sizen="3 3" style="Icons64x64_1" substyle="ClipPlay" action="23"/>
<quad posn="10 -0.6 2" sizen="3 3.1" style="Icons64x64_1" substyle="Refresh" action="24"/>
<quad posn="13 -0.1 2" sizen="3.5 4" style="Icons64x64_1" substyle="ArrowGreen" action="25"/>
<quad posn="16 -0.1 2" sizen="3.5 4" style="Icons64x64_1" substyle="ArrowRed" action="26"/>
<quad posn="19.2 -0.2 2" sizen="3.2 3.5" style="Icons64x64_1" substyle="Buddy" action="27"/>
</frame></manialink>

View File

@ -1,10 +0,0 @@
<manialink id="3"><frame posn="-64.8 37.1 0">
<quad sizen="14.1 3.5" style="Bgs1InRace" substyle="NavButton"/>
<quad posn="1.1 -0.8 2" sizen="1.7 1.8" style="Icons64x64_1" substyle="ClipRewind" action="21"/>
<quad posn="3.0 -0.8 2" sizen="1.7 1.8" style="Icons64x64_1" substyle="ClipPause" action="22"/>
<quad posn="4.9 -0.8 2" sizen="1.7 1.8" style="Icons64x64_1" substyle="ClipPlay" action="23"/>
<quad posn="6.7 -0.8 2" sizen="1.7 1.8" style="Icons64x64_1" substyle="Refresh" action="24"/>
<quad posn="8.5 -0.4 2" sizen="1.9 2.6" style="Icons64x64_1" substyle="ArrowGreen" action="25"/>
<quad posn="10.1 -0.4 2" sizen="1.9 2.6" style="Icons64x64_1" substyle="ArrowRed" action="26"/>
<quad posn="11.9 -0.4 2" sizen="1.8 2.4" style="Icons64x64_1" substyle="Buddy" action="27"/>
</frame></manialink>

View File

@ -1,10 +0,0 @@
<manialink id="3"><frame posn="-64.8 37.1 0">
<quad sizen="14.1 3.5" style="Bgs1" substyle="NavButton"/>
<quad posn="1.1 -0.8 2" sizen="1.7 1.8" style="Icons64x64_1" substyle="ClipRewind" action="21"/>
<quad posn="3.0 -0.8 2" sizen="1.7 1.8" style="Icons64x64_1" substyle="ClipPause" action="22"/>
<quad posn="4.9 -0.8 2" sizen="1.7 1.8" style="Icons64x64_1" substyle="ClipPlay" action="23"/>
<quad posn="6.7 -0.8 2" sizen="1.7 1.8" style="Icons64x64_1" substyle="Refresh" action="24"/>
<quad posn="8.5 -0.4 2" sizen="1.9 2.6" style="Icons64x64_1" substyle="ArrowGreen" action="25"/>
<quad posn="10.1 -0.4 2" sizen="1.9 2.6" style="Icons64x64_1" substyle="ArrowRed" action="26"/>
<quad posn="11.9 -0.4 2" sizen="1.8 2.4" style="Icons64x64_1" substyle="Buddy" action="27"/>
</frame></manialink>

View File

@ -1,10 +0,0 @@
<manialink id="3"><frame posn="-64.8 5.5 0">
<quad sizen="4.6 29.6" style="Bgs1InRace" substyle="NavButton"/>
<quad posn="0.9 -1 2" sizen="3 3" style="Icons64x64_1" substyle="ClipRewind" action="21"/>
<quad posn="1.0 -5 2" sizen="3 3" style="Icons64x64_1" substyle="ClipPause" action="22"/>
<quad posn="1.0 -9 2" sizen="3 3" style="Icons64x64_1" substyle="ClipPlay" action="23"/>
<quad posn="1.0 -13 2" sizen="3 3.1" style="Icons64x64_1" substyle="Refresh" action="24"/>
<quad posn="0.8 -16 2" sizen="3.4 5" style="Icons64x64_1" substyle="ArrowGreen" action="25"/>
<quad posn="0.8 -20 2" sizen="3.4 5" style="Icons64x64_1" substyle="ArrowRed" action="26"/>
<quad posn="1.0 -25 2" sizen="3.2 4" style="Icons64x64_1" substyle="Buddy" action="27"/>
</frame></manialink>

View File

@ -1,10 +0,0 @@
<manialink id="3"><frame posn="60.1 5.5 0">
<quad sizen="4.6 29.6" style="Bgs1InRace" substyle="NavButton"/>
<quad posn="0.6 -1 2" sizen="3 3" style="Icons64x64_1" substyle="ClipRewind" action="21"/>
<quad posn="0.7 -5 2" sizen="3 3" style="Icons64x64_1" substyle="ClipPause" action="22"/>
<quad posn="0.7 -9 2" sizen="3 3" style="Icons64x64_1" substyle="ClipPlay" action="23"/>
<quad posn="0.6 -13 2" sizen="3 3.1" style="Icons64x64_1" substyle="Refresh" action="24"/>
<quad posn="0.5 -16 2" sizen="3.4 5" style="Icons64x64_1" substyle="ArrowGreen" action="25"/>
<quad posn="0.5 -20 2" sizen="3.4 5" style="Icons64x64_1" substyle="ArrowRed" action="26"/>
<quad posn="0.6 -25 2" sizen="3.2 4" style="Icons64x64_1" substyle="Buddy" action="27"/>
</frame></manialink>

View File

@ -1,10 +0,0 @@
<manialink id="3"><frame posn="-12.1 44.2 0">
<quad sizen="16 3.5" style="Bgs1InRace" substyle="NavButton"/>
<quad posn="0.8 -0.8 2" sizen="2 2" style="Icons64x64_1" substyle="ClipRewind" action="21"/>
<quad posn="2.9 -0.8 2" sizen="2 2" style="Icons64x64_1" substyle="ClipPause" action="22"/>
<quad posn="5.0 -0.8 2" sizen="2 2" style="Icons64x64_1" substyle="ClipPlay" action="23"/>
<quad posn="7.1 -0.8 2" sizen="2 2.1" style="Icons64x64_1" substyle="Refresh" action="24"/>
<quad posn="9.0 -0.2 2" sizen="2.4 3.3" style="Icons64x64_1" substyle="ArrowGreen" action="25"/>
<quad posn="10.8 -0.2 2" sizen="2.4 3.3" style="Icons64x64_1" substyle="ArrowRed" action="26"/>
<quad posn="13.0 -0.3 2" sizen="2.4 3" style="Icons64x64_1" substyle="Buddy" action="27"/>
</frame></manialink>

View File

@ -1,10 +0,0 @@
<manialink id="3"><frame posn="-12.1 44.2 0">
<quad sizen="23 4.2" style="Bgs1InRace" substyle="NavButton"/>
<quad posn="1 -0.6 2" sizen="3 3" style="Icons64x64_1" substyle="ClipRewind" action="21"/>
<quad posn="4 -0.6 2" sizen="3 3" style="Icons64x64_1" substyle="ClipPause" action="22"/>
<quad posn="7 -0.6 2" sizen="3 3" style="Icons64x64_1" substyle="ClipPlay" action="23"/>
<quad posn="10 -0.6 2" sizen="3 3.1" style="Icons64x64_1" substyle="Refresh" action="24"/>
<quad posn="13 -0.1 2" sizen="3.5 4" style="Icons64x64_1" substyle="ArrowGreen" action="25"/>
<quad posn="16 -0.1 2" sizen="3.5 4" style="Icons64x64_1" substyle="ArrowRed" action="26"/>
<quad posn="19.2 -0.2 2" sizen="3 3.5" style="Icons64x64_1" substyle="Buddy" action="27"/>
</frame></manialink>

View File

@ -1,13 +0,0 @@
<manialink id="6"><frame posn="11.7 -45.6 0">
<quad sizen="40.8 2.5" style="Bgs1InRace" substyle="NavButton"/>
<quad posn="1.5 -0.3 2" sizen="2 2" style="Icons128x128_1" substyle="Coppers"/>
<label posn="4.5 -0.6 2" textsize="1" textcolor="dddf" text="$f6fDonate:"/>
<format textsize="1" textcolor="ffff"/>
<label posn="11 -0.6 2" sizen="2.4 1.5" text="%COP1% C" action="30"/>
<label posn="14.5 -0.6 2" sizen="2.4 1.5" text="%COP2% C" action="31"/>
<label posn="18 -0.6 2" sizen="3 1.5" text="%COP3% C" action="32"/>
<label posn="22 -0.6 2" sizen="3 1.5" text="%COP4% C" action="33"/>
<label posn="26 -0.6 2" sizen="3 1.5" text="%COP5% C" action="34"/>
<label posn="30 -0.6 2" sizen="4 1.5" text="%COP6% C" action="35"/>
<label posn="35 -0.6 2" sizen="4 1.5" text="%COP7% C" action="36"/>
</frame></manialink>

View File

@ -1,13 +0,0 @@
<manialink id="6"><frame posn="11.7 -45.6 0">
<quad sizen="40.8 2.5" style="Bgs1InRace" substyle="NavButton"/>
<quad posn="1.5 -0.3 2" sizen="2 2" style="Icons128x128_1" substyle="Coppers"/>
<label posn="4.4 -0.6 2" textsize="1" textcolor="dddf" text="$ccc$s$oDonate:$fff"/>
<format textsize="1" textcolor="ffff"/>
<label posn="11 -0.6 2" sizen="2.4 1.5" style="TextRaceChrono" scale="1.25" text="$s$abc%COP1%C" action="30"/>
<label posn="14.5 -0.6 2" sizen="2.4 1.5" style="TextRaceChrono" scale="1.25" text="$s$aaa%COP2%C" action="31"/>
<label posn="18 -0.6 2" sizen="3 1.5" style="TextRaceChrono" scale="1.25" text="$s$a98%COP3%C" action="32"/>
<label posn="22 -0.6 2" sizen="3 1.5" style="TextRaceChrono" scale="1.25" text="$s$a86%COP4%C" action="33"/>
<label posn="26 -0.6 2" sizen="3 1.5" style="TextRaceChrono" scale="1.25" text="$s$a74%COP5%C" action="34"/>
<label posn="30 -0.6 2" sizen="4 1.5" style="TextRaceChrono" scale="1.25" text="$s$a62%COP6%C" action="35"/>
<label posn="35 -0.6 2" sizen="4 1.5" style="TextRaceChrono" scale="1.25" text="$s$a50%COP7%C" action="36"/>
</frame></manialink>

View File

@ -1,13 +0,0 @@
<manialink id="6"><frame posn="-64.8 5.5 0">
<quad sizen="7.5 29.6" style="Bgs1InRace" substyle="NavButton"/>
<quad posn="2 -0.5 2" sizen="4 4" style="Icons128x128_1" substyle="Coppers"/>
<label posn="1 -5 2" textsize="2" textcolor="dddf" text="$f6fDonate:"/>
<format textsize="2" textcolor="ffff"/>
<label posn="6.5 -8 2" sizen="3.8 2" halign="right" text="%COP1% C" action="30"/>
<label posn="6.5 -11 2" sizen="3.8 2" halign="right" text="%COP2% C" action="31"/>
<label posn="6.5 -14 2" sizen="4.8 2" halign="right" text="%COP3% C" action="32"/>
<label posn="6.5 -17 2" sizen="4.8 2" halign="right" text="%COP4% C" action="33"/>
<label posn="6.5 -20 2" sizen="4.8 2" halign="right" text="%COP5% C" action="34"/>
<label posn="6.5 -23 2" sizen="5.8 2" halign="right" text="%COP6% C" action="35"/>
<label posn="6.5 -26 2" sizen="5.8 2" halign="right" text="%COP7% C" action="36"/>
</frame></manialink>

View File

@ -1,13 +0,0 @@
<manialink id="6"><frame posn="-64.8 5.5 0">
<quad sizen="7.5 29.6" style="Bgs1InRace" substyle="NavButton"/>
<quad posn="2 -0.5 2" sizen="4 4" style="Icons128x128_1" substyle="Coppers"/>
<label posn="1 -5 2" style="TextCardSmallScores2Rank" text="$f6fDonate:"/>
<format style="TextCardSmallScores2"/>
<label posn="6.5 -8 2" sizen="3.8 2" halign="right" text="%COP1% C" action="30"/>
<label posn="6.5 -11 2" sizen="3.8 2" halign="right" text="%COP2% C" action="31"/>
<label posn="6.5 -14 2" sizen="4.8 2" halign="right" text="%COP3% C" action="32"/>
<label posn="6.5 -17 2" sizen="4.8 2" halign="right" text="%COP4% C" action="33"/>
<label posn="6.5 -20 2" sizen="4.8 2" halign="right" text="%COP5% C" action="34"/>
<label posn="6.5 -23 2" sizen="5.8 2" halign="right" text="%COP6% C" action="35"/>
<label posn="6.5 -26 2" sizen="5.8 2" halign="right" text="%COP7% C" action="36"/>
</frame></manialink>

View File

@ -1,13 +0,0 @@
<!-- donate panel made by nouseforname -->
<manialink id="6"><frame posn="-64.8 -4.5 0">
<quad sizen="7.7 19.5" style="Bgs1InRace" substyle="NavButton"/>
<label posn="1 -0.8 2" style="TextCardSmallScores2Rank" text="$f6fDonate:"/>
<format style="TextCardSmallScores2"/>
<label posn="6.5 -3.5 2" sizen="3.8 2" halign="right" text="%COP1% C" action="30"/>
<label posn="6.5 -5.7 2" sizen="3.8 2" halign="right" text="%COP2% C" action="31"/>
<label posn="6.5 -7.9 2" sizen="4.8 2" halign="right" text="%COP3% C" action="32"/>
<label posn="6.5 -10.1 2" sizen="4.8 2" halign="right" text="%COP4% C" action="33"/>
<label posn="6.5 -12.3 2" sizen="4.8 2" halign="right" text="%COP5% C" action="34"/>
<label posn="6.5 -14.5 2" sizen="5.8 2" halign="right" text="%COP6% C" action="35"/>
<label posn="6.5 -16.7 2" sizen="5.8 2" halign="right" text="%COP7% C" action="36"/>
</frame></manialink>

View File

@ -1,13 +0,0 @@
<manialink id="6"><frame posn="57.2 5.5 0">
<quad sizen="7.5 29.6" style="Bgs1InRace" substyle="NavButton"/>
<quad posn="1.6 -0.5 2" sizen="4 4" style="Icons128x128_1" substyle="Coppers"/>
<label posn="0.5 -5 2" textsize="2" textcolor="dddf" text="$f6fDonate:"/>
<format textsize="2" textcolor="ffff"/>
<label posn="6.3 -8 2" sizen="3.8 2" halign="right" text="%COP1% C" action="30"/>
<label posn="6.3 -11 2" sizen="3.8 2" halign="right" text="%COP2% C" action="31"/>
<label posn="6.3 -14 2" sizen="4.8 2" halign="right" text="%COP3% C" action="32"/>
<label posn="6.3 -17 2" sizen="4.8 2" halign="right" text="%COP4% C" action="33"/>
<label posn="6.3 -20 2" sizen="4.8 2" halign="right" text="%COP5% C" action="34"/>
<label posn="6.3 -23 2" sizen="5.8 2" halign="right" text="%COP6% C" action="35"/>
<label posn="6.3 -26 2" sizen="5.8 2" halign="right" text="%COP7% C" action="36"/>
</frame></manialink>

View File

@ -1,13 +0,0 @@
<manialink id="6"><frame posn="57.2 5.5 0">
<quad sizen="7.5 29.6" style="Bgs1InRace" substyle="NavButton"/>
<quad posn="1.6 -0.5 2" sizen="4 4" style="Icons128x128_1" substyle="Coppers"/>
<label posn="0.5 -5 2" style="TextCardSmallScores2Rank" text="$f6fDonate:"/>
<format style="TextCardSmallScores2"/>
<label posn="6.3 -8 2" sizen="3.8 2" halign="right" text="%COP1% C" action="30"/>
<label posn="6.3 -11 2" sizen="3.8 2" halign="right" text="%COP2% C" action="31"/>
<label posn="6.3 -14 2" sizen="4.8 2" halign="right" text="%COP3% C" action="32"/>
<label posn="6.3 -17 2" sizen="4.8 2" halign="right" text="%COP4% C" action="33"/>
<label posn="6.3 -20 2" sizen="4.8 2" halign="right" text="%COP5% C" action="34"/>
<label posn="6.3 -23 2" sizen="5.8 2" halign="right" text="%COP6% C" action="35"/>
<label posn="6.3 -26 2" sizen="5.8 2" halign="right" text="%COP7% C" action="36"/>
</frame></manialink>

View File

@ -1,13 +0,0 @@
<!-- donate panel made by nouseforname -->
<manialink id="6"><frame posn="57.2 -4.5 0">
<quad sizen="7.7 19.5" style="Bgs1InRace" substyle="NavButton"/>
<label posn="0.5 -0.8 2" style="TextCardSmallScores2Rank" text="$f6fDonate:"/>
<format style="TextCardSmallScores2"/>
<label posn="6.3 -3.5 2" sizen="3.8 2" halign="right" text="%COP1% C" action="30"/>
<label posn="6.3 -5.7 2" sizen="3.8 2" halign="right" text="%COP2% C" action="31"/>
<label posn="6.3 -7.9 2" sizen="4.8 2" halign="right" text="%COP3% C" action="32"/>
<label posn="6.3 -10.1 2" sizen="4.8 2" halign="right" text="%COP4% C" action="33"/>
<label posn="6.3 -12.3 2" sizen="4.8 2" halign="right" text="%COP5% C" action="34"/>
<label posn="6.3 -14.5 2" sizen="5.8 2" halign="right" text="%COP6% C" action="35"/>
<label posn="6.3 -16.7 2" sizen="5.8 2" halign="right" text="%COP7% C" action="36"/>
</frame></manialink>

View File

@ -1,13 +0,0 @@
<manialink id="6"><frame posn="-64.2 48.2 0">
<quad sizen="39.5 2.5" style="Bgs1InRace" substyle="NavButton"/>
<quad posn="1 -0.2 2" sizen="2 2" style="Icons128x128_1" substyle="Coppers"/>
<label posn="4 -0.4 2" textsize="1" textcolor="dddf" text="$f6fDonate:"/>
<format textsize="1" textcolor="ffff"/>
<label posn="10 -0.4 2" sizen="2.4 1.5" text="%COP1% C" action="30"/>
<label posn="13.5 -0.4 2" sizen="2.4 1.5" text="%COP2% C" action="31"/>
<label posn="17 -0.4 2" sizen="3 1.5" text="%COP3% C" action="32"/>
<label posn="21 -0.4 2" sizen="3 1.5" text="%COP4% C" action="33"/>
<label posn="25 -0.4 2" sizen="3 1.5" text="%COP5% C" action="34"/>
<label posn="29 -0.4 2" sizen="4 1.5" text="%COP6% C" action="35"/>
<label posn="34 -0.4 2" sizen="4 1.5" text="%COP7% C" action="36"/>
</frame></manialink>

View File

@ -1,13 +0,0 @@
<manialink id="4"><frame posn="-64.8 23.3 0">
<quad sizen="14 11.5" style="Bgs1InRace" substyle="NavButton"/>
<format style="TextCardSmallScores2Rank"/>
<label posn="6.0 -1.0 2" sizen="4.5 2" halign="right" text="PB:"/>
<label posn="6.0 -3.5 2" sizen="4.5 2" halign="right" text="Local:"/>
<label posn="6.0 -6.0 2" sizen="4.5 2" halign="right" text="Dedi:"/>
<label posn="6.0 -8.5 2" sizen="4.5 2" halign="right" text="TMX:"/>
<format style="TextSubTitle2"/>
<label posn="6.5 -1.0 2" sizen="6.5 2" halign="left" text="%PB%" action="7"/>
<label posn="6.5 -3.5 2" sizen="6.5 2" halign="left" text="%LCL%" action="8"/>
<label posn="6.5 -6.0 2" sizen="6.5 2" halign="left" text="%DED%" action="9"/>
<label posn="6.5 -8.5 2" sizen="6.5 2" halign="left" text="%TMX%" action="10"/>
</frame></manialink>

View File

@ -1,13 +0,0 @@
<manialink id="4"><frame posn="-64.8 23.3 0">
<quad sizen="14 11.5" style="Bgs1InRace" substyle="NavButton"/>
<format style="TextCardSmallScores2Rank"/>
<label posn="6.0 -1.0 2" sizen="4.5 2" halign="right" text="PB:"/>
<label posn="6.0 -3.5 2" sizen="4.5 2" halign="right" text="Local:"/>
<label posn="6.0 -6.0 2" sizen="4.5 2" halign="right" text="Dedi:"/>
<label posn="6.0 -8.5 2" sizen="4.5 2" halign="right" text="TMX:"/>
<format style="TextButtonMedium"/>
<label posn="6.5 -1.0 2" sizen="6.5 2" halign="left" text="%PB%" action="7"/>
<label posn="6.5 -3.5 2" sizen="6.5 2" halign="left" text="%LCL%" action="8"/>
<label posn="6.5 -6.0 2" sizen="6.5 2" halign="left" text="%DED%" action="9"/>
<label posn="6.5 -8.5 2" sizen="6.5 2" halign="left" text="%TMX%" action="10"/>
</frame></manialink>

View File

@ -1,13 +0,0 @@
<manialink id="4"><frame posn="-64.8 23.3 0">
<quad sizen="14 11.5" style="Bgs1InRace" substyle="NavButton"/>
<format style="TextCardSmallScores2Rank"/>
<label posn="6.0 -1.0 2" sizen="4.5 2" halign="right" text="PB:"/>
<label posn="6.0 -3.5 2" sizen="4.5 2" halign="right" text="Local:"/>
<label posn="6.0 -6.0 2" sizen="4.5 2" halign="right" text="Dedi:"/>
<label posn="6.0 -8.5 2" sizen="4.5 2" halign="right" text="TMX:"/>
<format style="TextButtonSmall"/>
<label posn="6.5 -1.0 2" sizen="6.5 2" halign="left" text="%PB%" action="7"/>
<label posn="6.5 -3.5 2" sizen="6.5 2" halign="left" text="%LCL%" action="8"/>
<label posn="6.5 -6.0 2" sizen="6.5 2" halign="left" text="%DED%" action="9"/>
<label posn="6.5 -8.5 2" sizen="6.5 2" halign="left" text="%TMX%" action="10"/>
</frame></manialink>

View File

@ -1,13 +0,0 @@
<manialink id="4"><frame posn="-64.8 23.3 0">
<quad sizen="14 11.5" style="Bgs1InRace" substyle="NavButton"/>
<format style="TextCardSmallScores2Rank"/>
<label posn="6.0 -1.0 2" sizen="4.5 2" halign="right" text="PB:"/>
<label posn="6.0 -3.5 2" sizen="4.5 2" halign="right" text="Local:"/>
<label posn="6.0 -6.0 2" sizen="4.5 2" halign="right" text="Dedi:"/>
<label posn="6.0 -8.5 2" sizen="4.5 2" halign="right" text="TMX:"/>
<format style="TextRaceValueSmall"/>
<label posn="6.5 -1.0 2" sizen="6.5 2" halign="left" text="%PB%" action="7"/>
<label posn="6.5 -3.5 2" sizen="6.5 2" halign="left" text="%LCL%" action="8"/>
<label posn="6.5 -6.0 2" sizen="6.5 2" halign="left" text="%DED%" action="9"/>
<label posn="6.5 -8.5 2" sizen="6.5 2" halign="left" text="%TMX%" action="10"/>
</frame></manialink>

Some files were not shown because too many files have changed in this diff Show More