New plugin
This commit is contained in:
		
							
								
								
									
										356
									
								
								MatchManagerSuite/MatchManagerReadyButton.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										356
									
								
								MatchManagerSuite/MatchManagerReadyButton.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,356 @@ | ||||
| <?php | ||||
|  | ||||
| namespace MatchManagerSuite; | ||||
|  | ||||
| use FML\Controls\Frame; | ||||
| use FML\Controls\Labels\Label_Text; | ||||
| use FML\Controls\Label; | ||||
| use FML\Controls\Quad; | ||||
| use FML\ManiaLink; | ||||
| use ManiaControl\Callbacks\CallbackListener; | ||||
| use ManiaControl\Callbacks\CallbackManager; | ||||
| use ManiaControl\Callbacks\Callbacks; | ||||
| use ManiaControl\Logger; | ||||
| use ManiaControl\ManiaControl; | ||||
| use ManiaControl\Manialinks\ManialinkPageAnswerListener; | ||||
| use ManiaControl\Players\Player; | ||||
| use ManiaControl\Players\PlayerManager; | ||||
| use ManiaControl\Plugins\Plugin; | ||||
| use ManiaControl\Settings\Setting; | ||||
| use ManiaControl\Settings\SettingManager; | ||||
| //use ManiaControl\Utils\Formatter; | ||||
| use ManiaControl\Commands\CommandListener; | ||||
|  | ||||
|  | ||||
| if (! class_exists('MatchManagerSuite\MatchManagerCore')) { | ||||
| 	$this->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; | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user