docker-tmserver/xaseco/plugins/mistral.idlekick.php

176 lines
6.5 KiB
PHP
Raw Normal View History

2022-06-26 17:43:44 +02:00
<?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
?>