MySQL connection plugin

Discuss the Dedicated Server Tools developed by Nadeo Live such as ManiaLive, Trust Circles, Dedicated Manager, Competition Manager and Lobbies

Moderator: NADEO

TheM
Posts: 1379
Joined: 15 Jun 2010, 14:30
Location: Uden, Noord-Brabant, Netherlands
Contact:

MySQL connection plugin

Post by TheM »

Trying to make a plugin with an SQL connection, but it won't really work...

Code: Select all

<?php

/**
 * MLEPP - ManiaLive Extending Plugin Pack
 * 
 * -- MLEPP Core --
 * @name Core
 * @date 29-12-2010
 * @version 2010
 * @website mlepp.trackmania.nl
 * @package MLEPP
 * 
 * @author Max "TheM" Klaversma <maxklaversma@gmail.com>
 * @copyright 2010 - 2011
 */

namespace ManiaLivePlugins\TheM\mlepp_Core;

use ManiaLive\Utilities\Console;
use ManiaLive\Utilities\String;
use ManiaLive\Database\Connection;

class mlepp_Core extends \ManiaLive\PluginHandler\Plugin {
    
    static $dbtype = 'MySQL';
    static $dbport = '3306';
    static $dbhost = 'localhost';
    static $dbuser = 'manialive';
    static $dbpass = 'manialive';
    static $dbname = 'manialive';
    
    var $mlepp_sql;
    
    function onInit() {
        $version = 1.0;
        $this->setVersion($version);
        Console::println('['.date('H:i:s').'] [MLEPP] Starting MLEPP . . .');
        
        $this->mlepp_sql = Connection::getConnection(self::dbhost, self::dbuser, self::dbpass, self::dbname, self::dbtype, self::dbport);
    }
}

?>
Config file part:

Code: Select all

;------------------
[MLEPP - Database]
;------------------

; Database type, can be SQLite or MySQL
; Standard: MySQL
plugins.TheM\mlepp_Core.dbtype = 'MySQL'
; Database port
; Standard: 3306
plugins.TheM\mlepp_Core.dbport = '3306'

; Database host, mostly 'localhost'
plugins.TheM\mlepp_Core.dbhost = 'localhost'
; Database user
plugins.TheM\mlepp_Core.dbuser = 'manialive'
; Database password
plugins.TheM\mlepp_Core.dbpass = 'manialive'
; Database name
plugins.TheM\mlepp_Core.dbname = 'manialive'
Yes, there is a MySQL server running on localhost:3306 with database manialive and user/pass manialive.
This is what the console gives me:

Code: Select all

E:\Servers\ManiaLive>E:\xampp\php\php.exe bootstrapper.php
[CONFIG LOADER] Starting runtime load
[CONFIG LOADER] Pre-load completed
[CONFIG LOADER] E:\Servers\ManiaLive/config/config.ini parsed
[CONFIG LOADER] Warning: ManiaLive\Config\Config::$MLEPP - Database does not exists
[CONFIG LOADER] Load completed
[CONFIG LOADER] Runtime load completed in 13.88 milliseconds
[10:46:16] XML-RPC connection established
[10:46:16] Successfully authentified with XML-RPC server
Threading will be disabled, you need to enable the 'SQLite' extension on your system!
Attention: Threading disabled, trying to emulate - this will cause performance downgrades!
[10:46:16] [MLEPP] Starting MLEPP . . .

E:\Servers\ManiaLive>pause
Druk op een toets om door te gaan. . .
Any ideas?
Global moderator | Dutch moderator | Laddermoderator | ManiaWiki moderator
Server Manager/webmaster of Smurfen.net, join us on Canyon, Valley and Royal!
ESL (Game) Staff Head for TrackMania (Stadium, Canyon and Valley).
User avatar
aseco
Posts: 96
Joined: 06 Jul 2010, 17:08
Location: Germany
Contact:

Re: MySQL connection plugin

Post by aseco »

:) nice
Okay, the first idea that I have is to put the connection establishment into the onLoad() method of the plugin.
onInit is executed before the plugin is loaded, so if something during the load is not working the connection will be created anyways ... (that's how your code would behave)
Also the configuration file settings are applied to the plugin during the load process and are only available in the onLoad event. That's not a problem for you, yet, because you have set standard values that are the same as in the config file.
Finally I don't think this is the reason for your problem - it's just a remark to avoid future issues.

So for the current behavior, I don't have a clue yet. Have you checked the logs folder for any "*Error*" file?
Normally there should be more information on the reason of the crash :-/
Can you please also check whether you have enabled error reporting in the php.ini?
Maybe the php's mysql module is not loaded?

PS: posted first reply on tm-forum.com, but discuss this topic on maniaplanet forum is a better idea, so I will remove it.
i7 920 | Nvidia GTX260 | 4Gb DDR3
www.floschnell.de | I like that comic
TheM
Posts: 1379
Joined: 15 Jun 2010, 14:30
Location: Uden, Noord-Brabant, Netherlands
Contact:

Re: MySQL connection plugin

Post by TheM »

aseco wrote:So for the current behavior, I don't have a clue yet. Have you checked the logs folder for any "*Error*" file?
Normally there should be more information on the reason of the crash :-/
There is one, but no information about this error in there... :|
aseco wrote:Can you please also check whether you have enabled error reporting in the php.ini?
E_ALL
aseco wrote:Maybe the php's mysql module is not loaded?
It is loaded, MySQL is used in websites on my localhost which are using the same PHP.
Global moderator | Dutch moderator | Laddermoderator | ManiaWiki moderator
Server Manager/webmaster of Smurfen.net, join us on Canyon, Valley and Royal!
ESL (Game) Staff Head for TrackMania (Stadium, Canyon and Valley).
TheM
Posts: 1379
Joined: 15 Jun 2010, 14:30
Location: Uden, Noord-Brabant, Netherlands
Contact:

Re: MySQL connection plugin

Post by TheM »

Moved the connection to onLoad()

Code: Select all

<?php

/**
 * MLEPP - ManiaLive Extending Plugin Pack
 * 
 * -- MLEPP Core --
 * @name Core
 * @date 29-12-2010
 * @version 2010
 * @website mlepp.trackmania.nl
 * @package MLEPP
 * 
 * @author Max "TheM" Klaversma <maxklaversma@gmail.com>
 * @copyright 2010 - 2011
 */

namespace ManiaLivePlugins\TheM\mlepp_Core;

use ManiaLive\Utilities\Console;
use ManiaLive\Utilities\String;
use ManiaLive\Database\Connection;

class mlepp_Core extends \ManiaLive\PluginHandler\Plugin {
    
    static $dbtype = 'MySQL';
    static $dbport = '3306';
    static $dbhost = 'localhost';
    static $dbuser = 'manialive';
    static $dbpass = 'manialive';
    static $dbname = 'manialive';
    
    var $mlepp_sql;
    
    function onInit() {
        $version = 1.0;
        $this->setVersion($version);
        Console::println('['.date('H:i:s').'] [MLEPP] Starting MLEPP . . .');
    }
    
    function onLoad() {
        $this->mlepp_sql = Connection::getConnection(self::dbhost, self::dbuser, self::dbpass, self::dbname, self::dbtype, self::dbport);
    }
}

?>
Doesn't make a difference for this problem, but would (as you say) avoid further problems.

By the way, I'm running PHP 5.3.0 on Windows 7 Ultimate 64x (if this might help).
Global moderator | Dutch moderator | Laddermoderator | ManiaWiki moderator
Server Manager/webmaster of Smurfen.net, join us on Canyon, Valley and Royal!
ESL (Game) Staff Head for TrackMania (Stadium, Canyon and Valley).
User avatar
aseco
Posts: 96
Joined: 06 Jul 2010, 17:08
Location: Germany
Contact:

Re: MySQL connection plugin

Post by aseco »

TheM wrote:
aseco wrote:So for the current behavior, I don't have a clue yet. Have you checked the logs folder for any "*Error*" file?
Normally there should be more information on the reason of the crash :-/
There is one, but no information about this error in there... :|
aseco wrote:Can you please also check whether you have enabled error reporting in the php.ini?
E_ALL
aseco wrote:Maybe the php's mysql module is not loaded?
It is loaded, MySQL is used in websites on my localhost which are using the same PHP.
Okay, here we go :-)
Finally I discovered the error after trying your code on my computer, but I got a fatal error message.
You might have display errors set to false in your php.ini?

The main problem has been that you forgot the dollars when you accessed the static properties.
So it should be like that:

Code: Select all

$this->mlepp_sql = Connection::getConnection(self::$dbhost, self::$dbuser, self::$dbpass, self::$dbname, self::$dbtype, self::$dbport);
Further more during my code inspectation I found another two little mistakes. First you used "[MLEPP - Database]" in your config. Brackets are reserved characters and you need to put it as a comment. This is why you got a warning at the startup, saying that $MLEPP - Database could not be found.
Second, the "var" keyword is bad habit, you should use protected/private/public instead.

Actually, we've decided, based on you plugin which seems to be the core for a package of plugins, to allow package folders in a author's plugin folder. That will give you the possibility to rename your plugin later to something like "TheM\Mlepp\Core". This however is not implemented yet but will maybe come until the end of the week.
We will also introduce some naming conventions (classes: first letter upper case, every word seperated by upper case letter; methods: first letter lower case, every word seperated by upper case; properties: see methods.)

hope it helped!
good luck :D
i7 920 | Nvidia GTX260 | 4Gb DDR3
www.floschnell.de | I like that comic
TheM
Posts: 1379
Joined: 15 Jun 2010, 14:30
Location: Uden, Noord-Brabant, Netherlands
Contact:

Re: MySQL connection plugin

Post by TheM »

Thanks Flo for your help.
I moved the connection to onLoad(), but the variables aren't replaced by the config ones.
Any idea 'bout that?

EDIT
Also made a JoinLeaveMessage plugin, but I can't get player information when the player disconnects.

Code: Select all

$source_player = $this->storage->getPlayerObject($login);
Above gives me an error:

Code: Select all

E:\Servers\ManiaLive>E:\xampp\php\php.exe bootstrapper.php
[CONFIG LOADER] Starting runtime load
[CONFIG LOADER] Pre-load completed
[CONFIG LOADER] E:\Servers\ManiaLive/config/config.ini parsed
[CONFIG LOADER] Load completed
[CONFIG LOADER] Runtime load completed in 32.22 milliseconds
[13:45:58] XML-RPC connection established
[13:45:58] Successfully authentified with XML-RPC server
Threading will be disabled, you need to enable the 'SQLite' extension on your sy
stem!
Attention: Threading disabled, trying to emulate - this will cause performance d
owngrades!
[13:45:58] [MLEPP] Starting MLEPP . . .
[13:45:58] [MLEPP] Connecting to database server . . .
[13:45:58] [MLEPP] Connection succesfully established !
[13:45:58] [MLEPP] Plugin: JoinLeaveMessage v1 by TheM.
[13:46:26] [MLEPP] [JoinLeaveMessage] max1995 joins the server.
[13:46:54] [MLEPP] [JoinLeaveMessage] max1995 left the server.

 -> ErrorException with code 0
    Trying to get property of non-object
  - in
      E:\Servers\ManiaLive\libraries\ManiaLivePlugins\TheM\mlepp_JoinLeaveMessa
      ge\mlepp_JoinLeaveMessage.php on line 67
  - Stack: #0
      E:\Servers\ManiaLive\libraries\ManiaLivePlugins\TheM\mlepp_JoinLeaveMessa
      ge\mlepp_JoinLeaveMessage.php(67):
      ManiaLive\Application\ErrorHandling::createExcpetionFromError(8, 'Trying
      to get p...', 'E:\Servers\Mani...', 67, Array)
           #1 [internal function]:
      ManiaLivePlugins\TheM\mlepp_JoinLeaveMessage\mlepp_JoinLeaveMessage->onPl
      ayerDisconnect('max1995')
           #2
      E:\Servers\ManiaLive\libraries\ManiaLive\DedicatedApi\Callback\Event.php(
      19): call_user_func_array(Array, Array)
           #3
      E:\Servers\ManiaLive\libraries\ManiaLive\Event\Dispatcher.php(43):
      ManiaLive\DedicatedApi\Callback\Event->fireDo(Object(ManiaLivePlugins\The
      M\mlepp_JoinLeaveMessage\mlepp_JoinLeaveMessage))
           #4
      E:\Servers\ManiaLive\libraries\ManiaLive\DedicatedApi\Connection.php(116)
      :
      ManiaLive\Event\Dispatcher::dispatch(Object(ManiaLive\DedicatedApi\Callba
      ck\Event))
           #5
      E:\Servers\ManiaLive\libraries\ManiaLive\Application\AbstractApplication.
      php(120): ManiaLive\DedicatedApi\Connection->executeCallbacks()
           #6 E:\Servers\ManiaLive\bootstrapper.php(9):
      ManiaLive\Application\AbstractApplication->run()
           #7 {main}
Can I get playerinfo from ManiaLive while onPlayerDisconnect in a different way (without database...)?

EDIT2
Plugin file might be easy to have:

Code: Select all

<?php

/**
 * MLEPP - ManiaLive Extending Plugin Pack
 * 
 * -- MLEPP Plugin --
 * @name JoinMessage
 * @date 28-12-2010
 * @version 2010
 * @website mlepp.trackmania.nl
 * @package MLEPP
 * 
 * @author Max "TheM" Klaversma <maxklaversma@gmail.com>
 * @copyright 2010 - 2011
 */

namespace ManiaLivePlugins\TheM\mlepp_JoinLeaveMessage;

use ManiaLive\Utilities\Console;
use ManiaLive\Utilities\String;
use ManiaLive\DedicatedApi\Connection;
use ManiaLivePlugins\TheM\mlepp_Core;

class mlepp_JoinLeaveMessage extends \ManiaLive\PluginHandler\Plugin {
    function onInit() {
        if(!$this->isPluginLoaded('TheM\mlepp_Core', 1)) {
            Console::println('['.date('H:i:s').'] [MLEPP] Couldn\'t load JoinLeaveMessage because MLEPP Core plugin isn\'t installed.');
            die();
        }
        
        $version = 1.0;
        $this->setVersion($version);
    }
    
    function onLoad() {
        $this->enableStorageEvents();
        $this->enableDedicatedEvents();
                
        Console::println('['.date('H:i:s').'] [MLEPP] Plugin: JoinLeaveMessage v'.$this->getVersion().' by TheM.');
        
        $message = '$ff0>> $09f[MLEPP] $fffJoinLeaveMessage$09f plugin v'.$this->getVersion().' by $fffTheM$09f: $0f0running$09f.';
        Connection::getInstance()->chatSendServerMessage($message);
    }
    
    function onPlayerConnect($login, $isSpectator) {
        if($isSpectator) {
            $spec = ' $f00(Spec)';
        } else {
            $spec = '';
        }
        
        $source_player = $this->storage->getPlayerObject($login);
        $path = str_replace('World|', '', $source_player->path);
        
        Console::println('['.date('H:i:s').'] [MLEPP] [JoinLeaveMessage] '.$login.' joins the server.');
        Connection::getInstance()->chatSendServerMessage('$f00Welcome $fff'.$source_player->nickName.'$z$s$f00, this server is running $fffMLEPP$f00 to manage the server.', array($source_player), false);        
                
        $message = '$ff0>> $fff'.$source_player->nickName.'$z$s'.$spec.' $09f[$fff'.$path.'$09f] [LR: $fff'.$source_player->ladderRanking.'$09f] joins the server.';
        Connection::getInstance()->chatSendServerMessage($message);
    }
    
    function onPlayerDisconnect($login) {
        $source_player = $this->storage->getPlayerObject($login);
        
        Console::println('['.date('H:i:s').'] [MLEPP] [JoinLeaveMessage] '.$login.' left the server.');
        
        $message = '$ff0>> $fff'.$source_player->nickName.'$z$s $09fleft the server.';
        Connection::getInstance()->chatSendServerMessage($message);
    }
}
?>
Global moderator | Dutch moderator | Laddermoderator | ManiaWiki moderator
Server Manager/webmaster of Smurfen.net, join us on Canyon, Valley and Royal!
ESL (Game) Staff Head for TrackMania (Stadium, Canyon and Valley).
User avatar
aseco
Posts: 96
Joined: 06 Jul 2010, 17:08
Location: Germany
Contact:

Re: MySQL connection plugin

Post by aseco »

TheM wrote:Thanks Flo for your help.
I moved the connection to onLoad(), but the variables aren't replaced by the config ones.
Any idea 'bout that?
hmmm ... if you want to know whether the config file is read correctly, then you can check the logs folder's "Loader_[process id].txt" file. It contains information, what has been parsed.
Have you fixed the config problem I described in my earlier post? (could be related)
I can't tell you more for the moment, just some advices before lunchtime :-)

For the message you want to send when a player leaves ... that's truly a problem. And sadly it is on manialive core side.
A player that leaves is erased from the storage and since the storage class is always triggered first on each event it is deleted before you plugin is invoked. For the moment you can't use the storage for a player that has already left the server, but we will think about that!

Thanks a lot for trying and giving response :-)
This adds quality ...
i7 920 | Nvidia GTX260 | 4Gb DDR3
www.floschnell.de | I like that comic
TheM
Posts: 1379
Joined: 15 Jun 2010, 14:30
Location: Uden, Noord-Brabant, Netherlands
Contact:

Re: MySQL connection plugin

Post by TheM »

aseco wrote:
TheM wrote:Thanks Flo for your help.
I moved the connection to onLoad(), but the variables aren't replaced by the config ones.
Any idea 'bout that?
hmmm ... if you want to know whether the config file is read correctly, then you can check the logs folder's "Loader_[process id].txt" file. It contains information, what has been parsed.
Have you fixed the config problem I described in my earlier post? (could be related)
I can't tell you more for the moment, just some advices before lunchtime :-)
I did handle the config problem you told me.
The settings I added aren't loaded by ManiaLive as you can see in the log:

Code: Select all

E:\Servers\ManiaLive>E:\xampp\php\php.exe bootstrapper.php
[CONFIG LOADER] Starting runtime load
[CONFIG LOADER] Pre-load completed
[CONFIG LOADER] E:\Servers\ManiaLive/config/config.ini parsed
[CONFIG LOADER] Load completed
[CONFIG LOADER] Data dump:

ManiaLive\Config\Config Object
(
    [server] => ManiaLive\DedicatedApi\Config Object
        (
            [host] => 127.0.0.1
            [port] => 4024
            [password] => testservert
            [user] => SuperAdmin
            [timeout] => 1
        )

    [threading] => ManiaLive\Threading\Config Object
        (
            [enabled] =>
            [busy_timeout] => 20
            [ping_timeout] => 2
            [sequential_timeout] => 1
            [chunk_size] => 10
        )

    [maniahome] => ManiaHome\Config Object
        (
            [enabled] =>
            [user] =>
            [password] =>
            [manialink] =>
        )

    [plugins] => ManiaLive\PluginHandler\Config Object
        (
            [plugins:protected] => Array
                (
                )

            [load] => Array
                (
                    [0] => TheM\mlepp_Core
                    [1] => TheM\mlepp_JoinLeaveMessage
                )

        )

    [admins] => ManiaLive\Features\Admin\Config Object
        (
            [logins] => Array
                (
                    [0] => max1995
                )

        )

    [chatcommands] => ManiaLive\Features\ChatCommand\Config Object
        (
            [createDocumentation] =>
        )

    [phpPath] => php.exe
    [logsPath] => E:\Servers\ManiaLive/logs
    [logsPrefix] =>
    [runtimeLog] =>
    [globalErrorLog] =>
    [maxErrorCount] =>
)

[CONFIG LOADER] Runtime load completed in 45.18 milliseconds
[14:08:06] XML-RPC connection established
[14:08:06] Successfully authentified with XML-RPC server
Threading will be disabled, you need to enable the 'SQLite' extension on your sy
stem!
Attention: Threading disabled, trying to emulate - this will cause performance d
owngrades!
[14:08:07] [MLEPP] Starting MLEPP . . .
[14:08:07] [MLEPP] Connecting to database server . . .
[14:08:07] [MLEPP] Connection succesfully established !
[14:08:07] [MLEPP] Plugin: JoinLeaveMessage v1 by TheM.
Configfile:

Code: Select all

;------------------
; ManiaLive
;------------------

; the default path is 'php.exe' on windows and 'php' on linux
; phpPath = E:/xampp/php

; the default is %application%/logs
; logsPath = /var/logs

; whether to write console output into a file, default is Off
; runtimeLog = On

;------------------
; Dedicated Server
;------------------

server.host = '127.0.0.1'

server.port = 4024

; standard user level is SuperAdmin
server.user = 'SuperAdmin'

server.password = '*****'

; when a connection can't be established after the given amount
; of time, it will timeout and manialive will shutdown.
server.timeout = 1

;------------------
; Admins
;------------------

; Add admins, that shall be able to control your server from game.
admins.logins[] = 'max1995'

;------------------
; Plugins
;------------------

; Add plugins to load.

; MLEPP Plugins
plugins.load[] = 'TheM\mlepp_Core'
plugins.load[] = 'TheM\mlepp_JoinLeaveMessage'

;------------------
; Threading
;------------------

; threading can improve performance of your application. it
; allows modules to push blocking work onto another processes,
; this can also improve stability, because timeouts or
; unexpected exceptions do not impact the main application.

; if you have stability problems try to deactivate threading first
; threading.enabled = false

; how long may a thread be busy until it is killed
; threading.busy_timeout = 20

; how long, if not busy, may it take for a thread to response to a ping
; threading.ping_timeout = 2

; how many jobs should be send on each loop.
; increasing this value will boost jobs/time
; decreasing it will result in a reaction time improvement.
; threading.chunk_size = 10

; if threading is disabled, then how much time should be spend on
; each application loop to process work that would have been assigned
; to other threads normally
; default value is 1 second.
; threading.sequential_timeout = 1

;------------------
; ManiaHome
;------------------

; enabling the maniahome feature allows other modules to send
; notifications about eg. records or other actions on your
; server to player's friends.

; disabled by default.
; maniahome.enabled = true

; maniahome.user = ''

; maniahome.password = ''

; maniahome.manialink = ''

;------------------
[hostname: testHost]
;------------------

; put here the configuration specific to an host

;------------------
; [MLEPP - Database]
;------------------

; Database type, can be SQLite or MySQL
; Standard: MySQL
plugins.TheM\mlepp_Core.dbtype = 'MySQL'
; Database port
; Standard: 3306
plugins.TheM\mlepp_Core.dbport = '3306'

; Database host, mostly '127.0.0.1' (localhost)
plugins.TheM\mlepp_Core.dbhost = '127.0.0.1'
; Database user
plugins.TheM\mlepp_Core.dbuser = 'manialive'
; Database password
plugins.TheM\mlepp_Core.dbpass = 'manialive'
; Database name
plugins.TheM\mlepp_Core.dbname = 'manialive'
aseco wrote:For the message you want to send when a player leaves ... that's truly a problem. And sadly it is on manialive core side.
A player that leaves is erased from the storage and since the storage class is always triggered first on each event it is deleted before you plugin is invoked. For the moment you can't use the storage for a player that has already left the server, but we will think about that!
Ah okay, I'll try to do it by database instead.
aseco wrote:Thanks a lot for trying and giving response :-)
No problem at all :)
aseco wrote:This adds quality ...
You aren't sarcastic here, are you? :P
Global moderator | Dutch moderator | Laddermoderator | ManiaWiki moderator
Server Manager/webmaster of Smurfen.net, join us on Canyon, Valley and Royal!
ESL (Game) Staff Head for TrackMania (Stadium, Canyon and Valley).
User avatar
aseco
Posts: 96
Joined: 06 Jul 2010, 17:08
Location: Germany
Contact:

Re: MySQL connection plugin

Post by aseco »

haha, no way, I'm not sarcastic - we probably haven't found 80 percent of all errors, because we aren't using the full potential of ManiaLive at the moment. And also because we might be more cautious ... so it's really good to have players that test and find bugs: this adds quality :-)

um, so for your problem, it is because you are using a host override "[hostname: testHost]" which applies to >everything< written afterwards (except there is another host override).
and apparently your machine's not called testHost on the network :arrow: everything after this tag is not being read.
i7 920 | Nvidia GTX260 | 4Gb DDR3
www.floschnell.de | I like that comic
TheM
Posts: 1379
Joined: 15 Jun 2010, 14:30
Location: Uden, Noord-Brabant, Netherlands
Contact:

Re: MySQL connection plugin

Post by TheM »

aseco wrote:haha, no way, I'm not sarcastic - we probably haven't found 80 percent of all errors, because we aren't using the full potential of ManiaLive at the moment. And also because we might be more cautious ... so it's really good to have players that test and find bugs: this adds quality :-)

um, so for your problem, it is because you are using a host override "[hostname: testHost]" which applies to >everything< written afterwards (except there is another host override).
and apparently your machine's not called testHost on the network :arrow: everything after this tag is not being read.
Problem solved! Thanks a lot! :)
Global moderator | Dutch moderator | Laddermoderator | ManiaWiki moderator
Server Manager/webmaster of Smurfen.net, join us on Canyon, Valley and Royal!
ESL (Game) Staff Head for TrackMania (Stadium, Canyon and Valley).
Post Reply

Return to “Dedicated Server Tools”

Who is online

Users browsing this forum: No registered users and 1 guest