176 lines
6.5 KiB
PHP
176 lines
6.5 KiB
PHP
|
<?php
|
||
|
/* vim: set noexpandtab tabstop=2 softtabstop=2 shiftwidth=2: */
|
||
|
|
||
|
/****************************************************************************
|
||
|
*
|
||
|
* (X)ASECO plugin to kick idle players
|
||
|
*
|
||
|
* (C) 2007 by Mistral
|
||
|
* Updated by Xymph
|
||
|
*
|
||
|
* Dependencies: none
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
|
||
|
Aseco::registerEvent('onNewChallenge', 'kickIdleNewChallenge');
|
||
|
Aseco::registerEvent('onPlayerConnect', 'kickIdleInit');
|
||
|
Aseco::registerEvent('onChat', 'kickIdleChat');
|
||
|
Aseco::registerEvent('onCheckpoint', 'kickIdleCheckpoint');
|
||
|
Aseco::registerEvent('onPlayerFinish', 'kickIdleFinish');
|
||
|
Aseco::registerEvent('onEndRace', 'kickIdlePlayers');
|
||
|
|
||
|
global $kickPlayAfter, $kickSpecAfter, $kickSpecToo, $specPlayFirst, $resetOnChat,
|
||
|
$resetOnCheckpoint, $resetOnFinish, $idlekickStart, $idlekick_log, $idlekick_debug;
|
||
|
|
||
|
$kickPlayAfter = 2; // Player idle this number of challenges and get kicked or specced
|
||
|
$kickSpecAfter = 4; // Spectator idle this number of challenges and get kicked
|
||
|
$kickSpecToo = true; // Kick spectators too
|
||
|
$specPlayFirst = false; // Set idle player to spectator first instead of kick (TMF only)
|
||
|
$resetOnChat = true; // Reset idle counter on chat use
|
||
|
$resetOnCheckpoint = true; // Reset idle counter when passing a checkpoint
|
||
|
$resetOnFinish = false; // Reset idle counter when reaching the finish
|
||
|
// don't use OnFinish in rounds or team mode, because every player will "finish"
|
||
|
|
||
|
// don't touch:
|
||
|
$idlekickStart = true;
|
||
|
$idlekick_log = false;
|
||
|
$idlekick_debug = false;
|
||
|
|
||
|
// called @ onChat
|
||
|
function kickIdleChat($aseco, $chat) {
|
||
|
global $resetOnChat, $idlekick_debug;
|
||
|
|
||
|
// if server message, bail out immediately
|
||
|
if ($chat[0] == $aseco->server->id) return;
|
||
|
|
||
|
// if no check on chat use, bail out too
|
||
|
if (!$resetOnChat) return;
|
||
|
|
||
|
$player = $aseco->server->players->getPlayer($chat[1]);
|
||
|
$player->mistral['idleCount'] = 0;
|
||
|
if ($idlekick_debug)
|
||
|
$aseco->console('Idlekick: {1} reset on chat', $player->login);
|
||
|
} // kickIdleChat
|
||
|
|
||
|
// called @ onCheckpoint
|
||
|
function kickIdleCheckpoint($aseco, $checkpt) {
|
||
|
global $resetOnCheckpoint, $idlekick_debug;
|
||
|
|
||
|
// if no check on checkpoints, bail out
|
||
|
if (!$resetOnCheckpoint) return;
|
||
|
|
||
|
$player = $aseco->server->players->getPlayer($checkpt[1]);
|
||
|
$player->mistral['idleCount'] = 0;
|
||
|
if ($idlekick_debug)
|
||
|
$aseco->console('Idlekick: {1} reset on checkpoint', $player->login);
|
||
|
} // kickIdleCheckpoint
|
||
|
|
||
|
// called @ onPlayerFinish
|
||
|
function kickIdleFinish($aseco, $finish_item) {
|
||
|
global $resetOnFinish, $idlekick_debug;
|
||
|
|
||
|
// if no check on finishes, bail out
|
||
|
if (!$resetOnFinish) return;
|
||
|
|
||
|
$player = $finish_item->player;
|
||
|
$player->mistral['idleCount'] = 0;
|
||
|
if ($idlekick_debug)
|
||
|
$aseco->console('Idlekick: {1} reset on finish', $player->login);
|
||
|
} // kickIdleFinish
|
||
|
|
||
|
// called @ onNewChallenge
|
||
|
function kickIdleNewChallenge($aseco, $challenge) {
|
||
|
global $kickSpecToo, $idlekickStart, $idlekick_debug, $idlekick_log;
|
||
|
|
||
|
if ($idlekickStart) {
|
||
|
$idlekickStart = false;
|
||
|
if ($idlekick_debug)
|
||
|
$aseco->console('Idlekick: idlekickStart set to false');
|
||
|
foreach ($aseco->server->players->player_list as $player)
|
||
|
kickIdleInit($aseco, $player);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
foreach ($aseco->server->players->player_list as $player) {
|
||
|
// get player status
|
||
|
$spec = $aseco->isSpectator($player);
|
||
|
|
||
|
// check for admin immunity
|
||
|
if ($spec ? $aseco->allowAbility($player, 'noidlekick_spec')
|
||
|
: $aseco->allowAbility($player, 'noidlekick_play'))
|
||
|
continue; // go check next player
|
||
|
|
||
|
// check for spectator kicking
|
||
|
if ($kickSpecToo || !$spec)
|
||
|
$player->mistral['idleCount']++;
|
||
|
if ($idlekick_log)
|
||
|
$aseco->console('Idlekick: {1} set to {2}', $player->login, $player->mistral['idleCount']);
|
||
|
}
|
||
|
} // kickIdleNewChallenge
|
||
|
|
||
|
// called @ onPlayerConnect
|
||
|
function kickIdleInit($aseco, $player) {
|
||
|
global $idlekick_debug;
|
||
|
|
||
|
$player->mistral['idleCount'] = 0;
|
||
|
if ($idlekick_debug)
|
||
|
$aseco->console('Idlekick: {1} initialised with 0', $player->login);
|
||
|
} // kickIdleInit
|
||
|
|
||
|
// called @ onEndRace
|
||
|
function kickIdlePlayers($aseco, $data) {
|
||
|
global $kickPlayAfter, $kickSpecAfter, $specPlayFirst, $idlekick_debug;
|
||
|
|
||
|
foreach ($aseco->server->players->player_list as $player) {
|
||
|
$spec = $aseco->isSpectator($player);
|
||
|
// check for spectator or player challenge counts
|
||
|
if ($player->mistral['idleCount'] == ($spec ? $kickSpecAfter
|
||
|
: $kickPlayAfter)) {
|
||
|
$dokick = false;
|
||
|
if ($spec) {
|
||
|
$dokick = true;
|
||
|
// log console message
|
||
|
$aseco->console('IdleKick spectator: {1} after {2} challenge(s) without action', $player->login, $kickSpecAfter);
|
||
|
$message = formatText($aseco->getChatMessage('IDLEKICK_SPEC'),
|
||
|
$player->nickname,
|
||
|
$kickSpecAfter, ($kickSpecAfter == 1 ? '' : 's'));
|
||
|
} else {
|
||
|
if ($aseco->server->getGame() == 'TMF' && $specPlayFirst) {
|
||
|
// log console message
|
||
|
$aseco->console('IdleSpec player: {1} after {2} challenge(s) without action', $player->login, $kickPlayAfter);
|
||
|
$message = formatText($aseco->getChatMessage('IDLESPEC_PLAY'),
|
||
|
$player->nickname,
|
||
|
$kickPlayAfter, ($kickPlayAfter == 1 ? '' : 's'));
|
||
|
|
||
|
// force player into spectator
|
||
|
$rtn = $aseco->client->query('ForceSpectator', $player->login, 1);
|
||
|
if (!$rtn) {
|
||
|
trigger_error('[' . $aseco->client->getErrorCode() . '] ForceSpectator - ' . $aseco->client->getErrorMessage(), E_USER_WARNING);
|
||
|
} else {
|
||
|
// allow spectator to switch back to player
|
||
|
$rtn = $aseco->client->query('ForceSpectator', $player->login, 0);
|
||
|
}
|
||
|
|
||
|
// force free camera mode on spectator
|
||
|
$aseco->client->addCall('ForceSpectatorTarget', array($player->login, '', 2));
|
||
|
} else {
|
||
|
$dokick = true;
|
||
|
// log console message
|
||
|
$aseco->console('IdleKick player: {1} after {2} challenge(s) without action', $player->login, $kickPlayAfter);
|
||
|
$message = formatText($aseco->getChatMessage('IDLEKICK_PLAY'),
|
||
|
$player->nickname,
|
||
|
$kickPlayAfter, ($kickPlayAfter == 1 ? '' : 's'));
|
||
|
}
|
||
|
}
|
||
|
// show chat message
|
||
|
$aseco->client->query('ChatSendServerMessage', $aseco->formatColors($message));
|
||
|
// kick idle player
|
||
|
if ($dokick)
|
||
|
$aseco->client->query('Kick', $player->login);
|
||
|
}
|
||
|
elseif ($idlekick_debug)
|
||
|
$aseco->console('Idlekick: {1} current value is {2}', $player->login, $player->mistral['idleCount']);
|
||
|
}
|
||
|
} // kickIdlePlayers
|
||
|
?>
|