docker-tmserver/xaseco/plugins/chat.dedimania.php

942 lines
39 KiB
PHP

<?php
/* vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2: */
/**
* Chat plugin.
* Shows new/online Dedimania world records and their relations on the
* current track.
* Created by Xymph
*
* Dependencies: requires plugin.dedimania.php, plugin.checkpoints.php
* used by plugin.dedimania.php
*/
Aseco::addChatCommand('helpdedi', 'Displays info about the Dedimania records system');
Aseco::addChatCommand('dedihelp', 'Displays info about the Dedimania records system');
Aseco::addChatCommand('dedirecs', 'Displays all Dedimania records on current track');
if (!INHIBIT_RECCMDS) {
Aseco::addChatCommand('dedinew', 'Shows newly driven Dedimania records');
Aseco::addChatCommand('dedilive', 'Shows Dedimania records of online players');
Aseco::addChatCommand('dedipb', 'Shows your Dedimania personal best on current track');
Aseco::addChatCommand('dedifirst', 'Shows first Dedimania record on current track');
Aseco::addChatCommand('dedilast', 'Shows last Dedimania record on current track');
Aseco::addChatCommand('dedinext', 'Shows next better Dedimania record to beat');
Aseco::addChatCommand('dedidiff', 'Shows your difference to first Dedimania record');
Aseco::addChatCommand('dedirange', 'Shows difference first to last Dedimania record');
}
Aseco::addChatCommand('dedicps', 'Sets Dedimania record checkspoints tracking');
Aseco::addChatCommand('dedistats', 'Displays Dedimania track statistics');
Aseco::addChatCommand('dedicptms', 'Displays all Dedimania records\' checkpoint times');
Aseco::addChatCommand('dedisectms', 'Displays all Dedimania records\' sector times');
function chat_dedihelp($aseco, $command) { chat_helpdedi($aseco, $command); }
function chat_helpdedi($aseco, $command) {
// compile & display help message
if ($aseco->server->getGame() == 'TMN') {
$help = '{#dedimsg}Dedimania$g is an online World Records database for {#black}all$g' . LF;
$help .= 'TrackMania games. See its official site at:' . LF;
$help .= '{#black}http://www.dedimania.com/SITE/$g and the records database:' . LF;
$help .= '{#black}http://www.dedimania.com/tmstats/?do=stat$g .' . LF . LF;
$help .= 'Dedimania records are stored per game (TMN, TMU, etc)' . LF;
$help .= 'and mode (TimeAttack, Rounds, etc) and shared between' . LF;
$help .= 'all servers that operate with Dedimania support.' . LF . LF;
$help .= 'The available Dedimania commands are similar to local' . LF;
$help .= 'record commands:' . LF;
$help .= '{#black}/dedirecs$g, {#black}/dedinew$g, {#black}/dedilive$g, {#black}/dedipb$g, {#black}/dedicps$g, {#black}/dedistats$g,' . LF;
$help .= '{#black}/dedifirst$g, {#black}/dedilast$g, {#black}/dedinext$g, {#black}/dedidiff$g, {#black}/dedirange$g' . LF;
$help .= 'See the {#black}/helpall$g command for detailed descriptions.';
// display popup message
$aseco->client->query('SendDisplayServerMessageToLogin', $command['author']->login, $aseco->formatColors($help), 'OK', '', 0);
} elseif ($aseco->server->getGame() == 'TMF') {
$header = 'Dedimania information:';
$data = array();
$data[] = array('{#dedimsg}Dedimania$g is an online World Records database for {#black}all');
$data[] = array('TrackMania games. See its official site at:');
$data[] = array('{#black}$l[http://www.dedimania.com/SITE/]http://www.dedimania.com/SITE/$l$g and the records database:');
$data[] = array('{#black}$l[http://www.dedimania.com/tmstats/?do=stat]http://www.dedimania.com/tmstats/?do=stat$l$g .');
$data[] = array();
$data[] = array('Dedimania records are stored per game (TMN, TMU, etc)');
$data[] = array('and mode (TimeAttack, Rounds, etc) and shared between');
$data[] = array('all servers that operate with Dedimania support.');
$data[] = array();
$data[] = array('The available Dedimania commands are similar to local');
$data[] = array('record commands:');
$data[] = array('{#black}/dedirecs$g, {#black}/dedinew$g, {#black}/dedilive$g, {#black}/dedipb$g, {#black}/dedicps$g, {#black}/dedistats$g,');
$data[] = array('{#black}/dedifirst$g, {#black}/dedilast$g, {#black}/dedinext$g, {#black}/dedidiff$g, {#black}/dedirange$g');
$data[] = array();
$data[] = array('See the {#black}/helpall$g command for detailed descriptions.');
// display ManiaLink message
display_manialink($command['author']->login, $header, array('Icons64x64_1', 'TrackInfo', -0.01), $data, array(0.95), 'OK');
}
} // chat_helpdedi
function chat_dedirecs($aseco, $command) {
global $dedi_db;
$player = $command['author'];
$login = $player->login;
$dedi_recs = $dedi_db['Challenge']['Records'];
// split params into array
$arglist = explode(' ', strtolower(preg_replace('/ +/', ' ', $command['params'])));
// process optional relations commands
if ($arglist[0] == 'help') {
if ($aseco->server->getGame() == 'TMN') {
$help = '{#black}/dedirecs <option>$g shows Dedimania records and relations' . LF;
$help .= ' - {#black}help$g, displays this help information' . LF;
$help .= ' - {#black}pb$g, your personal best on current track' . LF;
$help .= ' - {#black}new$g, newly driven records' . LF;
$help .= ' - {#black}live$g, records of online players' . LF;
$help .= ' - {#black}first$g, first ranked record on current track' . LF;
$help .= ' - {#black}last$g, last ranked record on current track' . LF;
$help .= ' - {#black}next$g, next better ranked record to beat' . LF;
$help .= ' - {#black}diff$g, your difference to first ranked record' . LF;
$help .= ' - {#black}range$g, difference first to last ranked record' . LF;
$help .= LF . 'Without an option, the normal records list is displayed.';
// display popup message
$aseco->client->query('SendDisplayServerMessageToLogin', $login, $aseco->formatColors($help), 'OK', '', 0);
} elseif ($aseco->server->getGame() == 'TMF') {
$header = '{#black}/dedirecs <option>$g shows Dedimania records and relations:';
$help = array();
$help[] = array('...', '{#black}help',
'Displays this help information');
$help[] = array('...', '{#black}pb',
'Shows your personal best on current track');
$help[] = array('...', '{#black}new',
'Shows newly driven records');
$help[] = array('...', '{#black}live',
'Shows records of online players');
$help[] = array('...', '{#black}first',
'Shows first ranked record on current track');
$help[] = array('...', '{#black}last',
'Shows last ranked record on current track');
$help[] = array('...', '{#black}next',
'Shows next better ranked record to beat');
$help[] = array('...', '{#black}diff',
'Shows your difference to first ranked record');
$help[] = array('...', '{#black}range',
'Shows difference first to last ranked record');
$help[] = array();
$help[] = array('Without an option, the normal records list is displayed.');
// display ManiaLink message
display_manialink($login, $header, array('Icons64x64_1', 'TrackInfo', -0.01), $help, array(1.2, 0.05, 0.3, 0.85), 'OK');
}
return;
}
elseif ($arglist[0] == 'pb') {
chat_dedipb($aseco, $command);
return;
}
elseif ($arglist[0] == 'new') {
chat_dedinew($aseco, $command);
return;
}
elseif ($arglist[0] == 'live') {
chat_dedilive($aseco, $command);
return;
}
elseif ($arglist[0] == 'first') {
chat_dedifirst($aseco, $command);
return;
}
elseif ($arglist[0] == 'last') {
chat_dedilast($aseco, $command);
return;
}
elseif ($arglist[0] == 'next') {
chat_dedinext($aseco, $command);
return;
}
elseif ($arglist[0] == 'diff') {
chat_dedidiff($aseco, $command);
return;
}
elseif ($arglist[0] == 'range') {
chat_dedirange($aseco, $command);
return;
}
if (!$total = count($dedi_recs)) {
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors('{#server}> {#error}No Dedimania records found!'), $login);
return;
}
$maxrank = max($dedi_db['ServerMaxRank'], $player->dedirank);
// display popup window for TMN
if ($aseco->server->getGame() == 'TMN') {
$head = 'Current TOP ' . $maxrank . ' Dedimania Records:' . LF;
$msg = '';
$lines = 0;
$player->msgs = array();
$player->msgs[0] = 1;
// create list of records
for ($i = 0; $i < $total; $i++) {
$cur_record = $dedi_recs[$i];
$nick = $cur_record['NickName'];
if (!$aseco->settings['lists_colornicks'])
$nick = stripColors($nick);
$msg .= str_pad($i+1, 2, '0', STR_PAD_LEFT) . '. {#black}'
. str_pad($nick, 20) . '$z - '
. ((isset($cur_record['NewBest']) && $cur_record['NewBest']) ? '{#black}': '')
. formatTime($cur_record['Best']) . LF;
if (++$lines > 9) {
$player->msgs[] = $aseco->formatColors($head . $msg);
$lines = 0;
$msg = '';
}
}
// add if last batch exists
if ($msg != '')
$player->msgs[] = $aseco->formatColors($head . $msg);
// display popup message
if (count($player->msgs) == 2) {
$aseco->client->query('SendDisplayServerMessageToLogin', $login, $player->msgs[1], 'OK', '', 0);
} else { // > 2
$aseco->client->query('SendDisplayServerMessageToLogin', $login, $player->msgs[1], 'Close', 'Next', 0);
}
// display ManiaLink window for TMF
} elseif ($aseco->server->getGame() == 'TMF') {
$head = 'Current TOP ' . $maxrank . ' Dedimania Records:';
$msg = array();
$lines = 0;
$player->msgs = array();
// reserve extra width for $w tags
$extra = ($aseco->settings['lists_colornicks'] ? 0.2 : 0);
if ($dedi_db['ShowRecLogins'])
$player->msgs[0] = array(1, $head, array(1.2+$extra, 0.1, 0.45+$extra, 0.4, 0.25), array('BgRaceScore2', 'Podium'));
else
$player->msgs[0] = array(1, $head, array(0.8+$extra, 0.1, 0.45+$extra, 0.25), array('BgRaceScore2', 'Podium'));
// create list of records
for ($i = 0; $i < $total; $i++) {
$cur_record = $dedi_recs[$i];
$nick = $cur_record['NickName'];
if (!$aseco->settings['lists_colornicks'])
$nick = stripColors($nick);
if ($dedi_db['ShowRecLogins']) {
$msg[] = array(str_pad($i+1, 2, '0', STR_PAD_LEFT) . '.',
'{#black}' . $nick,
'{#login}' . $cur_record['Login'],
((isset($cur_record['NewBest']) && $cur_record['NewBest']) ? '{#black}': '') .
($aseco->server->gameinfo->mode == Gameinfo::STNT ?
$cur_record['Best'] : formatTime($cur_record['Best'])));
} else {
$msg[] = array(str_pad($i+1, 2, '0', STR_PAD_LEFT) . '.',
'{#black}' . $nick,
((isset($cur_record['NewBest']) && $cur_record['NewBest']) ? '{#black}': '') .
($aseco->server->gameinfo->mode == Gameinfo::STNT ?
$cur_record['Best'] : formatTime($cur_record['Best'])));
}
if (++$lines > 14) {
$player->msgs[] = $msg;
$lines = 0;
$msg = array();
}
}
// add if last batch exists
if (!empty($msg))
$player->msgs[] = $msg;
// display ManiaLink message
display_manialink_multi($player);
// show chat message for TMO & TMS
} else {
$top = 4;
$msg = $aseco->formatColors("{#server}> Current TOP $top Dedimania Records:{#highlite}");
// create list of records
$total = ($total <= $top ? $total : $top);
for ($i = 0; $i < $total; $i++) {
$cur_record = $dedi_recs[$i];
$msg .= LF . ($i+1) . '. ' . str_pad(stripColors($cur_record['NickName']), 15)
. ' - ' . formatTime($cur_record['Best']);
}
// show chat message
$aseco->client->query('ChatSendServerMessageToLogin', $msg, $login);
}
} // chat_dedirecs
/*
* Universal function to generate list of Dedimania records for current track.
* Called by chat_dedinew, chat_dedilive, endRace & beginRace (plugin.dedimania.php).
* Show to a player if $login defined, otherwise show to all players.
* $mode = 0 (only new), 1 (top-8 & online players at start of track),
* 2 (top-6 & online during track), 3 (top-8 & new at end of track)
* In modes 1/2/3 the last Dedimania record is also shown
* top-8 is configurable via $dedi_db['ShowMinRecs']; top-6 is ShowMinRecs-2
*/
function show_dedirecs($aseco, $name, $uid, $dedi_recs, $login, $mode, $window) {
global $dedi_db, $dedi_debug;
$records = '$n'; // use narrow font
if ($dedi_debug > 2)
$aseco->console_text('show_dedirecs - dedi_recs' . CRLF . print_r($dedi_recs, true));
// check for records
if (!isset($dedi_recs) || ($total = count($dedi_recs)) == 0) {
$totalnew = -1;
} else {
// check whether to show range
if ($dedi_db['ShowRecsRange']) {
// get the first & last Dedimania records
$first = $dedi_recs[0];
$last = $dedi_recs[$total-1];
// compute difference between records
if ($aseco->server->gameinfo->mode != Gameinfo::STNT) {
$diff = $last['Best'] - $first['Best'];
$sec = floor($diff/1000);
$hun = ($diff - ($sec * 1000)) / 10;
} else { // Stunts
$diff = $first['Best'] - $last['Best'];
}
}
// get list of online players
$players = array();
foreach ($aseco->server->players->player_list as $pl) {
$players[] = $pl->login;
}
// collect new records and records by online players
$totalnew = 0;
// go through each record
for ($i = 0; $i < $total; $i++) {
$cur_record = $dedi_recs[$i];
// if the record is new then display it
if (isset($cur_record['NewBest']) && $cur_record['NewBest']) {
$totalnew++;
$record_msg = formatText($aseco->getChatMessage('RANKING_RECORD_NEW_ON'),
$i+1,
stripColors($cur_record['NickName']),
($aseco->server->gameinfo->mode == Gameinfo::STNT ?
$cur_record['Best'] : formatTime($cur_record['Best'])));
// always show new record
$records .= $record_msg;
} else {
// check if player is online
if (in_array($cur_record['Login'], $players) && $cur_record['Game'] ==
($aseco->server->getGame() == 'TMF' ? 'TMU' : $aseco->server->getGame())) {
$record_msg = formatText($aseco->getChatMessage('RANKING_RECORD_ON'),
$i+1,
stripColors($cur_record['NickName']),
($aseco->server->gameinfo->mode == Gameinfo::STNT ?
$cur_record['Best'] : formatTime($cur_record['Best'])));
// check if last Dedimania record
if ($mode != 0 && $i == $total-1) {
$records .= $record_msg;
}
// check if always show (start of/during track)
elseif ($mode == 1 || $mode == 2) {
$records .= $record_msg;
}
else {
// show record if < ShowMinRecs (end of track)
if ($mode == 3 && $i < $dedi_db['ShowMinRecs']) {
$records .= $record_msg;
}
}
} else {
$record_msg = formatText($aseco->getChatMessage('RANKING_RECORD'),
$i+1,
stripColors($cur_record['NickName']),
($aseco->server->gameinfo->mode == Gameinfo::STNT ?
$cur_record['Best'] : formatTime($cur_record['Best'])));
// check if last Dedimania record
if ($mode != 0 && $i == $total-1) {
$records .= $record_msg;
}
// show offline record if < ShowMinRecs-2 (during track)
elseif (($mode == 2 && $i < $dedi_db['ShowMinRecs']-2) ||
// show offline record if < ShowMinRecs (start/end of track)
(($mode == 1 || $mode == 3) && $i < $dedi_db['ShowMinRecs'])) {
$records .= $record_msg;
}
}
}
}
}
// define wording of the ranking message
switch ($mode) {
case 0:
$timing = 'during';
break;
case 1:
$timing = 'before';
break;
case 2:
$timing = 'during';
break;
case 3:
$timing = 'after';
break;
}
// hyperlink track name
$name = stripColors($name);
if ($aseco->server->getGame() == 'TMF')
$name = '$l[http://www.dedimania.com/tmstats/?do=stat&Show=RECORDS&RecOrder3=RANK-ASC&Uid=' . $uid . ']' . $name . '$l';
// define the ranking message
if ($totalnew > 0) {
$message = formatText($dedi_db['Messages']['RANKING_NEW'][0],
$name, $timing, $totalnew);
}
elseif ($totalnew == 0 && $records != '$n') {
// check whether to show range
if ($dedi_db['ShowRecsRange']) {
$message = formatText($dedi_db['Messages']['RANKING_RANGE'][0],
$name, $timing,
($aseco->server->gameinfo->mode == Gameinfo::STNT ?
$diff : sprintf("%d.%02d", $sec, $hun)));
} else {
$message = formatText($dedi_db['Messages']['RANKING'][0],
$name, $timing);
}
}
elseif ($totalnew == 0 && $records == '$n') {
$message = formatText($dedi_db['Messages']['RANKING_NONEW'][0],
$name, $timing);
}
else { // $totalnew == -1
$message = formatText($dedi_db['Messages']['RANKING_NONE'][0],
$name, $timing);
}
// append the records if any
if ($records != '$n') {
$records = substr($records, 0, strlen($records)-2); // strip trailing ", "
$message .= LF . $records;
}
// show to player or all
if ($login) {
// strip 1 leading '>' to indicate a player message instead of system-wide
$message = str_replace('{#server}>> ', '{#server}> ', $message);
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
} else {
if ($window == 2 && function_exists('send_window_message'))
send_window_message($aseco, $message, ($mode == 3));
else
$aseco->client->query('ChatSendServerMessage', $aseco->formatColors($message));
}
} // show_dedirecs
function chat_dedinew($aseco, $command) {
global $dedi_db;
// show only newly driven records
show_dedirecs($aseco, $aseco->server->challenge->name, $aseco->server->challenge->uid, $dedi_db['Challenge']['Records'], $command['author']->login, 0, 0);
} // chat_dedinew
function chat_dedilive($aseco, $command) {
global $dedi_db;
// show online & ShowMinRecs-2 records
show_dedirecs($aseco, $aseco->server->challenge->name, $aseco->server->challenge->uid, $dedi_db['Challenge']['Records'], $command['author']->login, 2, 0);
} // chat_dedilive
function chat_dedipb($aseco, $command) {
global $dedi_db;
$login = $command['author']->login;
$dedi_recs = $dedi_db['Challenge']['Records'];
$found = false;
// find Dedimania record
for ($i = 0; $i < count($dedi_recs); $i++) {
$rec = $dedi_recs[$i];
if ($rec['Login'] == $login && $rec['Game'] ==
($aseco->server->getGame() == 'TMF' ? 'TMU' : $aseco->server->getGame())) {
$score = $rec['Best'];
$rank = $i;
$found = true;
break;
}
}
if ($found) {
$message = formatText($dedi_db['Messages']['PB'][0],
($aseco->server->gameinfo->mode == Gameinfo::STNT ?
$score : formatTime($score)), $rank+1);
$message = $aseco->formatColors($message);
$aseco->client->query('ChatSendServerMessageToLogin', $message, $login);
} else {
$message = $dedi_db['Messages']['PB_NONE'][0];
$message = $aseco->formatColors($message);
$aseco->client->query('ChatSendServerMessageToLogin', $message, $login);
}
} // chat_dedipb
function chat_dedifirst($aseco, $command) {
global $dedi_db;
$dedi_recs = $dedi_db['Challenge']['Records'];
if (!empty($dedi_recs)) {
// get the first Dedimania record
$record = $dedi_recs[0];
// show chat message
$message = formatText($dedi_db['Messages']['FIRST_RECORD'][0])
. formatText($aseco->getChatMessage('RANKING_RECORD_NEW'),
1,
stripColors($record['NickName']),
($aseco->server->gameinfo->mode == Gameinfo::STNT ?
$record['Best'] : formatTime($record['Best'])));
$message = substr($message, 0, strlen($message)-2); // strip trailing ", "
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $command['author']->login);
} else {
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors('{#server}> {#error}No Dedimania records found!'), $command['author']->login);
}
} // chat_dedifirst
function chat_dedilast($aseco, $command) {
global $dedi_db;
$dedi_recs = $dedi_db['Challenge']['Records'];
if ($total = count($dedi_recs)) {
// get the last Dedimania record
$record = $dedi_recs[$total-1];
// show chat message
$message = formatText($dedi_db['Messages']['LAST_RECORD'][0])
. formatText($aseco->getChatMessage('RANKING_RECORD_NEW'),
$total,
stripColors($record['NickName']),
($aseco->server->gameinfo->mode == Gameinfo::STNT ?
$record['Best'] : formatTime($record['Best'])));
$message = substr($message, 0, strlen($message)-2); // strip trailing ", "
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $command['author']->login);
} else {
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors('{#server}> {#error}No Dedimania records found!'), $command['author']->login);
}
} // chat_dedilast
function chat_dedinext($aseco, $command) {
global $dedi_db;
$login = $command['author']->login;
$dedi_recs = $dedi_db['Challenge']['Records'];
if ($total = count($dedi_recs)) {
$found = false;
// find Dedimania record
for ($i = 0; $i < $total; $i++) {
$rec = $dedi_recs[$i];
if ($rec['Login'] == $login && $rec['Game'] ==
($aseco->server->getGame() == 'TMF' ? 'TMU' : $aseco->server->getGame())) {
$rank = $i;
$found = true;
break;
}
}
if ($found) {
// get current and next better Dedimania records
$nextrank = ($rank > 0 ? $rank-1 : 0);
$record = $dedi_recs[$rank];
$next = $dedi_recs[$nextrank];
// compute difference to next record
if ($aseco->server->gameinfo->mode != Gameinfo::STNT) {
$diff = $record['Best'] - $next['Best'];
$sec = floor($diff/1000);
$hun = ($diff - ($sec * 1000)) / 10;
} else { // Stunts mode
$diff = $next['Best'] - $record['Best'];
}
// show chat message
$message1 = formatText($aseco->getChatMessage('RANKING_RECORD_NEW'),
$rank+1,
stripColors($record['NickName']),
($aseco->server->gameinfo->mode == Gameinfo::STNT ?
$record['Best'] : formatTime($record['Best'])));
$message1 = substr($message1, 0, strlen($message1)-2); // strip trailing ", "
$message2 = formatText($aseco->getChatMessage('RANKING_RECORD_NEW'),
$nextrank+1,
stripColors($next['NickName']),
($aseco->server->gameinfo->mode == Gameinfo::STNT ?
$next['Best'] : formatTime($next['Best'])));
$message2 = substr($message2, 0, strlen($message2)-2); // strip trailing ", "
$message = formatText($dedi_db['Messages']['DIFF_RECORD'][0],
$message1, $message2,
($aseco->server->gameinfo->mode == Gameinfo::STNT ?
$diff : sprintf("%d.%02d", $sec, $hun)));
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
} else {
// look for unranked time instead
$order = ($aseco->server->gameinfo->mode == Gameinfo::STNT ? 'DESC' : 'ASC');
$query = 'SELECT score FROM rs_times
WHERE playerID=' . $command['author']->id . ' AND
challengeID=' . $aseco->server->challenge->id . '
ORDER BY score ' . $order . ' LIMIT 1';
$result = mysql_query($query);
if (mysql_num_rows($result) > 0) {
$unranked = mysql_fetch_object($result);
$found = true;
}
mysql_free_result($result);
if ($found) {
// get the last Dedimania record
$last = $dedi_recs[$total-1];
// compute difference to next record
if ($aseco->server->gameinfo->mode != Gameinfo::STNT) {
$sign = ($unranked->score < $last['Best'] ? '-' : '');
$diff = abs($unranked->score - $last['Best']);
$sec = floor($diff/1000);
$hun = ($diff - ($sec * 1000)) / 10;
} else { // Stunts mode
$diff = $last['Best'] - $unranked->score;
}
// show chat message
$message1 = formatText($aseco->getChatMessage('RANKING_RECORD_NEW'),
'PB',
stripColors($command['author']->nickname),
($aseco->server->gameinfo->mode == Gameinfo::STNT ?
$unranked->score : formatTime($unranked->score)));
$message1 = substr($message1, 0, strlen($message1)-2); // strip trailing ", "
$message2 = formatText($aseco->getChatMessage('RANKING_RECORD_NEW'),
$total,
stripColors($last['NickName']),
($aseco->server->gameinfo->mode == Gameinfo::STNT ?
$last['Best'] : formatTime($last['Best'])));
$message2 = substr($message2, 0, strlen($message2)-2); // strip trailing ", "
$message = formatText($dedi_db['Messages']['DIFF_RECORD'][0],
$message1, $message2,
($aseco->server->gameinfo->mode == Gameinfo::STNT ?
$diff : sprintf("%s%d.%02d", $sign, $sec, $hun)));
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
} else {
$message = '{#server}> {#error}You don\'t have Dedimania a record on this track yet... use {#highlite}$i/dedilast';
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
}
}
} else {
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors('{#server}> {#error}No Dedimania records found!'), $login);
}
} // chat_dedinext
function chat_dedidiff($aseco, $command) {
global $dedi_db;
$login = $command['author']->login;
$dedi_recs = $dedi_db['Challenge']['Records'];
if ($total = count($dedi_recs)) {
$found = false;
// find Dedimania record
for ($i = 0; $i < $total; $i++) {
$rec = $dedi_recs[$i];
if ($rec['Login'] == $login && $rec['Game'] ==
($aseco->server->getGame() == 'TMF' ? 'TMU' : $aseco->server->getGame())) {
$rank = $i;
$found = true;
break;
}
}
if ($found) {
// get current and first Dedimania records
$record = $dedi_recs[$rank];
$first = $dedi_recs[0];
// compute difference to first record
if ($aseco->server->gameinfo->mode != Gameinfo::STNT) {
$diff = $record['Best'] - $first['Best'];
$sec = floor($diff/1000);
$hun = ($diff - ($sec * 1000)) / 10;
} else { // Stunts mode
$diff = $first['Best'] - $record['Best'];
}
// show chat message
$message1 = formatText($aseco->getChatMessage('RANKING_RECORD_NEW'),
$rank+1,
stripColors($record['NickName']),
($aseco->server->gameinfo->mode == Gameinfo::STNT ?
$record['Best'] : formatTime($record['Best'])));
$message1 = substr($message1, 0, strlen($message1)-2); // strip trailing ", "
$message2 = formatText($aseco->getChatMessage('RANKING_RECORD_NEW'),
1,
stripColors($first['NickName']),
($aseco->server->gameinfo->mode == Gameinfo::STNT ?
$first['Best'] : formatTime($first['Best'])));
$message2 = substr($message2, 0, strlen($message2)-2); // strip trailing ", "
$message = formatText($dedi_db['Messages']['DIFF_RECORD'][0],
$message1, $message2,
($aseco->server->gameinfo->mode == Gameinfo::STNT ?
$diff : sprintf("%d.%02d", $sec, $hun)));
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
} else {
$message = '{#server}> {#error}You don\'t have a Dedimania record on this track yet... use {#highlite}$i/dedilast';
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
}
} else {
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors('{#server}> {#error}No Dedimania records found!'), $login);
}
} // chat_dedidiff
function chat_dedirange($aseco, $command) {
global $dedi_db;
$dedi_recs = $dedi_db['Challenge']['Records'];
if ($total = count($dedi_recs)) {
// get the first & last Dedimania records
$first = $dedi_recs[0];
$last = $dedi_recs[$total-1];
// compute difference between records
if ($aseco->server->gameinfo->mode != Gameinfo::STNT) {
$diff = $last['Best'] - $first['Best'];
$sec = floor($diff/1000);
$hun = ($diff - ($sec * 1000)) / 10;
} else { // Stunts mode
$diff = $first['Best'] - $last['Best'];
}
// show chat message
$message1 = formatText($aseco->getChatMessage('RANKING_RECORD_NEW'),
1,
stripColors($first['NickName']),
($aseco->server->gameinfo->mode == Gameinfo::STNT ?
$first['Best'] : formatTime($first['Best'])));
$message1 = substr($message1, 0, strlen($message1)-2); // strip trailing ", "
$message2 = formatText($aseco->getChatMessage('RANKING_RECORD_NEW'),
$total,
stripColors($last['NickName']),
($aseco->server->gameinfo->mode == Gameinfo::STNT ?
$last['Best'] : formatTime($last['Best'])));
$message2 = substr($message2, 0, strlen($message2)-2); // strip trailing ", "
$message = formatText($dedi_db['Messages']['DIFF_RECORD'][0],
$message1, $message2,
($aseco->server->gameinfo->mode == Gameinfo::STNT ?
$diff : sprintf("%d.%02d", $sec, $hun)));
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $command['author']->login);
} else {
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors('{#server}> {#error}No Dedimania records found!'), $command['author']->login);
}
} // chat_dedirange
function chat_dedicps($aseco, $command) {
global $dedi_db, $checkpoints; // from plugin.checkpoints.php
$login = $command['author']->login;
if ($aseco->settings['display_checkpoints']) {
if (isset($checkpoints[$login]) && $checkpoints[$login]->loclrec != -1) {
// set Dedimania checkpoints tracking
$param = $command['params'];
if (strtolower($param) == 'off') {
$checkpoints[$login]->dedirec = -1;
$message = '{#server}> {#dedimsg}Dedimania checkpoints tracking: {#highlite}OFF';
}
elseif ($param == '') {
$checkpoints[$login]->dedirec = 0;
$message = '{#server}> {#dedimsg}Dedimania checkpoints tracking: {#highlite}ON {#dedimsg}(your own or the last record)';
}
elseif (is_numeric($param) && $param > 0 && $param <= max($dedi_db['ServerMaxRank'], $command['author']->dedirank)) {
$checkpoints[$login]->dedirec = intval($param);
$message = '{#server}> {#dedimsg}Dedimania checkpoints tracking record: {#highlite}' . $checkpoints[$login]->dedirec;
}
else {
$message = '{#server}> {#error}No such Dedimania record {#highlite}$i ' . $param;
}
} else {
$message = '{#server}> {#error}You must first enable checkpoints tracking with {#highlite}$i /cps';
}
} else {
$message = '{#server}> {#error}Dedimania checkpoints tracking permanently disabled by server';
}
// show chat message
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors($message), $login);
} // chat_dedicps
function chat_dedistats($aseco, $command) {
global $dedi_db;
$login = $command['author']->login;
// compile & display stats message
if ($aseco->server->getGame() == 'TMN') {
$stats = '{#dedimsg}Dedimania$g Stats: {#black}' . stripColors($aseco->server->challenge->name) . LF . LF;
$stats .= '$gServer MaxRank: {#black}$n' . $dedi_db['ServerMaxRank'] . '$m' . LF;
$stats .= '$gYour MaxRank : {#black}$n' . $command['author']->dedirank . '$m' . LF . LF;
$stats .= '$gUID : {#black}$n' . $dedi_db['Challenge']['Uid'] . '$m' . LF;
$stats .= '$gTotal Races : {#black}' . $dedi_db['Challenge']['TotalRaces'] . LF;
$stats .= '$gTotal Players : {#black}' . $dedi_db['Challenge']['TotalPlayers'] . LF;
$stats .= '$gAvg. Players : {#black}' . ($dedi_db['Challenge']['TotalRaces'] > 0 ? round($dedi_db['Challenge']['TotalPlayers'] / $dedi_db['Challenge']['TotalRaces'], 2) : 0);
// display popup message
$aseco->client->query('SendDisplayServerMessageToLogin', $login, $aseco->formatColors($stats), 'OK', '', 0);
} elseif ($aseco->server->getGame() == 'TMF') {
$header = 'Dedimania Stats: {#black}' . stripColors($aseco->server->challenge->name);
$stats = array();
$stats[] = array('Server MaxRank', '{#black}' . $dedi_db['ServerMaxRank']);
$stats[] = array('Your MaxRank', '{#black}' . $command['author']->dedirank);
$stats[] = array();
$stats[] = array('UID', '{#black}' . $dedi_db['Challenge']['Uid']);
$stats[] = array('Total Races', '{#black}' . $dedi_db['Challenge']['TotalRaces']);
$stats[] = array('Total Players', '{#black}' . $dedi_db['Challenge']['TotalPlayers']);
$stats[] = array('Avg. Players', '{#black}' . ($dedi_db['Challenge']['TotalRaces'] > 0 ? round($dedi_db['Challenge']['TotalPlayers'] / $dedi_db['Challenge']['TotalRaces'], 2) : 0));
$stats[] = array();
$stats[] = array(' {#black}$l[http://dedimania.com/tmstats/?do=stat&RecOrder3=RANK-ASC&Uid=' . $dedi_db['Challenge']['Uid'] . '&Show=RECORDS]View all Dedimania records for this track$l');
// display ManiaLink message
display_manialink($login, $header, array('Icons64x64_1', 'Maximize', -0.01), $stats, array(1.0, 0.3, 0.7), 'OK');
}
} // chat_dedistats
function chat_dedicptms($aseco, $command) {
chat_dedisectms($aseco, $command, false);
} // chat_dedicptms
function chat_dedisectms($aseco, $command, $diff = true) {
global $dedi_db;
$player = $command['author'];
$login = $player->login;
$dedi_recs = $dedi_db['Challenge']['Records'];
if (!$total = count($dedi_recs)) {
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors('{#server}> {#error}No Dedimania records found!'), $login);
return;
}
$maxrank = max($dedi_db['ServerMaxRank'], $player->dedirank);
$cpscnt = count($dedi_recs[0]['Checks']);
// display popup window for TMN
if ($aseco->server->getGame() == 'TMN') {
$head = 'Current TOP ' . $maxrank . ' Dedimania ' . ($diff ? 'Sector' : 'CP') . ' Times (' . $cpscnt . '):' . LF;
$cpsmax = 9;
$msg = '';
$lines = 0;
$player->msgs = array();
$player->msgs[0] = 1;
// create list of records
for ($i = 0; $i < $total; $i++) {
$cur_record = $dedi_recs[$i];
$msg .= str_pad($i+1, 2, '0', STR_PAD_LEFT) . '. '
. ((isset($cur_record['NewBest']) && $cur_record['NewBest']) ? '{#black}' : '')
. formatTime($cur_record['Best']);
// append up to $cpsmax sector/CP times
if (!empty($cur_record['Checks'])) {
$j = 1;
$pr = 0;
$msg .= '$n';
foreach ($cur_record['Checks'] as $cp) {
$msg .= ' ' . formatTime($cp - $pr);
if ($diff) $pr = $cp;
if (++$j > $cpsmax) {
if ($cpscnt > $cpsmax) $msg .= ' +';
break;
}
}
$msg .= '$m';
}
$msg .= LF;
if (++$lines > 9) {
$player->msgs[] = $aseco->formatColors($head . $msg);
$lines = 0;
$msg = '';
}
}
// add if last batch exists
if ($msg != '')
$player->msgs[] = $aseco->formatColors($head . $msg);
// display popup message
if (count($player->msgs) == 2) {
$aseco->client->query('SendDisplayServerMessageToLogin', $login, $player->msgs[1], 'OK', '', 0);
} else { // > 2
$aseco->client->query('SendDisplayServerMessageToLogin', $login, $player->msgs[1], 'Close', 'Next', 0);
}
// display ManiaLink window for TMF
} elseif ($aseco->server->getGame() == 'TMF') {
$head = 'Current TOP ' . $maxrank . ' Dedimania ' . ($diff ? 'Sector' : 'CP') . ' Times (' . $cpscnt . '):';
$cpsmax = 12;
// compute widths
$width = 0.1 + 0.18 + min($cpscnt, $cpsmax) * 0.1 + ($cpscnt > $cpsmax ? 0.06 : 0.0);
if ($width < 1.0) $width = 1.0;
$widths = array($width, 0.1, 0.18);
for ($i = 0; $i < min($cpscnt, $cpsmax); $i++)
$widths[] = 0.1; // cp
if ($cpscnt > $cpsmax)
$widths[] = 0.06;
$msg = array();
$lines = 0;
$player->msgs = array();
$player->msgs[0] = array(1, $head, $widths, array('BgRaceScore2', 'Podium'));
// create list of records
for ($i = 0; $i < $total; $i++) {
$cur_record = $dedi_recs[$i];
$line = array();
$line[] = str_pad($i+1, 2, '0', STR_PAD_LEFT) . '.';
$line[] = ((isset($cur_record['NewBest']) && $cur_record['NewBest']) ? '{#black}' : '')
. formatTime($cur_record['Best']);
// append up to $cpsmax sector/CP times
if (!empty($cur_record['Checks'])) {
$j = 1;
$pr = 0;
foreach ($cur_record['Checks'] as $cp) {
$line[] = '$n' . formatTime($cp - $pr);
if ($diff) $pr = $cp;
if (++$j > $cpsmax) {
if ($cpscnt > $cpsmax) $line[] = '+';
break;
}
}
}
$msg[] = $line;
if (++$lines > 14) {
$player->msgs[] = $msg;
$lines = 0;
$msg = array();
}
}
// add if last batch exists
if (!empty($msg))
$player->msgs[] = $msg;
// display ManiaLink message
display_manialink_multi($player);
// show chat message for TMO & TMS
} else {
$msg = $aseco->formatColors('{#server}> {#error}No Dedimania ' . ($diff ? 'sector' : 'CP') . ' times available');
$aseco->client->query('ChatSendServerMessageToLogin', $msg, $login);
}
} // chat_dedisectms
?>