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

142 lines
4.8 KiB
PHP

<?php
/* vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2: */
/**
* Chat plugin.
* Displays main list of players.
* Updated by Xymph
*
* Dependencies: none
*/
Aseco::addChatCommand('players', 'Displays current list of nicks/logins');
// handles action id's "2001"-"2200" for /stats
Aseco::registerEvent('onPlayerManialinkPageAnswer', 'event_players');
function chat_players($aseco, $command) {
// use only first parameter
$command['params'] = explode(' ', $command['params'], 2);
$player = $command['author'];
$player->playerlist = array();
if ($aseco->server->getGame() == 'TMN') {
$head = 'Players On This Server:' . LF . 'Id {#nick}Nick $g/{#login} Login $g/{#black} $nNation$m'. LF;
$msg = '';
$pid = 1;
$lines = 0;
$player->msgs = array();
$player->msgs[0] = 1;
// create list of players, optionally by (sub)string
foreach ($aseco->server->players->player_list as $pl) {
if (strlen($command['params'][0]) == 0 ||
stripos(stripColors($pl->nickname), $command['params'][0]) !== false ||
stripos($pl->login, $command['params'][0]) !== false) {
$plarr = array();
$plarr['login'] = $pl->login;
$player->playerlist[] = $plarr;
$msg .= '$g' . str_pad($pid, 2, '0', STR_PAD_LEFT) . '. {#black}' .
str_ireplace('$w', '', $pl->nickname) . '$z / ' .
($aseco->isAnyAdmin($pl) ? '{#logina}' : '{#login}') . $pl->login .
'$g / {#black}$n' . $pl->nation . '$m' . LF;
$pid++;
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', $player->login, $player->msgs[1], 'OK', '', 0);
} elseif (count($player->msgs) > 2) {
$aseco->client->query('SendDisplayServerMessageToLogin', $player->login, $player->msgs[1], 'Close', 'Next', 0);
} else { // == 1
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors('{#server}> {#error}No player(s) found!'), $player->login);
}
} elseif ($aseco->server->getGame() == 'TMF') {
$head = 'Players On This Server:';
$msg = array();
$msg[] = array('Id', '{#nick}Nick $g/{#login} Login', '{#black}Nation');
$pid = 1;
$lines = 0;
$player->msgs = array();
$player->msgs[0] = array(1, $head, array(1.3, 0.1, 0.9, 0.3), array('Icons128x128_1', 'Buddies'));
// create list of players, optionally by (sub)string
foreach ($aseco->server->players->player_list as $pl) {
if (strlen($command['params'][0]) == 0 ||
stripos(stripColors($pl->nickname), $command['params'][0]) !== false ||
stripos($pl->login, $command['params'][0]) !== false) {
$plarr = array();
$plarr['login'] = $pl->login;
$player->playerlist[] = $plarr;
// format nickname & login
$ply = '{#black}' . $pl->nickname . '$z / ' .
($aseco->isAnyAdmin($pl) ? '{#logina}' : '{#login}') . $pl->login;
// add clickable button
if ($aseco->settings['clickable_lists'] && $pid <= 200)
$ply = array($ply, $pid+2000); // action id
$nat = $pl->nation;
if (strlen($nat) > 14)
$nat = mapCountry($nat);
$msg[] = array(str_pad($pid, 2, '0', STR_PAD_LEFT) . '.',
$ply, '{#black}' . $nat);
$pid++;
if (++$lines > 14) {
$player->msgs[] = $msg;
$lines = 0;
$msg = array();
$msg[] = array('Id', '{#nick}Nick $g/{#login} Login', '{#black}Nation');
}
}
}
// add if last batch exists
if (count($msg) > 1)
$player->msgs[] = $msg;
// display ManiaLink message
if (count($player->msgs) > 1) {
display_manialink_multi($player);
} else { // == 1
$aseco->client->query('ChatSendServerMessageToLogin', $aseco->formatColors('{#server}> {#error}No player(s) found!'), $player->login);
}
}
} // chat_players
// called @ onPlayerManialinkPageAnswer
// Handles ManiaLink player responses
// [0]=PlayerUid, [1]=Login, [2]=Answer
function event_players($aseco, $answer) {
// leave actions outside 2001 - 2200 to other handlers
if ($answer[2] >= 2001 && $answer[2] <= 2200) {
// get player
$player = $aseco->server->players->getPlayer($answer[1]);
$target = $player->playerlist[$answer[2]-2001]['login'];
// log clicked command
$aseco->console('player {1} clicked command "/stats {2}"',
$player->login, $target);
// close main window because /stats can take a while
mainwindow_off($aseco, $player->login);
// /stats selected player
$command = array();
$command['author'] = $player;
$command['params'] = $target;
chat_stats($aseco, $command);
}
} // event_players
?>