maniaControl->getChat()->sendErrorToAdmins('MatchManager Core is needed to use MatchManager Ready Button plugin. Install it and restart Maniacontrol'); Logger::logError('MatchManager Core is needed to use MatchManager Ready Button plugin. Install it and restart Maniacontrol'); return false; } use MatchManagerSuite\MatchManagerCore; /** * MatchManager Widgets * * @author Beu (based on MatchManagerWidget by jonthekiller) * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class MatchManagerReadyButton implements ManialinkPageAnswerListener, CommandListener, CallbackListener, Plugin { /* * Constants */ const PLUGIN_ID = 199; const PLUGIN_VERSION = 1.0; const PLUGIN_NAME = 'MatchManager Ready Button'; const PLUGIN_AUTHOR = 'Beu'; // MatchManagerWidget Properties const MATCHMANAGERCORE_PLUGIN = 'MatchManagerSuite\MatchManagerCore'; const ACTION_READY = 'ReadyButton.Action'; const MLID_MATCH_READY_WIDGET = 'Ready ButtonWidget'; const SETTING_MATCH_READY_MODE = 'Ready Button'; const SETTING_MATCH_READY_NBPLAYERS = 'Ready Button-Minimal number of players before start'; const SETTING_MATCH_READY_POSX = 'Ready Button-Position: X'; const SETTING_MATCH_READY_POSY = 'Ready Button-Position: Y'; /* * Private properties */ /** @var ManiaControl $maniaControl */ private $maniaControl = null; private $chatprefix = '$<$fc3$w🏆$m$> '; // Would like to create a setting but MC database doesn't support utf8mb4 private $playersreadystate = array(); private $MLisReady = null; private $MLisNotReady = null; /** * @param \ManiaControl\ManiaControl $maniaControl * @see \ManiaControl\Plugins\Plugin::prepare() */ public static function prepare(ManiaControl $maniaControl) { } /** * @see \ManiaControl\Plugins\Plugin::getId() */ public static function getId() { return self::PLUGIN_ID; } /** * @see \ManiaControl\Plugins\Plugin::getName() */ public static function getName() { return self::PLUGIN_NAME; } /** * @see \ManiaControl\Plugins\Plugin::getVersion() */ public static function getVersion() { return self::PLUGIN_VERSION; } /** * @see \ManiaControl\Plugins\Plugin::getAuthor() */ public static function getAuthor() { return self::PLUGIN_AUTHOR; } /** * @see \ManiaControl\Plugins\Plugin::getDescription() */ public static function getDescription() { return 'Add a button for players to get ready and start the game automatically'; } /** * @param \ManiaControl\ManiaControl $maniaControl * @return bool * @see \ManiaControl\Plugins\Plugin::load() */ public function load(ManiaControl $maniaControl) { $this->maniaControl = $maniaControl; $this->MatchManagerCore = $this->maniaControl->getPluginManager()->getPlugin(self::MATCHMANAGERCORE_PLUGIN); if ($this->MatchManagerCore == Null) { throw new \Exception('MatchManager Core is needed to use MatchManager Ready Button plugin'); } $this->maniaControl->getCommandManager()->registerCommandListener('ready', $this, 'onCommandSetReadyPlayer', false, 'Change status to Ready.'); $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_MATCH_READY_MODE, false, "Activate Ready widget"); $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_MATCH_READY_NBPLAYERS, 2, "Minimal number of players to start a match if all are ready"); $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_MATCH_READY_POSX, 152.5, "Position of the Ready widget (on X axis)"); $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_MATCH_READY_POSY, 40, "Position of the Ready widget (on Y axis)"); $this->maniaControl->getCallbackManager()->registerCallbackListener(SettingManager::CB_SETTING_CHANGED, $this, 'updateSettings'); $this->maniaControl->getCallbackManager()->registerCallbackListener(PlayerManager::CB_PLAYERDISCONNECT, $this, 'handlePlayerDisconnect'); $this->maniaControl->getCallbackManager()->registerCallbackListener(PlayerManager::CB_PLAYERINFOCHANGED, $this, 'displayReadyWidgetIfNeeded'); // Register ManiaLink Pages $this->maniaControl->getManialinkManager()->registerManialinkPageAnswerListener(self::ACTION_READY, $this, 'handleReady'); $this->updateManialinks(); $this->displayReadyWidgetIfNeeded(); return true; } /** * @see \ManiaControl\Plugins\Plugin::unload() */ public function unload() { $this->closeReadyWidget(); } /** * Generate Manialinks variables */ public function getPlayersReadyState() { return $this->playersreadystate; } /** * Update on Setting Changes * * @param Setting $setting */ public function updateSettings(Setting $setting) { if ($setting->belongsToClass($this)) { $this->updateManialinks(); $this->StartMatchIfNeeded(); } } /** * Start match if needed * * @param Player $player or null */ private function StartMatchIfNeeded($player = null) { if ($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_READY_MODE) && !$this->MatchManagerCore->getMatchStatus()) { $nbplayers = $this->maniaControl->getPlayerManager()->getPlayerCount(); if ($nbplayers >= $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_READY_NBPLAYERS)) { $nbready = 0; foreach ($this->playersreadystate as $readystate) { if ($readystate == 1) { $nbready++; } } if ($nbready >= $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_READY_NBPLAYERS)) { $this->playersreadystate = array(); $this->closeReadyWidget(); Logger::log('Start Match via Ready Button'); $this->MatchManagerCore->MatchStart(); return; } } $this->displayReadyWidgetIfNeeded($player); } } /** * Display (or not) the Ready Widget * * @param string $login */ public function displayReadyWidgetIfNeeded($player = null) { if ($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_READY_MODE) && !$this->MatchManagerCore->getMatchStatus()) { if ($player == null) { $players = $this->maniaControl->getPlayerManager()->getPlayers(true,true); } else { $players = array($player); } foreach ($players as $player) { if ($player->isSpectator && isset($this->playersreadystate[$player->login])) { unset($this->playersreadystate[$player->login]); $this->closeReadyWidget($player->login); } else if (!$player->isSpectator && !isset($this->playersreadystate[$player->login])) { $this->playersreadystate[$player->login] = 0; $this->maniaControl->getManialinkManager()->sendManialink($this->MLisNotReady, $player->login); } else if (!$player->isSpectator && isset($this->playersreadystate[$player->login])) { if ($this->playersreadystate[$player->login] == 1) { $this->maniaControl->getManialinkManager()->sendManialink($this->MLisReady, $player->login); } else { $this->maniaControl->getManialinkManager()->sendManialink($this->MLisNotReady, $player->login); } } } } else { $this->playersreadystate = array(); $this->closeReadyWidget(); } } /** * Close Ready Widget * * @param string $login */ public function closeReadyWidget($login = null) { $this->maniaControl->getManialinkManager()->hideManialink(self::MLID_MATCH_READY_WIDGET, $login); } /** * Handle when a player disconnects * * @param \ManiaControl\Players\Player $player */ public function handlePlayerDisconnect(Player $player) { if (isset($this->playersreadystate[$player->login])) { unset($this->playersreadystate[$player->login]); $this->closeReadyWidget($player->login); } } /** * Handle Ready state of the player * * @param array $callback * @param \ManiaControl\Players\Player $player */ public function handleReady(array $callback, Player $player) { if (isset($this->playersreadystate[$player->login])) { if ($this->playersreadystate[$player->login] == 0) { $this->playersreadystate[$player->login] = 1; $this->maniaControl->getChat()->sendInformation($this->chatprefix . 'Player $<$ff0' . $player->nickname . '$> now is $<$z$0f0ready$>'); } elseif ($this->playersreadystate[$player->login] == 1) { $this->playersreadystate[$player->login] = 0; $this->maniaControl->getChat()->sendInformation($this->chatprefix . 'Player $<$ff0' . $player->nickname . '$> now is $<$z$f00not ready$>'); } $this->StartMatchIfNeeded($player); } } /** * Command /ready for players * * @param array $chatCallback * @param \ManiaControl\Players\Player $player */ public function onCommandSetReadyPlayer(array $chatCallback, Player $player) { if ($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_READY_MODE) && (!$this->MatchManagerCore->getMatchStatus())) { $this->handleReady($chatCallback, $player); } } /** * Generate Manialinks variables */ private function updateManialinks() { $width = 17; $height = 6; $posX = $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_READY_POSX); $posY = $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_READY_POSY); $quadStyle = $this->maniaControl->getManialinkManager()->getStyleManager()->getDefaultQuadStyle(); $quadSubstyle = $this->maniaControl->getManialinkManager()->getStyleManager()->getDefaultQuadSubstyle(); $MLisReady = new ManiaLink(self::MLID_MATCH_READY_WIDGET); // mainframe $frameisReady = new Frame(); $MLisReady->addChild($frameisReady); $frameisReady->setSize($width, $height); $frameisReady->setPosition($posX, $posY); // Background Quad $backgroundQuadisReady = new Quad(); $frameisReady->addChild($backgroundQuadisReady); $backgroundQuadisReady->setSize($width, $height); $backgroundQuadisReady->setStyles($quadStyle, $quadSubstyle); $backgroundQuadisReady->setAction(self::ACTION_READY); $labelisReady = new Label_Text(); $frameisReady->addChild($labelisReady); $labelisReady->setPosition(0, 1.75, 0.2); $labelisReady->setVerticalAlign($labelisReady::TOP); $labelisReady->setTextSize(2); $labelisReady->setTextFont("GameFontBlack"); $labelisReady->setTextPrefix('$s'); $labelisReady->setText("Ready?"); $labelisReady->setTextColor('0f0'); $MLisNotReady = new ManiaLink(self::MLID_MATCH_READY_WIDGET); // mainframe $frameisNotReady = new Frame(); $MLisNotReady->addChild($frameisNotReady); $frameisNotReady->setSize($width, $height); $frameisNotReady->setPosition($posX, $posY); // Background Quad $backgroundQuadisNotReady = new Quad(); $frameisNotReady->addChild($backgroundQuadisNotReady); $backgroundQuadisNotReady->setSize($width, $height); $backgroundQuadisNotReady->setStyles($quadStyle, $quadSubstyle); $backgroundQuadisNotReady->setAction(self::ACTION_READY); $labelisNotReady = new Label_Text(); $frameisNotReady->addChild($labelisNotReady); $labelisNotReady->setPosition(0, 1.75, 0.2); $labelisNotReady->setVerticalAlign($labelisNotReady::TOP); $labelisNotReady->setTextSize(2); $labelisNotReady->setTextFont("GameFontBlack"); $labelisNotReady->setTextPrefix('$s'); $labelisNotReady->setText("Ready?"); $labelisNotReady->setTextColor('f00'); $this->MLisReady = $MLisReady; $this->MLisNotReady = $MLisNotReady; } }