docker-tmserver/xaseco/plugins/jfreu.plugin.php

1792 lines
61 KiB
PHP

<?php
/* vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2: */
/**
* Jfreu's plugin 0.14
* http://jfreu.servegame.com
* Updated by Xymph
*
* Dependencies: requires jfreu.chat.php
*
* LICENSE: This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published
* by the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
Aseco::registerEvent('onPlayerConnect', 'player_connect');
Aseco::registerEvent('onPlayerDisconnect', 'player_disconnect');
Aseco::registerEvent('onStartup', 'init_jfreu');
Aseco::registerEvent('onEndRace', 'kick_hirank');
Aseco::registerEvent('onEndRace', 'vote_end');
Aseco::registerEvent('onEndRace', 'info_message');
/**
* Jfreu-Unspec-Fix by (OoR-F)~fuckfish
* Updated/integrated by Xymph
*
* This code fixes the bug in Jfreu that some highranked users are able to
* join the race without launching an /unspec vote.
*
* How it works:
* The code just checks on every checkpoint if the player passing that
* checkpoint was unspec-ed or still is in spec mode. If s/he is,
* s/he will be kicked; easy but working =)
*/
Aseco::registerEvent('onCheckpoint', 'kick_speconly');
//** novote **//
Aseco::registerEvent('onChat', 'novote');
//Aseco::registerEvent('onPlayerVote', 'novote_message');
//** BadWords **//
Aseco::registerEvent('onChat', 'BadWords');
//** BAD BAD BAD **//
Aseco::registerEvent('onPlayerFinish', 'pf_kick');
//** MISC **/
Aseco::addChatCommand('ranklimit', 'Shows the current rank limit');
Aseco::addChatCommand('password', 'Show server\'s player/spectator password');
// disabled childish /fake command - Xymph
//Aseco::addChatCommand('fake', 'blaguadeubal...');
// disabled /uptodate command, superseded in main system - Xymph
//Aseco::addChatCommand('uptodate', 'Check version of Jfreu plugin');
//** VOTES **//
Aseco::addChatCommand('unspec', 'Launches an unSpec vote');
Aseco::addChatCommand('yes', 'Votes Yes for unSpec');
Aseco::addChatCommand('no', 'Votes No for unSpec');
Aseco::addChatCommand('message', 'Shows random informational message');
//** Jfreu admin commands **//
Aseco::addChatCommand('jfreu', 'Jfreu admin commands (see: /jfreu help)');
class Jfreu
{
//** Jfreu's plugin version **//
var $version;
//** config **//
var $conf_file;
var $vips_file;
var $bans_file;
var $servername;
var $top;
var $autochangename;
//** ranklimit **//
var $ranklimit;
var $limit;
var $hardlimit;
var $autorank;
var $offset;
var $autolimit;
var $autorankminplayers;
var $autorankvip;
var $maxplayers;
var $kickhirank;
//** colors **// <-- use aseco colors ?
var $white;
var $yellow;
var $red;
var $blue;
var $green;
var $admin;
//** random info message **//
var $messages;
var $nbmessages;
var $infomessages;
var $message_start;
//** player join/leave messages **//
var $player_join;
var $player_joins;
var $player_left;
//** votes **//
var $current_vote; // false: no vote | true: vote in progress
var $vote_item; // voting object
//** novote **//
var $novote;
var $unspecvote;
//** Jfreu's Player list **//
var $playerlist;
//** lists: VIP, VIP_Team **//
var $vip_list;
var $vip_team_list;
//** BadWords **//
var $badwords;
var $badwordsban;
var $badwordsnum;
var $badwordstime;
var $badwordslist;
//** BAD BAD BAD **//
var $pf;
var $pf_list;
//** jfreu admin commands *//
var $admin_commands;
} // class Jfreu
class joueur
{
var $hasvoted;
var $badwords;
var $kicked; // if kicked prevent 'left' message
var $isvip;
var $speconly; // SpecOnly status
var $banned; // >0 = timestamp unban
} // class joueur
class vote
{
var $yes;
var $no;
var $total;
var $nb_votes_needed;
var $type;
//** truc **//
var $login;
} // class vote
class jfreu_command
{
var $name;
var $help;
var $isadmin;
} // class jfreu_command
include('plugins/jfreu.chat.php');
// called @ onStartup
function init_jfreu($aseco, $command)
{
include_once('includes/jfreu.config.php');
$version = '0.14';
$aseco->server->jfreu = new Jfreu();
$aseco->server->jfreu->version = $version;
$aseco->server->jfreu->conf_file = $conf_file;
$aseco->server->jfreu->vips_file = $vips_file;
$aseco->server->jfreu->bans_file = $bans_file;
$aseco->server->jfreu->servername = $servername;
$aseco->server->jfreu->top = $top;
$aseco->server->jfreu->autochangename = ($autochangename != 0); // insure boolean
$aseco->server->jfreu->autorank = ($autorank != 0); // insure boolean
$aseco->server->jfreu->ranklimit = ($ranklimit != 0); // insure boolean
$aseco->server->jfreu->limit = $limit;
$aseco->server->jfreu->autolimit = $limit;
$aseco->server->jfreu->hardlimit = $hardlimit;
$aseco->server->jfreu->offset = $offset;
$aseco->server->jfreu->autorankvip = ($autorankvip != 0); // insure boolean
$aseco->server->jfreu->autorankminplayers = $autorankminplayers;
$aseco->server->jfreu->maxplayers = $maxplayers;
$aseco->server->jfreu->kickhirank = ($kickhirank != 0); // insure boolean
$aseco->server->jfreu->player_join = $player_join;
$aseco->server->jfreu->player_joins = $player_joins;
$aseco->server->jfreu->player_left = $player_left;
//** colors **//
$whi = $aseco->server->jfreu->white = $aseco->formatColors('$z$s{#highlite}');
$yel = $aseco->server->jfreu->yellow = $aseco->formatColors('$z$s{#server}');
$red = $aseco->server->jfreu->red = $aseco->formatColors('$z$s{#error}');
$blu = $aseco->server->jfreu->blue = $aseco->formatColors('$z$s{#message}');
$gre = $aseco->server->jfreu->green = $aseco->formatColors('$z$s{#record}');
$adm = $aseco->server->jfreu->admin = $aseco->formatColors('$z$s{#logina}');
//** random information messages **//
$aseco->server->jfreu->infomessages = $infomessages;
$aseco->server->jfreu->message_start = $message_start;
$i = 1;
while (isset(${'message'.$i}) && $i < 1000)
{
$aseco->server->jfreu->messages[$i] = ${'message'.$i};
$i++;
}
if ($i != 1000)
{
$aseco->server->jfreu->nbmessages = $i - 1;
}
else // info message overload
{
$aseco->server->jfreu->nbmessages = 0;
}
//** playerlist **//
foreach ($aseco->server->players->player_list as $pl)
ajouter_joueur_liste($aseco, $pl->login, false, false);
//** badwords **//
$aseco->server->jfreu->badwords = ($badwords != 0); // insure boolean
$aseco->server->jfreu->badwordsban = ($badwordsban != 0); // insure boolean
$aseco->server->jfreu->badwordsnum = $badwordsnum;
$aseco->server->jfreu->badwordstime = $badwordstime;
$aseco->server->jfreu->badwordslist = $badwordslist;
//** BAD BAD BAD **//
$aseco->server->jfreu->pf = 0;
// $aseco->server->jfreu->pf_list['barcelona'] = 302880;
//** Votes **//
$aseco->server->jfreu->vote_item = new vote();
$aseco->server->jfreu->vote_item->login = '';
$aseco->server->jfreu->vote_item->yes = 0;
$aseco->server->jfreu->vote_item->no = 0;
$aseco->server->jfreu->vote_item->total = 0;
$aseco->server->jfreu->vote_item->type = '';
$aseco->server->jfreu->vote_item->nb_votes_needed = 0;
$aseco->server->jfreu->current_vote = false;
//** novote **//
$aseco->server->jfreu->novote = ($novote != 0); // insure boolean
$aseco->server->jfreu->unspecvote = ($unspecvote != 0); // insure boolean
//** init jfreu admin commands **//
$aseco->server->jfreu->admin_commands = array();
init_jfreu_admin_commands($aseco);
//** Permanent VIP & VIP_Team **//
$aseco->server->jfreu->vip_list = array();
$aseco->server->jfreu->vip_team_list = array();
read_lists_xml($aseco);
read_guest_list($aseco);
//** Temporary bans **//
read_bans_xml($aseco);
//** Loaded message **//
$message = $yel.'>> '.$whi.'Jfreu'.$blu.'\'s plugin '.$yel.$version.$blu.': '.$whi.'Loaded'.$blu.'.';
$aseco->client->query('ChatSendServerMessage', $message);
// start rank limiting
set_ranklimit($aseco, $aseco->server->jfreu->autolimit, $autorank); // pass $autorank as integer
//** disabled up-to-date test, superseded in main system - Xymph **//
// $aseco->client->query('ChatSendServerMessage', up_to_date($aseco));
} // init_jfreu
function write_lists_xml($aseco)
{
$lists = '<?xml version="1.0" encoding="utf-8" ?>' . CRLF
. "<lists>" . CRLF;
$lists .= "\t<vip_list>" . CRLF;
$nb = count($aseco->server->jfreu->vip_list);
$i = 0;
$empty = true;
while ($i < $nb)
{
if ($aseco->server->jfreu->vip_list[$i] != '')
{
$lists .= "\t\t<login>" . $aseco->server->jfreu->vip_list[$i] . "</login>" . CRLF;
$empty = false;
}
$i++;
}
if ($empty) {
$list .= "<!-- format:" . CRLF;
$list .= "\t\t<login></login>" . CRLF;
$list .= "-->" . CRLF;
}
$lists .= "\t</vip_list>" . CRLF . CRLF
. "\t<vip_team_list>" . CRLF;
$nb = count($aseco->server->jfreu->vip_team_list);
$i = 0;
$empty = true;
while ($i < $nb)
{
if ($aseco->server->jfreu->vip_team_list[$i] != '')
{
$lists .= "\t\t<team>" . $aseco->server->jfreu->vip_team_list[$i] . "</team>" . CRLF;
$empty = false;
}
$i++;
}
if ($empty) {
$list .= "<!-- format:" . CRLF;
$list .= "\t\t<team></team>" . CRLF;
$list .= "-->" . CRLF;
}
$lists .= "\t</vip_team_list>" . CRLF
. "</lists>" . CRLF;
//** write out XML file **//
if (!@file_put_contents($aseco->server->jfreu->vips_file, $lists)) {
trigger_error('Could not write Jfreu vips file ' . $aseco->server->jfreu->vips_file . ' !', E_USER_WARNING);
}
} // write_lists_xml
function read_lists_xml($aseco)
{
if (!file_exists($aseco->server->jfreu->vips_file))
{
trigger_error('Could not find Jfreu vips file ' . $aseco->server->jfreu->vips_file . ' !', E_USER_WARNING);
return false;
}
if (!$list = $aseco->xml_parser->parseXml($aseco->server->jfreu->vips_file))
{
trigger_error('Could not read/parse Jfreu vips file ' . $aseco->server->jfreu->vips_file . ' !', E_USER_WARNING);
return false;
}
$vip = $list['LISTS']['VIP_LIST'][0];
$vip_team = $list['LISTS']['VIP_TEAM_LIST'][0];
// update VIP_List
if (isset($vip['LOGIN']))
{
for ($i = 0; $i < count($vip['LOGIN']); $i++)
{
if (!in_array($vip['LOGIN'][$i], $aseco->server->jfreu->vip_list))
{
$aseco->server->jfreu->vip_list[] = $vip['LOGIN'][$i];
}
}
}
// update VIP_Team_List
if (isset($vip_team['TEAM']))
{
for ($i = 0; $i < count($vip_team['TEAM']); $i++)
{
if (!in_array($vip_team['TEAM'][$i], $aseco->server->jfreu->vip_team_list))
{
$aseco->server->jfreu->vip_team_list[] = $vip_team['TEAM'][$i];
}
}
}
} // read_lists_xml
function read_guest_list($aseco)
{
// get guests on the server (hardlimited to 300)
if ($aseco->client->query('GetGuestList', 300, 0))
{
$guests = $aseco->client->getResponse();
foreach ($guests as $player)
{
if ($player['Login'] != '' && !in_array($player['Login'], $aseco->server->jfreu->vip_list))
{
$aseco->server->jfreu->vip_list[] = $player['Login'];
}
}
}
} // read_guest_list
function write_config_xml($aseco)
{
$config = '<?xml version="1.0" encoding="utf-8" ?>' . CRLF
. "<config>" . CRLF;
$config .= "\t<server>" . CRLF;
$config .= "\t\t<servername>" . $aseco->server->jfreu->servername . "</servername>" . CRLF;
$config .= "\t\t<servertop>" . $aseco->server->jfreu->top . "</servertop>" . CRLF;
$config .= "\t\t<autochangename>" . ($aseco->server->jfreu->autochangename ? "true" : "false") . "</autochangename>" . CRLF;
$config .= "\t\t<infomessages>" . $aseco->server->jfreu->infomessages . "</infomessages>" . CRLF;
$config .= "\t\t<badwords>" . ($aseco->server->jfreu->badwords ? "true" : "false") . "</badwords>" . CRLF;
$config .= "\t\t<badwordsban>" . ($aseco->server->jfreu->badwordsban ? "true" : "false") . "</badwordsban>" . CRLF;
$config .= "\t\t<badwordsnum>" . $aseco->server->jfreu->badwordsnum . "</badwordsnum>" . CRLF;
$config .= "\t\t<badwordstime>" . $aseco->server->jfreu->badwordstime . "</badwordstime>" . CRLF;
$config .= "\t\t<unspecvote>" . ($aseco->server->jfreu->unspecvote ? "true" : "false") . "</unspecvote>" . CRLF;
$config .= "\t\t<novote>" . ($aseco->server->jfreu->novote ? "true" : "false") . "</novote>" . CRLF;
$config .= "\t</server>" . CRLF . CRLF
. "\t<limits>" . CRLF;
$config .= "\t\t<ranklimit>" . ($aseco->server->jfreu->ranklimit ? "true" : "false") . "</ranklimit>" . CRLF;
$config .= "\t\t<limit>" . $aseco->server->jfreu->limit . "</limit>" . CRLF;
$config .= "\t\t<hardlimit>" . $aseco->server->jfreu->hardlimit . "</hardlimit>" . CRLF;
$config .= "\t\t<autorank>" . ($aseco->server->jfreu->autorank ? "true" : "false") . "</autorank>" . CRLF;
$config .= "\t\t<offset>" . $aseco->server->jfreu->offset . "</offset>" . CRLF;
$config .= "\t\t<autolimit>" . $aseco->server->jfreu->autolimit . "</autolimit>" . CRLF;
$config .= "\t\t<autorankminplayers>" . $aseco->server->jfreu->autorankminplayers . "</autorankminplayers>" . CRLF;
$config .= "\t\t<autorankvip>" . ($aseco->server->jfreu->autorankvip ? "true" : "false") . "</autorankvip>" . CRLF;
$config .= "\t\t<maxplayers>" . $aseco->server->jfreu->maxplayers . "</maxplayers>" . CRLF;
$config .= "\t\t<kickhirank>" . ($aseco->server->jfreu->kickhirank ? "true" : "false") . "</kickhirank>" . CRLF;
$config .= "\t\t<pf>" . ($aseco->server->jfreu->pf ? $aseco->server->jfreu->pf : '0') . "</pf>" . CRLF;
$config .= "\t</limits>" . CRLF
. "</config>" . CRLF;
//** write out XML file **//
if (!@file_put_contents($aseco->server->jfreu->conf_file, $config)) {
trigger_error('Could not write Jfreu config file ' . $aseco->server->jfreu->conf_file . ' !', E_USER_WARNING);
}
} // write_config_xml
function read_config_xml($aseco)
{
if (!file_exists($aseco->server->jfreu->conf_file))
{
trigger_error('Could not find Jfreu config file ' . $aseco->server->jfreu->conf_file . ' !', E_USER_WARNING);
return false;
}
if (!$config = $aseco->xml_parser->parseXml($aseco->server->jfreu->conf_file))
{
trigger_error('Could not read/parse Jfreu config file ' . $aseco->server->jfreu->conf_file . ' !', E_USER_WARNING);
return false;
}
$server = $config['CONFIG']['SERVER'][0];
$limits = $config['CONFIG']['LIMITS'][0];
$aseco->server->jfreu->servername = $server['SERVERNAME'][0];
$aseco->server->jfreu->top = $server['SERVERTOP'][0];
$aseco->server->jfreu->autochangename = (strtolower($server['AUTOCHANGENAME'][0]) == 'true' ? true : false);
$aseco->server->jfreu->infomessages = $server['INFOMESSAGES'][0];
$aseco->server->jfreu->badwords = (strtolower($server['BADWORDS'][0]) == 'true' ? true : false);
$aseco->server->jfreu->badwordsban = (strtolower($server['BADWORDSBAN'][0]) == 'true' ? true : false);
$aseco->server->jfreu->badwordsnum = $server['BADWORDSNUM'][0];
$aseco->server->jfreu->badwordstime = $server['BADWORDSTIME'][0];
$aseco->server->jfreu->unspecvote = (strtolower($server['UNSPECVOTE'][0]) == 'true' ? true : false);
$aseco->server->jfreu->novote = (strtolower($server['NOVOTE'][0]) == 'true' ? true : false);
$aseco->server->jfreu->ranklimit = (strtolower($limits['RANKLIMIT'][0]) == 'true' ? true : false);
$aseco->server->jfreu->limit = $limits['LIMIT'][0];
$aseco->server->jfreu->hardlimit = $limits['HARDLIMIT'][0];
$aseco->server->jfreu->autorank = (strtolower($limits['AUTORANK'][0]) == 'true' ? true : false);
$aseco->server->jfreu->offset = $limits['OFFSET'][0];
$aseco->server->jfreu->autolimit = $limits['AUTOLIMIT'][0];
$aseco->server->jfreu->autorankminplayers = $limits['AUTORANKMINPLAYERS'][0];
$aseco->server->jfreu->autorankvip = (strtolower($limits['AUTORANKVIP'][0]) == 'true' ? true : false);
$aseco->server->jfreu->maxplayers = $limits['MAXPLAYERS'][0];
$aseco->server->jfreu->kickhirank = (strtolower($limits['KICKHIRANK'][0]) == 'true' ? true : false);
$aseco->server->jfreu->pf = $limits['PF'][0];
if ($aseco->server->jfreu->autochangename)
{
$limit = ($aseco->server->jfreu->autorank ? $aseco->server->jfreu->autolimit : $aseco->server->jfreu->limit);
$servername = $aseco->server->jfreu->servername . $aseco->server->jfreu->top . $limit;
$aseco->client->query('SetServerName', $servername);
}
} // read_config_xml
function write_bans_xml($aseco)
{
$lists = '<?xml version="1.0" encoding="utf-8" ?>' . CRLF
. "<lists>" . CRLF;
$lists .= "\t<ban_list>" . CRLF;
$time = time();
$empty = true;
foreach ($aseco->server->jfreu->playerlist as $player => $entry)
{
if ($entry->banned > $time)
{
$lists .= "\t\t<login>" . $player . "</login> <time>" . $entry->banned . "</time>" . CRLF;
$empty = false;
}
}
if ($empty) {
$list .= "<!-- format:" . CRLF;
$list .= "\t\t<login></login> <time></time>" . CRLF;
$list .= "-->" . CRLF;
}
$lists .= "\t</ban_list>" . CRLF
. "</lists>" . CRLF;
//** write out XML file **//
if (!@file_put_contents($aseco->server->jfreu->bans_file, $lists)) {
trigger_error('Could not write Jfreu bans file ' . $aseco->server->jfreu->bans_file . ' !', E_USER_WARNING);
}
} // write_bans_xml
function read_bans_xml($aseco)
{
if (!file_exists($aseco->server->jfreu->bans_file))
{
trigger_error('Could not find Jfreu bans file ' . $aseco->server->jfreu->bans_file . ' !', E_USER_WARNING);
return false;
}
if (!$list = $aseco->xml_parser->parseXml($aseco->server->jfreu->bans_file))
{
trigger_error('Could not read/parse Jfreu bans file ' . $aseco->server->jfreu->bans_file . ' !', E_USER_WARNING);
return false;
}
// restore temporary bans
$time = time();
$bans = $list['LISTS']['BAN_LIST'][0];
if (isset($bans['LOGIN']))
{
for ($i = 0; $i < count($bans['LOGIN']); $i++)
{
// check if ban hasn't expired yet
if ($bans['TIME'][$i] > $time) {
ajouter_joueur_liste($aseco, $bans['LOGIN'][$i], false, false);
$aseco->server->jfreu->playerlist[$bans['LOGIN'][$i]]->banned = $bans['TIME'][$i];
}
}
}
} // read_bans_xml
function chat_unspec($aseco, $command)
{
$whi = $aseco->server->jfreu->white;
$yel = $aseco->server->jfreu->yellow;
$red = $aseco->server->jfreu->red;
$blu = $aseco->server->jfreu->blue;
$gre = $aseco->server->jfreu->green;
$adm = $aseco->server->jfreu->admin;
$login = $command['author']->login;
if ($aseco->server->jfreu->unspecvote)
{
if ($aseco->server->jfreu->playerlist[$login]->speconly)
{
if (!$aseco->server->jfreu->current_vote)
{
new_vote($aseco, 'unspec', $login);
}
else
{
$message = $yel.'> '.$blu.'Wait until the end of the current vote.';
$aseco->client->query('ChatSendServerMessageToLogin', $message, $login);
}
}
else
{
$message = $yel.'> '.$blu.'This command is only for SpecOnly players.';
$aseco->client->query('ChatSendServerMessageToLogin', $message, $login);
}
}
else
{
$message = $yel.'> '.$whi.'/unspec'.$blu.' is not currently enabled on this server.';
$aseco->client->query('ChatSendServerMessageToLogin', $message, $login);
}
} // chat_unspec
function chat_yes($aseco, $command)
{
$whi = $aseco->server->jfreu->white;
$yel = $aseco->server->jfreu->yellow;
$red = $aseco->server->jfreu->red;
$blu = $aseco->server->jfreu->blue;
$gre = $aseco->server->jfreu->green;
$adm = $aseco->server->jfreu->admin;
$login = $command['author']->login;
if (!$aseco->server->jfreu->current_vote)
{
$message = $yel.'> '.$blu.'No current vote.';
$aseco->client->query('ChatSendServerMessageToLogin', $message, $login);
return;
}
if ($aseco->server->jfreu->playerlist[$login]->speconly)
{
$message = $yel.'> '.$blu.'SpecOnly can\'t vote.';
$aseco->client->query('ChatSendServerMessageToLogin', $message, $login);
return;
}
if ($aseco->server->jfreu->playerlist[$login]->hasvoted == 0)
{
vote_yes_no($aseco, true, false);
$aseco->server->jfreu->playerlist[$login]->hasvoted = 1;
$message = $yel.'> '.$blu.'You have voted '.$whi.'yes'.$blu.'.';
$aseco->client->query('ChatSendServerMessageToLogin', $message, $login);
}
elseif ($aseco->server->jfreu->playerlist[$login]->hasvoted == 1)
{
$message = $yel.'> '.$blu.'You have already voted '.$whi.'yes'.$blu.'.';
$aseco->client->query('ChatSendServerMessageToLogin', $message, $login);
}
elseif ($aseco->server->jfreu->playerlist[$login]->hasvoted == -1)
{
vote_yes_no($aseco, true, true);
$aseco->server->jfreu->playerlist[$login]->hasvoted = 1;
$message = $yel.'> '.$blu.'You change your vote to '.$whi.'yes'.$blu.'.';
$aseco->client->query('ChatSendServerMessageToLogin', $message, $login);
}
} // chat_yes
function chat_no($aseco, $command)
{
$whi = $aseco->server->jfreu->white;
$yel = $aseco->server->jfreu->yellow;
$red = $aseco->server->jfreu->red;
$blu = $aseco->server->jfreu->blue;
$gre = $aseco->server->jfreu->green;
$adm = $aseco->server->jfreu->admin;
$login = $command['author']->login;
if (!$aseco->server->jfreu->current_vote)
{
$message = $yel.'> '.$blu.'No current vote.';
$aseco->client->query('ChatSendServerMessageToLogin', $message, $login);
return;
}
if ($aseco->server->jfreu->playerlist[$login]->speconly)
{
$message = $yel.'> '.$blu.'SpecOnly can\'t vote.';
$aseco->client->query('ChatSendServerMessageToLogin', $message, $login);
return;
}
if ($aseco->server->jfreu->playerlist[$login]->hasvoted == 0)
{
vote_yes_no($aseco, false, false);
$aseco->server->jfreu->playerlist[$login]->hasvoted = -1;
$message = $yel.'> '.$blu.'You have voted '.$whi.'no'.$blu.'.';
$aseco->client->query('ChatSendServerMessageToLogin', $message, $login);
}
elseif ($aseco->server->jfreu->playerlist[$login]->hasvoted == -1)
{
$message = $yel.'> '.$blu.'You have already voted '.$whi.'no'.$blu.'.';
$aseco->client->query('ChatSendServerMessageToLogin', $message, $login);
}
elseif ($aseco->server->jfreu->playerlist[$login]->hasvoted == 1)
{
vote_yes_no($aseco, false, true);
$aseco->server->jfreu->playerlist[$login]->hasvoted = -1;
$message = $yel.'> '.$blu.'You change your vote to '.$whi.'no'.$blu.'.';
$aseco->client->query('ChatSendServerMessageToLogin', $message, $login);
}
} // chat_no
function vote_yes_no($aseco, $yes, $change) // change = true: Vote change (yes -> no | no -> yes)
{
$whi = $aseco->server->jfreu->white;
$yel = $aseco->server->jfreu->yellow;
$red = $aseco->server->jfreu->red;
$blu = $aseco->server->jfreu->blue;
$gre = $aseco->server->jfreu->green;
$adm = $aseco->server->jfreu->admin;
if ($aseco->server->jfreu->vote_item->nb_votes_needed == 0)
{
vote_end($aseco);
return 0;
}
if ($yes)
{
$aseco->server->jfreu->vote_item->yes++;
if ($change)
{
$aseco->server->jfreu->vote_item->no--;
}
}
else
{
$aseco->server->jfreu->vote_item->no++;
if ($change)
{
$aseco->server->jfreu->vote_item->yes--;
}
}
if (!$change)
{
$aseco->server->jfreu->vote_item->total++;
}
if ($aseco->server->jfreu->vote_item->total >= $aseco->server->jfreu->vote_item->nb_votes_needed)
{
vote_finish($aseco);
return;
}
$reste = $aseco->server->jfreu->vote_item->nb_votes_needed - $aseco->server->jfreu->vote_item->total;
if ($reste > 0)
{
if ($aseco->server->jfreu->vote_item->type == 'unspec')
{
$player = $aseco->server->players->getPlayer($aseco->server->jfreu->vote_item->login);
$message = $yel.'>> '.$whi.$reste.$blu.' vote'.($reste == 1 ? '' : 's').' left to unSpec '.$whi.clean_nick($player->nickname).$blu.'$n [ '.$gre.'$n/yes'.$blu.'$n | '.$red.'$n/no'.$blu.'$n ]';
}
$aseco->client->query('ChatSendServerMessage', $message);
}
} // vote_yes_no
function new_vote($aseco, $type, $login) // type = unspec
{
$whi = $aseco->server->jfreu->white;
$yel = $aseco->server->jfreu->yellow;
$red = $aseco->server->jfreu->red;
$blu = $aseco->server->jfreu->blue;
$gre = $aseco->server->jfreu->green;
$adm = $aseco->server->jfreu->admin;
$aseco->server->jfreu->vote_item->login = $login;
$aseco->server->jfreu->vote_item->yes = 0;
$aseco->server->jfreu->vote_item->no = 0;
$aseco->server->jfreu->vote_item->total = 0;
$aseco->server->jfreu->vote_item->type = $type;
$aseco->server->jfreu->current_vote = true;
$nbjoueurs = count($aseco->server->players->player_list);
$aseco->server->jfreu->vote_item->nb_votes_needed = round($nbjoueurs / 4);
$player = $aseco->server->players->getPlayer($login);
// format ladder rank with narrow spaces between the thousands
$rank = str_replace(' ', '$n $m', number_format($player->ladderrank, 0, ' ', ' '));
if ($type == 'unspec')
{
$message = $yel.'>> '.$blu.'SpecOnly '.$whi.clean_nick($player->nickname).$blu.' (Rank: '.$whi.$rank.$blu.') wants to join the race.' . LF
. $yel.'>> '.$blu.'('.$gre.'/yes'.$blu.' | '.$red.'$i/no'.$blu.'): '.$whi.round($aseco->server->jfreu->vote_item->nb_votes_needed).$blu.' votes needed.';
$aseco->client->query('ChatSendServerMessage', $message);
}
foreach ($aseco->server->players->player_list as $pl)
$aseco->server->jfreu->playerlist[$pl->login]->hasvoted = 0;
} // new_vote
function vote_finish($aseco)
{
$whi = $aseco->server->jfreu->white;
$yel = $aseco->server->jfreu->yellow;
$red = $aseco->server->jfreu->red;
$blu = $aseco->server->jfreu->blue;
$gre = $aseco->server->jfreu->green;
$adm = $aseco->server->jfreu->admin;
if ($aseco->server->jfreu->vote_item->type == 'unspec')
{
$login = $aseco->server->jfreu->vote_item->login;
// check if player still online
if ($player = $aseco->server->players->getPlayer($login)) {
$nick = $player->nickname;
$yes = $aseco->server->jfreu->vote_item->yes;
$no = $aseco->server->jfreu->vote_item->no;
$message = $yel.'>> '.$blu.'Vote result to unSpec '.$whi.clean_nick($nick).$blu.': '.$whi.$yes.$blu.' yes, '.$whi.$no.$blu.' no.';
$aseco->client->query('ChatSendServerMessage', $message);
if ($yes > $no)
{
$aseco->server->jfreu->playerlist[$login]->speconly = false;
$aseco->server->jfreu->playerlist[$login]->isvip = true;
$message = $yel.'>> '.$blu.'The server unSpecs '.$whi.clean_nick($nick).$blu.'.';
$aseco->client->query('ChatSendServerMessage', $message);
if ($aseco->server->jfreu->autorank)
{
autorank($aseco, $command);
}
}
else
{
$message = $yel.'>> '.$blu.'The server banned '.$whi.clean_nick($nick).$blu.' for '.$whi.'5'.$blu.' mins.';
$aseco->client->query('ChatSendServerMessage', $message);
banfor($aseco, $login, 5);
}
}
}
$aseco->server->jfreu->vote_item->login = '';
$aseco->server->jfreu->vote_item->yes = 0;
$aseco->server->jfreu->vote_item->no = 0;
$aseco->server->jfreu->vote_item->total = 0;
$aseco->server->jfreu->vote_item->nb_votes_needed = 0;
$aseco->server->jfreu->current_vote = false;
$aseco->server->jfreu->type = '';
foreach ($aseco->server->players->player_list as $pl)
$aseco->server->jfreu->playerlist[$pl->login]->hasvoted = 0;
} // vote_finish
// called @ onEndRace
function vote_end($aseco)
{
if ($aseco->server->jfreu->current_vote)
{
$aseco->server->jfreu->vote_item->login = '';
$aseco->server->jfreu->vote_item->yes = 0;
$aseco->server->jfreu->vote_item->no = 0;
$aseco->server->jfreu->vote_item->total = 0;
$aseco->server->jfreu->vote_item->type = '';
$aseco->server->jfreu->vote_item->nb_votes_needed = 0;
$aseco->server->jfreu->current_vote = false;
}
} // vote_end
function ajouter_joueur_liste($aseco, $login, $isvip, $speconly)
{
if (!isset($aseco->server->jfreu->playerlist[$login]))
{
$aseco->server->jfreu->playerlist[$login] = new joueur();
$aseco->server->jfreu->playerlist[$login]->badwords = 0;
$aseco->server->jfreu->playerlist[$login]->hasvoted = 0;
$aseco->server->jfreu->playerlist[$login]->banned = 0;
}
$aseco->server->jfreu->playerlist[$login]->isvip = $isvip;
$aseco->server->jfreu->playerlist[$login]->speconly = $speconly;
$aseco->server->jfreu->playerlist[$login]->kicked = false;
} // ajouter_joueur_liste
function banfor($aseco, $login, $time) // time: mins
{
$whi = $aseco->server->jfreu->white;
$yel = $aseco->server->jfreu->yellow;
$red = $aseco->server->jfreu->red;
$blu = $aseco->server->jfreu->blue;
$gre = $aseco->server->jfreu->green;
$adm = $aseco->server->jfreu->admin;
// format time value
if ($time > 60) { // check for >1 hour
$ban = sprintf("%d ${red}hour%s ${whi}%02d ${red}min%s",
$time / 60, (floor($time / 60) == 1 ? '' : 's'),
$time % 60, (($time % 60) == 1 ? '' : 's'));
} else {
$ban = sprintf('%d%s min%s', $time, $red, ($time == 1 ? '' : 's'));
}
// notify/kick banned player if (still) online
$found = false;
foreach ($aseco->server->players->player_list as $pl) {
if ($pl->login == $login) {
$message = $yel.'> '.$red.'You have been Banned for '.$whi.$ban.'.';
$aseco->client->query('ChatSendServerMessageToLogin', $message, $login);
$aseco->client->addCall('Kick', array($login));
$found = true;
break;
}
}
if (!$found)
ajouter_joueur_liste($aseco, $login, false, false);
// log console message
$aseco->console('[BanFor] player "{1}" banned for {2}', $login, stripColors($ban));
$absolute_time = time() + $time * 60;
$aseco->server->jfreu->playerlist[$login]->banned = $absolute_time;
$aseco->server->jfreu->playerlist[$login]->kicked = true;
// update XML file
write_bans_xml($aseco);
} // banfor
function isbanned($aseco, $login) // return mins left = banned, return 0 = not banned
{
if (!isset($aseco->server->jfreu->playerlist[$login]))
{
return 0;
}
if ($aseco->server->jfreu->playerlist[$login]->banned == 0)
{
return 0;
}
$time = time();
if ($aseco->server->jfreu->playerlist[$login]->banned > $time)
{
return round(($aseco->server->jfreu->playerlist[$login]->banned - $time) / 60);
}
else
{
$aseco->server->jfreu->playerlist[$login]->banned = 0;
return 0;
}
} // isbanned
function kicker_login($aseco, $login)
{
$whi = $aseco->server->jfreu->white;
$yel = $aseco->server->jfreu->yellow;
$red = $aseco->server->jfreu->red;
$blu = $aseco->server->jfreu->blue;
$gre = $aseco->server->jfreu->green;
$adm = $aseco->server->jfreu->admin;
$aseco->server->jfreu->playerlist[$login]->kicked = true;
$message = $yel.'> '.$red.'You\'ve been Kicked. Bye!';
$aseco->client->query('ChatSendServerMessageToLogin', $message, $login);
$aseco->client->addCall('Kick', array($login));
} // kicker_login
function isvip($aseco, $login)
{
if ($aseco->server->jfreu->playerlist[$login]->isvip || in_array($login, $aseco->server->jfreu->vip_list))
{
return true;
}
return false;
} // isvip
// called @ onPlayerConnect
function player_connect($aseco, $player)
{
global $rasp, $feature_ranks;
$whi = $aseco->server->jfreu->white;
$yel = $aseco->server->jfreu->yellow;
$red = $aseco->server->jfreu->red;
$blu = $aseco->server->jfreu->blue;
$gre = $aseco->server->jfreu->green;
$adm = $aseco->server->jfreu->admin;
// abbreviate long nations
$nation = $player->nation;
if (strlen($nation) > 14)
$nation = mapCountry($nation);
/* disabled spammy Loaded message - Xymph
$welcome = $yel.'>> '.$whi.'Jfreu'.$blu.'\'s plugin '.$gre.$aseco->server->jfreu->version.$blu.': '.$whi.'Loaded'.$blu.'.';
$aseco->client->query('ChatSendServerMessageToLogin', $welcome, $player->login);
disabled */
if ($ban = isbanned($aseco, $player->login))
{
$title = $aseco->isMasterAdmin($player) ? $adm.$aseco->titles['MASTERADMIN'][0] :
($aseco->isAdmin($player) ? $adm.$aseco->titles['ADMIN'][0] :
($aseco->isOperator($player) ? $adm.$aseco->titles['OPERATOR'][0] :
$blu.'New Player'));
// format ladder rank with narrow spaces between the thousands
$rank = str_replace(' ', '$n $m', number_format($player->ladderrank, 0, ' ', ' '));
// format time value
if ($ban > 60) { // check for >1 hour
$ban = sprintf("%d ${red}hour%s ${whi}%02d ${red}min%s",
$ban / 60, (floor($ban / 60) == 1 ? '' : 's'),
$ban % 60, (($ban % 60) == 1 ? '' : 's'));
} else {
$ban = sprintf('%d%s min%s', $ban, $red, ($ban == 1 ? '' : 's'));
}
$message = $yel.'>> '.$title.': '.$whi.clean_nick($player->nickname).$blu.' Nation: '.$whi.$nation.$blu.' Ladder: '.$whi.$rank.$blu.' ['.$red.'Banned for '.$whi.$ban.$blu.']';
$aseco->client->query('ChatSendServerMessage', $message);
$message2 = $yel.'> '.$red.'Your ban will be over in '.$whi.$ban.'!';
$aseco->client->query('ChatSendServerMessageToLogin', $message2, $player->login);
$aseco->server->jfreu->playerlist[$player->login]->kicked = true;
$aseco->client->addCall('Kick', array($player->login));
return 0;
}
if ($aseco->server->jfreu->ranklimit)
{
if (autokick($aseco, $player) && $aseco->server->jfreu->autorank && !$player->isspectator)
{
autorank($aseco, $player);
}
}
else
{
ajouter_joueur_liste($aseco, $player->login, false, false);
// if starting up, bail out immediately
if ($aseco->startup_phase) return;
// define admin/player title
$title = $aseco->isMasterAdmin($player) ? $adm.$aseco->titles['MASTERADMIN'][0] :
($aseco->isAdmin($player) ? $adm.$aseco->titles['ADMIN'][0] :
($aseco->isOperator($player) ? $adm.$aseco->titles['OPERATOR'][0] :
$blu.'New Player'));
// format ladder rank with narrow spaces between the thousands
$rank = str_replace(' ', '$n $m', number_format($player->ladderrank, 0, ' ', ' '));
if ($feature_ranks) {
$message = formatText($aseco->server->jfreu->player_joins,
$title, clean_nick($player->nickname),
$nation, $rank, $rasp->getRank($player->login));
} else {
$message = formatText($aseco->server->jfreu->player_join,
$title, clean_nick($player->nickname),
$nation, $rank);
}
$aseco->client->query('ChatSendServerMessage', $aseco->formatColors($message));
}
} // player_connect
// called @ onPlayerDisconnect
function player_disconnect($aseco, $player)
{
$whi = $aseco->server->jfreu->white;
$yel = $aseco->server->jfreu->yellow;
$red = $aseco->server->jfreu->red;
$blu = $aseco->server->jfreu->blue;
$gre = $aseco->server->jfreu->green;
$adm = $aseco->server->jfreu->admin;
if ($aseco->server->jfreu->current_vote)
{
if ($aseco->server->jfreu->vote_item->login == $player->login)
{
vote_end($aseco);
$message = $yel.'>> '.$whi.clean_nick($player->nickname).$blu.'\'s vote cancelled.';
$aseco->client->query('ChatSendServerMessage', $message);
}
}
if (!$aseco->server->jfreu->playerlist[$player->login]->kicked)
{
$message = formatText($aseco->server->jfreu->player_left,
clean_nick($player->nickname),
formatTimeH($player->getTimeOnline() * 1000, false));
$aseco->client->query('ChatSendServerMessage', $aseco->formatColors($message));
if ($aseco->server->jfreu->autorank && !$aseco->server->jfreu->playerlist[$player->login]->speconly)
{
autorank($aseco, $player);
}
}
} // player_disconnect
function autokick($aseco, $player) // returns true if no kick, false if kick
{
global $rasp, $feature_ranks;
$whi = $aseco->server->jfreu->white;
$yel = $aseco->server->jfreu->yellow;
$red = $aseco->server->jfreu->red;
$blu = $aseco->server->jfreu->blue;
$gre = $aseco->server->jfreu->green;
$adm = $aseco->server->jfreu->admin;
// abbreviate long nations
$nation = $player->nation;
if (strlen($nation) > 14)
$nation = mapCountry($nation);
if ($aseco->server->jfreu->autorank)
{
$limit = $aseco->server->jfreu->autolimit;
}
else
{
$limit = $aseco->server->jfreu->limit;
}
// check if hardlimit active and player rank higher than hardlimit
if ($aseco->server->jfreu->hardlimit != 0 && ($player->ladderrank > $aseco->server->jfreu->hardlimit || $player->ladderrank <= 0))
{
ajouter_joueur_liste($aseco, $player->login, false, false);
// kick the player
$message = $red.'This server is only for players with a rank lower than '.$whi.$aseco->server->jfreu->hardlimit.$red.' !';
$aseco->client->query('ChatSendServerMessageToLogin', $yel.'> '.$message, $player->login);
// log console message
$aseco->console('[HardLimit] player "{1}" kicked (rank: {2})', $player->login, $player->ladderrank);
$aseco->server->jfreu->playerlist[$player->login]->kicked = true;
if ($aseco->server->getGame() == 'TMF')
$aseco->client->addCall('Kick', array($player->login, $message.' $z'));
else
$aseco->client->addCall('Kick', array($player->login));
return false;
}
// check for high rank or no rank
if ($player->ladderrank > $limit || $player->ladderrank <= 0)
{
// if not spectator, check for no VIP player or VIP_Team member
if (!$player->isspectator &&
!in_array($player->login, $aseco->server->jfreu->vip_list) &&
!in_array($player->teamname, $aseco->server->jfreu->vip_team_list))
{
ajouter_joueur_liste($aseco, $player->login, false, false);
// kick the player
$message = $red.'This server is only for players with a rank lower than '.$whi.$limit.$red.' !';
$aseco->client->query('ChatSendServerMessageToLogin', $yel.'> '.$message, $player->login);
if ($nick = clean_nick($player->nickname))
{
// define admin/player title
$title = $aseco->isMasterAdmin($player) ? $adm.$aseco->titles['MASTERADMIN'][0] :
($aseco->isAdmin($player) ? $adm.$aseco->titles['ADMIN'][0] :
($aseco->isOperator($player) ? $adm.$aseco->titles['OPERATOR'][0] :
$blu.'New Player'));
// format ladder rank with narrow spaces between the thousands
$rank = str_replace(' ', '$n $m', number_format($player->ladderrank, 0, ' ', ' '));
$message2 = $yel.'>> '.$title.': '.$whi.$nick.$blu.' Nation: '.$whi.$nation.$blu.' Ladder: '.$red.$rank.$blu.' ['.$red.'Kicked'.$blu.' ]';
$aseco->client->query('ChatSendServerMessage', $message2);
}
// log console message
$aseco->console('[AutoRank] player "{1}" kicked (rank: {2})', $player->login, $player->ladderrank);
$aseco->server->jfreu->playerlist[$player->login]->kicked = true;
if ($aseco->server->getGame() == 'TMF')
$aseco->client->addCall('Kick', array($player->login, $message.' $z'));
else
$aseco->client->addCall('Kick', array($player->login));
return false;
}
// if spectator, check for no VIP player or VIP_Team member
elseif ($player->isspectator &&
!in_array($player->login, $aseco->server->jfreu->vip_list) &&
!in_array($player->teamname, $aseco->server->jfreu->vip_team_list))
{
if ($nick = clean_nick($player->nickname))
{
ajouter_joueur_liste($aseco, $player->login, false, true);
// define admin/player title
$title = $aseco->isMasterAdmin($player) ? $adm.$aseco->titles['MASTERADMIN'][0] :
($aseco->isAdmin($player) ? $adm.$aseco->titles['ADMIN'][0] :
($aseco->isOperator($player) ? $adm.$aseco->titles['OPERATOR'][0] :
$blu.'New Player'));
// format ladder rank with narrow spaces between the thousands
$rank = str_replace(' ', '$n $m', number_format($player->ladderrank, 0, ' ', ' '));
$message = $yel.'>> '.$title.': '.$whi.$nick.$blu.' Nation: '.$whi.$nation.$blu.' Ladder: '.$red.$rank.$blu.' ['.$gre.'SpecOnly'.$blu.']';
$aseco->client->query('ChatSendServerMessage', $message);
spec_message($aseco, $player->login);
}
}
else
{
// VIP player/spectator
ajouter_joueur_liste($aseco, $player->login, true, false);
if ($nick = clean_nick($player->nickname))
{
// define admin/player title
$title = $aseco->isMasterAdmin($player) ? $adm.$aseco->titles['MASTERADMIN'][0] :
($aseco->isAdmin($player) ? $adm.$aseco->titles['ADMIN'][0] :
($aseco->isOperator($player) ? $adm.$aseco->titles['OPERATOR'][0] :
$blu.'New Player'));
// format ladder rank with narrow spaces between the thousands
$rank = str_replace(' ', '$n $m', number_format($player->ladderrank, 0, ' ', ' '));
$message = $yel.'>> '.$title.': '.$whi.$nick.$blu.' Nation: '.$whi.$nation.$blu.' Ladder: '.$red.$rank.' ';
if ($feature_ranks)
{
$message .= $blu.' Server: '.$whi.$rasp->getRank($player->login);
}
$message .= $blu.' ['.$gre.'VIP'.$blu.']';
$aseco->client->query('ChatSendServerMessage', $message);
}
}
}
else
{
// normal player
ajouter_joueur_liste($aseco, $player->login, false, false);
if ($nick = clean_nick($player->nickname))
{
// define admin/player title
$title = $aseco->isMasterAdmin($player) ? $adm.$aseco->titles['MASTERADMIN'][0] :
($aseco->isAdmin($player) ? $adm.$aseco->titles['ADMIN'][0] :
($aseco->isOperator($player) ? $adm.$aseco->titles['OPERATOR'][0] :
$blu.'New Player'));
// format ladder rank with narrow spaces between the thousands
$rank = str_replace(' ', '$n $m', number_format($player->ladderrank, 0, ' ', ' '));
$message = $yel.'>> '.$title.': '.$whi.$nick.$blu.' Nation: '.$whi.$nation.$blu.' Ladder: '.$whi.$rank;
if ($feature_ranks)
{
$message .= $blu.' Server: '.$whi.$rasp->getRank($player->login);
}
$message .= $blu.' ['.$gre.'OK'.$blu.']';
$aseco->client->query('ChatSendServerMessage', $message);
}
}
return true;
} // autokick
function autorank($aseco, $command)
{
$whi = $aseco->server->jfreu->white;
$yel = $aseco->server->jfreu->yellow;
$red = $aseco->server->jfreu->red;
$blu = $aseco->server->jfreu->blue;
$gre = $aseco->server->jfreu->green;
$adm = $aseco->server->jfreu->admin;
$nbjoueurs = count($aseco->server->players->player_list);
$nbjoueurs2 = 0;
$total = 0;
$limit = $aseco->server->jfreu->autolimit;
if ($nbjoueurs > 0 && $aseco->server->jfreu->autorankminplayers <= $nbjoueurs)
{
foreach ($aseco->server->players->player_list as $pl)
{
if (isset($pl->ladderrank) && $pl->ladderrank > 0 && !$aseco->server->jfreu->playerlist[$pl->login]->speconly)
{
if (!$aseco->server->jfreu->autorankvip && isvip($aseco, $pl->login) && $pl->ladderrank > $limit)
{
// VIP (incl. unSpec) over auto-ranklimit & autorankvip OFF:
// ignore in autorank calculation
}
else
{
$total += $pl->ladderrank;
$nbjoueurs2++;
}
}
}
if ($total > 0)
{
$average = $total / $nbjoueurs2;
$newlimit = round($average + $aseco->server->jfreu->offset);
if ($newlimit <= 0) // prevent negative limit
{
$newlimit = 1;
}
set_ranklimit($aseco, $newlimit, 1);
}
}
else
{
$message = $yel.'>> '.$blu.'Not enough players: '.$whi.$nbjoueurs.$blu.'/'.$whi.$aseco->server->jfreu->autorankminplayers.$blu.' (autorank '.$red.'disabled'.$blu.')';
$aseco->client->query('ChatSendServerMessage', $message);
set_ranklimit($aseco, $aseco->server->jfreu->limit, 1);
}
} // autorank
function spec_message($aseco, $login)
{
$whi = $aseco->server->jfreu->white;
$yel = $aseco->server->jfreu->yellow;
$red = $aseco->server->jfreu->red;
$blu = $aseco->server->jfreu->blue;
$gre = $aseco->server->jfreu->green;
$adm = $aseco->server->jfreu->admin;
$message = $yel.'> '.$blu.'You are '.$whi.'SpecOnly'.$blu.', ask an admin to be unSpec.' . LF
.$yel.'> '.$blu.'Or use the '.$whi.'/unspec'.$blu.' command to launch a vote.';
$aseco->client->query('ChatSendServerMessageToLogin', $message, $login);
} // spec_message
// called @ onCheckpoint
function kick_speconly($aseco, $checkpt)
{
$whi = $aseco->server->jfreu->white;
$yel = $aseco->server->jfreu->yellow;
$red = $aseco->server->jfreu->red;
$blu = $aseco->server->jfreu->blue;
$gre = $aseco->server->jfreu->green;
$adm = $aseco->server->jfreu->admin;
$login = $checkpt[1];
if (isset($aseco->server->jfreu->playerlist[$login]) &&
$aseco->server->jfreu->playerlist[$login]->speconly)
{
if ($player = $aseco->server->players->getPlayer($login))
{
$message = $yel.'>> '.$blu.'SpecOnly '.$whi.clean_nick($player->nickname).$blu.' tried to join the race ['.$red.'Kicked'.$blu.' ]';
$aseco->client->query('ChatSendServerMessage', $message);
// log console message
$aseco->console('[SpecOnly] player "{1}" kicked (rank: {2})', $player->login, $player->ladderrank);
kicker_login($aseco, $player->login);
}
}
} // kick_speconly
// called @ onEndRace
function kick_hirank($aseco)
{
$whi = $aseco->server->jfreu->white;
$yel = $aseco->server->jfreu->yellow;
$red = $aseco->server->jfreu->red;
$blu = $aseco->server->jfreu->blue;
$gre = $aseco->server->jfreu->green;
$adm = $aseco->server->jfreu->admin;
if ($aseco->server->jfreu->kickhirank)
{
$nbjoueurs = count($aseco->server->players->player_list);
$max = $aseco->server->jfreu->maxplayers;
$diff = $nbjoueurs - $max;
if ($diff > 0)
{
$message = $yel.'>> '.$blu.'Server is full ('.$red.$nbjoueurs.$blu.'/'.$whi.$max.$blu.'): $n'.$whi.$diff.$blu.' Hi-rank player'.($diff == 1 ? '' : 's').' will be kicked.';
$aseco->client->query('ChatSendServerMessage', $message);
kick_worst($aseco, $diff);
}
else
{
$message = $yel.'>> '.$blu.'Server is not full ('.$gre.$nbjoueurs.$blu.'/'.$whi.$max.$blu.'): '.$gre.'No kick'.$blu.'.';
$aseco->client->query('ChatSendServerMessage', $message);
}
}
} // kick_hirank
function kick_worst($aseco, $x)
{
$whi = $aseco->server->jfreu->white;
$yel = $aseco->server->jfreu->yellow;
$red = $aseco->server->jfreu->red;
$blu = $aseco->server->jfreu->blue;
$gre = $aseco->server->jfreu->green;
$adm = $aseco->server->jfreu->admin;
if (count($aseco->server->players->player_list) == 0)
{
return 0;
}
foreach ($aseco->server->players->player_list as $pl)
{
$listakicker[$pl->login] = ($pl->ladderrank > 0 ? $pl->ladderrank : PHP_INT_MAX);
}
arsort($listakicker);
$nbjoueurs = count($listakicker);
if ($x > $nbjoueurs)
{
$x = $nbjoueurs;
}
if ($x == 0)
{
$message = $yel.'>> '.$red.'No kick !';
$aseco->client->query('ChatSendServerMessage', $message);
return 0;
}
$i = 0;
$nicknames = '';
foreach ($listakicker as $login => $rank)
{
$playertemp = $aseco->server->players->getPlayer($login);
$nicknames .= $whi.clean_nick($playertemp->nickname);
// log console message
$aseco->console('[KickWorst] player "{1}" kicked (rank: {2})', $login, $rank);
kicker_login($aseco, $login);
if (++$i == $x) break; // stop if we've got enough
$nicknames .= $blu.', ';
}
$message = $yel.'>> '.$blu.'Players: '.$nicknames.$red.' kicked'.$blu.'.';
$aseco->client->query('ChatSendServerMessage', $message);
if ($aseco->server->jfreu->autorank)
{
autorank($aseco, $x);
}
return $x;
} // kick_worst
function chat_ranklimit($aseco, $command)
{
$whi = $aseco->server->jfreu->white;
$yel = $aseco->server->jfreu->yellow;
$red = $aseco->server->jfreu->red;
$blu = $aseco->server->jfreu->blue;
$gre = $aseco->server->jfreu->green;
$adm = $aseco->server->jfreu->admin;
$login = $command['author']->login;
if ($aseco->server->jfreu->ranklimit)
{
if ($aseco->server->jfreu->autorank)
{
$message = $yel.'> '.$blu.'Auto-RankLimit: '.$whi.$aseco->server->jfreu->autolimit;
}
else
{
$message = $yel.'> '.$blu.'RankLimit: '.$whi.$aseco->server->jfreu->limit;
}
}
else
{
$message = $yel.'> '.$blu.'RankLimit: '.$whi.'OFF'.$blu.'.';
}
$aseco->client->query('ChatSendServerMessageToLogin', $message, $login);
} // chat_ranklimit
function set_ranklimit($aseco, $limit, $auto)
{
$whi = $aseco->server->jfreu->white;
$yel = $aseco->server->jfreu->yellow;
$red = $aseco->server->jfreu->red;
$blu = $aseco->server->jfreu->blue;
$gre = $aseco->server->jfreu->green;
$adm = $aseco->server->jfreu->admin;
if (isset($limit) && $limit != 0)
{
$message = '';
if ($auto == 1) // autorank ON --> limit changed by autorank function
{
$aseco->server->jfreu->autolimit = $limit;
$message = $yel.'>> '.$blu.'Auto-RankLimit: '.$whi.$limit;
}
elseif ($auto == 0) // autorank OFF --> limit changed by admin
{
$aseco->server->jfreu->limit = $limit;
$message = $yel.'>> '.$blu.'New RankLimit: '.$whi.$limit;
}
elseif ($auto == 2) // autorank ON --> limit forced by admin
{
$aseco->server->jfreu->autolimit = $limit;
$message = $yel.'>> '.$blu.'Auto-RankLimit: '.$whi.$limit.$blu.' (forced by admin)';
}
if (!$aseco->server->jfreu->ranklimit)
{
$message = $yel.'>> '.$blu.'RankLimit: '.$whi.'OFF'.$blu.'.';
}
$aseco->client->query('ChatSendServerMessage', $message);
if ($aseco->server->jfreu->autochangename)
{
$servername = $aseco->server->jfreu->servername . $aseco->server->jfreu->top . $limit;
$aseco->client->query('SetServerName', $servername);
}
}
} // set_ranklimit
function getpassword($aseco, $spec) // spec = true: specPassword || false: playerPassword
{
$aseco->client->query('GetServerOptions');
$options = $aseco->client->getResponse();
if ($spec)
{
return $options['PasswordForSpectator'];
}
else
{
return $options['Password'];
}
} // getpassword
function chat_password($aseco, $command)
{
$whi = $aseco->server->jfreu->white;
$yel = $aseco->server->jfreu->yellow;
$red = $aseco->server->jfreu->red;
$blu = $aseco->server->jfreu->blue;
$gre = $aseco->server->jfreu->green;
$adm = $aseco->server->jfreu->admin;
$login = $command['author']->login;
// check for spectator or SpecOnly status
if ($aseco->isSpectator($command['author']) ||
$aseco->server->jfreu->playerlist[$login]->speconly)
{
$pass = getpassword($aseco, true);
$message = $yel.'> '.$blu.'Spectator password is: '.$whi.$pass.$blu.'.';
}
else
{
$pass = getpassword($aseco, false);
$message = $yel.'> '.$blu.'Player password is: '.$whi.$pass.$blu.'.';
}
$aseco->client->query('ChatSendServerMessageToLogin', $message, $login);
} // chat_password
/* disabled, this is too childish - Xymph
function chat_fake($aseco, $command)
{
$whi = $aseco->server->jfreu->white;
$yel = $aseco->server->jfreu->yellow;
$red = $aseco->server->jfreu->red;
$blu = $aseco->server->jfreu->blue;
$gre = $aseco->server->jfreu->green;
$adm = $aseco->server->jfreu->admin;
$rank = 1;
$time1 = rand(20, 30);
$time2 = rand(10, 99);
$message = $yel.'>> '.$whi.clean_nick($command['author']->nickname).$gre.' took the '.$whi.$rank.'.'.$gre.' Local Record with a time of '.$whi.'00:'.$time1.'.'.$time2.$gre.'! $000(fake)';
$aseco->client->query('ChatSendServerMessage', $message);
} // chat_fake
disabled */
// called @ onEndRace
function info_message($aseco, $data)
{
$whi = $aseco->server->jfreu->white;
$yel = $aseco->server->jfreu->yellow;
$red = $aseco->server->jfreu->red;
$blu = $aseco->server->jfreu->blue;
$gre = $aseco->server->jfreu->green;
$adm = $aseco->server->jfreu->admin;
if ($aseco->server->jfreu->infomessages == 0)
{
/* disabled, no need to spam that messages are off - Xymph
$message = $yel.'>> '.$blu.'Messages: '.$whi.'OFF'.$blu.'.';
$aseco->client->query('ChatSendServerMessage', $message);
disabled */
return;
}
// get random message
$i = rand(1, $aseco->server->jfreu->nbmessages);
$message = $aseco->formatColors($aseco->server->jfreu->message_start . $aseco->server->jfreu->messages[$i]);
// hyperlink release page on TMF
if ($aseco->server->getGame() == 'TMF') {
$message = preg_replace('|' . XASECO_TMN . '|', '$l[$0]$0$l', $message);
$message = preg_replace('|' . XASECO_ORG . '|', '$l[$0]$0$l', $message);
}
// send the message & test for scoreboard or /message command
if ($aseco->server->getGame() == 'TMF' && $aseco->server->jfreu->infomessages == 2 &&
function_exists('send_window_message'))
send_window_message($aseco, $message, ($data !== false));
else
$aseco->client->query('ChatSendServerMessage', $message);
} // info_message
function chat_message($aseco, $command)
{
info_message($aseco, false);
} // chat_message
// called @ onChat
function novote($aseco, $chat)
{
global $feature_votes; // from rasp.settings.php
// disabled if chat-based votes are enabled
if (!$feature_votes && $aseco->server->jfreu->novote)
{
$aseco->client->query('CancelVote');
}
} // novote
/* disabled as it's not related to /vote events - Xymph
// called @ onPlayerVote
function novote_message($aseco)
{
$whi = $aseco->server->jfreu->white;
$yel = $aseco->server->jfreu->yellow;
$red = $aseco->server->jfreu->red;
$blu = $aseco->server->jfreu->blue;
$gre = $aseco->server->jfreu->green;
$adm = $aseco->server->jfreu->admin;
if ($aseco->server->jfreu->novote)
{
$message = $yel.'>> '.$blu.'Vote canceled.';
$aseco->client->query('ChatSendServerMessage', $message);
}
} // novote_message
disabled */
// called @ onChat
function BadWords($aseco, $chat)
{
// if server message or no badwords checking, bail out immediately
if ($chat[0] == $aseco->server->id) return;
if (!$aseco->server->jfreu->badwords) return;
$texte = clean_nick($chat[2]);
$temp = '';
$temp2 = ' ';
$i = 0;
while (isset($texte[$i]) && $i < 1000)
{
if ($texte[$i] != ' ' && $texte[$i] != $temp2)
{
$temp2 = $texte[$i];
$temp .= $texte[$i];
}
$i++;
}
$texte = $temp;
$texte = str_replace('|_|', 'u', $texte);
$texte = str_replace('I<', 'k', $texte);
$texte = str_replace('|<', 'k', $texte);
$texte = str_replace('|', 'l', $texte);
$texte = str_replace('@', 'a', $texte);
$texte = str_replace('á', 'a', $texte);
$texte = str_replace('à', 'a', $texte);
$texte = str_replace('á', 'a', $texte);
$texte = str_replace('â', 'a', $texte);
$texte = str_replace('ä', 'a', $texte);
$texte = str_replace('å', 'a', $texte);
$texte = str_replace('é', 'e', $texte);
$texte = str_replace('è', 'e', $texte);
$texte = str_replace('ë', 'e', $texte);
$texte = str_replace('ê', 'e', $texte);
$texte = str_replace('!', 'i', $texte);
$texte = str_replace('¡', 'i', $texte);
$texte = str_replace('¿', 'i', $texte);
$texte = str_replace('í', 'i', $texte);
$texte = str_replace('ì', 'i', $texte);
$texte = str_replace('ï', 'i', $texte);
$texte = str_replace('î', 'i', $texte);
$texte = str_replace('0', 'o', $texte);
$texte = str_replace('ó', 'o', $texte);
$texte = str_replace('ò', 'o', $texte);
$texte = str_replace('ö', 'o', $texte);
$texte = str_replace('ô', 'o', $texte);
$texte = str_replace('ú', 'u', $texte);
$texte = str_replace('ù', 'u', $texte);
$texte = str_replace('ü', 'u', $texte);
$texte = str_replace('û', 'u', $texte);
$texte = str_replace('.', '', $texte);
$texte = str_replace('*', '', $texte);
$texte = str_replace('-', '', $texte);
$texte = str_replace('_', '', $texte);
$texte = str_replace('"', '', $texte);
$texte = str_replace('\'', '', $texte);
foreach ($aseco->server->jfreu->badwordslist as $mot)
{
if (stristr($texte, $mot))
{
// get offending player
$login = $chat[1];
if (!$player = $aseco->server->players->getPlayer($login))
return;
if (!$nick = $player->nickname)
$nick = $login;
badword_found($login, $nick, $mot);
return;
}
}
} // BadWords
function badword_found($login, $nick, $mot)
{
global $aseco;
$whi = $aseco->server->jfreu->white;
$yel = $aseco->server->jfreu->yellow;
$red = $aseco->server->jfreu->red;
$blu = $aseco->server->jfreu->blue;
$gre = $aseco->server->jfreu->green;
$adm = $aseco->server->jfreu->admin;
$max = $aseco->server->jfreu->badwordsnum;
$aseco->server->jfreu->playerlist[$login]->badwords++;
$message = $yel.'>> '.$red.'Language plz !';
if ($mot != '')
{
$message2 = $yel.'> '.$red.'[ '.$whi.'"'.$mot.'"'.$red.' is a forbidden word]';
}
else
{
$message2 = $yel.'> '.$red.'[That is a forbidden word too]';
}
$aseco->client->query('ChatSendServerMessageToLogin', $message2, $login);
if ($aseco->server->jfreu->badwordsban && $aseco->server->jfreu->playerlist[$login]->badwords > $max)
{
$max2 = $max * 2;
$message .= $blu.' ('.$whi.clean_nick($nick).$blu.' : ';
$message .= $whi.$aseco->server->jfreu->playerlist[$login]->badwords.$blu.'/'.$whi.$max2.$blu;
$message .= $red.' to ban'.$blu.') ';
}
else
{
$message .= $blu.' ('.$whi.clean_nick($nick).$blu.' : ';
$message .= $whi.$aseco->server->jfreu->playerlist[$login]->badwords.$blu.'/'.$whi.$max.$blu;
$message .= $red.' to kick'.$blu.') ';
}
if (($aseco->server->jfreu->playerlist[$login]->badwords % $max) == 0)
{
if ($aseco->server->jfreu->badwordsban)
{
if ($aseco->server->jfreu->playerlist[$login]->badwords > $max)
{
$message .= ' ['.$red.'Banned for '.$whi.$aseco->server->jfreu->badwordstime.$red.' mins'.$blu.' ]';
$aseco->client->query('ChatSendServerMessage', $message);
$aseco->server->jfreu->playerlist[$login]->badwords = 0;
banfor($aseco, $login, $aseco->server->jfreu->badwordstime);
}
else
{
$message .= ' ['.$red.'Kicked'.$blu.' ] ';
$aseco->client->query('ChatSendServerMessage', $message);
// log console message
$aseco->console('[BadWords] player "{1}" kicked', $login);
$aseco->server->jfreu->playerlist[$login]->kicked = true;
$aseco->client->addCall('Kick', array($login));
}
}
else
{
$message .= ' ['.$red.'Kicked'.$blu.' ] ';
$aseco->client->query('ChatSendServerMessage', $message);
$aseco->server->jfreu->playerlist[$login]->badwords = 0;
// log console message
$aseco->console('[BadWords] player "{1}" kicked', $login);
$aseco->server->jfreu->playerlist[$login]->kicked = true;
$aseco->client->addCall('Kick', array($login));
}
}
else
{
$aseco->client->query('ChatSendServerMessage', $message);
}
} // badword_found
// called @ onPlayerFinish
function pf_kick($aseco, $finish)
{
$whi = $aseco->server->jfreu->white;
$yel = $aseco->server->jfreu->yellow;
$red = $aseco->server->jfreu->red;
$blu = $aseco->server->jfreu->blue;
$gre = $aseco->server->jfreu->green;
$adm = $aseco->server->jfreu->admin;
if ($aseco->server->jfreu->pf == 0)
{
return 0;
}
if ($finish->score == 0)
{
return 0;
}
// more than 0.01 sec faster than PF time?
if ($finish->score < ($aseco->server->jfreu->pf - 10))
{
$message = $yel.'>> '.$blu.'Player '.$whi.clean_nick($finish->player->nickname).$blu.' did not PF. ('.$red.'Kicked'.$blu.')';
$aseco->client->query('ChatSendServerMessage', $message);
// log console message
$aseco->console('[NoPfKick] player "{1}" kicked (rank: {2})', $player->login, $player->ladderrank);
kicker_login($aseco, $finish->player->login);
}
} // pf_kick
/* disabled up_to_date function & /uptodate command, superseded in main system - Xymph
function up_to_date($aseco)
{
$whi = $aseco->server->jfreu->white;
$yel = $aseco->server->jfreu->yellow;
$red = $aseco->server->jfreu->red;
$blu = $aseco->server->jfreu->blue;
$gre = $aseco->server->jfreu->green;
$adm = $aseco->server->jfreu->admin;
if ($file = @fopen('http://reload.servegame.com/plugin/reload_data/version.php', 'rb'))
{
$last = trim(fgets($file));
if ($last != $aseco->server->jfreu->version)
{
$message = $yel.'> '.$blu.'New version of Jfreu\'s plugin available: '.$gre.$last.$blu.'.'.LF.$yel.'> '.$red.'http://jfreu.servegame.com';
return $message;
}
else
{
$message = $yel.'> '.$blu.'Your Jfreu\'s plugin version is up to date.';
return $message;
}
}
else
{
$message = $yel.'> '.$red.'Error: can\'t find the last version.';
return $message;
}
} // up_to_date
function chat_uptodate($aseco, $command)
{
$whi = $aseco->server->jfreu->white;
$yel = $aseco->server->jfreu->yellow;
$red = $aseco->server->jfreu->red;
$blu = $aseco->server->jfreu->blue;
$gre = $aseco->server->jfreu->green;
$adm = $aseco->server->jfreu->admin;
$login = $command['author']->login;
if ($aseco->isAnyAdmin($command['author']))
{
$aseco->client->query('ChatSendServerMessageToLogin', up_to_date($aseco), $login);
}
else
{
$message = $aseco->getChatMessage('NO_ADMIN');
$aseco->client->query('ChatSendServerMessageToLogin', $message, $login);
}
} // chat_uptodate
disabled */
function addJfreuAdminChatCommand($name, $help)
{
global $aseco;
$i = count($aseco->server->jfreu->admin_commands);
$aseco->server->jfreu->admin_commands[$i] = new jfreu_command();
$aseco->server->jfreu->admin_commands[$i]->name = $name;
$aseco->server->jfreu->admin_commands[$i]->help = $help;
$aseco->server->jfreu->admin_commands[$i]->isadmin = true; // always admin
} // addJfreuAdminChatCommand
function clean_nick($nick)
{
global $aseco;
$whi = $aseco->server->jfreu->white;
$yel = $aseco->server->jfreu->yellow;
$red = $aseco->server->jfreu->red;
$blu = $aseco->server->jfreu->blue;
$gre = $aseco->server->jfreu->green;
$adm = $aseco->server->jfreu->admin;
$propre = stripColors($nick);
if ($propre == '')
{
return $red.'ERROR';
}
return $propre;
} // clean_nick
?>