Here is the unedited code. It's the newest from XAseco 1.06.
Code: Select all
<?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, $resetOnChat, $resetOnCheckpoint, $resetOnFinish, $idlekickStart, $idlekick_log, $idlekick_debug;
$kickPlayAfter = 2; // Player idle this number of challenges and get kicked
$kickSpecAfter = 4; // Spectator idle this number of challenges and get kicked
$kickSpecToo = true; // Kick spectators too
$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: " . $player->login . " reset on chat");
} // 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: " . $player->login . " reset on checkpoint");
} // 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: " . $player->login . " reset on finish");
} // 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: " . $player->login . " set to " . $player->mistral['idleCount']);
}
} // kickIdleNewChallenge
// called @ onPlayerConnect
function kickIdleInit($aseco, $player) {
global $idlekick_debug;
$player->mistral['idleCount'] = 0;
if ($idlekick_debug)
$aseco->console("Idlekick: " . $player->login . " initialised with 0");
} // kickIdleInit
// called @ onEndRace
function kickIdlePlayers($aseco, $data) {
global $kickPlayAfter, $kickSpecAfter, $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)) {
if ($spec) {
// log console message
$aseco->console("Idlekick spectator: " . $player->login . " after " . $kickSpecAfter . " challenge(s) without action.");
$message = formatText($aseco->getChatMessage('IDLEKICK_SPEC'),
$player->nickname,
$kickSpecAfter, ($kickSpecAfter == 1 ? '' : 's'));
} else {
// log console message
$aseco->console("Idlekick player: " . $player->login . " after " . $kickPlayAfter . " challenge(s) without action.");
$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
$aseco->client->query('Kick', $player->login);
}
elseif ($idlekick_debug)
$aseco->console("Idlekick: " . $player->login . " current value is " . $player->mistral['idleCount']);
}
} // kickIdlePlayers
?>
But it doesn't seem to send them to spectate. I even tried copying the whole section of ForceSpectator from admin.chat.php, and even aseco.php. So I'm quite stuck on what else to do to make this work. Seeing as how 'ForceSpectator' is an aseco function just like 'Kick'.