Add Freezone(1.4)

This commit is contained in:
fanyx 2022-06-26 16:01:19 +02:00
commit 1a97d14a1b
4 changed files with 1012 additions and 0 deletions

18
freezone/README.txt Normal file
View File

@ -0,0 +1,18 @@
####################################################################
### Freezone Port for XAseco ###
####################################################################
### !!! I am not responsible if your server gets disabled !!! ###
####################################################################
##Installation##
1. UnZIP the Archive into the XAseco folder.
2. Open the file "freezone.xml" and set <password> to your webservices-password.
3. Insert the following line into "plugins.xml":
<plugin>plugin.freezone.php</plugin>
4. Restart XAseco
##Copyright##
The full copyright remains to the Author of the Freezone plugin for ManiaLive.

36
freezone/freezone.xml Normal file
View File

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8" ?>
<freezone>
<webservices>
<password></password> <!-- Your webservices password -->
<!-- Optional settings -->
<testmode>false</testmode> <!-- Disables requests to webservices -->
<debuginfo>true</debuginfo> <!-- Creates the file freezone.log in XAseco main directory with webservices responses -->
<!-- Development settings -->
<debugmode>false</debugmode> <!-- Please don't use this! -->
<user></user> <!-- You don't need to set this! Only for testing purpose! -->
</webservices>
<button>
<background_style>BgsPlayerCard</background_style>
<background_substyle>BgPlayerCardBig</background_substyle>
<pos_x>-66</pos_x>
<pos_y>10.3</pos_y>
<score>
<pos_x>-66</pos_x>
<pos_y>10.3</pos_y>
</score>
</button>
<searchupdates>true</searchupdates>
<notify>
<enable>1</enable> <!-- Notify all players in chat if a player gets muted/unmuted by freezone? = = disabled, 1 = chat, 2 = in window-->
<messages>
<mute>{#server}>> {#highlite}{1}$z{#grey} got muted for this round because of freezone limitations.</mute>
<unmute>{#server}>> {#highlite}{1}$z{#grey} got unmuted again.</unmute>
</messages>
</notify>
</freezone>

View File

@ -0,0 +1,214 @@
<?php
/**
* ManiaLib - Lightweight PHP framework for Manialinks
*
* @copyright Copyright (c) 2009-2011 NADEO (http://www.nadeo.com)
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
* @version $Revision: 493 $:
* @author $Author: maximeraoust $:
* @date $Date: 2011-05-05 18:51:29 +0200 (jeu., 05 mai 2011) $:
*/
/**
* Lightweight REST client for Web Services.
*
* Requires CURL and JSON extensions
*/
class Client
{
public $lastRequestInfo;
protected $APIURL = 'https://ws.trackmania.com';
protected $username;
protected $password;
protected $contentType;
protected $acceptType;
protected $serializeCallback;
protected $unserializeCallback;
protected $timeout;
public $debug;
function __construct($username, $password, $debug = false)
{
if (!function_exists('curl_init'))
{
die('Freezone-Plugin needs the CURL PHP extension.');
}
$this->username = $username;
$this->password = $password;
$this->contentType = 'application/json';
$this->acceptType = 'application/json';
$this->serializeCallback = 'json_encode';
$this->unserializeCallback = 'json_decode';
$this->timeout = 3;
$this->debug = $debug;
}
function setAuth($username, $password)
{
$this->username = $username;
$this->password = $password;
}
function setAPIURL($URL)
{
$this->APIURL = $URL;
}
function setContentType($contentType)
{
$this->contentType = $contentType;
}
function setAcceptType($acceptType)
{
$this->acceptType = $acceptType;
}
function setSerializeCallback($callback)
{
$this->serializeCallback = $callback;
}
function setUnserializeCallback($callback)
{
$this->unserializeCallback = $callback;
}
function setTimeout($timeout)
{
$this->timeout = $timeout;
}
function execute($verb, $ressource, array $params = array())
{
$url = $this->APIURL.$ressource;
if($verb == 'POST' || $verb == 'PUT')
{
$data = array_pop($params);
$data = call_user_func($this->serializeCallback, $data);
}
else
{
$data = null;
}
if($params)
{
$params = array_map('urlencode', $params);
array_unshift($params, $url);
$url = call_user_func_array('sprintf', $params);
}
$header[] = 'Accept: '.$this->acceptType;
$header[] = 'Content-type: '.$this->contentType;
$options = array();
switch($verb)
{
case 'HEAD':
case 'GET':
// Nothing to do
break;
case 'POST':
$options[CURLOPT_POST] = true;
$options[CURLOPT_POSTFIELDS] = $data;
break;
case 'PUT':
$fh = fopen('php://temp', 'rw');
fwrite($fh, $data);
rewind($fh);
$options[CURLOPT_PUT] = true;
$options[CURLOPT_INFILE] = $fh;
$options[CURLOPT_INFILESIZE] = strlen($data);
break;
case 'DELETE':
$options[CURLOPT_POST] = true;
$options[CURLOPT_POSTFIELDS] = '';
$header[] = 'Method: DELETE';
break;
default:
throw new FreezoneException('Unsupported HTTP method: '.$verb);
}
$options[CURLOPT_URL] = $url;
$options[CURLOPT_HTTPHEADER] = $header;
$options[CURLOPT_HTTPAUTH] = CURLAUTH_BASIC;
$options[CURLOPT_USERPWD] = $this->username.':'.$this->password;
$options[CURLOPT_TIMEOUT] = $this->timeout;
$options[CURLOPT_RETURNTRANSFER] = true;
$options[CURLOPT_USERAGENT] = 'ManiaLib Rest Client';
// This normally should not be done
// But the certificates of our api are self-signed for now
$options[CURLOPT_SSL_VERIFYHOST] = 0;
$options[CURLOPT_SSL_VERIFYPEER] = 0;
try
{
$ch = curl_init();
curl_setopt_array($ch, $options);
$response = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
}
catch(Exception $e)
{
if($ch)
{
curl_close($ch);
}
throw $e;
}
$this->lastRequestInfo = $info;
if($response && $this->unserializeCallback)
{
$response = call_user_func($this->unserializeCallback, $response);
}
if($this->debug) {
$this->writedebug("[".date('r')."] ".$info['http_code']." ('".$verb."', '".$ressource."', '".(is_array($data) ? print_r($data,1) : $data)."')");
}
if($info['http_code'] == 200)
{
return $response;
}
else
{
if(is_object($response) && property_exists($response, 'message'))
{
$message = $response->message;
}
else
{
$message = 'API error. Check the HTTP error code.';
}
throw new FreezoneException($message, $info['http_code']);
}
}
static function writedebug($msg) {
$fp = fopen("freezone.log","a+");
fwrite($fp, $msg."\r\n");
fclose($fp);
}
}
class FreezoneException extends Exception {
public function __construct($message, $code = 0) {
parent::__construct($message, $code);
}
public function __toString() {
return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
}
}
?>

View File

@ -0,0 +1,744 @@
<?php
/**
* ManiaLive - Freezone Plugin
*
* @copyright Copyright (c) 2009-2011 NADEO (http://www.nadeo.com)
* @version $Revision: 3705 $:
* @author $Author: philippe $:
* @date $Date: 2011-05-09 13:04:04 +0200 (lun., 09 mai 2011) $:
*/
require_once('freezone/fz-rest-client.php');
Aseco::registerEvent('onSync', 'freezone_sync');
Aseco::registerEvent('onChat', 'freezone_chat');
Aseco::registerEvent('onPlayerConnect', 'freezone_playerConnect');
Aseco::registerEvent('onPlayerDisconnect', 'freezone_playerDisconnect');
Aseco::registerEvent('onPlayerInfoChanged', 'freezone_playerInfoChanged');
Aseco::registerEvent('onPlayerManialinkPageAnswer', 'freezone_actionHandler');
Aseco::registerEvent('onEverySecond', 'freezone_tick');
Aseco::registerEvent('onNewChallenge', 'freezone_newChallenge');
Aseco::registerEvent('onEndRace1', 'freezone_endRace');
define('FREEZONE_VERSION', '1.4');
class Freezone {
public $searchupdates;
private $wsUser, $wsPassword, $testmode, $button, $messages, $translation, $Aseco, $interval, $MLVersion, $debuginfo, $debugmode, $notify, $gamestate;
protected $wsInstance, $players, $spectators, $retired, $banned, $slangWords, $tick = 0, $slangUsers = array(), $usersWatched = array(), $store = array();
protected static $MLHash = '6f116833b419fe7cb9c912fdaefb774845f60e79';
protected static $chatPrefix = '$<$0f0$oFreeZone:$> ';
protected static $maxPlayerGame = 5;
protected static $maxSpectatorGame = 1;
function __construct($aseco, $config) {
$this->Aseco = $aseco;
$this->xml = simplexml_load_file($config);
$this->loadSettings();
$this->translation = file_get_contents('http://files.manialive.com/freezonerules.xml');
if(!$this->testmode) {
$this->wsInstance = new Client($this->wsUser, $this->wsPassword, $this->debuginfo);
if($this->debugmode) {
$this->wsInstance->setAPIURL('http://ws.localhost/');
}
try {
$response = $this->wsInstance->execute('GET', '/manialive/version/check/239/index.json');
} catch(FreezoneException $ex) {
if($ex->getCode() == 401) {
trigger_error('[plugin.freezone.php] API Password wrong or server not registered for freezone! Check the freezone:servers manialink.', E_USER_ERROR);
}
}
$this->MLVersion = $response->version->revision;
}
$this->interval['ban_slang'] = 0; // every 6 hours
$this->interval['stats'] = 0; // every hour
$this->interval['rules'] = 0; // every 13 minutes
$this->interval['free'] = 0; // every 13 minutes
$this->interval['rules'] = 0; // every minute
$this->players = array();
$this->spectators = array();
$this->retired = array();
$this->banned = array();
$this->store['forcedspectators'] = array();
$this->slangWords = $this->getSlangList();
$this->gamestate = 0;
}
function loadSettings() {
global $re_config;
$this->wsUser = strval(($this->xml->webservices->user!="" ? $this->xml->webservices->user : $this->Aseco->server->serverlogin));
$this->wsPassword = strval($this->xml->webservices->password);
$this->testmode = (strtoupper($this->xml->webservices->testmode) == 'TRUE' ? true : false);
$this->debuginfo = (strtoupper($this->xml->webservices->debuginfo) == 'TRUE' ? true : false);
$this->debugmode = (strtoupper($this->xml->webservices->debugmode) == 'TRUE' ? true : false);
if($this->wsPassword == "") {
trigger_error('[plugin.freezone.php] Please set freezone.webservices.password in freezone.xml!', E_USER_ERROR);
}
$this->button['background_style'] = strval($this->xml->button->background_style);
$this->button['background_substyle'] = strval($this->xml->button->background_substyle);
$this->button['pos_x'] = strval($this->xml->button->pos_x);
$this->button['pos_y'] = strval($this->xml->button->pos_y);
$this->button['score_pos_x'] = strval($this->xml->button->score->pos_x);
$this->button['score_pos_y'] = strval($this->xml->button->score->pos_y);
$this->searchupdates = (strtoupper($this->xml->searchupdates) == 'TRUE' ? true : false);
// Messages
$frText = 'Pour profiter d\'un accès illimité à tous les serveurs en ligne, vous devez convertir votre compte à TrackMania United Forever. Clicker ici $hfreezone$h pour plus d\'informations';
$deText = 'Für einen unbegrenzten Zugang zu allen Onlinepartien musst Du auf einen Trackmania United Forever Account upgraden. Klicke hier $hfreezone$h für mehr Informationen.';
$enText = 'To enjoy unlimited access to all online games, you must upgrade to a TrackMania United Forever account. Click here $hfreezone$h for more information';
$this->messages['freeaccount'][] = array('Lang'=>'fr','Text'=>$frText);
$this->messages['freeaccount'][] = array('Lang'=>'de','Text'=>$deText);
$this->messages['freeaccount'][] = array('Lang'=>'en','Text'=>$enText);
$frText = 'Nous expérimentons de nouvelles règles sur la FreeZone: les joueurs possédant un compte gratuit peuvent jouer sur 5 circuits d\'affilé avant d\'effectuer une partie en spectateur';
$deText = 'Wir experimentieren mit neuen Regeln für die FreeZone: Spieler mit einem kostenlosen Account können 5 Strecken am Stück spielen bevor sie eine Runde als Zuschauer verbringen.';
$enText = 'We are experimenting new rules on the FreeZone: players with a free account can play up to 5 tracks in a row before doing 1 match as spectator.';
$this->messages['rules'][] = array('Lang'=>'fr','Text'=>$frText);
$this->messages['rules'][] = array('Lang'=>'de','Text'=>$deText);
$this->messages['rules'][] = array('Lang'=>'en','Text'=>$enText);
$this->messages['notify'] = array('mute' => strval($this->xml->notify->messages->mute), 'unmute' => strval($this->xml->notify->messages->unmute));
$this->notify = intval($this->xml->notify->enable);
}
function showFreezoneButton($player = false) {
$xml = '<?xml version="1.0" encoding="UTF-8"?>
<manialinks>
<manialink id="1073741824">
'.$this->translation.'
<frame posn="'.($this->gamestate==1 ? $this->button['score_pos_x'] : $this->button['pos_x']).' '.($this->gamestate==1 ? $this->button['score_pos_y'] : $this->button['pos_y']).' -32">
<quad sizen="27 4" style="'.$this->button['background_style'].'" substyle="'.$this->button['background_substyle'].'" manialink="freezone"/>
<label posn="13.5 -1 0.1" sizen="27 3" halign="center" style="TextStaticSmall" textid="button"/>
</frame>
</manialink>
<manialink id="2684354561">
<frame posn="0 0 -32">
<quad posn="100 -100 0" sizen="20 20" substyle="BgWindow2" action="268435457" actionkey="1"/>
<quad posn="100 -100 0.1" sizen="20 20" substyle="BgWindow2" action="268435458" actionkey="2"/>
<quad posn="100 -100 0.2" sizen="20 20" substyle="BgWindow2" action="268435459" actionkey="3"/>
</frame>
</manialink>
</manialinks>';
if(!$player) {
$players = array();
foreach ($this->Aseco->server->players->player_list as $player) {
if($player->rights) {
continue;
}
$players[] = $player->login;
}
if(!empty($players)) {
$this->Aseco->client->query('SendDisplayManialinkPageToLogin', implode(',', $players), $xml, 0, false);
}
} else {
if(!$this->Aseco->server->players->player_list[$player]->rights) {
$this->Aseco->client->query('SendDisplayManialinkPageToLogin', $player, $xml, 0, false);
}
}
}
function showSpectator($player) {
if (!isset($this->Aseco->server->players->player_list[$player])) {
return;
}
$xml = '<?xml version="1.0" encoding="UTF-8"?>
<manialinks>
<manialink id="1073741824">
<frame posn="0 0 -32">
<quad posn="100 -100 0" sizen="20 20" substyle="BgWindow2" action="1073741825" actionkey="1"/>
<quad posn="100 -100 0.1" sizen="20 20" substyle="BgWindow2" action="1073741826" actionkey="2"/>
<quad posn="100 -100 0.2" sizen="20 20" substyle="BgWindow2" action="1073741827" actionkey="3"/>
</frame>
</manialink>
'.$this->getCustomUi(true).'
<manialink id="536870912">
<frame posn="0 0 -32">
<quad posn="100 -100 0" sizen="20 20" substyle="BgWindow2" action="536870913" actionkey="1"/>
<quad posn="100 -100 0.1" sizen="20 20" substyle="BgWindow2" action="536870914" actionkey="2"/>
<quad posn="100 -100 0.2" sizen="20 20" substyle="BgWindow2" action="536870915" actionkey="3"/>
</frame>
</manialink>
<manialink id="1610612736">
'.$this->translation.'
<frame posn="-25 23.5 -32">
<frame>
<quad sizen="50 35" style="Bgs1" substyle="BgWindow2"/>
<frame posn="25 -1 0.1">
<quad sizen="48 4" halign="center" style="Bgs1" substyle="BgTitle3_1"/>
<quad posn="-24.5 -0.3 0.1" sizen="49 3.5" style="BgsPlayerCard" substyle="BgRacePlayerLine"/>
<label posn="0 -1 0.2" sizen="46 3" halign="center" textsize="2.5" textcolor="fff" textid="description_title"/>
</frame>
<quad posn="2 -1.6 0.4" sizen="3 3" style="Icons64x64_1" substyle="Close" action="1610612737"/>
</frame>
<label posn="2 -6 0.5" sizen="46 3" textsize="2" textcolor="fff" textid="description" autonewline="1"/>
<label posn="25 -33 0.6" sizen="26 4" halign="center" valign="bottom" style="CardButtonMedium" manialink="freezone" textid="description_button"/>
</frame>
</manialink>
<manialink id="268435456">
'.$this->translation.'
<frame posn="-63 -37 -32">
<label sizen="55 3" style="TextStaticSmall" textid="message" autonewline="1"/>
</frame>
</manialink>
</manialinks>';
$this->Aseco->client->query('SendDisplayManialinkPageToLogin', $player, $xml, 0, false);
$message = formatText($this->messages['notify']['mute'], $this->Aseco->server->players->player_list[$player]->nickname);
if($this->notify==2 && function_exists('send_window_message')) {
send_window_message($this->Aseco, $message, false);
} else if($this->notify==1){
$this->Aseco->client->query('ChatSendServerMessage', $this->Aseco->formatColors($message));
}
}
function showPlayer($player) {
if (!isset($this->Aseco->server->players->player_list[$player])) {
return;
}
$xml = '<?xml version="1.0" encoding="UTF-8"?>
<manialinks>
<manialink id="1073741824">
</manialink>
'.$this->getCustomUi(false).'
<manialink id="536870912">
</manialink>
<manialink id="1610612736">
</manialink>
<manialink id="268435456">
</manialink>
</manialinks>';
$this->Aseco->client->query('SendDisplayManialinkPageToLogin', $player, $xml, 0, false);
$message = formatText($this->messages['notify']['unmute'], $this->Aseco->server->players->player_list[$player]->nickname);
if($this->notify==2 && function_exists('send_window_message')) {
send_window_message($this->Aseco, $message, false);
} else if($this->notify==1){
$this->Aseco->client->query('ChatSendServerMessage', $this->Aseco->formatColors($message));
}
}
protected function getFreePlayers() {
$players = array();
foreach ($this->Aseco->server->players->player_list as $player) {
if(!$player->rights) {
$players[] = $player->login;
}
}
return $players;
}
protected function getSlangList() {
if(!$this->testmode) {
try {
return $this->wsInstance->execute('GET', '/freezone/slang/');
} catch(FreezoneException $ex) {
if($ex->getCode() == 401) {
$this->badPasswordMessage();
}
}
}
return array();
}
protected function checkLanguage($playerUid, $login, $text, $isRegistredCmd) {
$pattern = '/.*(?:^|\\s)('.implode('|', $this->slangWords).')(?:$|\\s).*/i';
$matches = array();
if(preg_match($pattern, $text, $matches)) {
$slangWord = $matches[1];
if(array_key_exists($login, $this->slangUsers)) {
$slangs = $this->slangUsers[$login]->matches;
$totalMatch = 0;
$find = false;
$this->slangUsers[$login]->lastMatchTime = time();
foreach ($slangs as $key => $matchCount) {
if($matchCount[0] == $slangWord) {
$this->slangUsers[$login]->matches[$key][1]++;
$find = true;
}
$totalMatch += $matchCount[1];
}
if(!$find) {
$this->slangUsers[$login]->matches[] = array($slangWord, 1);
$totalMatch += 1;
}
$slangDuration = $this->slangUsers[$login]->lastMatchTime - $this->slangUsers[$login]->firstMatchTime;
if($totalMatch >= 10 && $slangDuration <= 3600) {
$this->usersWatched[$login] = $this->slangUsers[$login];
}
} else {
$player = $this->Aseco->server->players->player_list[$login];
$slangUser = new SlangUser();
$slangUser->language = $player->language;
$slangUser->matches[] = array($slangWord, 1);
$this->slangUsers[$login] = $slangUser;
}
}
}
protected function cleanSlangUsersList() {
foreach($this->slangUsers as $key => $slangUser) {
if(time() - $slangUser->firstMatchTime >= 3600) {
unset($this->slangUsers[$key]);
}
}
}
protected function sendUsersWatched() {
if(count($this->usersWatched)) {
$datas = array();
foreach ($this->usersWatched as $slangUser) {
$user = array();
$user['language'] = $slangUser->language;
$user['matches'] = $slangUser->matches;
$datas[] = (object)$user;
}
$this->usersWatched = array();
try {
$this->wsInstance->execute('PUT', '/freezone/abuses/reports/%s/',array($this->wsUser, $datas));
} catch (FreezoneException $ex) {
if($ex->getCode() == 401) {
$this->badPasswordMessage();
}
}
}
}
function badPasswordMessage() {
foreach ($this->Aseco->server->players->player_list as $player) {
if($this->Aseco->isMasterAdmin($player)) {
$this->sendChat('Bad API Password, please check your configuration file and the manialink $hfreezone:servers$h', $player->login);
}
}
}
function sendChat($message, $player = false) {
if(!$player) {
$this->Aseco->client->query('ChatSendServerMessage', self::$chatPrefix.$message);
} else {
$this->Aseco->client->query('ChatSendServerMessageToLogin', self::$chatPrefix.$message, $player);
}
}
function getCustomUi($dis = false) {
// From manialinks.inc.php
global $ml_custom_ui;
return '<custom_ui>' .
'<notice visible="' . (!$dis ? bool2text($ml_custom_ui['notice']) : bool2text(false)) . '"/>' .
'<challenge_info visible="' . bool2text($ml_custom_ui['challenge_info']) . '"/>' .
'<net_infos visible="' . bool2text($ml_custom_ui['net_infos']) . '"/>' .
'<chat visible="' . (!$dis ? bool2text($ml_custom_ui['chat']) : bool2text(false)) . '"/>' .
'<checkpoint_list visible="' . bool2text($ml_custom_ui['checkpoint_list']) . '"/>' .
'<round_scores visible="' . bool2text($ml_custom_ui['round_scores']) . '"/>' .
'<scoretable visible="' . bool2text($ml_custom_ui['scoretable']) . '"/>' .
'<global visible="' . bool2text($ml_custom_ui['global']) . '"/>' .
'</custom_ui>';
}
/***** Events *****/
function onPlayerConnect($player) {
$this->Aseco->client->query('GetPlayerInfo', $player->login, 2);
$info = $this->Aseco->client->getResponse();
if(in_array($login, $this->banned)) {
$this->Aseco->client->query('Kick', $player->login);
} else {
if(!$this->testmode) {
try {
$result = $this->wsInstance->execute('GET', '/freezone/ban/status/'.$player->login.'/index.json');
} catch(FreezoneException $ex) {
if($ex->getCode() == 401) {
$this->badPasswordMessage();
}
$result = 0;
}
} else {
$result = 0;
}
if($result == 2) {
$this->Aseco->client->query('Kick', $player->login);
$this->banned[] = $login;
} else {
if(!$player->rights) {
if(key_exists($player->login, $this->retired)) {
if(key_exists($player->login, $this->players)) {
if($this->Aseco->isSpectator($player)) {
$this->spectators[$player->login] = $this->players[$player->login];
} else {
$this->Aseco->client->query('ForceSpectator', $player->login, 2);
$this->store['forcedspectators'][$player->login] = 2;
}
} else if(key_exists($player->login, $this->spectators)) {
if(isset($this->retired[$player->login])) {
$this->showSpectator($player->login);
$this->spectators[$player->login] = self::$maxPlayerGame;
$this->Aseco->client->query('ForceSpectator', $player->login, 1);
$this->store['forcedspectators'][$player->login] = 1;
} else {
if(!$this->Aseco->isSpectator($player)) {
if($this->spectators[$login] > self::$maxPlayerGame) {
$this->showSpectator($player->login);
$this->Aseco->client->query('ForceSpectator', $player->login, 1);
$this->store['forcedspectators'][$player->login] = 1;
} else {
$this->players[$login] = $this->spectators[$player->login];
}
}
}
}
return;
}
if(!$this->testmode) {
try {
$count = $this->wsInstance->execute('GET', '/freezone/rules/'.$player->login.'/index.json');
} catch(FreezoneException $ex) {
if($ex->getCode() == 401) {
$this->badPasswordMessage();
}
}
} else {
$count = 0;
}
if($count >= self::$maxPlayerGame) {
$this->showSpectator($player->login);
$this->spectators[$player->login] = $count;
$this->Aseco->client->query('ForceSpectator', $player->login, 1);
$this->store['forcedspectators'][$player->login] = 1;
return;
}
if(!$this->Aseco->isSpectator($player)) {
$this->players[$player->login] = $count;
$this->Aseco->client->query('ForceSpectator', $player->login, 2);
$this->store['forcedspectators'][$player->login] = 2;
} else {
$this->spectators[$player->login] = $count;
}
$this->showFreezoneButton($player->login);
}
}
}
}
function onPlayerChangeSide($login) {
$player = $this->Aseco->server->players->player_list[$login];
if (!$this->Aseco->isSpectator($player)) {
$this->Aseco->client->query('GetPlayerInfo', $player->login, 2);
$this->store['forcedspectators'][$player->login] = 2;
$info = $this->Aseco->client->getResponse();
if (!$player->rights && ($info['Flags'] % 10 == 0)) {
$this->Aseco->client->query('ForceSpectator', $login, 2);
$this->store['forcedspectators'][$player->login] = 2;
}
if (isset($this->spectators[$login])) {
$this->players[$login] = $this->spectators[$login];
unset($this->spectators[$login]);
}
$player->isSpectator = false;
$this->showFreezoneButton($player->login);
} elseif ($this->Aseco->isSpectator($player)) {
if (isset($this->players[$login])) {
$this->spectators[$login] = $this->players[$login];
unset($this->players[$login]);
}
$player->isSpectator = true;
$this->showFreezoneButton($player->login);
}
}
function actionHandler($answer) {
if ($answer[2] == 0) {
return;
}
if ($answer[2] == 1610612737) {
// Close SpectatorWindow
$xml = '<?xml version="1.0" encoding="UTF-8"?>
<manialinks>
<manialink id="1610612736">
</manialink>
</manialinks>';
$this->Aseco->client->query('SendDisplayManialinkPageToLogin', $answer[1], $xml, 0, false);
}
}
function onBeginRace($challenge) {
foreach($this->spectators as $login => $value) {
if(!array_key_exists($login, $this->Aseco->server->players->player_list)) {
Client::writedebug("$login is in plugin-intern spectatorlist but is offline!");
unset($this->spectators[$login]);
}
$player = $this->Aseco->server->players->player_list[$login];
$this->Aseco->client->query('GetPlayerInfo', $player->login, 2);
$info = $this->Aseco->client->getResponse();
if($player && (($info['Flags'] % 10) == 1)) {
if (!$this->Aseco->startup_phase) {
$this->spectators[$login]++;
}
if($value >= self::$maxPlayerGame + self::$maxSpectatorGame) {
$this->Aseco->client->query('ForceSpectator', $login, 2);
$this->store['forcedspectators'][$login] = 2;
$this->showPlayer($player->login);
$this->spectators[$login] = 0;
if($this->debuginfo) {
Client::writedebug("Forcing $login into player!");
}
}
}
}
foreach($this->players as $login => $value) {
$this->players[$login]++;
if($value >= self::$maxPlayerGame) {
$player = $this->Aseco->server->players->player_list[$login];
$this->showSpectator($login);
$this->Aseco->client->query('ForceSpectator', $login, 1);
$this->store['forcedspectators'][$login] = 1;
if($this->debuginfo) {
Client::writedebug("Forcing $login into spectator!");
}
}
}
$this->gamestate = 0;
$this->showFreezoneButton();
}
function onEndChallenge($rankings, $challenge, $wasWarmUp, $matchContinuesOnNextChallenge, $restartChallenge) {
if(!$wasWarmUp) {
foreach ($this->retired as $login => $value) {
if ($value) {
$count = self::$maxPlayerGame;
if(array_key_exists($login, $this->players)) {
$count = $this->players[$login];
} elseif(array_key_exists($login, $this->spectators)) {
$count = $this->spectators[$login];
}
$count++;
if(!$this->testmode) {
try {
$this->wsInstance->execute('PUT', '/freezone/rules/'.$login.'/index.json', array($count));
} catch (FreezoneException $ex) {
if($ex->getCode() == 401) {
$this->badPasswordMessage();
}
}
}
unset($this->players[$login]);
unset($this->spectators[$login]);
}
}
$this->retired = array();
$this->gamestate = 1;
$this->showFreezoneButton();
}
$this->printDebug();
}
function onRestartChallenge() {
$this->gamestate = 0;
}
function onPlayerDisconnect($player) {
$count = self::$maxPlayerGame;
if(array_key_exists($player->login, $this->players)) {
$count = $this->players[$player->login];
} elseif(array_key_exists($player->login, $this->spectators)) {
$count = $this->spectators[$player->login];
}
if(!$this->testmode){
try {
$this->wsInstance->execute('PUT', '/freezone/rules/'.$player->login.'/index.json', array($count));
} catch (FreezoneException $ex) {
if($ex->getCode() == 401) {
$this->badPasswordMessage();
}
}
}
if(isset($this->store['forcedspectators'][$player->login])) {
if($this->store['forcedspectators'][$player->login] != 0) {
$this->retired[$player->login] = true;
}
unset($this->store['forcedspectators'][$player->login]);
}
}
function onPlayerChat($playerUid, $login, $text, $isRegistredCmd) {
$this->checkLanguage($playerUid, $login, $text, $isRegistredCmd);
}
function onTick() {
$time = time();
// every 6 hours - refresh ban- and clean slanglist
if($this->interval['ban_slang']+21600 <= $time) {
$this->slangWords = $this->getSlangList();
$this->banned = array();
$this->interval['ban_slang'] = $time;
}
// every hour - send statistics to ManiaStudio
if($this->interval['stats']+3600 <= $time) {
if(!$this->testmode) {
$this->Aseco->client->query('GetHideServer');
$hidestatus = $this->Aseco->client->getResponse();
$data = array();
$data['serverLogin'] = $this->wsUser;
$data['serverName'] = $this->Aseco->server->name;
$data['serverVersion'] = $this->Aseco->server->game.','.$this->Aseco->server->version.','.$this->Aseco->server->build;
$data['manialiveVersion'] = $this->MLVersion;
$data['maxPlayers'] = $this->Aseco->server->maxplay;
$data['visibility'] = $hidestatus;
$data['classHash'] = self::$MLHash;
try {
$this->wsInstance->execute('POST', '/freezone/live/', array($data));
} catch (FreezoneException $ex) {
if($ex->getCode() == 401) {
$this->badPasswordMessage();
}
}
$this->sendUsersWatched();
}
$this->cleanSlangUsersList();
$this->interval['stats'] = $time;
}
// every minute - testmode message
if($this->interval['rules']+60 <= $time) {
if($this->testmode) {
foreach ($this->Aseco->server->players->player_list as $player) {
if($this->Aseco->isMasterAdmin($player)) {
$this->sendChat('This server is in test Mode. This mode should be disable to respect the FreeZone Rules', $player->login);
}
}
}
$this->interval['rules'] = $time;
}
// every 13 minutes - send rule message
if($this->interval['rules']+780 <= $time) {
$players = $this->getFreePlayers();
if(count($players)) {
$this->Aseco->client->query('ChatSendServerMessageToLanguage', $this->messages['rules'], $players);
}
$this->interval['rules'] = $time;
}
// every 13 minutes - send free-account message
if($this->interval['free']+780 <= $time) {
$players = $this->getFreePlayers();
if(count($players)) {
$this->Aseco->client->query('ChatSendServerMessageToLanguage', $this->messages['freeaccount'], $players);
}
$this->interval['free'] = $time;
}
}
function printDebug() {
echo '$this->players:'."\n";
print_r($this->players);
echo '$this->spectators:'."\n";
print_r($this->spectators);
}
}
function freezone_sync($aseco) {
global $freezone;
$freezone = new Freezone($aseco, 'freezone.xml');
// Register this to the global version pool (for up-to-date checks)
$aseco->plugin_versions[] = array(
'plugin' => 'plugin.freezone.php',
'author' => 'ManiacTwister',
'version' => FREEZONE_VERSION
);
}
function freezone_chat($aseco, $chat) {
global $freezone;
if ($chat[0] == $aseco->server->id) return;
$freezone->onPlayerChat($chat[0], $chat[1], $chat[2], $chat[3]);
}
function freezone_playerConnect($aseco, $player) {
global $freezone;
$freezone->onPlayerConnect($player);
if($aseco->isMasterAdmin($player) && $message=search_update()) {
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $player->login);
}
}
function freezone_playerDisconnect($aseco, $player) {
global $freezone;
$freezone->onPlayerDisconnect($player);
}
function freezone_playerInfoChanged($aseco, $changes) {
global $freezone;
$freezone->onPlayerChangeSide($changes['Login']);
}
function freezone_actionHandler($aseco, $answer) {
global $freezone;
$freezone->actionHandler($answer);
}
function freezone_tick($aseco) {
global $freezone;
$freezone->onTick();
}
function freezone_newChallenge($aseco, $challenge) {
global $freezone;
$freezone->onBeginRace($challenge);
}
function freezone_endRace($aseco, $race) {
global $freezone;
$freezone->onEndChallenge($race[0], $race[1], $race[2], $race[3], $race[4]);
}
function freezone_restartChallenge($aseco) {
global $freezone;
$freezone->onRestartChallenge();
}
function search_update() {
global $freezone;
$current = trim(http_get_file('http://xaseco.maniactwister.de/freezone/version'));
if (!empty($current) && $freezone->searchupdates && $current != -1 && $current > FREEZONE_VERSION) {
return formatText('{#server}>> {#message}New Freezone plugin version {#highlite}{1}{#message} available from {#highlite}{2}', $current, '$L[http://www.tm-forum.com/viewtopic.php?f=127&t=29748]TM-Forum');
}
return false;
}
$freezone = '';
class SlangUser {
public $language;
public $firstMatchTime;
public $lastMatchTime;
public $matches = array();
function __construct() {
$this->firstMatchTime = time();
$this->lastMatchTime = time();
}
}
?>