From 16394a6532e09837de1dd41c1b13e27e121ad2b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steffen=20Schro=CC=88der?= Date: Tue, 20 May 2014 22:32:38 +0200 Subject: [PATCH] dynamic point limit plugin overhaul+improvements moved into MCTeam namespace --- .../MCTeam/DynamicPointlimitPlugin.php | 186 ++++++++++++++ .../plugins/TheM/DynamicPointlimitPlugin.php | 227 ------------------ 2 files changed, 186 insertions(+), 227 deletions(-) create mode 100644 application/plugins/MCTeam/DynamicPointlimitPlugin.php delete mode 100644 application/plugins/TheM/DynamicPointlimitPlugin.php diff --git a/application/plugins/MCTeam/DynamicPointlimitPlugin.php b/application/plugins/MCTeam/DynamicPointlimitPlugin.php new file mode 100644 index 00000000..2b678fd5 --- /dev/null +++ b/application/plugins/MCTeam/DynamicPointlimitPlugin.php @@ -0,0 +1,186 @@ + + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + */ +class DynamicPointLimitPlugin implements CallbackListener, CommandListener, Plugin { + /* + * Constants + */ + const ID = 21; + const VERSION = 0.2; + const NAME = 'Dynamic Point Limit Plugin'; + const AUTHOR = 'MCTeam'; + + const SETTING_POINT_LIMIT_MULTIPLIER = 'Point Limit Multiplier'; + const SETTING_POINT_LIMIT_OFFSET = 'Point Limit Offset'; + const SETTING_MIN_POINT_LIMIT = 'Minimum Point Limit'; + const SETTING_MAX_POINT_LIMIT = 'Maximum Point Limit'; + const SETTING_ACCEPT_OTHER_MODES = 'Activate in other Modes than Royal'; + + const CACHE_SPEC_STATUS = 'SpecStatus'; + + /* + * Private properties + */ + /** @var ManiaControl $maniaControl */ + private $maniaControl = null; + private $lastPointLimit = null; + + /** + * @see \ManiaControl\Plugins\Plugin::prepare() + */ + public static function prepare(ManiaControl $maniaControl) { + $maniaControl->settingManager->initSetting(get_class(), self::SETTING_POINT_LIMIT_MULTIPLIER, 10); + $maniaControl->settingManager->initSetting(get_class(), self::SETTING_POINT_LIMIT_OFFSET, 0); + $maniaControl->settingManager->initSetting(get_class(), self::SETTING_MIN_POINT_LIMIT, 30); + $maniaControl->settingManager->initSetting(get_class(), self::SETTING_MAX_POINT_LIMIT, 200); + $maniaControl->settingManager->initSetting(get_class(), self::SETTING_ACCEPT_OTHER_MODES, false); + } + + /** + * @see \ManiaControl\Plugins\Plugin::getId() + */ + public static function getId() { + return self::ID; + } + + /** + * @see \ManiaControl\Plugins\Plugin::getName() + */ + public static function getName() { + return self::NAME; + } + + /** + * @see \ManiaControl\Plugins\Plugin::getVersion() + */ + public static function getVersion() { + return self::VERSION; + } + + /** + * @see \ManiaControl\Plugins\Plugin::getAuthor() + */ + public static function getAuthor() { + return self::AUTHOR; + } + + /** + * @see \ManiaControl\Plugins\Plugin::getDescription() + */ + public static function getDescription() { + return 'Plugin offering a dynamic Point Limit according to the Number of Players on the Server.'; + } + + /** + * @see \ManiaControl\Plugins\Plugin::load() + */ + public function load(ManiaControl $maniaControl) { + $this->maniaControl = $maniaControl; + + $allowOthers = $this->maniaControl->settingManager->getSettingValue($this, self::SETTING_ACCEPT_OTHER_MODES); + if (!$allowOthers && $this->maniaControl->server->titleId != 'SMStormRoyal@nadeolabs') { + $error = 'This plugin only supports Royal (check Settings)!'; + throw new \Exception($error); + } + + $this->maniaControl->callbackManager->registerCallbackListener(PlayerManager::CB_PLAYERCONNECT, $this, 'updatePointLimit'); + $this->maniaControl->callbackManager->registerCallbackListener(PlayerManager::CB_PLAYERDISCONNECT, $this, 'updatePointLimit'); + $this->maniaControl->callbackManager->registerCallbackListener(PlayerManager::CB_PLAYERINFOCHANGED, $this, 'handlePlayerInfoChangedCallback'); + + $this->maniaControl->callbackManager->registerCallbackListener(Callbacks::BEGINROUND, $this, 'updatePointLimit'); + $this->maniaControl->callbackManager->registerCallbackListener(SettingManager::CB_SETTING_CHANGED, $this, 'handleSettingChangedCallback'); + + $players = $this->maniaControl->playerManager->getPlayers(); + foreach ($players as $player) { + /** @var Player $player */ + $player->setCache($this, self::CACHE_SPEC_STATUS, $player->isSpectator); + } + + $this->updatePointLimit(); + } + + /** + * Update Point Limit + */ + public function updatePointLimit() { + $numberOfPlayers = $this->maniaControl->playerManager->getPlayerCount(); + + $multiplier = $this->maniaControl->settingManager->getSettingValue($this, self::SETTING_POINT_LIMIT_MULTIPLIER); + $offset = $this->maniaControl->settingManager->getSettingValue($this, self::SETTING_POINT_LIMIT_OFFSET); + $minValue = $this->maniaControl->settingManager->getSettingValue($this, self::SETTING_MIN_POINT_LIMIT); + $maxValue = $this->maniaControl->settingManager->getSettingValue($this, self::SETTING_MAX_POINT_LIMIT); + + $pointLimit = ($numberOfPlayers * $multiplier) + $offset; + + if ($pointLimit < $minValue) { + $pointLimit = $minValue; + } + if ($pointLimit > $maxValue) { + $pointLimit = $maxValue; + } + + if ($this->lastPointLimit != $pointLimit) { + $this->maniaControl->client->setModeScriptSettings(array('S_MapPointsLimit' => $pointLimit)); + + $message = "Dynamic PointLimit changed to: {$pointLimit}!"; + if ($this->lastPointLimit !== null) { + $message .= " (From {$this->lastPointLimit})"; + } + $this->maniaControl->chat->sendChat($message); + + $this->lastPointLimit = $pointLimit; + } + } + + /** + * @see \ManiaControl\Plugins\Plugin::unload() + */ + public function unload() { + } + + /** + * Handle Setting Changed Callback + * + * @param Setting $setting + */ + public function handleSettingChangedCallback(Setting $setting) { + if (!$setting->belongsToClass($this)) { + return; + } + + $this->updatePointLimit(); + } + + /** + * Handle Player Info Changed Callback + * + * @param Player $player + */ + public function handlePlayerInfoChangedCallback(Player $player) { + $lastSpecStatus = $player->getCache($this, self::CACHE_SPEC_STATUS); + $newSpecStatus = $player->isSpectator; + if ($newSpecStatus === $lastSpecStatus && $lastSpecStatus !== null) { + return; + } + $player->setCache($this, self::CACHE_SPEC_STATUS, $newSpecStatus); + $this->updatePointLimit(); + } +} diff --git a/application/plugins/TheM/DynamicPointlimitPlugin.php b/application/plugins/TheM/DynamicPointlimitPlugin.php deleted file mode 100644 index dd25059f..00000000 --- a/application/plugins/TheM/DynamicPointlimitPlugin.php +++ /dev/null @@ -1,227 +0,0 @@ -settingManager->initSetting(get_class(), self::ACCEPT_OTHER_MODES, false); - $maniaControl->settingManager->initSetting(get_class(), self::DYNPNT_MULTIPLIER, 10); - $maniaControl->settingManager->initSetting(get_class(), self::DYNPNT_OFFSET, 0); - $maniaControl->settingManager->initSetting(get_class(), self::DYNPNT_MIN, 30); - $maniaControl->settingManager->initSetting(get_class(), self::DYNPNT_MAX, 200); - } - - /** - * Private properties - */ - /** @var ManiaControl $maniaControl */ - private $maniaControl = null; - // Added to check if status of player changed - private $specStatus = array(); - - /** - * Load the plugin - * - * @param \ManiaControl\ManiaControl $maniaControl - * @throws \Exception - * @return bool - */ - public function load(ManiaControl $maniaControl) { - $this->maniaControl = $maniaControl; - - $allowOthers = $this->maniaControl->settingManager->getSettingValue($this, self::ACCEPT_OTHER_MODES); - if (!$allowOthers && $this->maniaControl->server->titleId != 'SMStormRoyal@nadeolabs') { - $error = 'This plugin only supports Royal (check Settings)!'; - throw new \Exception($error); - } - - $this->maniaControl->callbackManager->registerCallbackListener(PlayerManager::CB_PLAYERCONNECT, $this, 'changePointlimit'); - $this->maniaControl->callbackManager->registerCallbackListener(PlayerManager::CB_PLAYERDISCONNECT, $this, 'changePointlimit'); - // added to check if player enters or leaves specmode - $this->maniaControl->callbackManager->registerCallbackListener(CallbackManager::CB_MP_PLAYERINFOCHANGED, $this, 'checkStatus'); - // added to check if scriptsettings have changed and act on it. - $this->maniaControl->callbackManager->registerCallbackListener(SettingManager::CB_SETTING_CHANGED, $this, 'handleSettingChangedCallback'); - // Added to add additional pointslimit check on beginning of the round. - $this->maniaControl->callbackManager->registerCallbackListener(CallbackManager::CB_MP_MODESCRIPTCALLBACK, $this, 'handleCallbacks'); - $this->maniaControl->callbackManager->registerCallbackListener(CallbackManager::CB_MP_MODESCRIPTCALLBACKARRAY, $this, 'handleCallbacks'); - - // Added to fill variable with current player status - foreach($this->maniaControl->playerManager->getPlayers() as $player) { - if ($player->isSpectator) { - $this->specStatus[$player->login]=1; - } else { - $this->specStatus[$player->login]=0; - } - } - $this->changePointlimit(); - } - - /** - * Unload the plugin and its resources - */ - public function unload() { - } - - /** - * Get plugin id - * - * @return int - */ - public static function getId() { - return self::ID; - } - - /** - * Get Plugin Name - * - * @return string - */ - public static function getName() { - return 'Dynamic Pointlimit Plugin'; - } - - /** - * Get Plugin Version - * - * @return float - */ - public static function getVersion() { - return self::VERSION; - } - - /** - * Get Plugin Author - * - * @return string - */ - public static function getAuthor() { - return 'TheM'; - } - - /** - * Get Plugin Description - * - * @return string - */ - public static function getDescription() { - return 'Plugin offers a dynamic pointlimit according to the amount of players on the server.'; - } - - // Handle Beginround - public function handleCallbacks(array $callback) { - $callbackName = $callback[1][0]; - switch($callbackName) { - - // ROYAL - case 'LibXmlRpc_BeginRound': - - $this->changePointlimit(); - break; - } - - } - - // handle scriptsettings changes - public function handleSettingChangedCallback($settingClass) { - if ($settingClass !== get_class()) { - return; - } - $this->changePointlimit(); - } - - public function checkStatus(array $callback) { - if(!$this->mode) return; - $specStatus = $callback[1][0]["SpectatorStatus"]; - $login = $callback[1][0]['Login']; - //$this->maniaControl->chat->sendChat('$<$fffSpectatus of '.$login.'is '.$specStatus.' $> '.$pointlimit); - $player = $this->maniaControl->playerManager->getPlayer($login); - if(isset($this->specStatus)) - { - if($this->specStatus[$login] != $specStatus) - { - $this->changePointlimit(); - } - } - } - /** - * Function called on player connect and disconnect, changing the pointlimit. - * - * @param Player $player - */ - public function changePointlimit() { - $numberOfPlayers = 0; - $numberOfSpectators = 0; - - - /** @var Player $player */ - foreach($this->maniaControl->playerManager->getPlayers() as $player) { - if ($player->isSpectator) { - $this->specStatus[$player->login]=1; // used for player status changes - $numberOfSpectators++; - } else { - $numberOfPlayers++; - $this->specStatus[$player->login]=0; // used for player status changes - } - } - - $pointlimit = ($numberOfPlayers * $this->maniaControl->settingManager->getSettingValue($this, self::DYNPNT_MULTIPLIER)) + $this->maniaControl->settingManager->getSettingValue($this, self::DYNPNT_OFFSET); - - $min_value = $this->maniaControl->settingManager->getSettingValue($this, self::DYNPNT_MIN); - $max_value = $this->maniaControl->settingManager->getSettingValue($this, self::DYNPNT_MAX); - if ($pointlimit < $min_value) { - $pointlimit = $min_value; - } - if ($pointlimit > $max_value) { - $pointlimit = $max_value; - } - // added to only change the pointlimit if it needs changing - $setting = $this->maniaControl->client->getModeScriptSettings(); // get current pointlimit - $old = $setting['S_MapPointsLimit']; - - if ( $old != $pointlimit) - { - try{ - $this->maniaControl->client->setModeScriptSettings(array('S_MapPointsLimit' => $pointlimit)); - }catch(FaultException $e){ - } - - $this->maniaControl->chat->sendChat('$<$fffPointlimit changed to : $> '.$pointlimit ." (was $old)"); // notice about pointlimit change - } - - } -}