263 lines
10 KiB
PHP
263 lines
10 KiB
PHP
<?php
|
|
/* vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2: */
|
|
|
|
/**
|
|
* Rounds Points plugin.
|
|
* Allows setting common and custom Rounds points systems.
|
|
* Created by Xymph
|
|
*
|
|
* Dependencies: used by chat.admin.php
|
|
*/
|
|
|
|
Aseco::registerEvent('onSync', 'init_rpoints');
|
|
|
|
Aseco::addChatCommand('rpoints', 'Shows current Rounds points system');
|
|
|
|
global $rounds_points;
|
|
$rounds_points = array();
|
|
|
|
// define common points systems:
|
|
|
|
// http://www.formula1.com/inside_f1/rules_and_regulations/sporting_regulations/6833/
|
|
$rounds_points['f1old'] = array('Formula 1 GP Old',
|
|
array(10,8,6,5,4,3,2,1));
|
|
// http://www.formula1.com/inside_f1/rules_and_regulations/sporting_regulations/8681/
|
|
$rounds_points['f1new'] = array('Formula 1 GP New',
|
|
array(25,18,15,12,10,8,6,4,2,1));
|
|
// http://www.motogp.com/en/about+MotoGP/key+rules
|
|
$rounds_points['motogp'] = array('MotoGP',
|
|
array(25,20,16,13,11,10,9,8,7,6,5,4,3,2,1));
|
|
// MotoGP + 5 points
|
|
$rounds_points['motogp5'] = array('MotoGP + 5',
|
|
array(30,25,21,18,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1));
|
|
// http://www.et-leagues.com/fet1/rules.php
|
|
$rounds_points['fet1'] = array('Formula ET Season 1',
|
|
array(12,10,9,8,7,6,5,4,4,3,3,3,2,2,2,1));
|
|
// http://www.et-leagues.com/fet2/rules.php (fixed: #17-19 = 2, not #17-21)
|
|
$rounds_points['fet2'] = array('Formula ET Season 2',
|
|
array(15,12,11,10,9,8,7,6,6,5,5,4,4,3,3,3,2,2,2,1));
|
|
// http://www.et-leagues.com/fet3/rules.php
|
|
$rounds_points['fet3'] = array('Formula ET Season 3',
|
|
array(15,12,11,10,9,8,7,6,6,5,5,4,4,3,3,3,2,2,2,2,1));
|
|
// http://www.champcarworldseries.com/News/Article.asp?ID=7499
|
|
$rounds_points['champcar'] = array('Champ Car World Series',
|
|
array(31,27,25,23,21,19,17,15,13,11,10,9,8,7,6,5,4,3,2,1));
|
|
// http://www.eurosuperstars.com/eng/regolamenti.asp
|
|
$rounds_points['superstars'] = array('Superstars',
|
|
array(20,15,12,10,8,6,4,3,2,1));
|
|
$rounds_points['simple5'] = array('Simple 5',
|
|
array(5,4,3,2,1));
|
|
$rounds_points['simple10'] = array('Simple 10',
|
|
array(10,9,8,7,6,5,4,3,2,1));
|
|
|
|
// any players finishing beyond the last points entry get the same number of points (typically 1) as that last entry
|
|
|
|
|
|
function init_rpoints($aseco) {
|
|
global $rounds_points;
|
|
|
|
// set default rounds points system
|
|
$system = $aseco->settings['default_rpoints'];
|
|
if (preg_match('/^\d+,[\d,]*\d+$/', $system)) {
|
|
// set new custom points as array of ints
|
|
$points = array_map('intval', explode(',', $system));
|
|
$rtn = $aseco->client->query('SetRoundCustomPoints', $points, false);
|
|
// log console message
|
|
if (!$rtn) {
|
|
$aseco->console('Invalid rounds points: {1} Error: {2}', $system, $aseco->client->getErrorMessage());
|
|
} else {
|
|
$aseco->console('Initialize default rounds points: {1}', $system);
|
|
}
|
|
|
|
} elseif (array_key_exists($system, $rounds_points)) {
|
|
// set new custom points
|
|
$rtn = $aseco->client->query('SetRoundCustomPoints', $rounds_points[$system][1], false);
|
|
// log console message
|
|
if (!$rtn) {
|
|
$aseco->console('Invalid rounds points: {1} Error: {2}', $system, $aseco->client->getErrorMessage());
|
|
} else {
|
|
$aseco->console('Initialize default rounds points: {1} - {2}',
|
|
$rounds_points[$system][0],
|
|
implode(',', $rounds_points[$system][1]));
|
|
}
|
|
|
|
} elseif ($system == '') {
|
|
// disable custom points
|
|
$rtn = $aseco->client->query('SetRoundCustomPoints', array(), false);
|
|
|
|
} else {
|
|
$aseco->console('Unknown rounds points: {1}', $system);
|
|
}
|
|
} // init_rpoints
|
|
|
|
function admin_rpoints($aseco, $admin, $logtitle, $chattitle, $command) {
|
|
global $rounds_points;
|
|
|
|
$login = $admin->login;
|
|
$command = explode(' ', preg_replace('/ +/', ' ', $command));
|
|
$system = strtolower($command[0]);
|
|
|
|
if ($command[0] == 'help') {
|
|
$header = '{#black}/admin rpoints$g sets custom Rounds points:';
|
|
$help = array();
|
|
$help[] = array('...', '{#black}help',
|
|
'Displays this help information');
|
|
$help[] = array('...', '{#black}list',
|
|
'Displays available points systems');
|
|
$help[] = array('...', '{#black}show',
|
|
'Shows current points system');
|
|
$help[] = array('...', '{#black}xxx',
|
|
'Sets custom points system labelled xxx');
|
|
$help[] = array('...', '{#black}X,Y,...,Z',
|
|
'Sets custom points system with specified values;');
|
|
$help[] = array('', '',
|
|
'X,Y,...,Z must be decreasing integers and there');
|
|
$help[] = array('', '',
|
|
'must be at least two values with no spaces');
|
|
$help[] = array('...', '{#black}off',
|
|
'Disables custom points system');
|
|
|
|
// display ManiaLink message
|
|
display_manialink($login, $header, array('Icons64x64_1', 'TrackInfo', -0.01), $help, array(1.05, 0.05, 0.2, 0.8), 'OK');
|
|
|
|
} elseif ($command[0] == 'list') {
|
|
$head = 'Currently available Rounds points systems:';
|
|
$list = array();
|
|
$list[] = array('Label', '{#black}System', '{#black}Distribution');
|
|
$lines = 0;
|
|
$admin->msgs = array();
|
|
$admin->msgs[0] = array(1, $head, array(1.3, 0.2, 0.4, 0.7), array('Icons128x32_1', 'RT_Rounds'));
|
|
foreach ($rounds_points as $tag => $points) {
|
|
$list[] = array('{#black}' . $tag, $points[0],
|
|
implode(',', $points[1]) . ',...');
|
|
if (++$lines > 14) {
|
|
$admin->msgs[] = $list;
|
|
$lines = 0;
|
|
$list = array();
|
|
$list[] = array('Label', '{#black}System', '{#black}Distribution');
|
|
}
|
|
}
|
|
if (!empty($list)) {
|
|
$admin->msgs[] = $list;
|
|
}
|
|
// display ManiaLink message
|
|
display_manialink_multi($admin);
|
|
|
|
} elseif ($command[0] == 'show') {
|
|
// get custom points
|
|
$aseco->client->query('GetRoundCustomPoints');
|
|
$points = $aseco->client->getResponse();
|
|
|
|
// search for known points system
|
|
$system = false;
|
|
foreach ($rounds_points as $rpoints) {
|
|
if ($points == $rpoints[1]) {
|
|
$system = $rpoints[0];
|
|
break;
|
|
}
|
|
}
|
|
|
|
// check for results
|
|
if (empty($points)) {
|
|
$message = formatText($aseco->getChatMessage('NO_RPOINTS'), '{#admin}');
|
|
} else {
|
|
if ($system)
|
|
$message = formatText($aseco->getChatMessage('RPOINTS_NAMED'),
|
|
'{#admin}', $system, '{#admin}', implode(',', $points));
|
|
else
|
|
$message = formatText($aseco->getChatMessage('RPOINTS_NAMELESS'),
|
|
'{#admin}', implode(',', $points));
|
|
}
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
|
|
} elseif ($command[0] == 'off') {
|
|
// disable custom points
|
|
$rtn = $aseco->client->query('SetRoundCustomPoints', array(), false);
|
|
|
|
// log console message
|
|
$aseco->console('{1} [{2}] disabled custom points', $logtitle, $login);
|
|
|
|
// show chat message
|
|
$message = formatText('{#server}>> {#admin}{1}$z$s {#highlite}{2}$z$s{#admin} disables custom rounds points',
|
|
$chattitle, $admin->nickname);
|
|
$aseco->client->query('ChatSendServerMessage', $aseco->formatColors($message));
|
|
|
|
} elseif (preg_match('/^\d+,[\d,]*\d+$/', $command[0])) {
|
|
// set new custom points as array of ints
|
|
$points = array_map('intval', explode(',', $command[0]));
|
|
$rtn = $aseco->client->query('SetRoundCustomPoints', $points, false);
|
|
if (!$rtn) {
|
|
$message = '{#server}> {#error}Invalid point distribution! Error: {#highlite}$i ' . $aseco->client->getErrorMessage();
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
} else {
|
|
// log console message
|
|
$aseco->console('{1} [{2}] set new custom points: {3}', $logtitle, $login, $command[0]);
|
|
|
|
// show chat message
|
|
$message = formatText('{#server}>> {#admin}{1}$z$s {#highlite}{2}$z$s{#admin} sets custom rounds points: {#highlite}{3},...',
|
|
$chattitle, $admin->nickname,
|
|
$command[0]);
|
|
$aseco->client->query('ChatSendServerMessage', $aseco->formatColors($message));
|
|
}
|
|
|
|
} elseif (array_key_exists($system, $rounds_points)) {
|
|
// set new custom points
|
|
$rtn = $aseco->client->query('SetRoundCustomPoints', $rounds_points[$system][1], false);
|
|
if (!$rtn) {
|
|
trigger_error('[' . $aseco->client->getErrorCode() . '] SetRoundCustomPoints - ' . $aseco->client->getErrorMessage(), E_USER_WARNING);
|
|
} else {
|
|
// log console message
|
|
$aseco->console('{1} [{2}] set new custom points [{3}]', $logtitle, $login, strtoupper($command[0]));
|
|
|
|
// show chat message
|
|
$message = formatText('{#server}>> {#admin}{1}$z$s {#highlite}{2}$z$s{#admin} sets rounds points to {#highlite}{3}{#admin}: {#highlite}{4},...',
|
|
$chattitle, $admin->nickname,
|
|
$rounds_points[$system][0],
|
|
implode(',', $rounds_points[$system][1]));
|
|
$aseco->client->query('ChatSendServerMessage', $aseco->formatColors($message));
|
|
}
|
|
|
|
} else {
|
|
$message = '{#server}> {#error}Unknown points system {#highlite}$i ' . strtoupper($command[0]) . '$z$s {#error}!';
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
}
|
|
} // admin_rpoints
|
|
|
|
function chat_rpoints($aseco, $command) {
|
|
global $rounds_points;
|
|
|
|
$login = $command['author']->login;
|
|
|
|
if ($aseco->server->getGame() == 'TMF') {
|
|
// get custom points
|
|
$aseco->client->query('GetRoundCustomPoints');
|
|
$points = $aseco->client->getResponse();
|
|
|
|
// search for known points system
|
|
$system = false;
|
|
foreach ($rounds_points as $rpoints) {
|
|
if ($points == $rpoints[1]) {
|
|
$system = $rpoints[0];
|
|
break;
|
|
}
|
|
}
|
|
|
|
// check for results
|
|
if (empty($points)) {
|
|
$message = formatText($aseco->getChatMessage('NO_RPOINTS'), '');
|
|
} else {
|
|
if ($system)
|
|
$message = formatText($aseco->getChatMessage('RPOINTS_NAMED'),
|
|
'', $system, '', implode(',', $points));
|
|
else
|
|
$message = formatText($aseco->getChatMessage('RPOINTS_NAMELESS'),
|
|
'', implode(',', $points));
|
|
}
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
} else {
|
|
$message = $aseco->getChatMessage('FOREVER_ONLY');
|
|
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
|
|
}
|
|
} // chat_rpoints
|
|
?>
|