- removed unnecessary files
- cleaned up database class - plugin and plugin handler class - improved player and player handler classes - other cleanup and improvements
This commit is contained in:
parent
d1818680d5
commit
d2744a5157
@ -3,4 +3,4 @@ REM Set the path to your php.exe here
|
|||||||
set phpPath="D:\Programme\xampp\php\php.exe"
|
set phpPath="D:\Programme\xampp\php\php.exe"
|
||||||
|
|
||||||
REM Start ManiaControl
|
REM Start ManiaControl
|
||||||
START "" /B %phpPath% -f "ManiaControl.php" 2>&1
|
START "" /B %phpPath% -f "startManiaControl.php" 2>&1
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
php ManiaControl.php 2>&1 &
|
php startManiaControl.php 2>&1 &
|
||||||
echo $! > ManiaControl.pid
|
echo $! > ManiaControl.pid
|
||||||
|
@ -1,14 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!-- Configure the chatlog plugin -->
|
|
||||||
<chatlog-config>
|
|
||||||
|
|
||||||
<!-- Enable plugin -->
|
|
||||||
<enabled>true</enabled>
|
|
||||||
|
|
||||||
<!-- Filename for the chatlog -->
|
|
||||||
<filename>chat.log</filename>
|
|
||||||
|
|
||||||
<!-- Log server messages -->
|
|
||||||
<log_server_messages>true</log_server_messages>
|
|
||||||
|
|
||||||
</chatlog-config>
|
|
@ -7,10 +7,10 @@
|
|||||||
<port>3306</port>
|
<port>3306</port>
|
||||||
|
|
||||||
<!-- MySQL User -->
|
<!-- MySQL User -->
|
||||||
<user>steff</user>
|
<user>maniacontrol</user>
|
||||||
<pass>kjhgvhbjnfih2394ugnjk</pass>
|
<pass>kjhgvhbjnfih2394ugnjk</pass>
|
||||||
|
|
||||||
<!-- Database Name -->
|
<!-- Database Name -->
|
||||||
<database>steff_united</database>
|
<database>maniacontrol_dev</database>
|
||||||
|
|
||||||
</database-config>
|
</database-config>
|
@ -1,15 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!-- Configure the karma plugin -->
|
|
||||||
<karma-plugin-config>
|
|
||||||
|
|
||||||
<!-- Enable the plugin -->
|
|
||||||
<enabled>true</enabled>
|
|
||||||
|
|
||||||
<!-- Title -->
|
|
||||||
<title>Map Voting</title>
|
|
||||||
|
|
||||||
<!-- Position -->
|
|
||||||
<pos_x>92</pos_x>
|
|
||||||
<pos_y>83</pos_y>
|
|
||||||
|
|
||||||
</karma-plugin-config>
|
|
@ -1,11 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!-- Configure the obstacle plugin -->
|
|
||||||
<obstacle-config>
|
|
||||||
|
|
||||||
<!-- Enable/Disable the whole plugin -->
|
|
||||||
<enabled>true</enabled>
|
|
||||||
|
|
||||||
<!-- Set right level needed for jumps -->
|
|
||||||
<jumps_rightlevel>operator</jumps_rightlevel>
|
|
||||||
|
|
||||||
</obstacle-config>
|
|
@ -1,13 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!-- Configure which plugins should be loaded -->
|
|
||||||
<plugins-config>
|
|
||||||
<!-- <plugin>FILENAME1</plugin> <plugin>FILENAME2</plugin>
|
|
||||||
|
|
||||||
<plugin>chatlog.plugin.php</plugin>
|
|
||||||
<plugin>karma.plugin.php</plugin>
|
|
||||||
<plugin>records.plugin.php</plugin>
|
|
||||||
<plugin>united.plugin.php</plugin>-->
|
|
||||||
|
|
||||||
<!-- <plugin>obstacle.plugin.php</plugin> -->
|
|
||||||
|
|
||||||
</plugins-config>
|
|
@ -1,67 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!-- Configure the records plugin -->
|
|
||||||
<records-config>
|
|
||||||
|
|
||||||
<!-- Enable/Disable the whole plugin -->
|
|
||||||
<enabled>true</enabled>
|
|
||||||
|
|
||||||
<!-- Configure local records -->
|
|
||||||
<local_records>
|
|
||||||
<enabled>true</enabled>
|
|
||||||
|
|
||||||
<!-- Define how many records per map are saved -->
|
|
||||||
<count>200</count>
|
|
||||||
|
|
||||||
<!-- Define the widget -->
|
|
||||||
<widget>
|
|
||||||
<enabled>true</enabled>
|
|
||||||
<pos_x>-139</pos_x>
|
|
||||||
<pos_y>65</pos_y>
|
|
||||||
<title>Local Records</title>
|
|
||||||
<width>40</width>
|
|
||||||
<lines>25</lines>
|
|
||||||
<line_height>4</line_height>
|
|
||||||
</widget>
|
|
||||||
|
|
||||||
</local_records>
|
|
||||||
|
|
||||||
<!-- Configure dedimania records -->
|
|
||||||
<dedimania_records>
|
|
||||||
<enabled>true</enabled>
|
|
||||||
|
|
||||||
<!-- Define your dedimania account (http://dedimania.net/tm2stats/?do=register) -->
|
|
||||||
<account>
|
|
||||||
<login>steff_test</login>
|
|
||||||
<code>468a0a185c</code>
|
|
||||||
</account>
|
|
||||||
<account>
|
|
||||||
<login>nsa_dev</login>
|
|
||||||
<code>3c20cbc737</code>
|
|
||||||
</account>
|
|
||||||
<account>
|
|
||||||
<login>united_canyon</login>
|
|
||||||
<code>703d080ddd</code>
|
|
||||||
</account>
|
|
||||||
<account>
|
|
||||||
<login>united_stadium</login>
|
|
||||||
<code>067b0d0017</code>
|
|
||||||
</account>
|
|
||||||
<account>
|
|
||||||
<login>united_valley</login>
|
|
||||||
<code>37ed993fe1</code>
|
|
||||||
</account>
|
|
||||||
|
|
||||||
<!-- Define the widget -->
|
|
||||||
<widget>
|
|
||||||
<enabled>true</enabled>
|
|
||||||
<pos_x>139</pos_x>
|
|
||||||
<pos_y>60</pos_y>
|
|
||||||
<title>Dedimania</title>
|
|
||||||
<width>40</width>
|
|
||||||
<lines>20</lines>
|
|
||||||
<line_height>4</line_height>
|
|
||||||
</widget>
|
|
||||||
|
|
||||||
</dedimania_records>
|
|
||||||
|
|
||||||
</records-config>
|
|
@ -1,17 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!-- Configure your maniaplanet server -->
|
|
||||||
<server-config>
|
|
||||||
|
|
||||||
<!-- Enable to use only one static server (default behavior) -->
|
|
||||||
<enable>true</enable>
|
|
||||||
|
|
||||||
<!-- Server connection details (Make sure that the firewall and the server config are properly configured!) -->
|
|
||||||
<host>144.76.158.111</host>
|
|
||||||
<host>localhost</host>
|
|
||||||
<port>21003</port>
|
|
||||||
|
|
||||||
<!-- XmlRpc login details -->
|
|
||||||
<login>SuperAdmin</login>
|
|
||||||
<pass>dtcfvgubhnjomkjnbhv</pass>
|
|
||||||
|
|
||||||
</server-config>
|
|
@ -1,119 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!-- Configure the United plugin -->
|
|
||||||
<!-- Note: You should disable the config server.ManiaControl.xml while using this plugin -->
|
|
||||||
<united-config>
|
|
||||||
|
|
||||||
<!-- Enable the whole plugin -->
|
|
||||||
<enabled>false</enabled>
|
|
||||||
|
|
||||||
<!-- Configure the server order (Random or as defined in the xml) -->
|
|
||||||
<random_order>false</random_order>
|
|
||||||
|
|
||||||
<!-- Define the mode that should be running on all the server -->
|
|
||||||
<!-- Rounds (1), TimeAttack (2), Team (3), Laps (4), Cup (5), Stunts (6) -->
|
|
||||||
<mode>2</mode>
|
|
||||||
|
|
||||||
<!-- Whether game server should be hidden from the browser -->
|
|
||||||
<hide_game_server>false</hide_game_server>
|
|
||||||
|
|
||||||
<!-- Set lobby status for lobby server -->
|
|
||||||
<set_lobby_status>true</set_lobby_status>
|
|
||||||
|
|
||||||
<!-- Define the game server -->
|
|
||||||
<gameserver>
|
|
||||||
|
|
||||||
<!-- Define the join/spec password for game server -->
|
|
||||||
<password>a</password>
|
|
||||||
|
|
||||||
<!-- Template -->
|
|
||||||
<!-- <server> -->
|
|
||||||
<!-- <host>ip</host> -->
|
|
||||||
<!-- <port>5000</port> -->
|
|
||||||
<!-- <login>SuperAdmin</login> -->
|
|
||||||
<!-- <pass>SuperAdmin</pass> -->
|
|
||||||
<!-- </server> -->
|
|
||||||
|
|
||||||
<!-- Canyon -->
|
|
||||||
<server>
|
|
||||||
<host>144.76.158.111</host>
|
|
||||||
<port>21013</port>
|
|
||||||
<login>SuperAdmin</login>
|
|
||||||
<pass>dtcfvgubhnjomkjnbhv</pass>
|
|
||||||
</server>
|
|
||||||
|
|
||||||
<!-- Stadium -->
|
|
||||||
<server>
|
|
||||||
<host>144.76.158.111</host>
|
|
||||||
<port>21033</port>
|
|
||||||
<login>SuperAdmin</login>
|
|
||||||
<pass>dtcfvgubhnjomkjnbhv</pass>
|
|
||||||
</server>
|
|
||||||
|
|
||||||
<!-- Valley -->
|
|
||||||
<server>
|
|
||||||
<host>144.76.158.111</host>
|
|
||||||
<port>21053</port>
|
|
||||||
<login>SuperAdmin</login>
|
|
||||||
<pass>dtcfvgubhnjomkjnbhv</pass>
|
|
||||||
</server>
|
|
||||||
|
|
||||||
</gameserver>
|
|
||||||
|
|
||||||
<!-- Define lobbies -->
|
|
||||||
<lobbies>
|
|
||||||
|
|
||||||
<!-- Define the join/spec password for lobbies -->
|
|
||||||
<password>a</password>
|
|
||||||
|
|
||||||
<!-- Template -->
|
|
||||||
<!-- <server> -->
|
|
||||||
<!-- <host>ip</host> -->
|
|
||||||
<!-- <port>5000</port> -->
|
|
||||||
<!-- <login>SuperAdmin</login> -->
|
|
||||||
<!-- <pass>SuperAdmin</pass> -->
|
|
||||||
<!-- </server> -->
|
|
||||||
|
|
||||||
<!-- Canyon -->
|
|
||||||
<server>
|
|
||||||
<host>144.76.158.111</host>
|
|
||||||
<port>21023</port>
|
|
||||||
<login>SuperAdmin</login>
|
|
||||||
<pass>dtcfvgubhnjomkjnbhv</pass>
|
|
||||||
</server>
|
|
||||||
|
|
||||||
<!-- Stadium -->
|
|
||||||
<server>
|
|
||||||
<host>144.76.158.111</host>
|
|
||||||
<port>21043</port>
|
|
||||||
<login>SuperAdmin</login>
|
|
||||||
<pass>dtcfvgubhnjomkjnbhv</pass>
|
|
||||||
</server>
|
|
||||||
|
|
||||||
<!-- Valley -->
|
|
||||||
<server>
|
|
||||||
<host>144.76.158.111</host>
|
|
||||||
<port>21063</port>
|
|
||||||
<login>SuperAdmin</login>
|
|
||||||
<pass>dtcfvgubhnjomkjnbhv</pass>
|
|
||||||
</server>
|
|
||||||
|
|
||||||
</lobbies>
|
|
||||||
|
|
||||||
<!-- Configure widgets -->
|
|
||||||
<widgets>
|
|
||||||
<enabled>true</enabled>
|
|
||||||
|
|
||||||
<!-- Favorite widget -->
|
|
||||||
<addfavorite>
|
|
||||||
<enabled>true</enabled>
|
|
||||||
<pos_x>76</pos_x>
|
|
||||||
<pos_y>85.5</pos_y>
|
|
||||||
<width>10</width>
|
|
||||||
<height>10</height>
|
|
||||||
<!-- Enable add_all to let players add all game and lobby server to favorite with 1 click -->
|
|
||||||
<add_all>true</add_all>
|
|
||||||
</addfavorite>
|
|
||||||
|
|
||||||
</widgets>
|
|
||||||
|
|
||||||
</united-config>
|
|
@ -28,7 +28,7 @@ class Authentication {
|
|||||||
$this->mc = $mc;
|
$this->mc = $mc;
|
||||||
|
|
||||||
// Load config
|
// Load config
|
||||||
$this->config = Tools::loadConfig('authentication.ManiaControl.xml');
|
$this->config = Tools::loadConfig('authentication.xml');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
namespace ManiaControl;
|
namespace ManiaControl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class for handling server callbacks
|
* Class for handling server and controller callbacks
|
||||||
*
|
*
|
||||||
* @author steeffeen
|
* @author steeffeen
|
||||||
*/
|
*/
|
||||||
@ -12,14 +12,14 @@ class Callbacks {
|
|||||||
* Constants
|
* Constants
|
||||||
*/
|
*/
|
||||||
// ManiaControl callbacks
|
// ManiaControl callbacks
|
||||||
const CB_IC_1_SECOND = 'ManiaControl.1Second';
|
const CB_MC_1_SECOND = 'ManiaControl.1Second';
|
||||||
const CB_IC_5_SECOND = 'ManiaControl.5Second';
|
const CB_MC_5_SECOND = 'ManiaControl.5Second';
|
||||||
const CB_IC_1_MINUTE = 'ManiaControl.1Minute';
|
const CB_MC_1_MINUTE = 'ManiaControl.1Minute';
|
||||||
const CB_IC_3_MINUTE = 'ManiaControl.3Minute';
|
const CB_MC_3_MINUTE = 'ManiaControl.3Minute';
|
||||||
const CB_IC_ONINIT = 'ManiaControl.OnInit';
|
const CB_MC_ONINIT = 'ManiaControl.OnInit';
|
||||||
const CB_IC_CLIENTUPDATED = 'ManiaControl.ClientUpdated';
|
const CB_MC_CLIENTUPDATED = 'ManiaControl.ClientUpdated';
|
||||||
const CB_IC_BEGINMAP = 'ManiaControl.BeginMap';
|
const CB_MC_BEGINMAP = 'ManiaControl.BeginMap';
|
||||||
const CB_IC_ENDMAP = 'ManiaControl.EndMap';
|
const CB_MC_ENDMAP = 'ManiaControl.EndMap';
|
||||||
// ManiaPlanet callbacks
|
// ManiaPlanet callbacks
|
||||||
const CB_MP_SERVERSTART = 'ManiaPlanet.ServerStart';
|
const CB_MP_SERVERSTART = 'ManiaPlanet.ServerStart';
|
||||||
const CB_MP_SERVERSTOP = 'ManiaPlanet.ServerStop';
|
const CB_MP_SERVERSTOP = 'ManiaPlanet.ServerStop';
|
||||||
@ -49,23 +49,20 @@ class Callbacks {
|
|||||||
/**
|
/**
|
||||||
* Private properties
|
* Private properties
|
||||||
*/
|
*/
|
||||||
private $mc = null;
|
private $maniaControl = null;
|
||||||
|
|
||||||
private $callbackHandlers = array();
|
private $callbackHandlers = array();
|
||||||
|
|
||||||
private $last1Second = -1;
|
private $last1Second = -1;
|
||||||
|
|
||||||
private $last5Second = -1;
|
private $last5Second = -1;
|
||||||
|
|
||||||
private $last1Minute = -1;
|
private $last1Minute = -1;
|
||||||
|
|
||||||
private $last3Minute = -1;
|
private $last3Minute = -1;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct callbacks handler
|
* Construct callbacks handler
|
||||||
|
*
|
||||||
|
* @param ManiaControl $maniaControl
|
||||||
*/
|
*/
|
||||||
public function __construct($mc) {
|
public function __construct(ManiaControl $maniaControl) {
|
||||||
$this->mc = $mc;
|
$this->maniaControl = $maniaControl;
|
||||||
|
|
||||||
// Init values
|
// Init values
|
||||||
$this->last1Second = time();
|
$this->last1Second = time();
|
||||||
@ -79,12 +76,12 @@ class Callbacks {
|
|||||||
*/
|
*/
|
||||||
public function onInit() {
|
public function onInit() {
|
||||||
// On init callback
|
// On init callback
|
||||||
$this->triggerCallback(self::CB_IC_ONINIT, array(self::CB_IC_ONINIT));
|
$this->triggerCallback(self::CB_MC_ONINIT, array(self::CB_MC_ONINIT));
|
||||||
|
|
||||||
// Simulate begin map
|
// Simulate begin map
|
||||||
$map = $this->mc->server->getMap();
|
$map = $this->maniaControl->server->getMap();
|
||||||
if ($map) {
|
if ($map) {
|
||||||
$this->triggerCallback(self::CB_IC_BEGINMAP, array(self::CB_IC_BEGINMAP, array($map)));
|
$this->triggerCallback(self::CB_MC_BEGINMAP, array(self::CB_MC_BEGINMAP, array($map)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -97,37 +94,39 @@ class Callbacks {
|
|||||||
$this->last1Second = time();
|
$this->last1Second = time();
|
||||||
|
|
||||||
// 1 second
|
// 1 second
|
||||||
$this->triggerCallback(self::CB_IC_1_SECOND, array(self::CB_IC_1_SECOND));
|
$this->triggerCallback(self::CB_MC_1_SECOND, array(self::CB_MC_1_SECOND));
|
||||||
|
|
||||||
if ($this->last5Second <= time() - 5) {
|
if ($this->last5Second <= time() - 5) {
|
||||||
$this->last5Second = time();
|
$this->last5Second = time();
|
||||||
|
|
||||||
// 5 second
|
// 5 second
|
||||||
$this->triggerCallback(self::CB_IC_5_SECOND, array(self::CB_IC_5_SECOND));
|
$this->triggerCallback(self::CB_MC_5_SECOND, array(self::CB_MC_5_SECOND));
|
||||||
|
|
||||||
if ($this->last1Minute <= time() - 60) {
|
if ($this->last1Minute <= time() - 60) {
|
||||||
$this->last1Minute = time();
|
$this->last1Minute = time();
|
||||||
|
|
||||||
// 1 minute
|
// 1 minute
|
||||||
$this->triggerCallback(self::CB_IC_1_MINUTE, array(self::CB_IC_1_MINUTE));
|
$this->triggerCallback(self::CB_MC_1_MINUTE, array(self::CB_MC_1_MINUTE));
|
||||||
|
|
||||||
if ($this->last3Minute <= time() - 180) {
|
if ($this->last3Minute <= time() - 180) {
|
||||||
$this->last3Minute = time();
|
$this->last3Minute = time();
|
||||||
|
|
||||||
// 3 minute
|
// 3 minute
|
||||||
$this->triggerCallback(self::CB_IC_3_MINUTE, array(self::CB_IC_3_MINUTE));
|
$this->triggerCallback(self::CB_MC_3_MINUTE, array(self::CB_MC_3_MINUTE));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get server callbacks
|
// Get server callbacks
|
||||||
if (!$this->mc->client) return;
|
if (!$this->maniaControl->client) {
|
||||||
$this->mc->client->resetError();
|
return;
|
||||||
$this->mc->client->readCB();
|
}
|
||||||
$callbacks = $this->mc->client->getCBResponses();
|
$this->maniaControl->client->resetError();
|
||||||
if (!is_array($callbacks) || $this->mc->client->isError()) {
|
$this->maniaControl->client->readCB();
|
||||||
trigger_error("Error reading server callbacks. " . $this->mc->getClientErrorText());
|
$callbacks = $this->maniaControl->client->getCBResponses();
|
||||||
|
if (!is_array($callbacks) || $this->maniaControl->client->isError()) {
|
||||||
|
trigger_error("Error reading server callbacks. " . $this->maniaControl->getClientErrorText());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -139,14 +138,14 @@ class Callbacks {
|
|||||||
{
|
{
|
||||||
// Map begin
|
// Map begin
|
||||||
$this->triggerCallback($callbackName, $callback);
|
$this->triggerCallback($callbackName, $callback);
|
||||||
$this->triggerCallback(self::CB_IC_BEGINMAP, $callback);
|
$this->triggerCallback(self::CB_MC_BEGINMAP, $callback);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case self::CB_MP_ENDMAP:
|
case self::CB_MP_ENDMAP:
|
||||||
{
|
{
|
||||||
// Map end
|
// Map end
|
||||||
$this->triggerCallback($callbackName, $callback);
|
$this->triggerCallback($callbackName, $callback);
|
||||||
$this->triggerCallback(self::CB_IC_ENDMAP, $callback);
|
$this->triggerCallback(self::CB_MC_ENDMAP, $callback);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@ -162,12 +161,14 @@ class Callbacks {
|
|||||||
* Trigger a specific callback
|
* Trigger a specific callback
|
||||||
*
|
*
|
||||||
* @param string $callbackName
|
* @param string $callbackName
|
||||||
* @param mixed $data
|
* @param array $data
|
||||||
*/
|
*/
|
||||||
public function triggerCallback($callbackName, $data) {
|
public function triggerCallback($callbackName, array $callback) {
|
||||||
if (!array_key_exists($callbackName, $this->callbackHandlers) || !is_array($this->callbackHandlers[$callbackName])) return;
|
if (!array_key_exists($callbackName, $this->callbackHandlers)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
foreach ($this->callbackHandlers[$callbackName] as $handler) {
|
foreach ($this->callbackHandlers[$callbackName] as $handler) {
|
||||||
call_user_func(array($handler[0], $handler[1]), $data);
|
call_user_func(array($handler[0], $handler[1]), $callback);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -176,7 +177,7 @@ class Callbacks {
|
|||||||
*/
|
*/
|
||||||
public function registerCallbackHandler($callback, $handler, $method) {
|
public function registerCallbackHandler($callback, $handler, $method) {
|
||||||
if (!is_object($handler) || !method_exists($handler, $method)) {
|
if (!is_object($handler) || !method_exists($handler, $method)) {
|
||||||
trigger_error("Given handler can't handle callback '" . $callback . "' (no method '" . $method . "')!");
|
trigger_error("Given handler can't handle callback '{$callback}' (no method '{$method}')!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!array_key_exists($callback, $this->callbackHandlers) || !is_array($this->callbackHandlers[$callback])) {
|
if (!array_key_exists($callback, $this->callbackHandlers) || !is_array($this->callbackHandlers[$callback])) {
|
||||||
|
@ -25,7 +25,7 @@ class Chat {
|
|||||||
$this->mc = $mc;
|
$this->mc = $mc;
|
||||||
|
|
||||||
// Load config
|
// Load config
|
||||||
$this->config = Tools::loadConfig('chat.ManiaControl.xml');
|
$this->config = Tools::loadConfig('chat.xml');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -41,7 +41,8 @@ class Chat {
|
|||||||
return $this->mc->client->query('ChatSendServerMessage', '$z' . ($prefix ? $this->prefix : '') . $message . '$z');
|
return $this->mc->client->query('ChatSendServerMessage', '$z' . ($prefix ? $this->prefix : '') . $message . '$z');
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return $this->mc->client->query('ChatSendServerMessageToLogin', '$z' . ($prefix ? $this->prefix : '') . $message . '$z', $login);
|
return $this->mc->client->query('ChatSendServerMessageToLogin', '$z' . ($prefix ? $this->prefix : '') . $message . '$z',
|
||||||
|
$login);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,10 +31,10 @@ class Commands {
|
|||||||
$this->mc = $mc;
|
$this->mc = $mc;
|
||||||
|
|
||||||
// Load config
|
// Load config
|
||||||
$this->config = Tools::loadConfig('commands.ManiaControl.xml');
|
$this->config = Tools::loadConfig('commands.xml');
|
||||||
|
|
||||||
// Register for callbacks
|
// Register for callbacks
|
||||||
$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_IC_5_SECOND, $this, 'each5Seconds');
|
$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_MC_5_SECOND, $this, 'each5Seconds');
|
||||||
$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_MP_BILLUPDATED, $this, 'handleBillUpdated');
|
$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_MP_BILLUPDATED, $this, 'handleBillUpdated');
|
||||||
$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_MP_PLAYERCHAT, $this, 'handleChatCallback');
|
$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_MP_PLAYERCHAT, $this, 'handleChatCallback');
|
||||||
|
|
||||||
@ -345,7 +345,7 @@ class Commands {
|
|||||||
$this->mc->authentication->sendNotAllowed($login);
|
$this->mc->authentication->sendNotAllowed($login);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$this->mc->quit("ManiaControl shutdown requested by '" . $login . "'");
|
$this->mc->quit("ManiaControl shutdown requested by '{$login}'");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -11,8 +11,8 @@ class Database {
|
|||||||
/**
|
/**
|
||||||
* Constants
|
* Constants
|
||||||
*/
|
*/
|
||||||
const TABLE_PLAYERS = 'ic_players';
|
const TABLE_PLAYERS = 'mc_players';
|
||||||
const TABLE_MAPS = 'ic_maps';
|
const TABLE_MAPS = 'mc_maps';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Public properties
|
* Public properties
|
||||||
@ -22,21 +22,17 @@ class Database {
|
|||||||
/**
|
/**
|
||||||
* Private properties
|
* Private properties
|
||||||
*/
|
*/
|
||||||
private $mc = null;
|
private $maniaControl = null;
|
||||||
|
|
||||||
private $config = null;
|
private $config = null;
|
||||||
|
|
||||||
private $multiQueries = '';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct database connection
|
* Construct database connection
|
||||||
*/
|
*/
|
||||||
public function __construct($mc) {
|
public function __construct(ManiaControl $maniaControl) {
|
||||||
$this->mc = $mc;
|
$this->maniaControl = $maniaControl;
|
||||||
|
|
||||||
// Load config
|
// Load config
|
||||||
$this->config = Tools::loadConfig('database.ManiaControl.xml');
|
$this->config = Tools::loadConfig('database.xml');
|
||||||
$this->mc->checkConfig($this->config, array("host", "user"), 'database.ManiaControl.xml');
|
|
||||||
|
|
||||||
// Get mysql server information
|
// Get mysql server information
|
||||||
$host = $this->config->xpath('host');
|
$host = $this->config->xpath('host');
|
||||||
@ -58,23 +54,12 @@ class Database {
|
|||||||
// Open database connection
|
// Open database connection
|
||||||
$this->mysqli = new \mysqli($host, $user, $pass, null, $port);
|
$this->mysqli = new \mysqli($host, $user, $pass, null, $port);
|
||||||
if ($this->mysqli->connect_error) {
|
if ($this->mysqli->connect_error) {
|
||||||
// Connection error
|
trigger_error($this->mysqli->connect_error, E_USER_ERROR);
|
||||||
throw new \Exception(
|
|
||||||
"Error on connecting to mysql server. " . $this->mysqli->connect_error . " (" . $this->mysqli->connect_errno . ")");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set charset
|
|
||||||
$this->mysqli->set_charset("utf8");
|
$this->mysqli->set_charset("utf8");
|
||||||
|
|
||||||
// Create/Connect database
|
|
||||||
$this->initDatabase();
|
$this->initDatabase();
|
||||||
|
$this->optimizeTables();
|
||||||
// Init tables
|
|
||||||
$this->initTables();
|
|
||||||
|
|
||||||
// Register for callbacks
|
|
||||||
$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_IC_5_SECOND, $this, 'handle5Second');
|
|
||||||
$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_IC_BEGINMAP, $this, 'handleBeginMap');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -86,6 +71,8 @@ class Database {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Connect to the defined database (create it if needed)
|
* Connect to the defined database (create it if needed)
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
*/
|
*/
|
||||||
private function initDatabase() {
|
private function initDatabase() {
|
||||||
$dbname = $this->config->xpath('database');
|
$dbname = $this->config->xpath('database');
|
||||||
@ -94,307 +81,67 @@ class Database {
|
|||||||
|
|
||||||
// Try to connect
|
// Try to connect
|
||||||
$result = $this->mysqli->select_db($dbname);
|
$result = $this->mysqli->select_db($dbname);
|
||||||
if (!$result) {
|
if ($result) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// Create database
|
// Create database
|
||||||
$query = "CREATE DATABASE `" . $this->escape($dbname) . "`;";
|
$databaseQuery = "CREATE DATABASE ?;";
|
||||||
$result = $this->mysqli->query($query);
|
$databaseStatement = $this->mysqli->prepare($databaseQuery);
|
||||||
if (!$result) {
|
if ($this->mysqli->error) {
|
||||||
trigger_error(
|
trigger_error($this->mysqli->error, E_USER_ERROR);
|
||||||
"Couldn't create database '" . $dbname . "'. " . $this->mysqli->error . ' (' . $this->mysqli->errno . ')',
|
return false;
|
||||||
E_USER_ERROR);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Connect to database
|
|
||||||
$result = $this->mysqli->select_db($dbname);
|
|
||||||
if (!$result) {
|
|
||||||
trigger_error(
|
|
||||||
"Couldn't select database '" . $dbname . "'. " . $this->mysqli->error . ' (' . $this->mysqli->errno . ')',
|
|
||||||
E_USER_ERROR);
|
|
||||||
}
|
}
|
||||||
|
$databaseStatement->bind_param('s', $dbname);
|
||||||
|
$databaseStatement->execute();
|
||||||
|
if ($databaseStatement->error) {
|
||||||
|
trigger_error($databaseStatement->error, E_USER_ERROR);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
$databaseStatement->close();
|
||||||
|
|
||||||
|
// Connect to new database
|
||||||
|
$this->mysqli->select_db($dbname);
|
||||||
|
if ($this->mysqli->error) {
|
||||||
|
trigger_error("Couldn't select database '{$dbname}'. " . $this->mysqli->error, E_USER_ERROR);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create the needed tables
|
* Optimize all existing tables
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
*/
|
*/
|
||||||
private function initTables() {
|
private function optimizeTables() {
|
||||||
$query = "";
|
$showQuery = "SHOW TABLES;";
|
||||||
|
$result = $this->mysqli->query($showQuery);
|
||||||
// Players table
|
if ($this->mysqli->error) {
|
||||||
$query .= "CREATE TABLE IF NOT EXISTS `" . self::TABLE_PLAYERS . "` (
|
trigger_error($this->mysqli->error);
|
||||||
`index` int(11) NOT NULL AUTO_INCREMENT,
|
return false;
|
||||||
`Login` varchar(100) NOT NULL,
|
|
||||||
`NickName` varchar(250) NOT NULL,
|
|
||||||
`PlayerId` int(11) NOT NULL,
|
|
||||||
`LadderRanking` int(11) NOT NULL,
|
|
||||||
`Flags` varchar(50) NOT NULL,
|
|
||||||
`changed` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
||||||
PRIMARY KEY (`index`),
|
|
||||||
UNIQUE KEY `Login` (`Login`)
|
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Store player metadata' AUTO_INCREMENT=1;";
|
|
||||||
|
|
||||||
// Maps table
|
|
||||||
$query .= "CREATE TABLE IF NOT EXISTS `ic_maps` (
|
|
||||||
`index` int(11) NOT NULL AUTO_INCREMENT,
|
|
||||||
`UId` varchar(100) NOT NULL,
|
|
||||||
`Name` varchar(100) NOT NULL,
|
|
||||||
`FileName` varchar(200) NOT NULL,
|
|
||||||
`Author` varchar(150) NOT NULL,
|
|
||||||
`Environnement` varchar(50) NOT NULL,
|
|
||||||
`Mood` varchar(50) NOT NULL,
|
|
||||||
`BronzeTime` int(11) NOT NULL DEFAULT '-1',
|
|
||||||
`SilverTime` int(11) NOT NULL DEFAULT '-1',
|
|
||||||
`GoldTime` int(11) NOT NULL DEFAULT '-1',
|
|
||||||
`AuthorTime` int(11) NOT NULL DEFAULT '-1',
|
|
||||||
`CopperPrice` int(11) NOT NULL DEFAULT '-1',
|
|
||||||
`LapRace` tinyint(1) NOT NULL,
|
|
||||||
`NbLaps` int(11) NOT NULL DEFAULT '-1',
|
|
||||||
`NbCheckpoints` int(11) NOT NULL DEFAULT '-1',
|
|
||||||
`MapType` varchar(100) NOT NULL,
|
|
||||||
`MapStyle` varchar(100) NOT NULL,
|
|
||||||
`changed` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
||||||
PRIMARY KEY (`index`),
|
|
||||||
UNIQUE KEY `UId` (`UId`)
|
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Store map metadata' AUTO_INCREMENT=1;";
|
|
||||||
|
|
||||||
// Perform queries
|
|
||||||
if (!$this->multiQuery($query)) {
|
|
||||||
trigger_error("Creating basic tables failed. " . $this->mysqli->error . ' (' . $this->mysqli->errno . ')', E_USER_ERROR);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Optimize all existing tables
|
|
||||||
$query = "SHOW TABLES;";
|
|
||||||
$result = $this->query($query);
|
|
||||||
if (!$result || !is_object($result)) {
|
|
||||||
trigger_error("Couldn't select tables. " . $this->mysqli->error . ' (' . $this->mysqli->errno . ')');
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$query = "OPTIMIZE TABLE ";
|
|
||||||
$count = $result->num_rows;
|
$count = $result->num_rows;
|
||||||
|
if ($count <= 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
$optimizeQuery = "OPTIMIZE TABLE ";
|
||||||
$index = 0;
|
$index = 0;
|
||||||
while ($row = $result->fetch_row()) {
|
while ($row = $result->fetch_row()) {
|
||||||
$query .= "`" . $row[0] . "`";
|
$tableName = $row[0];
|
||||||
if ($index < $count - 1) $query .= ", ";
|
$optimizeQuery .= "`{$tableName}`";
|
||||||
|
if ($index < $count - 1) {
|
||||||
|
$optimizeQuery .= ", ";
|
||||||
|
}
|
||||||
$index++;
|
$index++;
|
||||||
}
|
}
|
||||||
$query .= ";";
|
$optimizeQuery .= ";";
|
||||||
if (!$this->query($query)) {
|
$this->mysqli->query($optimizeQuery);
|
||||||
trigger_error("Couldn't optimize tables. " . $this->mysqli->error . ' (' . $this->mysqli->errno . ')');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrapper for performing a simple query
|
|
||||||
*
|
|
||||||
* @param string $query
|
|
||||||
* @return mixed query result
|
|
||||||
*/
|
|
||||||
public function query($query) {
|
|
||||||
if (!is_string($query)) return false;
|
|
||||||
if (strlen($query) <= 0) return true;
|
|
||||||
return $this->mysqli->query($query);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Perform multi query
|
|
||||||
*
|
|
||||||
* @param
|
|
||||||
* string multi_query
|
|
||||||
* @return bool whether no error occured during executing the multi query
|
|
||||||
*/
|
|
||||||
public function multiQuery($query) {
|
|
||||||
if (!is_string($query)) return false;
|
|
||||||
if (strlen($query) <= 0) return true;
|
|
||||||
$noError = true;
|
|
||||||
$this->mysqli->multi_query($query);
|
|
||||||
if ($this->mysqli->error) {
|
if ($this->mysqli->error) {
|
||||||
trigger_error("Executing multi query failed. " . $this->mysqli->error . ' (' . $this->mysqli->errno . ')');
|
trigger_error($this->mysqli->error);
|
||||||
$noError = false;
|
return false;
|
||||||
}
|
}
|
||||||
while ($this->mysqli->more_results() && $this->mysqli->next_result()) {
|
return true;
|
||||||
if ($this->mysqli->error) {
|
|
||||||
trigger_error("Executing multi query failed. " . $this->mysqli->error . ' (' . $this->mysqli->errno . ')');
|
|
||||||
$noError = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $noError;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle 5Second callback
|
|
||||||
*/
|
|
||||||
public function handle5Second($callback = null) {
|
|
||||||
// Save current players in database
|
|
||||||
$players = $this->mc->server->getPlayers();
|
|
||||||
if ($players) {
|
|
||||||
$query = "";
|
|
||||||
foreach ($players as $player) {
|
|
||||||
if (!Tools::isPlayer($player)) continue;
|
|
||||||
$query .= $this->composeInsertPlayer($player);
|
|
||||||
}
|
|
||||||
$this->multiQuery($query);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle BeginMap callback
|
|
||||||
*/
|
|
||||||
public function handleBeginMap($callback) {
|
|
||||||
$map = $callback[1][0];
|
|
||||||
$query = $this->composeInsertMap($map);
|
|
||||||
$result = $this->query($query);
|
|
||||||
if ($this->mysqli->error) {
|
|
||||||
trigger_error("Couldn't save map. " . $this->mysqli->error . ' (' . $this->mysqli->errno . ')');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the player index for the given login
|
|
||||||
*
|
|
||||||
* @param string $login
|
|
||||||
* @return int null
|
|
||||||
*/
|
|
||||||
public function getPlayerIndex($login) {
|
|
||||||
$query = "SELECT `index` FROM `" . self::TABLE_PLAYERS . "` WHERE `Login` = '" . $this->escape($login) . "';";
|
|
||||||
$result = $this->query($query);
|
|
||||||
$result = $result->fetch_assoc();
|
|
||||||
if ($result) {
|
|
||||||
return $result['index'];
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the map index for the given UId
|
|
||||||
*
|
|
||||||
* @param string $uid
|
|
||||||
* @return int null
|
|
||||||
*/
|
|
||||||
public function getMapIndex($uid) {
|
|
||||||
$query = "SELECT `index` FROM `" . self::TABLE_MAPS . "` WHERE `UId` = '" . $this->escape($uid) . "';";
|
|
||||||
$result = $this->query($query);
|
|
||||||
$result = $result->fetch_assoc();
|
|
||||||
if ($result) {
|
|
||||||
return $result['index'];
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Compose a query string for inserting the given player
|
|
||||||
*
|
|
||||||
* @param array $player
|
|
||||||
*/
|
|
||||||
private function composeInsertPlayer($player) {
|
|
||||||
if (!Tools::isPlayer($player)) return "";
|
|
||||||
return "INSERT INTO `" . self::TABLE_PLAYERS . "` (
|
|
||||||
`Login`,
|
|
||||||
`NickName`,
|
|
||||||
`PlayerId`,
|
|
||||||
`LadderRanking`,
|
|
||||||
`Flags`
|
|
||||||
) VALUES (
|
|
||||||
'" . $this->escape($player['Login']) . "',
|
|
||||||
'" . $this->escape($player['NickName']) . "',
|
|
||||||
" . $player['PlayerId'] . ",
|
|
||||||
" . $player['LadderRanking'] . ",
|
|
||||||
'" . $this->escape($player['Flags']) . "'
|
|
||||||
) ON DUPLICATE KEY UPDATE
|
|
||||||
`NickName` = VALUES(`NickName`),
|
|
||||||
`PlayerId` = VALUES(`PlayerId`),
|
|
||||||
`LadderRanking` = VALUES(`LadderRanking`),
|
|
||||||
`Flags` = VALUES(`Flags`);";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Compose a query string for inserting the given map
|
|
||||||
*
|
|
||||||
* @param array $map
|
|
||||||
*/
|
|
||||||
private function composeInsertMap($map) {
|
|
||||||
if (!$map) return "";
|
|
||||||
return "INSERT INTO `" . self::TABLE_MAPS . "` (
|
|
||||||
`UId`,
|
|
||||||
`Name`,
|
|
||||||
`FileName`,
|
|
||||||
`Author`,
|
|
||||||
`Environnement`,
|
|
||||||
`Mood`,
|
|
||||||
`BronzeTime`,
|
|
||||||
`SilverTime`,
|
|
||||||
`GoldTime`,
|
|
||||||
`AuthorTime`,
|
|
||||||
`CopperPrice`,
|
|
||||||
`LapRace`,
|
|
||||||
`NbLaps`,
|
|
||||||
`NbCheckpoints`,
|
|
||||||
`MapType`,
|
|
||||||
`MapStyle`
|
|
||||||
) VALUES (
|
|
||||||
'" . $this->escape($map['UId']) . "',
|
|
||||||
'" . $this->escape($map['Name']) . "',
|
|
||||||
'" . $this->escape($map['FileName']) . "',
|
|
||||||
'" . $this->escape($map['Author']) . "',
|
|
||||||
'" . $this->escape($map['Environnement']) . "',
|
|
||||||
'" . $this->escape($map['Mood']) . "',
|
|
||||||
" . $map['BronzeTime'] . ",
|
|
||||||
" . $map['SilverTime'] . ",
|
|
||||||
" . $map['GoldTime'] . ",
|
|
||||||
" . $map['AuthorTime'] . ",
|
|
||||||
" . $map['CopperPrice'] . ",
|
|
||||||
" . Tools::boolToInt($map['LapRace']) . ",
|
|
||||||
" . $map['NbLaps'] . ",
|
|
||||||
" . $map['NbCheckpoints'] . ",
|
|
||||||
'" . $this->escape($map['MapType']) . "',
|
|
||||||
'" . $this->escape($map['MapStyle']) . "'
|
|
||||||
) ON DUPLICATE KEY UPDATE
|
|
||||||
`Name` = VALUES(`Name`),
|
|
||||||
`FileName` = VALUES(`FileName`),
|
|
||||||
`Author` = VALUES(`Author`),
|
|
||||||
`Environnement` = VALUES(`Environnement`),
|
|
||||||
`Mood` = VALUES(`Mood`),
|
|
||||||
`BronzeTime` = VALUES(`BronzeTime`),
|
|
||||||
`SilverTime` = VALUES(`SilverTime`),
|
|
||||||
`GoldTime` = VALUES(`GoldTime`),
|
|
||||||
`AuthorTime` = VALUES(`AuthorTime`),
|
|
||||||
`CopperPrice` = VALUES(`CopperPrice`),
|
|
||||||
`LapRace` = VALUES(`LapRace`),
|
|
||||||
`NbLaps` = VALUES(`NbLaps`),
|
|
||||||
`NbCheckpoints` = VALUES(`NbCheckpoints`),
|
|
||||||
`MapType` = VALUES(`MapType`),
|
|
||||||
`MapStyle` = VALUES(`MapStyle`);";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve all information about the player with the given login
|
|
||||||
*/
|
|
||||||
public function getPlayer($login) {
|
|
||||||
if (!$login) return null;
|
|
||||||
$query = "SELECT * FROM `" . self::TABLE_PLAYERS . "` WHERE `Login` = '" . $this->escape($login) . "';";
|
|
||||||
$result = $this->mysqli->query($query);
|
|
||||||
if ($this->mysqli->error || !$result) {
|
|
||||||
trigger_error(
|
|
||||||
"Couldn't select player with login '" . $login . "'. " . $this->mysqli->error . ' (' . $this->mysqli->errno . ')');
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
while ($player = $result->fetch_assoc()) {
|
|
||||||
return $player;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Escapes the given string for a mysql query
|
|
||||||
*
|
|
||||||
* @param string $string
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function escape($string) {
|
|
||||||
return $this->mysqli->escape_string($string);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,12 +11,9 @@ require_once __DIR__ . '/chat.php';
|
|||||||
require_once __DIR__ . '/commands.php';
|
require_once __DIR__ . '/commands.php';
|
||||||
require_once __DIR__ . '/database.php';
|
require_once __DIR__ . '/database.php';
|
||||||
require_once __DIR__ . '/server.php';
|
require_once __DIR__ . '/server.php';
|
||||||
require_once __DIR__ . '/stats.php';
|
|
||||||
require_once __DIR__ . '/tools.php';
|
require_once __DIR__ . '/tools.php';
|
||||||
require_once __DIR__ . '/pluginHandler.php';
|
require_once __DIR__ . '/pluginHandler.php';
|
||||||
require_once __DIR__ . '/plugin.php';
|
|
||||||
require_once __DIR__ . '/playerHandler.php';
|
require_once __DIR__ . '/playerHandler.php';
|
||||||
require_once __DIR__ . '/player.php';
|
|
||||||
require_once __DIR__ . '/manialinkIdHandler.php';
|
require_once __DIR__ . '/manialinkIdHandler.php';
|
||||||
list($endiantest) = array_values(unpack('L1L', pack('V', 1)));
|
list($endiantest) = array_values(unpack('L1L', pack('V', 1)));
|
||||||
if ($endiantest == 1) {
|
if ($endiantest == 1) {
|
||||||
@ -39,89 +36,39 @@ class ManiaControl {
|
|||||||
const API_VERSION = '2013-04-16';
|
const API_VERSION = '2013-04-16';
|
||||||
const DATE = 'd-m-y h:i:sa T';
|
const DATE = 'd-m-y h:i:sa T';
|
||||||
|
|
||||||
/**
|
|
||||||
* Private properties
|
|
||||||
*/
|
|
||||||
private $version = 0;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Public properties
|
* Public properties
|
||||||
*/
|
*/
|
||||||
public $authentication = null;
|
public $authentication = null;
|
||||||
|
|
||||||
public $callbacks = null;
|
public $callbacks = null;
|
||||||
|
|
||||||
public $client = null;
|
public $client = null;
|
||||||
|
|
||||||
public $chat = null;
|
public $chat = null;
|
||||||
|
|
||||||
public $config = null;
|
|
||||||
|
|
||||||
public $commands = null;
|
public $commands = null;
|
||||||
|
|
||||||
public $database = null;
|
public $database = null;
|
||||||
|
|
||||||
public $debug = false;
|
|
||||||
|
|
||||||
public $server = null;
|
public $server = null;
|
||||||
|
|
||||||
public $startTime = -1;
|
|
||||||
|
|
||||||
public $stats = null;
|
|
||||||
|
|
||||||
public $manialinkIdHandler = null;
|
public $manialinkIdHandler = null;
|
||||||
public $pluginHandler = null;
|
public $pluginHandler = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Private properties
|
* Private properties
|
||||||
*/
|
*/
|
||||||
//private $plugins = array();
|
|
||||||
|
|
||||||
private $shutdownRequested = false;
|
private $shutdownRequested = false;
|
||||||
|
private $config = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct ManiaControl
|
* Construct ManiaControl
|
||||||
*/
|
*/
|
||||||
public function __construct() {
|
public function __construct() {
|
||||||
// Load core
|
$this->config = Tools::loadConfig('core.xml');
|
||||||
$this->config = Tools::loadConfig('core.ManiaControl.xml');
|
|
||||||
$this->startTime = time();
|
|
||||||
|
|
||||||
// Load chat tool
|
|
||||||
$this->chat = new Chat($this);
|
$this->chat = new Chat($this);
|
||||||
|
|
||||||
// Load callbacks handler
|
|
||||||
$this->callbacks = new Callbacks($this);
|
$this->callbacks = new Callbacks($this);
|
||||||
|
|
||||||
// Load database
|
|
||||||
$this->database = new Database($this);
|
$this->database = new Database($this);
|
||||||
|
|
||||||
// Load server
|
|
||||||
$this->server = new Server($this);
|
$this->server = new Server($this);
|
||||||
|
|
||||||
// Load authentication
|
|
||||||
$this->authentication = new Authentication($this);
|
$this->authentication = new Authentication($this);
|
||||||
|
|
||||||
// Load playerHandler
|
|
||||||
$this->playerHandler = new PlayerHandler($this);
|
$this->playerHandler = new PlayerHandler($this);
|
||||||
|
|
||||||
// Load manialinkidHandler
|
|
||||||
$this->manialinkIdHandler = new ManialinkIdHandler();
|
$this->manialinkIdHandler = new ManialinkIdHandler();
|
||||||
|
|
||||||
// Load pluginHandler
|
|
||||||
$this->pluginHandler = new PluginHandler($this);
|
|
||||||
|
|
||||||
// Load commands handler
|
|
||||||
$this->commands = new Commands($this);
|
$this->commands = new Commands($this);
|
||||||
|
$this->pluginHandler = new PluginHandler($this);
|
||||||
// Load stats manager
|
|
||||||
$this->stats = new Stats($this);
|
|
||||||
|
|
||||||
// Register for core callbacks
|
|
||||||
$this->callbacks->registerCallbackHandler(Callbacks::CB_MP_ENDMAP, $this, 'handleEndMap');
|
|
||||||
|
|
||||||
// Set ManiaControl version
|
|
||||||
$this->version = self::VERSION;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -141,8 +88,6 @@ class ManiaControl {
|
|||||||
* Quit ManiaControl and log the given message
|
* Quit ManiaControl and log the given message
|
||||||
*/
|
*/
|
||||||
public function quit($message = false) {
|
public function quit($message = false) {
|
||||||
if ($this->shutdownRequested) return;
|
|
||||||
|
|
||||||
if ($this->client) {
|
if ($this->client) {
|
||||||
// Announce quit
|
// Announce quit
|
||||||
$this->chat->sendInformation('ManiaControl shutting down.');
|
$this->chat->sendInformation('ManiaControl shutting down.');
|
||||||
@ -157,7 +102,9 @@ class ManiaControl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Shutdown
|
// Shutdown
|
||||||
if ($this->client) $this->client->Terminate();
|
if ($this->client) {
|
||||||
|
$this->client->Terminate();
|
||||||
|
}
|
||||||
|
|
||||||
error_log("Quitting ManiaControl!");
|
error_log("Quitting ManiaControl!");
|
||||||
exit();
|
exit();
|
||||||
@ -166,12 +113,10 @@ class ManiaControl {
|
|||||||
/**
|
/**
|
||||||
* Run ManiaControl
|
* Run ManiaControl
|
||||||
*/
|
*/
|
||||||
public function run($debug = false) {
|
public function run() {
|
||||||
error_log('Starting ManiaControl v' . self::VERSION . '!');
|
error_log('Starting ManiaControl v' . self::VERSION . '!');
|
||||||
$this->debug = (bool) $debug;
|
|
||||||
|
|
||||||
// Load plugins
|
// Load plugins
|
||||||
//$this->loadPlugins();
|
|
||||||
$this->pluginHandler->loadPlugins();
|
$this->pluginHandler->loadPlugins();
|
||||||
|
|
||||||
// Connect to server
|
// Connect to server
|
||||||
@ -181,13 +126,7 @@ class ManiaControl {
|
|||||||
error_log("Loading completed!");
|
error_log("Loading completed!");
|
||||||
|
|
||||||
// Announce ManiaControl
|
// Announce ManiaControl
|
||||||
if (!$this->chat->sendInformation('ManiaControl v' . self::VERSION . ' successfully started!')) {
|
$this->chat->sendInformation('ManiaControl v' . self::VERSION . ' successfully started!');
|
||||||
trigger_error("Couldn't announce ManiaControl. " . $this->getClientErrorText());
|
|
||||||
}
|
|
||||||
|
|
||||||
//get PlayerList
|
|
||||||
$this->client->query('GetPlayerList', 300, 0, 2);
|
|
||||||
$this->playerHandler->addPlayerList($this->client->getResponse());
|
|
||||||
|
|
||||||
// OnInit
|
// OnInit
|
||||||
$this->callbacks->onInit();
|
$this->callbacks->onInit();
|
||||||
@ -202,14 +141,6 @@ class ManiaControl {
|
|||||||
// Handle server callbacks
|
// Handle server callbacks
|
||||||
$this->callbacks->handleCallbacks();
|
$this->callbacks->handleCallbacks();
|
||||||
|
|
||||||
// Loop plugins
|
|
||||||
/*foreach ($this->plugins as $plugin) {
|
|
||||||
if (!method_exists($plugin, 'loop')) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$plugin->loop();
|
|
||||||
}*/
|
|
||||||
|
|
||||||
// Yield for next tick
|
// Yield for next tick
|
||||||
$loopEnd = microtime(true);
|
$loopEnd = microtime(true);
|
||||||
$sleepTime = 300000 - $loopEnd + $loopStart;
|
$sleepTime = 300000 - $loopEnd + $loopStart;
|
||||||
@ -243,13 +174,11 @@ class ManiaControl {
|
|||||||
if (!$timeout) trigger_error("Invalid core configuration (timeout).", E_USER_ERROR);
|
if (!$timeout) trigger_error("Invalid core configuration (timeout).", E_USER_ERROR);
|
||||||
$timeout = (int) $timeout[0];
|
$timeout = (int) $timeout[0];
|
||||||
|
|
||||||
error_log("Connecting to server at " . $host . ":" . $port . "...");
|
error_log("Connecting to server at {$host}:{$port}...");
|
||||||
|
|
||||||
// Connect
|
// Connect
|
||||||
if (!$this->client->InitWithIp($host, $port, $timeout)) {
|
if (!$this->client->InitWithIp($host, $port, $timeout)) {
|
||||||
trigger_error(
|
trigger_error("Couldn't connect to server! " . $this->getClientErrorText(), E_USER_ERROR);
|
||||||
"Couldn't connect to server! " . $this->client->getErrorMessage() . "(" . $this->client->getErrorCode() . ")",
|
|
||||||
E_USER_ERROR);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$login = $this->server->config->xpath('login');
|
$login = $this->server->config->xpath('login');
|
||||||
@ -261,15 +190,12 @@ class ManiaControl {
|
|||||||
|
|
||||||
// Authenticate
|
// Authenticate
|
||||||
if (!$this->client->query('Authenticate', $login, $pass)) {
|
if (!$this->client->query('Authenticate', $login, $pass)) {
|
||||||
trigger_error(
|
trigger_error("Couldn't authenticate on server with user '{$login}'! " . $this->getClientErrorText(), E_USER_ERROR);
|
||||||
"Couldn't authenticate on server with user '" . $login . "'! " . $this->client->getErrorMessage() . "(" .
|
|
||||||
$this->client->getErrorCode() . ")", E_USER_ERROR);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enable callback system
|
// Enable callback system
|
||||||
if (!$this->client->query('EnableCallbacks', true)) {
|
if (!$this->client->query('EnableCallbacks', true)) {
|
||||||
trigger_error("Couldn't enable callbacks! " . $this->client->getErrorMessage() . "(" . $this->client->getErrorCode() . ")",
|
trigger_error("Couldn't enable callbacks! " . $this->getClientErrorText(), E_USER_ERROR);
|
||||||
E_USER_ERROR);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wait for server to be ready
|
// Wait for server to be ready
|
||||||
@ -280,18 +206,12 @@ class ManiaControl {
|
|||||||
// Set api version
|
// Set api version
|
||||||
if (!$this->client->query('SetApiVersion', self::API_VERSION)) {
|
if (!$this->client->query('SetApiVersion', self::API_VERSION)) {
|
||||||
trigger_error(
|
trigger_error(
|
||||||
"Couldn't set API version '" . self::API_VERSION . "'! This might cause problems. " .
|
"Couldn't set API version '" . self::API_VERSION . "'! This might cause problems. " . $this->getClientErrorText());
|
||||||
$this->getClientErrorText());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Connect finished
|
// Connect finished
|
||||||
error_log("Server connection succesfully established!");
|
error_log("Server connection succesfully established!");
|
||||||
|
|
||||||
// Enable service announces
|
|
||||||
if (!$this->client->query("DisableServiceAnnounces", false)) {
|
|
||||||
trigger_error("Couldn't enable service announces. " . $this->getClientErrorText());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Enable script callbacks if needed
|
// Enable script callbacks if needed
|
||||||
if ($this->server->getGameMode() === 0) {
|
if ($this->server->getGameMode() === 0) {
|
||||||
if (!$this->client->query('GetModeScriptSettings')) {
|
if (!$this->client->query('GetModeScriptSettings')) {
|
||||||
@ -302,8 +222,7 @@ class ManiaControl {
|
|||||||
if (array_key_exists('S_UseScriptCallbacks', $scriptSettings)) {
|
if (array_key_exists('S_UseScriptCallbacks', $scriptSettings)) {
|
||||||
$scriptSettings['S_UseScriptCallbacks'] = true;
|
$scriptSettings['S_UseScriptCallbacks'] = true;
|
||||||
if (!$this->client->query('SetModeScriptSettings', $scriptSettings)) {
|
if (!$this->client->query('SetModeScriptSettings', $scriptSettings)) {
|
||||||
trigger_error(
|
trigger_error("Couldn't set mode script settings to enable script callbacks. " . $this->getClientErrorText());
|
||||||
"Couldn't set mode script settings to enable script callbacks. " . $this->getClientErrorText());
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
error_log("Script callbacks successfully enabled.");
|
error_log("Script callbacks successfully enabled.");
|
||||||
@ -312,84 +231,6 @@ class ManiaControl {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Load ManiaControl plugins
|
|
||||||
*/
|
|
||||||
//private function loadPlugins() {
|
|
||||||
/* $pluginsConfig = Tools::loadConfig('plugins.ManiaControl.xml');
|
|
||||||
if (!$pluginsConfig || !isset($pluginsConfig->plugin)) {
|
|
||||||
trigger_error('Invalid plugins config.');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load plugin classes
|
|
||||||
$classes = get_declared_classes();
|
|
||||||
foreach ($pluginsConfig->xpath('plugin') as $plugin) {
|
|
||||||
$fileName = ManiaControlDir . '/plugins/' . $plugin;
|
|
||||||
if (!file_exists($fileName)) {
|
|
||||||
trigger_error("Couldn't load plugin '" . $plugin . "'! File doesn't exist. (/plugins/" . $plugin . ")");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
require_once $fileName;
|
|
||||||
error_log("Loading plugin: " . $plugin);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$plugins = array_diff(get_declared_classes(), $classes);
|
|
||||||
|
|
||||||
// Create plugins
|
|
||||||
foreach ($plugins as $plugin) {
|
|
||||||
$nameIndex = stripos($plugin, 'plugin');
|
|
||||||
if ($nameIndex === false) continue;
|
|
||||||
array_push($this->plugins, new $plugin($this));
|
|
||||||
}*/
|
|
||||||
//}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle EndMap callback
|
|
||||||
*/
|
|
||||||
public function handleEndMap($callback) {
|
|
||||||
// Autosave match settings
|
|
||||||
$autosaveMatchsettings = $this->config->xpath('autosave_matchsettings');
|
|
||||||
if ($autosaveMatchsettings) {
|
|
||||||
$autosaveMatchsettings = (string) $autosaveMatchsettings[0];
|
|
||||||
if ($autosaveMatchsettings) {
|
|
||||||
if (!$this->client->query('SaveMatchSettings', 'MatchSettings/' . $autosaveMatchsettings)) {
|
|
||||||
trigger_error("Couldn't autosave match settings. " . $this->getClientErrorText());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check config settings
|
|
||||||
*/
|
|
||||||
public function checkConfig($config, $settings, $name = 'Config XML') {
|
|
||||||
if (!is_array($settings)) $settings = array($settings);
|
|
||||||
foreach ($settings as $setting) {
|
|
||||||
$settingTags = $config->xpath('//' . $setting);
|
|
||||||
if (empty($settingTags)) {
|
|
||||||
trigger_error("Missing property '" . $setting . "' in config '" . $name . "'!", E_USER_ERROR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param mixed $version
|
|
||||||
*/
|
|
||||||
public function setVersion($version)
|
|
||||||
{
|
|
||||||
$this->version = $version;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return mixed
|
|
||||||
*/
|
|
||||||
public function getVersion()
|
|
||||||
{
|
|
||||||
return $this->version;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
?>
|
@ -1,110 +1,79 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
|
||||||
* Created by PhpStorm.
|
|
||||||
* User: Lukas
|
|
||||||
* Date: 09.11.13
|
|
||||||
* Time: 19:32
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace ManiaControl;
|
namespace ManiaControl;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class representing players
|
||||||
|
*
|
||||||
|
* @author Kremsy & Steff
|
||||||
|
*/
|
||||||
class Player {
|
class Player {
|
||||||
/**
|
/**
|
||||||
* public properties
|
* Public properties
|
||||||
*/
|
*/
|
||||||
public $id; //Internal Id from ManiaControl
|
public $index = -1;
|
||||||
public $pid; //Id from dedicated Server
|
public $pid = -1;
|
||||||
public $login;
|
public $login = '';
|
||||||
public $nickname;
|
public $nickname = '';
|
||||||
public $teamname;
|
public $isFakePlayer = false;
|
||||||
public $ip;
|
public $teamName = '';
|
||||||
public $client;
|
public $ip = '';
|
||||||
public $ipport;
|
public $ipFull = '';
|
||||||
public $zone;
|
public $clientVersion = '';
|
||||||
public $continent;
|
public $zone = '';
|
||||||
public $nation;
|
public $continent = '';
|
||||||
//public $prevstatus;
|
public $nation = '';
|
||||||
public $isSpectator;
|
public $isSpectator = false;
|
||||||
public $isOfficial;
|
public $isOfficial = false;
|
||||||
public $language;
|
public $language = '';
|
||||||
public $avatar;
|
public $avatar = '';
|
||||||
public $teamid;
|
public $teamId; // TODO: default value
|
||||||
public $unlocked;
|
public $unlocked; // TODO: default value
|
||||||
public $ladderrank;
|
public $ladderRank = -1;
|
||||||
public $ladderscore;
|
public $ladderScore = -1;
|
||||||
public $created;
|
public $created = -1;
|
||||||
|
public $rightLevel = 0;
|
||||||
public $rightLevel;
|
|
||||||
|
|
||||||
|
|
||||||
// TODO: usefull construct player without rpc info?
|
// TODO: usefull construct player without rpc info?
|
||||||
//TODO: isBot properti
|
|
||||||
// TODO: add all attributes like, allies, clublink ... just make vardump on rpc infos
|
// TODO: add all attributes like, allies, clublink ... just make vardump on rpc infos
|
||||||
// TODO: READ ADDITIONAL INFOS FROM DATABASE
|
// TODO: READ ADDITIONAL INFOS FROM DATABASE
|
||||||
public function __construct($rpc_infos = null){
|
/**
|
||||||
|
* Construct a player
|
||||||
|
*
|
||||||
|
* @param array $rpcInfos
|
||||||
|
*/
|
||||||
|
public function __construct($rpcInfos) {
|
||||||
|
$this->created = time();
|
||||||
|
if (!$rpcInfos) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if ($rpc_infos) {
|
$this->login = $rpcInfos['Login'];
|
||||||
$this->login = $rpc_infos['Login'];
|
$this->isFakePlayer = (stripos($this->login, '*') !== false);
|
||||||
$this->nickname = $rpc_infos['NickName'];
|
$this->nickname = $rpcInfos['NickName'];
|
||||||
$this->pid = $rpc_infos['PlayerId'];
|
$this->pid = $rpcInfos['PlayerId'];
|
||||||
$this->teamid = $rpc_infos['TeamId'];
|
$this->teamId = $rpcInfos['TeamId'];
|
||||||
$this->ipport = $rpc_infos['IPAddress'];
|
$this->ipFull = $rpcInfos['IPAddress'];
|
||||||
$this->ip = preg_replace('/:\d+/', '', $rpc_infos['IPAddress']); // strip port
|
$this->ip = preg_replace('/:\d+/', '', $this->ipFull);
|
||||||
//$this->prevstatus = false;
|
$this->isSpectator = $rpcInfos['IsSpectator'];
|
||||||
$this->isSpectator = $rpc_infos['IsSpectator'];
|
$this->isOfficial = $rpcInfos['IsInOfficialMode'];
|
||||||
$this->isOfficial = $rpc_infos['IsInOfficialMode'];
|
$this->teamName = $rpcInfos['LadderStats']['TeamName'];
|
||||||
$this->teamname = $rpc_infos['LadderStats']['TeamName'];
|
$this->zone = substr($rpcInfos['Path'], 6);
|
||||||
$this->zone = substr($rpc_infos['Path'], 6); // strip 'World|'
|
$zones = explode('|', $rpcInfos['Path']);
|
||||||
$zones = explode('|', $rpc_infos['Path']);
|
|
||||||
if (isset($zones[1])) {
|
if (isset($zones[1])) {
|
||||||
switch ($zones[1]) {
|
if (isset($zones[2])) {
|
||||||
case 'Europe':
|
|
||||||
case 'Africa':
|
|
||||||
case 'Asia':
|
|
||||||
case 'Middle East':
|
|
||||||
case 'North America':
|
|
||||||
case 'South America':
|
|
||||||
case 'Oceania':
|
|
||||||
$this->continent = $zones[1];
|
$this->continent = $zones[1];
|
||||||
$this->nation = $zones[2];
|
$this->nation = $zones[2];
|
||||||
break;
|
}
|
||||||
default:
|
else {
|
||||||
$this->continent = '';
|
|
||||||
$this->nation = $zones[1];
|
$this->nation = $zones[1];
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
$this->continent = '';
|
|
||||||
$this->nation = '';
|
|
||||||
}
|
}
|
||||||
$this->ladderrank = $rpc_infos['LadderStats']['PlayerRankings'][0]['Ranking'];
|
$this->ladderRank = $rpcInfos['LadderStats']['PlayerRankings'][0]['Ranking'];
|
||||||
$this->ladderscore = round($rpc_infos['LadderStats']['PlayerRankings'][0]['Score'], 2);
|
$this->ladderScore = round($rpcInfos['LadderStats']['PlayerRankings'][0]['Score'], 2);
|
||||||
$this->client = $rpc_infos['ClientVersion'];
|
$this->clientVersion = $rpcInfos['ClientVersion'];
|
||||||
$this->language = $rpc_infos['Language'];
|
$this->language = $rpcInfos['Language'];
|
||||||
$this->avatar = $rpc_infos['Avatar']['FileName'];
|
$this->avatar = $rpcInfos['Avatar']['FileName'];
|
||||||
$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->continent = '';
|
|
||||||
$this->nation = '';
|
|
||||||
$this->ladderrank = 0;
|
|
||||||
$this->ladderscore = 0;
|
|
||||||
$this->created = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//rightlevels, 0 = user, 1 = operator, 2 = admin, 3 = superadmin, 4 = headadmin (from config)
|
|
||||||
$this->rightLevel = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,113 +1,156 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
|
||||||
* Created by PhpStorm.
|
|
||||||
* User: Lukas
|
|
||||||
* Date: 09.11.13
|
|
||||||
* Time: 19:44
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace ManiaControl;
|
namespace ManiaControl;
|
||||||
|
|
||||||
|
require_once __DIR__ . '/player.php';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class playerHandler
|
* Class managing players
|
||||||
|
*
|
||||||
* @package ManiaControl
|
* @package ManiaControl
|
||||||
*/
|
*/
|
||||||
class playerHandler {
|
class playerHandler {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Private properties
|
* Constants
|
||||||
*/
|
*/
|
||||||
private $playerList;
|
const TABLE_PLAYERS = 'mc_players';
|
||||||
private $mc;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Public properties
|
* Public properties
|
||||||
*/
|
*/
|
||||||
public $rightLevels = array(0 => 'Player', 1 => 'Operator', 2 => 'Admin', 3 => 'MasterAdmin', 4 => 'MasterAdmin');
|
public $rightLevels = array(0 => 'Player', 1 => 'Operator', 2 => 'Admin', 3 => 'MasterAdmin', 4 => 'Owner');
|
||||||
|
|
||||||
public function __construct(ManiaControl $mc){
|
|
||||||
$this->mc = $mc;
|
|
||||||
$this->playerList = array();
|
|
||||||
$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_MP_PLAYERCONNECT, $this, 'playerConnect');
|
|
||||||
$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_MP_PLAYERDISCONNECT, $this, 'playerDisconnect');
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* initializes a Whole PlayerList
|
* Private properties
|
||||||
* @param $players
|
|
||||||
*/
|
*/
|
||||||
public function addPlayerList($players){
|
private $maniaControl = null;
|
||||||
foreach($players as $player){
|
private $playerList = array();
|
||||||
$this->playerConnect(array($player['Login'], ''));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
* Handles a playerConnect
|
* Construct player handler
|
||||||
* @param $player
|
*
|
||||||
|
* @param ManiaControl $maniaControl
|
||||||
*/
|
*/
|
||||||
public function playerConnect($player){
|
public function __construct(ManiaControl $maniaControl) {
|
||||||
//TODO: Welcome Message?, on mc restart not all players listed, no relay support yet
|
$this->maniaControl = $maniaControl;
|
||||||
//TODO: Add Rights
|
|
||||||
//TODO: Database
|
$this->initTables();
|
||||||
$this->mc->client->query('GetDetailedPlayerInfo', $player[0]);
|
|
||||||
$this->addPlayer(new Player($this->mc->client->getResponse()));
|
$this->maniaControl->callbacks->registerCallbackHandler(Callbacks::CB_MC_ONINIT, $this, 'onInit');
|
||||||
$player = $this->playerList[$player[0]];
|
$this->maniaControl->callbacks->registerCallbackHandler(Callbacks::CB_MP_PLAYERCONNECT, $this, 'playerConnect');
|
||||||
if($player->pid != 0){ //Player 0 = server
|
$this->maniaControl->callbacks->registerCallbackHandler(Callbacks::CB_MP_PLAYERDISCONNECT, $this, 'playerDisconnect');
|
||||||
$string = array(0 => 'New Player', 1 => 'Operator', 2 => 'Admin', 3 => 'MasterAdmin', 4 => 'MasterAdmin');
|
|
||||||
$this->mc->chat->sendChat('$ff0'.$string[$player->rightLevel].': '. $player->nickname . '$z $ff0Nation:$fff ' . $player->nation . ' $ff0Ladder: $fff' . $player->ladderrank);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles a playerDisconnect
|
* Initialize all necessary tables
|
||||||
* @param $player
|
*
|
||||||
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function playerDisconnect($player){
|
private function initTables() {
|
||||||
$player = $this->removePlayer($player[0]);
|
$mysqli = $this->maniaControl->database->mysqli;
|
||||||
$played = TOOLS::formatTime(time() - $player->created);
|
$playerTableQuery = "CREATE TABLE IF NOT EXISTS `" . self::TABLE_PLAYERS . "` (
|
||||||
$this->mc->chat->sendChat($player->nickname . '$z $ff0has left the game. Played:$fff ' . $played);
|
`index` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`pid` int(11) NOT NULL DEFAULT '-1',
|
||||||
|
`login` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
|
||||||
|
`ipFull` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
|
||||||
|
`clientVersion` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
|
||||||
|
`zone` varchar(150) COLLATE utf8_unicode_ci NOT NULL,
|
||||||
|
`language` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
|
||||||
|
`avatar` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
|
||||||
|
`changed` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||||
|
PRIMARY KEY (`index`),
|
||||||
|
UNIQUE KEY `login` (`login`)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Player data' AUTO_INCREMENT=1;";
|
||||||
|
$playerTableStatement = $mysqli->prepare($playerTableQuery);
|
||||||
|
if ($mysqli->error) {
|
||||||
|
trigger_error($mysqli->error, E_USER_ERROR);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$playerTableStatement->execute();
|
||||||
|
if ($playerTableStatement->error) {
|
||||||
|
trigger_error($playerTableStatement->error, E_USER_ERROR);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$playerTableStatement->close();
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle OnInit callback
|
||||||
|
*
|
||||||
|
* @param array $callback
|
||||||
|
*/
|
||||||
|
public function onInit(array $callback) {
|
||||||
|
$this->maniaControl->client->query('GetPlayerList', 300, 0, 2);
|
||||||
|
$playerList = $this->maniaControl->client->getResponse();
|
||||||
|
foreach ($playerList as $player) {
|
||||||
|
$callback = array(Callbacks::CB_MP_PLAYERCONNECT, array($player['Login']));
|
||||||
|
$this->playerConnect($callback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a Player from the Playerlist
|
* Handle playerConnect callback
|
||||||
* @param $login
|
*
|
||||||
* @return null
|
* @param array $callback
|
||||||
|
*/
|
||||||
|
public function playerConnect(array $callback) {
|
||||||
|
$login = $callback[1][0];
|
||||||
|
$this->maniaControl->client->query('GetDetailedPlayerInfo', $login);
|
||||||
|
$playerInfo = $this->maniaControl->client->getResponse();
|
||||||
|
$player = new Player($playerInfo);
|
||||||
|
$this->addPlayer($player);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle playerDisconnect callback
|
||||||
|
*
|
||||||
|
* @param array $callback
|
||||||
|
*/
|
||||||
|
public function playerDisconnect(array $callback) {
|
||||||
|
$login = $callback[1][0];
|
||||||
|
$player = $this->removePlayer($login);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a Player from the PlayerList
|
||||||
|
*
|
||||||
|
* @param string $login
|
||||||
|
* @return Player
|
||||||
*/
|
*/
|
||||||
public function getPlayer($login) {
|
public function getPlayer($login) {
|
||||||
if (isset($this->playerList[$login]))
|
if (!isset($this->playerList[$login])) {
|
||||||
return $this->playerList[$login];
|
|
||||||
else
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
return $this->playerList[$login];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a player to the PlayerList
|
* Add a player to the PlayerList
|
||||||
|
*
|
||||||
* @param Player $player
|
* @param Player $player
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
private function addPlayer(Player $player) {
|
private function addPlayer(Player $player) {
|
||||||
if($player != null){
|
if (!$player) {
|
||||||
$this->playerList[$player->login] = $player;
|
|
||||||
return true;
|
|
||||||
}else{
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
$this->playerList[$player->login] = $player;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes a Player from the PlayerList
|
* Remove a Player from the PlayerList
|
||||||
* @param $login
|
*
|
||||||
|
* @param string $login
|
||||||
* @return Player $player
|
* @return Player $player
|
||||||
*/
|
*/
|
||||||
private function removePlayer($login) {
|
private function removePlayer($login) {
|
||||||
if(isset($this->playerList[$login])){
|
if (!isset($this->playerList[$login])) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
$player = $this->playerList[$login];
|
$player = $this->playerList[$login];
|
||||||
unset($this->playerList[$login]);
|
unset($this->playerList[$login]);
|
||||||
} else {
|
|
||||||
$player = null;
|
|
||||||
}
|
|
||||||
return $player;
|
return $player;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -3,152 +3,55 @@
|
|||||||
namespace ManiaControl;
|
namespace ManiaControl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class plugin parent class for all plugins
|
* Plugin parent class
|
||||||
*
|
*
|
||||||
* @author Lukas Kremsmayr and steeffeen
|
* @author Lukas Kremsmayr and steeffeen
|
||||||
*/
|
*/
|
||||||
|
abstract class Plugin {
|
||||||
|
|
||||||
class Plugin {
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Private properties
|
* Private properties
|
||||||
*/
|
*/
|
||||||
private $mc;
|
protected $maniaControl;
|
||||||
private $version;
|
protected $name;
|
||||||
private $author;
|
protected $version;
|
||||||
private $updateUrl;
|
protected $author;
|
||||||
private $name;
|
protected $description;
|
||||||
private $description;
|
|
||||||
private $active;
|
|
||||||
|
|
||||||
public function __construct($mc, $name, $version = 0, $author = '', $description = '', $updateUrl = ''){
|
|
||||||
$this->mc = $mc;
|
|
||||||
$this->name = $name;
|
|
||||||
$this->version = $version;
|
|
||||||
$this->author = $author;
|
|
||||||
$this->description = $description;
|
|
||||||
$this->updateUrl = $updateUrl;
|
|
||||||
|
|
||||||
$this->mc->pluginHandler->registerPlugin($this);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reserves manialinks on the ManialinkIdHandler
|
* Create plugin instance
|
||||||
*
|
*
|
||||||
* @param int $count
|
* @param ManiaControl $maniaControl
|
||||||
* @return array with manialink Ids
|
|
||||||
*/
|
*/
|
||||||
public function reserveManialinkIds($count){
|
public abstract function __construct(ManiaControl $maniaControl);
|
||||||
return $this->mc->manialinkIdHandler->reserveManialikIds($count);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function checkUpdate(){
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Enables the Plugin
|
|
||||||
*/
|
|
||||||
public function enablePlugin()
|
|
||||||
{
|
|
||||||
$this->active = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Disable the Plugin
|
|
||||||
*/
|
|
||||||
public function disablePlugin()
|
|
||||||
{
|
|
||||||
$this->active = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return mixed
|
|
||||||
*/
|
|
||||||
public function isActive()
|
|
||||||
{
|
|
||||||
return $this->active;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param mixed $author
|
|
||||||
*/
|
|
||||||
public function setAuthor($author)
|
|
||||||
{
|
|
||||||
$this->author = $author;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return mixed
|
|
||||||
*/
|
|
||||||
public function getAuthor()
|
|
||||||
{
|
|
||||||
return $this->author;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param mixed $updateUrl
|
|
||||||
*/
|
|
||||||
public function setUpdateUrl($updateUrl)
|
|
||||||
{
|
|
||||||
$this->updateUrl = $updateUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return mixed
|
|
||||||
*/
|
|
||||||
public function getUpdateUrl()
|
|
||||||
{
|
|
||||||
return $this->updateUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param mixed $version
|
|
||||||
*/
|
|
||||||
public function setVersion($version)
|
|
||||||
{
|
|
||||||
$this->version = $version;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return mixed
|
|
||||||
*/
|
|
||||||
public function getVersion()
|
|
||||||
{
|
|
||||||
return $this->version;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @param mixed $name
|
|
||||||
*/
|
|
||||||
public function setName($name)
|
|
||||||
{
|
|
||||||
$this->name = $name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return mixed
|
|
||||||
*/
|
|
||||||
public function getName()
|
|
||||||
{
|
|
||||||
return $this->name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $description
|
|
||||||
*/
|
|
||||||
public function setDescription($description)
|
|
||||||
{
|
|
||||||
$this->description = $description;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Get plugin author
|
||||||
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function getDescription()
|
public abstract function getAuthor();
|
||||||
{
|
|
||||||
return $this->description;
|
/**
|
||||||
|
* Get plugin version
|
||||||
|
*
|
||||||
|
* @return float
|
||||||
|
*/
|
||||||
|
public abstract function getVersion();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get plugin name
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public abstract function getName();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get plugin description
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public abstract function getDescription();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
?>
|
?>
|
@ -2,32 +2,163 @@
|
|||||||
|
|
||||||
namespace ManiaControl;
|
namespace ManiaControl;
|
||||||
|
|
||||||
|
require_once __DIR__ . '/plugin.php';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class handles plugins
|
* Class handling plugins
|
||||||
*
|
*
|
||||||
* @author Lukas Kremsmayr and steeffeen
|
* @author Lukas Kremsmayr and steeffeen
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
class PluginHandler {
|
class PluginHandler {
|
||||||
|
/**
|
||||||
|
* Constants
|
||||||
|
*/
|
||||||
|
const TABLE_PLUGINS = 'mc_plugins';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Private properties
|
* Private properties
|
||||||
*/
|
*/
|
||||||
private $mc;
|
private $maniaControl = null;
|
||||||
private $plugins;
|
private $activePlugins = array();
|
||||||
|
private $pluginClasses = array();
|
||||||
|
|
||||||
public function __construct($mc){
|
/**
|
||||||
$this->mc = $mc;
|
* Construct plugin handler
|
||||||
$this->plugins = array();
|
*
|
||||||
|
* @param ManiaControl $maniaControl
|
||||||
|
*/
|
||||||
|
public function __construct(ManiaControl $maniaControl) {
|
||||||
|
$this->maniaControl = $maniaControl;
|
||||||
|
$this->initTables();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function registerPlugin($plugin){
|
/**
|
||||||
array_push($this->plugins, $plugin);
|
* Initialize necessary database tables
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private function initTables() {
|
||||||
|
$mysqli = $this->maniaControl->database->mysqli;
|
||||||
|
$pluginsTableQuery = "CREATE TABLE IF NOT EXISTS `" . self::TABLE_PLUGINS . "` (
|
||||||
|
`index` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`className` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
|
||||||
|
`active` tinyint(1) NOT NULL DEFAULT '0',
|
||||||
|
`changed` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||||
|
PRIMARY KEY (`index`)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='ManiaControl plugin status' AUTO_INCREMENT=1;";
|
||||||
|
$tableStatement = $mysqli->prepare($pluginsTableQuery);
|
||||||
|
if ($mysqli->error) {
|
||||||
|
trigger_error($mysqli->error, E_USER_ERROR);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$tableStatement->execute();
|
||||||
|
if ($tableStatement->error) {
|
||||||
|
trigger_error($tableStatement->error, E_USER_ERROR);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$tableStatement->close();
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save plugin status in database
|
||||||
|
*
|
||||||
|
* @param string $className
|
||||||
|
* @param bool $active
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private function savePluginStatus($className, $active) {
|
||||||
|
$mysqli = $this->maniaControl->database->mysqli;
|
||||||
|
$pluginStatusQuery = "INSERT INTO `" . self::TABLE_PLUGINS . "` (
|
||||||
|
`className`,
|
||||||
|
`active`
|
||||||
|
) VALUES (
|
||||||
|
?, ?
|
||||||
|
) ON DUPLICATE KEY UPDATE
|
||||||
|
`active` = VALUES(`active`);";
|
||||||
|
$pluginStatement = $mysqli->prepare($pluginStatusQuery);
|
||||||
|
if ($mysqli->error) {
|
||||||
|
trigger_error($mysqli->error);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$activeInt = ($active ? 1 : 0);
|
||||||
|
$pluginStatement->bind_param('si', $className, $activeInt);
|
||||||
|
$pluginStatement->execute();
|
||||||
|
if ($pluginStatement->error) {
|
||||||
|
trigger_error($pluginStatement->error);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$pluginStatement->close();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get plugin status from database
|
||||||
|
*
|
||||||
|
* @param string $className
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private function getPluginStatus($className) {
|
||||||
|
$mysqli = $this->maniaControl->database->mysqli;
|
||||||
|
$pluginStatusQuery = "SELECT `active` FROM `" . self::TABLE_PLUGINS . "`
|
||||||
|
WHERE `className` = ?;";
|
||||||
|
$pluginStatement = $mysqli->prepare($pluginStatusQuery);
|
||||||
|
if ($mysqli->error) {
|
||||||
|
trigger_error($mysqli->error);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$pluginStatement->bind_param('s', $className);
|
||||||
|
$pluginStatement->execute();
|
||||||
|
if ($pluginStatement->error) {
|
||||||
|
trigger_error($pluginStatement->error);
|
||||||
|
$pluginStatement->close();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$pluginStatement->store_result();
|
||||||
|
if ($pluginStatement->num_rows <= 0) {
|
||||||
|
$pluginStatement->free_result();
|
||||||
|
$pluginStatement->close();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$pluginStatement->bind_result($activeInt);
|
||||||
|
$pluginStatement->fetch();
|
||||||
|
$active = ($activeInt === 1);
|
||||||
|
$pluginStatement->free_result();
|
||||||
|
$pluginStatement->close();
|
||||||
|
return $active;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load complete plugins directory and start all configured plugins
|
||||||
|
*/
|
||||||
public function loadPlugins() {
|
public function loadPlugins() {
|
||||||
|
$pluginsDirectory = ManiaControlDir . '/plugins/';
|
||||||
|
$pluginFiles = scandir($pluginsDirectory, 0);
|
||||||
|
foreach ($pluginFiles as $pluginFile) {
|
||||||
|
if (stripos($pluginFile, '.') === 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$classesBefore = get_declared_classes();
|
||||||
|
$success = include_once $pluginsDirectory . $pluginFile;
|
||||||
|
if (!$success) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$classesAfter = get_declared_classes();
|
||||||
|
$newClasses = array_diff($classesAfter, $classesBefore);
|
||||||
|
foreach ($newClasses as $className) {
|
||||||
|
if (!is_subclass_of($className, 'ManiaControl\Plugin')) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
array_push($this->pluginClasses, $className);
|
||||||
|
$active = $this->getPluginStatus($className);
|
||||||
|
if (!$active) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$plugin = new $className($this->maniaControl);
|
||||||
|
array_push($this->activePlugins, $plugin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
?>
|
?>
|
@ -31,11 +31,10 @@ class Server {
|
|||||||
$this->mc = $mc;
|
$this->mc = $mc;
|
||||||
|
|
||||||
// Load config
|
// Load config
|
||||||
$this->config = Tools::loadConfig('server.ManiaControl.xml');
|
$this->config = Tools::loadConfig('server.xml');
|
||||||
$this->mc->checkConfig($this->config, array('host', 'port', 'login', 'pass'), 'server');
|
|
||||||
|
|
||||||
// Register for callbacks
|
// Register for callbacks
|
||||||
$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_IC_1_SECOND, $this, 'eachSecond');
|
$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_MC_1_SECOND, $this, 'eachSecond');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,85 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace ManiaControl;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ManiaControl Chatlog Plugin
|
|
||||||
*
|
|
||||||
* @author steeffeen
|
|
||||||
*/
|
|
||||||
class Plugin_Chatlog extends Plugin{
|
|
||||||
/**
|
|
||||||
* Constants
|
|
||||||
*/
|
|
||||||
const VERSION = '1.0';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Private properties
|
|
||||||
*/
|
|
||||||
private $mc = null;
|
|
||||||
|
|
||||||
private $config = null;
|
|
||||||
|
|
||||||
private $settings = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constuct chatlog plugin
|
|
||||||
*/
|
|
||||||
public function __construct($mc) {
|
|
||||||
$this->mc = $mc;
|
|
||||||
|
|
||||||
// Load config
|
|
||||||
$this->config = Tools::loadConfig('chatlog.plugin.xml');
|
|
||||||
|
|
||||||
// Check for enabled setting
|
|
||||||
if (!Tools::toBool($this->config->enabled)) return;
|
|
||||||
|
|
||||||
// Load settings
|
|
||||||
$this->loadSettings();
|
|
||||||
|
|
||||||
// Register for callbacksc
|
|
||||||
$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_MP_PLAYERCHAT, $this, 'handlePlayerChatCallback');
|
|
||||||
|
|
||||||
error_log('Chatlog Pugin v' . self::VERSION . ' ready!');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Load settings from config
|
|
||||||
*/
|
|
||||||
private function loadSettings() {
|
|
||||||
$this->settings = new \stdClass();
|
|
||||||
|
|
||||||
// File name
|
|
||||||
$fileName = (string) $this->config->filename;
|
|
||||||
$this->settings->fileName = ManiaControlDir . '/' . $fileName;
|
|
||||||
|
|
||||||
// log_server_messages
|
|
||||||
$log_server_messages = $this->config->xpath('log_server_messages');
|
|
||||||
$this->settings->log_server_messages = ($log_server_messages ? (Tools::toBool($log_server_messages[0])) : false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle PlayerChat callback
|
|
||||||
*/
|
|
||||||
public function handlePlayerChatCallback($callback) {
|
|
||||||
$data = $callback[1];
|
|
||||||
if ($data[0] <= 0 && !$this->settings->log_server_messages) {
|
|
||||||
// Skip server message
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$this->logText($data[2], $data[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Log the given message
|
|
||||||
*
|
|
||||||
* @param string $message
|
|
||||||
* @param string $login
|
|
||||||
*/
|
|
||||||
private function logText($text, $login = null) {
|
|
||||||
$message = date(ManiaControl::DATE) . '>> ' . ($login ? $login . ': ' : '') . $text . PHP_EOL;
|
|
||||||
file_put_contents($this->settings->fileName, $message, FILE_APPEND);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
?>
|
|
@ -1,305 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace ManiaControl;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ManiaControl Karma Plugin
|
|
||||||
*
|
|
||||||
* @author : steeffeen
|
|
||||||
*/
|
|
||||||
class Plugin_Karma {
|
|
||||||
/**
|
|
||||||
* Constants
|
|
||||||
*/
|
|
||||||
const VERSION = '1.0';
|
|
||||||
const MLID_KARMA = 'KarmaPlugin.MLID';
|
|
||||||
const TABLE_KARMA = 'ic_karma';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Private properties
|
|
||||||
*/
|
|
||||||
private $mc = null;
|
|
||||||
|
|
||||||
private $config = null;
|
|
||||||
|
|
||||||
private $sendManialinkRequested = -1;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Construct plugin
|
|
||||||
*
|
|
||||||
* @param object $mc
|
|
||||||
*/
|
|
||||||
public function __construct($mc) {
|
|
||||||
$this->mc = $mc;
|
|
||||||
|
|
||||||
// Load config
|
|
||||||
$this->config = Tools::loadConfig('karma.plugin.xml');
|
|
||||||
if (!Tools::toBool($this->config->enabled)) return;
|
|
||||||
|
|
||||||
// Init database
|
|
||||||
$this->initDatabase();
|
|
||||||
|
|
||||||
// Register for callbacks
|
|
||||||
$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_IC_ONINIT, $this, 'handleOnInitCallback');
|
|
||||||
$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_IC_BEGINMAP, $this, 'handleBeginMapCallback');
|
|
||||||
$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_MP_PLAYERCONNECT, $this, 'handlePlayerConnectCallback');
|
|
||||||
$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_MP_PLAYERMANIALINKPAGEANSWER, $this,
|
|
||||||
'handleManialinkPageAnswerCallback');
|
|
||||||
|
|
||||||
error_log('Karma Pugin v' . self::VERSION . ' ready!');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Repetitive actions
|
|
||||||
*/
|
|
||||||
public function loop() {
|
|
||||||
if ($this->sendManialinkRequested > 0 && $this->sendManialinkRequested <= time()) {
|
|
||||||
$this->sendManialinkRequested = -1;
|
|
||||||
|
|
||||||
// Send manialink to all players
|
|
||||||
$players = $this->mc->server->getPlayers();
|
|
||||||
foreach ($players as $player) {
|
|
||||||
$login = $player['Login'];
|
|
||||||
$manialink = $this->buildManialink($login);
|
|
||||||
if (!$manialink) {
|
|
||||||
// Skip and retry
|
|
||||||
$this->sendManialinkRequested = time() + 5;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
Tools::sendManialinkPage($this->mc->client, $manialink->asXml(), $login);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle OnInit ManiaControl callback
|
|
||||||
*
|
|
||||||
* @param array $callback
|
|
||||||
*/
|
|
||||||
public function handleOnInitCallback($callback) {
|
|
||||||
// Send manialink to all players once
|
|
||||||
$this->sendManialinkRequested = time() + 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle ManiaControl BeginMap callback
|
|
||||||
*
|
|
||||||
* @param array $callback
|
|
||||||
*/
|
|
||||||
public function handleBeginMapCallback($callback) {
|
|
||||||
// Send manialink to all players once
|
|
||||||
$this->sendManialinkRequested = time() + 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle PlayerConnect callback
|
|
||||||
*
|
|
||||||
* @param array $callback
|
|
||||||
*/
|
|
||||||
public function handlePlayerConnectCallback($callback) {
|
|
||||||
$login = $callback[1][0];
|
|
||||||
$manialink = $this->buildManialink($login);
|
|
||||||
if (!$manialink) return;
|
|
||||||
Tools::sendManialinkPage($this->mc->client, $manialink->asXml(), $login);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create necessary tables
|
|
||||||
*/
|
|
||||||
private function initDatabase() {
|
|
||||||
$query = "CREATE TABLE IF NOT EXISTS `" . self::TABLE_KARMA . "` (
|
|
||||||
`index` int(11) NOT NULL AUTO_INCREMENT,
|
|
||||||
`mapIndex` int(11) NOT NULL,
|
|
||||||
`playerIndex` int(11) NOT NULL,
|
|
||||||
`vote` tinyint(1) NOT NULL,
|
|
||||||
`changed` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
||||||
PRIMARY KEY (`index`),
|
|
||||||
UNIQUE KEY `player_map_vote` (`mapIndex`, `playerIndex`)
|
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Save players map votes' AUTO_INCREMENT=1;";
|
|
||||||
$result = $this->mc->database->query($query);
|
|
||||||
if ($this->mc->database->mysqli->error) {
|
|
||||||
trigger_error('MySQL Error on creating karma table. ' . $this->mc->database->mysqli->error, E_USER_ERROR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle ManialinkPageAnswer callback
|
|
||||||
*
|
|
||||||
* @param array $callback
|
|
||||||
*/
|
|
||||||
public function handleManialinkPageAnswerCallback($callback) {
|
|
||||||
$action = $callback[1][2];
|
|
||||||
if (substr($action, 0, strlen(self::MLID_KARMA)) !== self::MLID_KARMA) return;
|
|
||||||
|
|
||||||
// Get vote
|
|
||||||
$action = substr($action, -4);
|
|
||||||
$vote = null;
|
|
||||||
switch ($action) {
|
|
||||||
case '.pos':
|
|
||||||
{
|
|
||||||
$vote = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case '.neu':
|
|
||||||
{
|
|
||||||
$vote = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case '.neg':
|
|
||||||
{
|
|
||||||
$vote = -1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save vote
|
|
||||||
$login = $callback[1][1];
|
|
||||||
$playerIndex = $this->mc->database->getPlayerIndex($login);
|
|
||||||
$map = $this->mc->server->getMap();
|
|
||||||
$mapIndex = $this->mc->database->getMapIndex($map['UId']);
|
|
||||||
$query = "INSERT INTO `" . self::TABLE_KARMA . "` (
|
|
||||||
`mapIndex`,
|
|
||||||
`playerIndex`,
|
|
||||||
`vote`
|
|
||||||
) VALUES (
|
|
||||||
" . $mapIndex . ",
|
|
||||||
" . $playerIndex . ",
|
|
||||||
" . $vote . "
|
|
||||||
) ON DUPLICATE KEY UPDATE
|
|
||||||
`vote` = VALUES(`vote`);";
|
|
||||||
$result = $this->mc->database->query($query);
|
|
||||||
if (!$result) return;
|
|
||||||
|
|
||||||
// Send success message
|
|
||||||
$this->mc->chat->sendSuccess('Vote successfully updated!', $login);
|
|
||||||
|
|
||||||
// Send updated manialink
|
|
||||||
$this->sendManialinkRequested = time() + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Build karma voting manialink xml for the given login
|
|
||||||
*/
|
|
||||||
private function buildManialink($login) {
|
|
||||||
// Get config
|
|
||||||
$title = (string) $this->config->title;
|
|
||||||
$pos_x = (float) $this->config->pos_x;
|
|
||||||
$pos_y = (float) $this->config->pos_y;
|
|
||||||
|
|
||||||
$mysqli = $this->mc->database->mysqli;
|
|
||||||
|
|
||||||
// Get indezes
|
|
||||||
$playerIndex = $this->mc->database->getPlayerIndex($login);
|
|
||||||
if ($playerIndex === null) return null;
|
|
||||||
$map = $this->mc->server->getMap();
|
|
||||||
if (!$map) return null;
|
|
||||||
$mapIndex = $this->mc->database->getMapIndex($map['UId']);
|
|
||||||
if ($mapIndex === null) return null;
|
|
||||||
|
|
||||||
// Get votings
|
|
||||||
$query = "SELECT
|
|
||||||
(SELECT `vote` FROM `" .
|
|
||||||
self::TABLE_KARMA . "` WHERE `mapIndex` = " . $mapIndex . " AND `playerIndex` = " . $playerIndex . ") as `playerVote`,
|
|
||||||
(SELECT COUNT(`vote`) FROM `" .
|
|
||||||
self::TABLE_KARMA . "` WHERE `mapIndex` = " . $mapIndex . " AND `vote` = 1) AS `positiveVotes`,
|
|
||||||
(SELECT COUNT(`vote`) FROM `" .
|
|
||||||
self::TABLE_KARMA . "` WHERE `mapIndex` = " . $mapIndex . " AND `vote` = 0) AS `neutralVotes`,
|
|
||||||
(SELECT COUNT(`vote`) FROM `" .
|
|
||||||
self::TABLE_KARMA . "` WHERE `mapIndex` = " . $mapIndex . " AND `vote` = -1) AS `negativeVotes`
|
|
||||||
FROM `" . self::TABLE_KARMA . "`;";
|
|
||||||
$result = $mysqli->query($query);
|
|
||||||
if ($mysqli->error) {
|
|
||||||
trigger_error('MySQL ERROR: ' . $mysqli->error);
|
|
||||||
}
|
|
||||||
$votes = $result->fetch_assoc();
|
|
||||||
if (!$votes) {
|
|
||||||
$votes = array('playerVote' => null, 'positiveVotes' => 0, 'neutralVotes' => 0, 'negativeVotes' => 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Build manialink
|
|
||||||
$xml = Tools::newManialinkXml(self::MLID_KARMA);
|
|
||||||
|
|
||||||
$frameXml = $xml->addChild('frame');
|
|
||||||
$frameXml->addAttribute('posn', $pos_x . ' ' . $pos_y);
|
|
||||||
|
|
||||||
// Title
|
|
||||||
$labelXml = $frameXml->addChild('label');
|
|
||||||
Tools::addAlignment($labelXml);
|
|
||||||
$labelXml->addAttribute('posn', '0 4.5 -1');
|
|
||||||
$labelXml->addAttribute('sizen', '22 0');
|
|
||||||
$labelXml->addAttribute('style', 'TextTitle1');
|
|
||||||
$labelXml->addAttribute('textsize', '1');
|
|
||||||
$labelXml->addAttribute('text', $title);
|
|
||||||
|
|
||||||
// Background
|
|
||||||
$quadXml = $frameXml->addChild('quad');
|
|
||||||
Tools::addAlignment($quadXml);
|
|
||||||
$quadXml->addAttribute('sizen', '23 15 -2');
|
|
||||||
$quadXml->addAttribute('style', 'Bgs1InRace');
|
|
||||||
$quadXml->addAttribute('substyle', 'BgTitleShadow');
|
|
||||||
|
|
||||||
// Votes
|
|
||||||
for ($i = 1; $i >= -1; $i--) {
|
|
||||||
$x = $i * 7.;
|
|
||||||
|
|
||||||
// Vote button
|
|
||||||
$quadXml = $frameXml->addChild('quad');
|
|
||||||
Tools::addAlignment($quadXml);
|
|
||||||
$quadXml->addAttribute('posn', $x . ' 0 0');
|
|
||||||
$quadXml->addAttribute('sizen', '6 6');
|
|
||||||
$quadXml->addAttribute('style', 'Icons64x64_1');
|
|
||||||
|
|
||||||
// Vote count
|
|
||||||
$labelXml = $frameXml->addChild('label');
|
|
||||||
Tools::addAlignment($labelXml);
|
|
||||||
$labelXml->addAttribute('posn', $x . ' -4.5 0');
|
|
||||||
$labelXml->addAttribute('style', 'TextTitle1');
|
|
||||||
$labelXml->addAttribute('textsize', '2');
|
|
||||||
|
|
||||||
if ((string) $i === $votes['playerVote']) {
|
|
||||||
// Player vote X
|
|
||||||
$voteQuadXml = $frameXml->addChild('quad');
|
|
||||||
Tools::addAlignment($voteQuadXml);
|
|
||||||
$voteQuadXml->addAttribute('posn', $x . ' 0 1');
|
|
||||||
$voteQuadXml->addAttribute('sizen', '6 6');
|
|
||||||
$voteQuadXml->addAttribute('style', 'Icons64x64_1');
|
|
||||||
$voteQuadXml->addAttribute('substyle', 'Close');
|
|
||||||
}
|
|
||||||
|
|
||||||
switch ($i) {
|
|
||||||
case 1:
|
|
||||||
{
|
|
||||||
// Positive
|
|
||||||
$quadXml->addAttribute('substyle', 'LvlGreen');
|
|
||||||
$quadXml->addAttribute('action', self::MLID_KARMA . '.pos');
|
|
||||||
$labelXml->addAttribute('text', $votes['positiveVotes']);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 0:
|
|
||||||
{
|
|
||||||
// Neutral
|
|
||||||
$quadXml->addAttribute('substyle', 'LvlYellow');
|
|
||||||
$quadXml->addAttribute('action', self::MLID_KARMA . '.neu');
|
|
||||||
$labelXml->addAttribute('text', $votes['neutralVotes']);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case -1:
|
|
||||||
{
|
|
||||||
// Negative
|
|
||||||
$quadXml->addAttribute('substyle', 'LvlRed');
|
|
||||||
$quadXml->addAttribute('action', self::MLID_KARMA . '.neg');
|
|
||||||
$labelXml->addAttribute('text', $votes['negativeVotes']);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $xml;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
?>
|
|
@ -1,63 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace ManiaControl;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ManiaControl Obstacle Plugin
|
|
||||||
*
|
|
||||||
* @author steeffeen
|
|
||||||
*/
|
|
||||||
class Plugin_Obstacle extends Plugin {
|
|
||||||
/**
|
|
||||||
* Constants
|
|
||||||
*/
|
|
||||||
const CB_JUMPTO = 'Obstacle.JumpTo';
|
|
||||||
const VERSION = '1.0';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Private properties
|
|
||||||
*/
|
|
||||||
private $mc = null;
|
|
||||||
|
|
||||||
private $config = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constuct obstacle plugin
|
|
||||||
*/
|
|
||||||
public function __construct($mc) {
|
|
||||||
$this->mc = $mc;
|
|
||||||
|
|
||||||
// Load config
|
|
||||||
$this->config = Tools::loadConfig('obstacle.plugin.xml');
|
|
||||||
|
|
||||||
// Check for enabled setting
|
|
||||||
if (!Tools::toBool($this->config->enabled)) return;
|
|
||||||
|
|
||||||
// Register for jump command
|
|
||||||
$this->mc->commands->registerCommandHandler('jumpto', $this, 'command_jumpto');
|
|
||||||
|
|
||||||
error_log('Obstacle Pugin v' . self::VERSION . ' ready!');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle jumpto command
|
|
||||||
*/
|
|
||||||
public function command_jumpto($chat) {
|
|
||||||
$login = $chat[1][1];
|
|
||||||
$rightLevel = (string) $this->config->jumps_rightlevel;
|
|
||||||
if (!$this->mc->authentication->checkRight($login, $rightLevel)) {
|
|
||||||
// Not allowed
|
|
||||||
$this->mc->authentication->sendNotAllowed($login);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Send jump callback
|
|
||||||
$params = explode(' ', $chat[1][2], 2);
|
|
||||||
$param = $login . ";" . $params[1] . ";";
|
|
||||||
if (!$this->mc->client->query('TriggerModeScriptEvent', self::CB_JUMPTO, $param)) {
|
|
||||||
trigger_error("Couldn't send jump callback for '" . $login . "'. " . $this->mc->getClientErrorText());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
?>
|
|
@ -1,37 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace ManiaControl;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Abstract ManiaControl plugin class
|
|
||||||
*/
|
|
||||||
abstract class Plugin_Name {
|
|
||||||
/**
|
|
||||||
* Constants
|
|
||||||
*/
|
|
||||||
const VERSION = '0.1';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Private properties
|
|
||||||
*/
|
|
||||||
private $mc = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Construct plugin
|
|
||||||
*
|
|
||||||
* @param object $mc
|
|
||||||
*/
|
|
||||||
public function __construct($mc) {
|
|
||||||
$this->mc = $mc;
|
|
||||||
|
|
||||||
error_log('Pugin v' . self::VERSION . ' ready!');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Perform actions during each loop
|
|
||||||
*/
|
|
||||||
public function loop() {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
?>
|
|
File diff suppressed because it is too large
Load Diff
@ -1,677 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace ManiaControl;
|
|
||||||
|
|
||||||
// TODO: Jump message "now playing stadium"
|
|
||||||
// TODO: put inactive server in idle (keeping same map)
|
|
||||||
// TODO: let next server wait for the first player
|
|
||||||
// TODO: check compatibility with other modes (laps, ...)
|
|
||||||
// TODO: max players setting
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ManiaControl United Plugin
|
|
||||||
*
|
|
||||||
* @author steeffeen
|
|
||||||
*/
|
|
||||||
class Plugin_United {
|
|
||||||
/**
|
|
||||||
* Constants
|
|
||||||
*/
|
|
||||||
const VERSION = '1.0';
|
|
||||||
const ML_ADDFAVORITE = 'MLID_UnitedPlugin.AddFavorite';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Private properties
|
|
||||||
*/
|
|
||||||
private $mc = null;
|
|
||||||
|
|
||||||
private $config = null;
|
|
||||||
|
|
||||||
private $settings = null;
|
|
||||||
|
|
||||||
private $gameServer = array();
|
|
||||||
|
|
||||||
private $lobbies = array();
|
|
||||||
|
|
||||||
private $currentClientIndex = 0;
|
|
||||||
|
|
||||||
private $lastStatusCheck = 0;
|
|
||||||
|
|
||||||
private $finishedBegin = -1;
|
|
||||||
|
|
||||||
private $switchServerRequested = -1;
|
|
||||||
|
|
||||||
private $manialinks = array();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constuct plugin
|
|
||||||
*/
|
|
||||||
public function __construct($mc) {
|
|
||||||
$this->mc = $mc;
|
|
||||||
|
|
||||||
// Load config
|
|
||||||
$this->config = Tools::loadConfig('united.plugin.xml');
|
|
||||||
$this->loadSettings();
|
|
||||||
|
|
||||||
// Check for enabled setting
|
|
||||||
if (!$this->settings->enabled) return;
|
|
||||||
|
|
||||||
// Load clients
|
|
||||||
$this->loadClients();
|
|
||||||
|
|
||||||
// Register for callbacks
|
|
||||||
$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_IC_ONINIT, $this, 'handleOnInitCallback');
|
|
||||||
$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_IC_5_SECOND, $this, 'handle5Seconds');
|
|
||||||
$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_MP_PLAYERCONNECT, $this, 'handlePlayerConnect');
|
|
||||||
$this->mc->callbacks->registerCallbackHandler(Callbacks::CB_MP_PLAYERMANIALINKPAGEANSWER, $this,
|
|
||||||
'handleManialinkPageAnswer');
|
|
||||||
|
|
||||||
// Register for commands
|
|
||||||
$this->mc->commands->registerCommandHandler('nextserver', $this, 'handleNextServerCommand');
|
|
||||||
|
|
||||||
if ($this->settings->widgets_enabled) {
|
|
||||||
// Build addfavorite manialink
|
|
||||||
$this->buildFavoriteManialink();
|
|
||||||
}
|
|
||||||
|
|
||||||
error_log('United Pugin v' . self::VERSION . ' ready!');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle ManiaControl OnInit callback
|
|
||||||
*
|
|
||||||
* @param array $callback
|
|
||||||
*/
|
|
||||||
public function handleOnInitCallback($callback) {
|
|
||||||
if ($this->settings->widgets_enabled) {
|
|
||||||
// Send widgets to all players
|
|
||||||
|
|
||||||
if (Tools::toBool($this->config->widgets->addfavorite->enabled)) {
|
|
||||||
// Send favorite widget
|
|
||||||
if (!$this->mc->client->query('SendDisplayManialinkPage', $this->manialinks[self::ML_ADDFAVORITE]->asXml(), 0,
|
|
||||||
false)) {
|
|
||||||
trigger_error("Couldn't send favorite widget! " . $this->mc->getClientErrorText());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Load settings from config
|
|
||||||
*/
|
|
||||||
private function loadSettings() {
|
|
||||||
$this->settings = new \stdClass();
|
|
||||||
|
|
||||||
// Enabled
|
|
||||||
$this->settings->enabled = Tools::toBool($this->config->enabled);
|
|
||||||
|
|
||||||
// Timeout
|
|
||||||
$timeout = $this->mc->server->config->xpath('timeout');
|
|
||||||
if ($timeout) {
|
|
||||||
$this->settings->timeout = (int) $timeout[0];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$this->settings->timeout = 30;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Game mode
|
|
||||||
$mode = $this->config->xpath('mode');
|
|
||||||
if ($mode) {
|
|
||||||
$mode = (int) $mode[0];
|
|
||||||
if ($mode < 1 || $mode > 6) {
|
|
||||||
$this->settings->gamemode = 2;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$this->settings->gamemode = $mode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Server status
|
|
||||||
$hide_game_server = $this->config->xpath('hide_game_server');
|
|
||||||
if ($hide_game_server) {
|
|
||||||
$this->settings->hide_game_server = Tools::toBool($hide_game_server[0]);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$this->settings->hide_game_server = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Passwords
|
|
||||||
$lobbyPassword = $this->config->xpath('lobbies/password');
|
|
||||||
if ($lobbyPassword) {
|
|
||||||
$this->settings->lobbyPassword = (string) $lobbyPassword[0];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$this->settings->lobbyPassword = '';
|
|
||||||
}
|
|
||||||
$gamePassword = $this->config->xpath('gameserver/password');
|
|
||||||
if ($gamePassword) {
|
|
||||||
$this->settings->gamePassword = (string) $gamePassword[0];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$this->settings->gamePassword = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
// Widgets
|
|
||||||
$this->settings->widgets_enabled = Tools::toBool($this->config->widgets->enabled);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Loop events on clients
|
|
||||||
*/
|
|
||||||
public function loop() {
|
|
||||||
if (!$this->settings->enabled) return;
|
|
||||||
|
|
||||||
// Check callbacks all clients
|
|
||||||
$clients = array_merge($this->gameServer, $this->lobbies);
|
|
||||||
$currentServer = $this->gameServer[$this->currentClientIndex];
|
|
||||||
foreach ($clients as $index => $client) {
|
|
||||||
$client->resetError();
|
|
||||||
$client->readCB();
|
|
||||||
$callbacks = $client->getCBResponses();
|
|
||||||
if (!is_array($callbacks) || $client->isError()) {
|
|
||||||
trigger_error("Error reading server callbacks! " . $this->mc->getClientErrorText($client));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if ($client == $currentServer) {
|
|
||||||
// Currently active game server
|
|
||||||
foreach ($callbacks as $index => $callback) {
|
|
||||||
$callbackName = $callback[0];
|
|
||||||
switch ($callbackName) {
|
|
||||||
case Callbacks::CB_MP_ENDMAP:
|
|
||||||
{
|
|
||||||
$this->switchToNextServer(false);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->lastStatusCheck + 2 > time()) continue;
|
|
||||||
$this->lastStatusCheck = time();
|
|
||||||
|
|
||||||
if (!$client->query('CheckEndMatchCondition')) {
|
|
||||||
trigger_error("Couldn't get game server status. " . $this->mc->getClientErrorText($client));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$response = $client->getResponse();
|
|
||||||
switch ($response) {
|
|
||||||
case 'Finished':
|
|
||||||
{
|
|
||||||
if ($this->finishedBegin < 0) {
|
|
||||||
$this->finishedBegin = time();
|
|
||||||
}
|
|
||||||
else if ($this->finishedBegin + 13 <= time()) {
|
|
||||||
$this->switchToNextServer(true);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
$this->finishedBegin = -1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Lobby or inactive game server -> Redirect players
|
|
||||||
foreach ($callbacks as $callback) {
|
|
||||||
switch ($callback[0]) {
|
|
||||||
case Callbacks::CB_MP_PLAYERCONNECT:
|
|
||||||
{
|
|
||||||
$this->playerJoinedLobby($client, $callback);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for switch server request
|
|
||||||
if ($this->switchServerRequested > 0 && $this->switchServerRequested <= time()) {
|
|
||||||
$this->switchServerRequested = -1;
|
|
||||||
|
|
||||||
// Switch server
|
|
||||||
$this->switchToNextServer(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle 5 seconds callback
|
|
||||||
*/
|
|
||||||
public function handle5Seconds($callback = null) {
|
|
||||||
// Update lobby infos
|
|
||||||
$players = $this->mc->server->getPlayers();
|
|
||||||
if (is_array($players)) {
|
|
||||||
$playerCount = count($players);
|
|
||||||
$playerLevel = 0.;
|
|
||||||
if ($playerCount > 0) {
|
|
||||||
foreach ($players as $player) {
|
|
||||||
$playerLevel += $player['LadderRanking'];
|
|
||||||
}
|
|
||||||
$playerLevel /= $playerCount;
|
|
||||||
}
|
|
||||||
foreach ($this->lobbies as $lobby) {
|
|
||||||
if (!$lobby->query('SetLobbyInfo', true, $playerCount, 255, $playerLevel)) {
|
|
||||||
trigger_error("Couldn't update lobby info. " . $this->mc->getClientErrorText($lobby));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for not-redirected players
|
|
||||||
$clients = array_merge($this->gameServer, $this->lobbies);
|
|
||||||
$joinLink = $this->getJoinLink();
|
|
||||||
foreach ($clients as $client) {
|
|
||||||
if ($client == $this->gameServer[$this->currentClientIndex]) continue;
|
|
||||||
$players = $this->mc->server->getPlayers($client);
|
|
||||||
if (!is_array($players)) continue;
|
|
||||||
foreach ($players as $player) {
|
|
||||||
$login = $player['Login'];
|
|
||||||
if (!$client->query('SendOpenLinkToLogin', $login, $joinLink, 1)) {
|
|
||||||
trigger_error(
|
|
||||||
"Couldn't redirect player '" . $login . "' to active game server. " .
|
|
||||||
$this->mc->getClientErrorText($client));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle player manialink page answer callback
|
|
||||||
*/
|
|
||||||
public function handleManialinkPageAnswer($callback) {
|
|
||||||
$login = $callback[1][1];
|
|
||||||
$action = $callback[1][2];
|
|
||||||
switch ($action) {
|
|
||||||
case self::ML_ADDFAVORITE:
|
|
||||||
{
|
|
||||||
// Open manialink to add server logins to favorite
|
|
||||||
$serverLogins = array();
|
|
||||||
$add_all = Tools::toBool($this->config->widgets->addfavorite->add_all);
|
|
||||||
if ($add_all) {
|
|
||||||
// Add all server
|
|
||||||
foreach ($this->gameServer as $serverClient) {
|
|
||||||
array_push($serverLogins, $this->mc->server->getLogin($serverClient));
|
|
||||||
}
|
|
||||||
foreach ($this->lobbies as $serverClient) {
|
|
||||||
array_push($serverLogins, $this->mc->server->getLogin($serverClient));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Add only current server
|
|
||||||
array_push($serverLogins, $this->mc->server->getLogin());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Build manialink url
|
|
||||||
$manialink = 'mc?favorite';
|
|
||||||
foreach ($serverLogins as $serverLogin) {
|
|
||||||
$manialink .= '&' . $serverLogin;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send url to player
|
|
||||||
if (!$this->mc->client->query('SendOpenLinkToLogin', $login, $manialink, 1)) {
|
|
||||||
trigger_error(
|
|
||||||
"Couldn't open manialink to add server to favorite for '" . $login . "'! " .
|
|
||||||
$this->mc->getClientErrorText());
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Switch to the next server
|
|
||||||
*
|
|
||||||
* @param bool $simulateMapEnd
|
|
||||||
* Simulate end of the map by sending callbacks
|
|
||||||
*/
|
|
||||||
private function switchToNextServer($simulateMapEnd) {
|
|
||||||
$this->finishedBegin = -1;
|
|
||||||
$oldClient = $this->gameServer[$this->currentClientIndex];
|
|
||||||
|
|
||||||
$random_order = Tools::toBool($this->config->random_order);
|
|
||||||
if ($random_order) {
|
|
||||||
// Random next server
|
|
||||||
$this->currentClientIndex = rand(0, count($this->gameServer) - 1);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Next server in list
|
|
||||||
$this->currentClientIndex++;
|
|
||||||
}
|
|
||||||
if ($this->currentClientIndex >= count($this->gameServer)) $this->currentClientIndex = 0;
|
|
||||||
|
|
||||||
$newClient = $this->gameServer[$this->currentClientIndex];
|
|
||||||
if ($newClient == $oldClient) return;
|
|
||||||
|
|
||||||
// Restart map on next game server
|
|
||||||
if (!$newClient->query('RestartMap')) {
|
|
||||||
trigger_error("Couldn't restart map on next game server. " . $this->mc->getClientErrorText($newClient));
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($simulateMapEnd) {
|
|
||||||
// Simulate EndMap on old client
|
|
||||||
$this->mc->callbacks->triggerCallback(Callbacks::CB_IC_ENDMAP, array(Callbacks::CB_IC_ENDMAP));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Transfer players to next server
|
|
||||||
$joinLink = $this->getJoinLink($newClient);
|
|
||||||
if (!$oldClient->query('GetPlayerList', 255, 0)) {
|
|
||||||
trigger_error("Couldn't get player list. " . $this->mc->getClientErrorText($oldClient));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$playerList = $oldClient->getResponse();
|
|
||||||
foreach ($playerList as $player) {
|
|
||||||
$login = $player['Login'];
|
|
||||||
if (!$oldClient->query('SendOpenLinkToLogin', $login, $joinLink, 1)) {
|
|
||||||
trigger_error("Couldn't redirect player to next game server. " . $this->mc->getClientErrorText($oldClient));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->mc->client = $newClient;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Trigger client updated callback
|
|
||||||
$this->mc->callbacks->triggerCallback(Callbacks::CB_IC_CLIENTUPDATED, "Plugin_United.SwitchedServer");
|
|
||||||
|
|
||||||
if ($simulateMapEnd) {
|
|
||||||
// Simulate BeginMap on new client
|
|
||||||
$map = $this->mc->server->getMap();
|
|
||||||
if ($map) {
|
|
||||||
$this->mc->callbacks->triggerCallback(Callbacks::CB_IC_BEGINMAP, array(Callbacks::CB_IC_BEGINMAP, array($map)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle nextserver command
|
|
||||||
*
|
|
||||||
* @param mixed $command
|
|
||||||
*/
|
|
||||||
public function handleNextServerCommand($command) {
|
|
||||||
if (!$command) return;
|
|
||||||
$login = $command[1][1];
|
|
||||||
|
|
||||||
if (!$this->mc->authentication->checkRight($login, 'operator')) {
|
|
||||||
// Not allowed
|
|
||||||
$this->mc->authentication->sendNotAllowed($login);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Request skip to next server
|
|
||||||
$this->switchServerRequested = time() + 3;
|
|
||||||
|
|
||||||
// Send chat message
|
|
||||||
$this->mc->chat->sendInformation("Switching to next server in 3 seconds...");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle PlayerConnect callback
|
|
||||||
*/
|
|
||||||
public function playerJoinedLobby($client, $callback) {
|
|
||||||
if (!$client) return;
|
|
||||||
|
|
||||||
$data = $callback[1];
|
|
||||||
$login = $data[0];
|
|
||||||
|
|
||||||
// Redirect player to current game server
|
|
||||||
$gameserver = $this->gameServer[$this->currentClientIndex];
|
|
||||||
$joinLink = $this->getJoinLink($gameserver, !$data[1]);
|
|
||||||
if (!$client->query('SendOpenLinkToLogin', $login, $joinLink, 1)) {
|
|
||||||
trigger_error(
|
|
||||||
"United Plugin: Couldn't redirect player to current game server. " . $this->mc->getClientErrorText($client));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Connect to the game server defined in the config
|
|
||||||
*/
|
|
||||||
private function loadClients() {
|
|
||||||
$gameserver = $this->config->xpath('gameserver/server');
|
|
||||||
$lobbies = $this->config->xpath('lobbies/server');
|
|
||||||
|
|
||||||
$clientsConfig = array_merge($gameserver, $lobbies);
|
|
||||||
foreach ($clientsConfig as $index => $serv) {
|
|
||||||
$isGameServer = (in_array($serv, $gameserver));
|
|
||||||
|
|
||||||
$host = $serv->xpath('host');
|
|
||||||
$port = $serv->xpath('port');
|
|
||||||
if (!$host || !$port) {
|
|
||||||
trigger_error("Invalid configuration!", E_USER_ERROR);
|
|
||||||
}
|
|
||||||
$host = (string) $host[0];
|
|
||||||
$port = (string) $port[0];
|
|
||||||
|
|
||||||
error_log("Connecting to united " . ($isGameServer ? 'game' : 'lobby') . " server at " . $host . ":" . $port . "...");
|
|
||||||
$client = new \IXR_ClientMulticall_Gbx();
|
|
||||||
|
|
||||||
// Connect
|
|
||||||
if (!$client->InitWithIp($host, $port, $this->settings->timeout)) {
|
|
||||||
trigger_error(
|
|
||||||
"Couldn't connect to united " . ($isGameServer ? 'game' : lobby) . " server! " . $client->getErrorMessage() .
|
|
||||||
"(" . $client->getErrorCode() . ")", E_USER_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
$login = $serv->xpath('login');
|
|
||||||
$pass = $serv->xpath('pass');
|
|
||||||
if (!$login || !$pass) {
|
|
||||||
trigger_error("Invalid configuration!", E_USER_ERROR);
|
|
||||||
}
|
|
||||||
$login = (string) $login[0];
|
|
||||||
$pass = (string) $pass[0];
|
|
||||||
|
|
||||||
// Authenticate
|
|
||||||
if (!$client->query('Authenticate', $login, $pass)) {
|
|
||||||
trigger_error(
|
|
||||||
"Couldn't authenticate on united " . ($isGameServer ? 'game' : 'lobby') . " server with user '" . $login . "'! " .
|
|
||||||
$client->getErrorMessage() . "(" . $client->getErrorCode() . ")", E_USER_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Enable callback system
|
|
||||||
if (!$client->query('EnableCallbacks', true)) {
|
|
||||||
trigger_error("Couldn't enable callbacks! " . $client->getErrorMessage() . "(" . $client->getErrorCode() . ")",
|
|
||||||
E_USER_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wait for server to be ready
|
|
||||||
if (!$this->mc->server->waitForStatus($client, 4)) {
|
|
||||||
trigger_error("Server couldn't get ready!", E_USER_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set api version
|
|
||||||
if (!$client->query('SetApiVersion', ManiaControl::API_VERSION)) {
|
|
||||||
trigger_error(
|
|
||||||
"Couldn't set API version '" . ManiaControl::API_VERSION . "'! This might cause problems. " .
|
|
||||||
$this->mc->getClientErrorText($client));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set server settings
|
|
||||||
$password = ($isGameServer ? $this->settings->gamePassword : $this->settings->lobbyPassword);
|
|
||||||
$hideServer = ($isGameServer && $this->settings->hide_game_server ? 1 : 0);
|
|
||||||
// Passwords
|
|
||||||
if (!$client->query('SetServerPassword', $password)) {
|
|
||||||
trigger_error("Couldn't set server join password. " . $this->mc->getClientErrorText($client));
|
|
||||||
}
|
|
||||||
if (!$client->query('SetServerPasswordForSpectator', $password)) {
|
|
||||||
trigger_error("Couldn't set server spec password. " . $this->mc->getClientErrorText($client));
|
|
||||||
}
|
|
||||||
// Show/Hide server
|
|
||||||
if (!$client->query('SetHideServer', $hideServer)) {
|
|
||||||
trigger_error(
|
|
||||||
"Couldn't set server '" . ($hideServer == 0 ? 'shown' : 'hidden') . "'. " .
|
|
||||||
$this->mc->getClientErrorText($client));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Enable service announces
|
|
||||||
if (!$client->query("DisableServiceAnnounces", false)) {
|
|
||||||
trigger_error("Couldn't enable service announces. " . $this->mc->getClientErrorText($client));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set game mode
|
|
||||||
if (!$client->query('SetGameMode', $this->settings->gamemode)) {
|
|
||||||
trigger_error(
|
|
||||||
"Couldn't set game mode (" . $this->settings->gamemode . "). " . $this->mc->getClientErrorText($client));
|
|
||||||
}
|
|
||||||
else if (!$client->query('RestartMap')) {
|
|
||||||
trigger_error("Couldn't restart map to change game mode. " . $this->mc->getClientErrorText($client));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save client
|
|
||||||
$client->index = $index;
|
|
||||||
if ($isGameServer) {
|
|
||||||
array_push($this->gameServer, $client);
|
|
||||||
if (count($this->gameServer) === 1) {
|
|
||||||
$this->mc->client = $client;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
array_push($this->lobbies, $client);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
error_log("United Plugin: Connected to all game and lobby server!");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle PlayerConnect callback
|
|
||||||
*
|
|
||||||
* @param array $callback
|
|
||||||
*/
|
|
||||||
public function handlePlayerConnect($callback) {
|
|
||||||
if ($this->settings->widgets_enabled) {
|
|
||||||
// Send manialinks to the client
|
|
||||||
$login = $callback[1][0];
|
|
||||||
|
|
||||||
if (Tools::toBool($this->config->widgets->addfavorite->enabled)) {
|
|
||||||
// Send favorite widget
|
|
||||||
if (!$this->mc->client->query('SendDisplayManialinkPageToLogin', $login,
|
|
||||||
$this->manialinks[self::ML_ADDFAVORITE]->asXml(), 0, false)) {
|
|
||||||
trigger_error("Couldn't send favorite widget to player '" . $login . "'! " . $this->mc->getClientErrorText());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Build join link for the given client
|
|
||||||
*/
|
|
||||||
private function getJoinLink(&$client = null, $play = true) {
|
|
||||||
if (!$client) {
|
|
||||||
$client = $this->gameServer[$this->currentClientIndex];
|
|
||||||
}
|
|
||||||
if (!$client->query('GetSystemInfo')) {
|
|
||||||
trigger_error("Couldn't fetch server system info. " . $this->mc->getClientErrorText($client));
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$systemInfo = $client->getResponse();
|
|
||||||
$password = '';
|
|
||||||
if (!$client->query('GetServerPassword')) {
|
|
||||||
trigger_error("Couldn't get server password. " . $this->mc->getClientErrorText($client));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$password = $client->getResponse();
|
|
||||||
}
|
|
||||||
return '#q' . ($play ? 'join' : 'spectate') . '=' . $systemInfo['ServerLogin'] .
|
|
||||||
(strlen($password) > 0 ? ':' . $password : '') . '@' . $systemInfo['TitleId'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Build manialink for addfavorite button
|
|
||||||
*/
|
|
||||||
private function buildFavoriteManialink() {
|
|
||||||
// Load configs
|
|
||||||
$config = $this->config->widgets->addfavorite;
|
|
||||||
if (!Tools::toBool($config->enabled)) return;
|
|
||||||
|
|
||||||
$pos_x = (float) $config->pos_x;
|
|
||||||
$pos_y = (float) $config->pos_y;
|
|
||||||
$height = (float) $config->height;
|
|
||||||
$width = (float) $config->width;
|
|
||||||
$add_all = Tools::toBool($config->add_all);
|
|
||||||
|
|
||||||
// Build manialink
|
|
||||||
$xml = Tools::newManialinkXml(self::ML_ADDFAVORITE);
|
|
||||||
|
|
||||||
$frameXml = $xml->addChild('frame');
|
|
||||||
$frameXml->addAttribute('posn', $pos_x . ' ' . $pos_y);
|
|
||||||
|
|
||||||
// Background
|
|
||||||
$quadXml = $frameXml->addChild('quad');
|
|
||||||
Tools::addAlignment($quadXml);
|
|
||||||
$quadXml->addAttribute('posn', '0 0 0');
|
|
||||||
$quadXml->addAttribute('sizen', $width . ' ' . $height);
|
|
||||||
$quadXml->addAttribute('style', 'Bgs1InRace');
|
|
||||||
$quadXml->addAttribute('substyle', 'BgTitleShadow');
|
|
||||||
$quadXml->addAttribute('action', self::ML_ADDFAVORITE);
|
|
||||||
|
|
||||||
// Heart
|
|
||||||
$quadXml = $frameXml->addChild('quad');
|
|
||||||
Tools::addAlignment($quadXml);
|
|
||||||
$quadXml->addAttribute('id', 'Quad_AddFavorite');
|
|
||||||
$quadXml->addAttribute('posn', '0 0 1');
|
|
||||||
$quadXml->addAttribute('sizen', ($width - 1.) . ' ' . ($height - 0.8));
|
|
||||||
$quadXml->addAttribute('style', 'Icons64x64_1');
|
|
||||||
$quadXml->addAttribute('substyle', 'StateFavourite');
|
|
||||||
$quadXml->addAttribute('scriptevents', '1');
|
|
||||||
|
|
||||||
// Tooltip
|
|
||||||
$tooltipFrameXml = $frameXml->addChild('frame');
|
|
||||||
$tooltipFrameXml->addAttribute('id', 'Frame_FavoriteTooltip');
|
|
||||||
$tooltipFrameXml->addAttribute('posn', '0 ' . ($pos_y >= 0 ? '-' : '') . '13');
|
|
||||||
$tooltipFrameXml->addAttribute('hidden', '1');
|
|
||||||
|
|
||||||
$quadXml = $tooltipFrameXml->addChild('quad');
|
|
||||||
Tools::addAlignment($quadXml);
|
|
||||||
$quadXml->addAttribute('posn', '0 0 2');
|
|
||||||
$quadXml->addAttribute('sizen', '28 16');
|
|
||||||
$quadXml->addAttribute('style', 'Bgs1InRace');
|
|
||||||
$quadXml->addAttribute('substyle', 'BgTitleShadow');
|
|
||||||
|
|
||||||
$labelXml = $tooltipFrameXml->addChild('label');
|
|
||||||
Tools::addAlignment($labelXml);
|
|
||||||
Tools::addTranslate($labelXml);
|
|
||||||
$labelXml->addAttribute('posn', '0 0 3');
|
|
||||||
$labelXml->addAttribute('sizen', '26 0');
|
|
||||||
$labelXml->addAttribute('style', 'TextTitle1');
|
|
||||||
$labelXml->addAttribute('textsize', '2');
|
|
||||||
$labelXml->addAttribute('autonewline', '1');
|
|
||||||
$countText = '';
|
|
||||||
if ($add_all) {
|
|
||||||
$count = count($this->gameServer) + count($this->lobbies);
|
|
||||||
$countText = 'all ' . $count . ' ';
|
|
||||||
}
|
|
||||||
$labelXml->addAttribute('text', 'Add ' . $countText . 'server to Favorite!');
|
|
||||||
|
|
||||||
// Script for tooltip
|
|
||||||
$script = '
|
|
||||||
declare Frame_FavoriteTooltip <=> (Page.GetFirstChild("Frame_FavoriteTooltip") as CMlFrame);
|
|
||||||
while (True) {
|
|
||||||
yield;
|
|
||||||
foreach (Event in PendingEvents) {
|
|
||||||
switch (Event.Type) {
|
|
||||||
case CMlEvent::Type::MouseOver: {
|
|
||||||
switch (Event.ControlId) {
|
|
||||||
case "Quad_AddFavorite": {
|
|
||||||
Frame_FavoriteTooltip.Visible = True;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case CMlEvent::Type::MouseOut: {
|
|
||||||
switch (Event.ControlId) {
|
|
||||||
case "Quad_AddFavorite": {
|
|
||||||
Frame_FavoriteTooltip.Visible = False;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}';
|
|
||||||
$xml->addChild('script', $script);
|
|
||||||
|
|
||||||
$this->manialinks[self::ML_ADDFAVORITE] = $xml;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
?>
|
|
||||||
|
|
28
application/plugins/testPlugin.php
Normal file
28
application/plugins/testPlugin.php
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace ManiaControl;
|
||||||
|
|
||||||
|
class TestPlugin extends Plugin {
|
||||||
|
|
||||||
|
public function __construct(ManiaControl $maniaControl) {
|
||||||
|
$this->maniaControl = $maniaControl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAuthor() {
|
||||||
|
return 'steeffeen';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getName() {
|
||||||
|
return 'Test Plugin';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getVersion() {
|
||||||
|
return '1.0';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getDescription() {
|
||||||
|
return 'Dummy plugin for testing plugin handling';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
@ -1,11 +1,9 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace ManiaControl;
|
use ManiaControl\ManiaControl;
|
||||||
|
// Define base dir
|
||||||
define('ManiaControlDir', __DIR__);
|
define('ManiaControlDir', __DIR__);
|
||||||
|
|
||||||
require_once __DIR__ . '/core/core.php';
|
|
||||||
|
|
||||||
// Set process settings
|
// Set process settings
|
||||||
ini_set('memory_limit', '128M');
|
ini_set('memory_limit', '128M');
|
||||||
if (function_exists('date_default_timezone_get') && function_exists('date_default_timezone_set')) {
|
if (function_exists('date_default_timezone_get') && function_exists('date_default_timezone_set')) {
|
||||||
@ -17,10 +15,13 @@ ini_set('log_errors', 1);
|
|||||||
ini_set('error_reporting', -1);
|
ini_set('error_reporting', -1);
|
||||||
ini_set('error_log', 'ManiaControl_' . getmypid() . '.log');
|
ini_set('error_log', 'ManiaControl_' . getmypid() . '.log');
|
||||||
|
|
||||||
|
// Load ManiaControl class
|
||||||
|
require_once __DIR__ . '/core/maniaControl.php';
|
||||||
|
|
||||||
// Start ManiaControl
|
// Start ManiaControl
|
||||||
error_log('Loading ManiaControl v' . ManiaControl::VERSION . '!');
|
error_log('Loading ManiaControl v' . ManiaControl::VERSION . '...');
|
||||||
|
|
||||||
$maniaControl = new ManiaControl();
|
$maniaControl = new ManiaControl();
|
||||||
$maniaControl->run(true);
|
$maniaControl->run();
|
||||||
|
|
||||||
?>
|
?>
|
Loading…
Reference in New Issue
Block a user