From a71323a52b8163df6c3745bbbb07d81ec913ef12 Mon Sep 17 00:00:00 2001 From: Beu Date: Sun, 20 Jun 2021 23:55:59 +0200 Subject: [PATCH] New plugin --- MatchManagerSuite/MatchManagerReadyButton.php | 356 ++++++++++++++++++ 1 file changed, 356 insertions(+) create mode 100644 MatchManagerSuite/MatchManagerReadyButton.php diff --git a/MatchManagerSuite/MatchManagerReadyButton.php b/MatchManagerSuite/MatchManagerReadyButton.php new file mode 100644 index 0000000..30f36a2 --- /dev/null +++ b/MatchManagerSuite/MatchManagerReadyButton.php @@ -0,0 +1,356 @@ +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; + } +} + +