Add TMWT Duo Integration
This commit is contained in:
		
							
								
								
									
										466
									
								
								MatchManagerSuite/MatchManagerTMWTDuoIntegration.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										466
									
								
								MatchManagerSuite/MatchManagerTMWTDuoIntegration.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,466 @@ | |||||||
|  | <?php | ||||||
|  |  | ||||||
|  | namespace MatchManagerSuite; | ||||||
|  |  | ||||||
|  | use ManiaControl\Callbacks\CallbackListener; | ||||||
|  | use ManiaControl\Callbacks\Callbacks; | ||||||
|  | use ManiaControl\Callbacks\TimerListener; | ||||||
|  | use ManiaControl\Commands\CommandListener; | ||||||
|  | use ManiaControl\Logger; | ||||||
|  | use ManiaControl\ManiaControl; | ||||||
|  | use ManiaControl\Manialinks\ManialinkPageAnswerListener; | ||||||
|  | use ManiaControl\Players\Player; | ||||||
|  | use ManiaControl\Plugins\Plugin; | ||||||
|  | use ManiaControl\Plugins\PluginManager; | ||||||
|  | use ManiaControl\Plugins\PluginMenu; | ||||||
|  | use ManiaControl\Settings\Setting; | ||||||
|  | use ManiaControl\Settings\SettingManager; | ||||||
|  | use ManiaControl\Utils\WebReader; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | if (!class_exists('MatchManagerSuite\MatchManagerCore')) { | ||||||
|  | 	$this->maniaControl->getChat()->sendErrorToAdmins('MatchManager Core is required to use one of MatchManager plugin. Install it and restart Maniacontrol'); | ||||||
|  | 	Logger::logError('MatchManager Core is required to use one of MatchManager plugin. Install it and restart Maniacontrol'); | ||||||
|  | 	return false; | ||||||
|  | } | ||||||
|  | use MatchManagerSuite\MatchManagerCore; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * MatchManager TMWT Duo Integration | ||||||
|  |  * | ||||||
|  |  * @author		Beu (based on MatchManagerWidget by jonthekiller) | ||||||
|  |  * @license		http://www.gnu.org/licenses/ GNU General Public License, Version 3 | ||||||
|  |  */ | ||||||
|  | class MatchManagerTMWTDuoIntegration implements CallbackListener, ManialinkPageAnswerListener, CommandListener, TimerListener, Plugin { | ||||||
|  | 	/* | ||||||
|  | 	 * Constants | ||||||
|  | 	 */ | ||||||
|  | 	const PLUGIN_ID											= 211; | ||||||
|  | 	const PLUGIN_VERSION									= 1.0; | ||||||
|  | 	const PLUGIN_NAME										= 'MatchManager TMWT Duo Integration'; | ||||||
|  | 	const PLUGIN_AUTHOR										= 'Beu'; | ||||||
|  |  | ||||||
|  | 	// Other MatchManager plugin | ||||||
|  | 	const MATCHMANAGERCORE_PLUGIN							= 'MatchManagerSuite\MatchManagerCore'; | ||||||
|  | 	const MATCHMANAGERADMINUI_PLUGIN						= 'MatchManagerSuite\MatchManagerAdminUI'; | ||||||
|  |  | ||||||
|  | 	// Actions | ||||||
|  | 	const ML_ACTION_OPENSETTINGS 							= 'MatchManagerSuite\MatchManagerTMWTDuoIntegration.OpenSettings'; | ||||||
|  |  | ||||||
|  | 	const XMLRPC_CALLBACK_PICKANDBANCOMPLETE				= 'PickBan.Complete'; | ||||||
|  | 	const XMLRPC_CALLBACK_STARTMAP							= 'Maniaplanet.StartMap_Start'; | ||||||
|  |  | ||||||
|  | 	const XMLRPC_METHOD_STARTPICKANDBAN						= 'PickBan.Start'; | ||||||
|  | 	const XMLRPC_METHOD_ADDPLAYER							= 'Club.Match.AddPlayer'; | ||||||
|  | 	const XMLRPC_METHOD_REMOVEPLAYER						= 'Club.Match.RemovePlayer'; | ||||||
|  | 	const XMLRPC_METHOD_MATCHSTARTED						= 'Club.Match.Start'; | ||||||
|  | 	const XMLRPC_METHOD_MATCHCOMPLETED						= 'Club.Match.Completed'; | ||||||
|  |  | ||||||
|  | 	const SETTING_TEAM1 									= 'Team 1 Id'; | ||||||
|  | 	const SETTING_TEAM2 									= 'Team 2 Id'; | ||||||
|  | 	const SETTING_PICKANDBAN_ENABLE 						= 'Enable Pick & Ban'; | ||||||
|  | 	const SETTING_PICKANDBAN_STEPCONFIG 					= 'Pick & Ban: Step config'; | ||||||
|  | 	const SETTING_PICKANDBAN_STEPDURATION 					= 'Pick & Ban: Step duration'; | ||||||
|  | 	const SETTING_PICKANDBAN_RESULTDURATION 				= 'Pick & Ban: Result duration'; | ||||||
|  |  | ||||||
|  | 	const STATE_NOTHING = 0; | ||||||
|  | 	const STATE_PRESETTING = 1; | ||||||
|  | 	const STATE_PREMATCH = 2; | ||||||
|  | 	const STATE_MATCH = 3; | ||||||
|  |  | ||||||
|  | 	/* | ||||||
|  | 	 * Private properties | ||||||
|  | 	 */ | ||||||
|  | 	/** @var ManiaControl $maniaControl */ | ||||||
|  | 	private $maniaControl 			= null; | ||||||
|  | 	private $MatchManagerCore		= null; | ||||||
|  | 	private $state = 0; | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * @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 'Integration of TMWT duo teams & pick and ban for MatchManager'; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * @param \ManiaControl\ManiaControl $maniaControl | ||||||
|  | 	 * @return bool | ||||||
|  | 	 * @see \ManiaControl\Plugins\Plugin::load() | ||||||
|  | 	 */ | ||||||
|  | 	public function load(ManiaControl $maniaControl) { | ||||||
|  | 		$this->maniaControl = $maniaControl; | ||||||
|  | 		/** @var MatchManagerCore */ | ||||||
|  | 		$this->MatchManagerCore = $this->maniaControl->getPluginManager()->getPlugin(self::MATCHMANAGERCORE_PLUGIN); | ||||||
|  |  | ||||||
|  | 		if ($this->MatchManagerCore == Null) { | ||||||
|  | 			throw new \Exception('MatchManager Core is needed to use ' . self::PLUGIN_NAME); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		// Settings | ||||||
|  | 		$this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_TEAM1, '', '', 10); | ||||||
|  | 		$this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_TEAM2, '', '', 10); | ||||||
|  | 		$this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_PICKANDBAN_ENABLE, false, '', 20); | ||||||
|  | 		$this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_PICKANDBAN_STEPCONFIG, '', 'Similar syntax as the ofiicial Competition Tool. e.g: b:1,b:0,p:0,p:1,p:1,p:0,b:0,b:1,p:r'); | ||||||
|  | 		$this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_PICKANDBAN_STEPDURATION, 60000, 'Each step duration in ms', 110); | ||||||
|  | 		$this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_PICKANDBAN_RESULTDURATION, 10000, 'result duration in ms', 120); | ||||||
|  |  | ||||||
|  | 		// Callbacks | ||||||
|  | 		$this->maniaControl->getManialinkManager()->registerManialinkPageAnswerListener(self::ML_ACTION_OPENSETTINGS, $this, 'handleActionOpenSettings'); | ||||||
|  | 		$this->maniaControl->getCallbackManager()->registerCallbackListener(Callbacks::AFTERINIT, $this, 'handleAfterInit'); | ||||||
|  | 		$this->maniaControl->getCallbackManager()->registerCallbackListener(PluginManager::CB_PLUGIN_LOADED, $this, 'handlePluginLoaded'); | ||||||
|  | 		$this->maniaControl->getCallbackManager()->registerCallbackListener($this->MatchManagerCore::CB_MATCHMANAGER_STARTMATCH, $this, 'handleMatchManagerStartMatch'); | ||||||
|  | 		$this->maniaControl->getCallbackManager()->registerCallbackListener(Callbacks::MP_STARTMATCHSTART, $this, 'handleStartMatchStartCallback'); | ||||||
|  | 		$this->maniaControl->getCallbackManager()->registerScriptCallbackListener(self::XMLRPC_CALLBACK_STARTMAP, $this, 'handleStartMapStartCallback'); | ||||||
|  | 		$this->maniaControl->getCallbackManager()->registerCallbackListener($this->MatchManagerCore::CB_MATCHMANAGER_STOPMATCH, $this, 'handleMatchManagerEndMatch'); | ||||||
|  | 		$this->maniaControl->getCallbackManager()->registerCallbackListener($this->MatchManagerCore::CB_MATCHMANAGER_ENDMATCH, $this, 'handleMatchManagerEndMatch'); | ||||||
|  | 		$this->maniaControl->getCallbackManager()->registerScriptCallbackListener(self::XMLRPC_CALLBACK_PICKANDBANCOMPLETE, $this, 'handlePickAndBanComplete'); | ||||||
|  | 		$this->maniaControl->getCallbackManager()->registerCallbackListener(SettingManager::CB_SETTING_CHANGED, $this, 'handleSettingChanged'); | ||||||
|  |  | ||||||
|  | 		$this->MatchManagerCore->addCanStartFunction($this, 'canStartMatch');  | ||||||
|  | 		$this->updateAdminUIMenuItems(); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * handle Plugin Loaded | ||||||
|  | 	 *  | ||||||
|  | 	 * @param string $pluginClass  | ||||||
|  | 	 */ | ||||||
|  | 	public function handleAfterInit() { | ||||||
|  | 		$this->updateAdminUIMenuItems(); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * handle Plugin Loaded | ||||||
|  | 	 *  | ||||||
|  | 	 * @param string $pluginClass  | ||||||
|  | 	 */ | ||||||
|  | 	public function handlePluginLoaded(string $pluginClass) { | ||||||
|  | 		if ($pluginClass === self::MATCHMANAGERADMINUI_PLUGIN) { | ||||||
|  | 			$this->updateAdminUIMenuItems(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 		/** | ||||||
|  | 	 * Add items in AdminUI plugin | ||||||
|  | 	 */ | ||||||
|  | 	public function updateAdminUIMenuItems() { | ||||||
|  | 		/** @var \MatchManagerSuite\MatchManagerAdminUI|null */ | ||||||
|  | 		$adminUIPlugin = $this->maniaControl->getPluginManager()->getPlugin(self::MATCHMANAGERADMINUI_PLUGIN); | ||||||
|  | 		if ($adminUIPlugin === null) return; | ||||||
|  |  | ||||||
|  | 		$adminUIPlugin->removeMenuItem(self::ML_ACTION_OPENSETTINGS); | ||||||
|  |  | ||||||
|  | 		$menuItem = new \MatchManagerSuite\MatchManagerAdminUI_MenuItem(); | ||||||
|  | 		$menuItem->setActionId(self::ML_ACTION_OPENSETTINGS) | ||||||
|  | 			->setOrder(50) | ||||||
|  | 			->setImageUrl('https://files.virtit.fr/TrackMania/Images/Others/TMWT_Logo.dds') | ||||||
|  | 			->setSize(4.5) | ||||||
|  | 			->setDescription('Open TMWT Integration Settings'); | ||||||
|  | 		$adminUIPlugin->addMenuItem($menuItem); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * handle Open settings manialink action | ||||||
|  | 	 *  | ||||||
|  | 	 * @param array $callback  | ||||||
|  | 	 * @param Player $player  | ||||||
|  | 	 */ | ||||||
|  | 	public function handleActionOpenSettings(array $callback, Player $player) { | ||||||
|  | 		if ($player->authLevel <= 0) return; | ||||||
|  |  | ||||||
|  | 		$pluginMenu = $this->maniaControl->getPluginManager()->getPluginMenu(); | ||||||
|  | 		if (defined("\ManiaControl\ManiaControl::ISTRACKMANIACONTROL")) { | ||||||
|  | 			$player->setCache($pluginMenu, PluginMenu::CACHE_SETTING_CLASS, "PluginMenu.Settings." . self::class); | ||||||
|  | 		} else { | ||||||
|  | 			$player->setCache($pluginMenu, PluginMenu::CACHE_SETTING_CLASS, self::class); | ||||||
|  | 		} | ||||||
|  | 		$this->maniaControl->getConfigurator()->showMenu($player, $pluginMenu); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * Callback function to check if everything is ok before starting the match | ||||||
|  | 	 *  | ||||||
|  | 	 * @return bool  | ||||||
|  | 	 */ | ||||||
|  | 	public function canStartMatch() { | ||||||
|  | 		if ($this->maniaControl->getSettingManager()->getSettingValue($this->MatchManagerCore, 'S_TeamsUrl') === '') { | ||||||
|  | 			$this->maniaControl->getChat()->sendErrorToAdmins($this->MatchManagerCore->getChatPrefix() . " S_TeamsUrl must be defined"); | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 		if ( | ||||||
|  | 			$this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_TEAM1) === '' || | ||||||
|  | 			$this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_TEAM2) === '' | ||||||
|  | 		) { | ||||||
|  | 			$this->maniaControl->getChat()->sendErrorToAdmins($this->MatchManagerCore->getChatPrefix() . " Team Id must be defined"); | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if ($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_PICKANDBAN_ENABLE)) { | ||||||
|  | 			if ($this->maniaControl->getSettingManager()->getSettingValue($this->MatchManagerCore, $this->MatchManagerCore::SETTING_MATCH_SETTINGS_MODE) !== "All from the plugin") { | ||||||
|  | 				$this->maniaControl->getChat()->sendErrorToAdmins('TMWT Pick and bans are only supported in Match Manager Core "All from the plugin" mode'); | ||||||
|  | 				return false; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		return true; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * handle MatchManagerCore StartMatch callback | ||||||
|  | 	 *  | ||||||
|  | 	 * @return void  | ||||||
|  | 	 */ | ||||||
|  | 	public function handleMatchManagerStartMatch() { | ||||||
|  | 		$this->state = self::STATE_PRESETTING; | ||||||
|  |  | ||||||
|  | 		$setting = $this->maniaControl->getSettingManager()->getSettingObject($this->MatchManagerCore, 'S_IsMatchmaking'); | ||||||
|  | 		if ($setting !== null && !$setting->value) { | ||||||
|  | 			$setting->value = true; | ||||||
|  | 			$this->maniaControl->getSettingManager()->saveSetting($setting); | ||||||
|  | 			Logger::logWarning('Remplacing S_IsMatchmaking setting value in MatchManagerCore for TMWT integration'); | ||||||
|  | 			$this->maniaControl->getChat()->sendErrorToAdmins('Remplacing S_IsMatchmaking setting value in MatchManagerCore for TMWT integration'); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if ($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_PICKANDBAN_ENABLE)) { | ||||||
|  | 			$setting = $this->maniaControl->getSettingManager()->getSettingObject($this->MatchManagerCore, 'S_PickAndBan_Enable'); | ||||||
|  | 			if ($setting !== null && !$setting->value) { | ||||||
|  | 				$setting->value = true; | ||||||
|  | 				$this->maniaControl->getSettingManager()->saveSetting($setting); | ||||||
|  | 				Logger::logWarning('Remplacing S_PickAndBan_Enable setting value in MatchManagerCore for TMWT integration'); | ||||||
|  | 				$this->maniaControl->getChat()->sendErrorToAdmins('Remplacing S_PickAndBan_Enable setting value in MatchManagerCore for TMWT integration'); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * handle MatchManagerCore StopMatch & EndMatch callback | ||||||
|  | 	 *  | ||||||
|  | 	 * @return void  | ||||||
|  | 	 */ | ||||||
|  | 	public function handleMatchManagerEndMatch() { | ||||||
|  | 		$this->state = self::STATE_NOTHING; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * handle StartMatch_Start script callback | ||||||
|  | 	 *  | ||||||
|  | 	 * @return void  | ||||||
|  | 	 */ | ||||||
|  | 	public function handleStartMatchStartCallback() { | ||||||
|  | 		if ($this->MatchManagerCore->getMatchStatus() && $this->state === self::STATE_PREMATCH) { | ||||||
|  | 			// reset match state in just in case | ||||||
|  | 			$this->maniaControl->getClient()->triggerModeScriptEvent(self::XMLRPC_METHOD_MATCHCOMPLETED, []); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * handle StartMap_Start script callback | ||||||
|  | 	 *  | ||||||
|  | 	 * @return void  | ||||||
|  | 	 */ | ||||||
|  | 	public function handleStartMapStartCallback() { | ||||||
|  | 		if (!$this->MatchManagerCore->getMatchStatus()) return; | ||||||
|  |  | ||||||
|  | 		if ($this->state === self::STATE_PRESETTING) { | ||||||
|  | 			$this->state = self::STATE_PREMATCH; | ||||||
|  | 			$this->maniaControl->getClient()->setModeScriptSettings(['S_IsMatchmaking' => true], false); | ||||||
|  | 			$this->maniaControl->getClient()->restartMap(); | ||||||
|  | 		} else if ($this->state === self::STATE_PREMATCH) { | ||||||
|  |  | ||||||
|  | 			$teamsUrl = $this->maniaControl->getSettingManager()->getSettingValue($this->MatchManagerCore, 'S_TeamsUrl'); | ||||||
|  | 			if ($teamsUrl !== '') { | ||||||
|  | 				$response = WebReader::getUrl($teamsUrl); | ||||||
|  | 				$content  = $response->getContent(); | ||||||
|  | 				$json = json_decode($content); | ||||||
|  | 				if ($json !== null) { | ||||||
|  | 					$team1 = $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_TEAM1); | ||||||
|  | 					$team2 = $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_TEAM2); | ||||||
|  |  | ||||||
|  | 					foreach ($json as $team) { | ||||||
|  | 						if ($team->Id === $team1) { | ||||||
|  | 							$team1 = null; | ||||||
|  | 							foreach ($team->Players as $player) { | ||||||
|  | 								Logger::log($player->AccountId ." added to team 1"); | ||||||
|  | 								$this->maniaControl->getClient()->triggerModeScriptEvent(self::XMLRPC_METHOD_ADDPLAYER, [$player->AccountId, "1"], true); | ||||||
|  | 							} | ||||||
|  | 						} | ||||||
|  | 						if ($team->Id === $team2) { | ||||||
|  | 							$team2 = null; | ||||||
|  | 							foreach ($team->Players as $player) { | ||||||
|  | 								Logger::log($player->AccountId ." added to team 2"); | ||||||
|  | 								$this->maniaControl->getClient()->triggerModeScriptEvent(self::XMLRPC_METHOD_ADDPLAYER, [$player->AccountId, "2"], true); | ||||||
|  | 							} | ||||||
|  | 						} | ||||||
|  |  | ||||||
|  | 						if ($team1 === null && $team2 === null) break; | ||||||
|  | 					} | ||||||
|  |  | ||||||
|  | 					if ($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_PICKANDBAN_ENABLE)) { | ||||||
|  | 						Logger::log('Starting Pick & ban in 10 seconds'); | ||||||
|  | 						$this->maniaControl->getChat()->sendSuccess('Starting pick & ban in 10 seconds'); | ||||||
|  | 						$this->maniaControl->getTimerManager()->registerOneTimeListening($this, function () { | ||||||
|  | 						$payload = [ | ||||||
|  | 							'stepDuration' => $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_PICKANDBAN_STEPDURATION), | ||||||
|  | 							'resultDuration' => $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_PICKANDBAN_RESULTDURATION), | ||||||
|  | 							'steps' => [] | ||||||
|  | 						]; | ||||||
|  |  | ||||||
|  | 						$stepConfig = $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_PICKANDBAN_STEPCONFIG); | ||||||
|  | 						foreach (explode(',', $stepConfig) as $stepRaw) { | ||||||
|  | 							$stepPayload = []; | ||||||
|  | 							$step = explode(':', $stepRaw); | ||||||
|  |  | ||||||
|  | 							if ($step[1] === 'r') { | ||||||
|  | 								$stepPayload['action'] = 'randompick'; | ||||||
|  | 							}  else { | ||||||
|  | 								if ($step[0] === 'p') { | ||||||
|  | 									$stepPayload['action'] = 'pick'; | ||||||
|  | 								} else if ($step[0] === 'b') { | ||||||
|  | 									$stepPayload['action'] = 'ban'; | ||||||
|  | 								} | ||||||
|  |  | ||||||
|  | 								$stepPayload['team'] = $step[1] + 1; | ||||||
|  | 							} | ||||||
|  |  | ||||||
|  | 							$payload['steps'][] = $stepPayload; | ||||||
|  | 						} | ||||||
|  |  | ||||||
|  | 						$json = json_encode($payload); | ||||||
|  |  | ||||||
|  | 						Logger::log('Starting Pick & ban: '. $json); | ||||||
|  | 						$this->maniaControl->getClient()->triggerModeScriptEvent(self::XMLRPC_METHOD_STARTPICKANDBAN, [$json], true); | ||||||
|  | 						}, 5000); | ||||||
|  | 					} else { | ||||||
|  | 						$this->state = self::STATE_MATCH; | ||||||
|  | 						Logger::log('Sending match start callback'); | ||||||
|  | 						$this->maniaControl->getClient()->triggerModeScriptEvent(self::XMLRPC_METHOD_MATCHSTARTED, [], true); | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * handle Pick & Ban completed script callback | ||||||
|  | 	 *  | ||||||
|  | 	 * @param array $structure  | ||||||
|  | 	 * @return void  | ||||||
|  | 	 */ | ||||||
|  | 	public function handlePickAndBanComplete(array $structure) { | ||||||
|  | 		if (!$this->MatchManagerCore->getMatchStatus()) return; | ||||||
|  | 		Logger::log('Received picks: '. $structure[1][0]); | ||||||
|  |  | ||||||
|  | 		$this->maniaControl->getTimerManager()->registerOneTimeListening($this, function () use ($structure) { | ||||||
|  | 			try { | ||||||
|  | 				$json = json_decode($structure[1][0]); | ||||||
|  | 	 | ||||||
|  | 				$mapUids = array_column($json->playlist, 'uid'); | ||||||
|  | 				$mapList = []; | ||||||
|  | 				foreach ($this->maniaControl->getMapManager()->getMaps() as $map) { | ||||||
|  | 					$index = array_search($map->uid, $mapUids); | ||||||
|  | 	 | ||||||
|  | 					if ($index === false) { | ||||||
|  | 						$this->maniaControl->getClient()->removeMap($map->fileName); | ||||||
|  | 					} else { | ||||||
|  | 						$mapList[$index] = $map->fileName; | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 	 | ||||||
|  | 				if (count($mapUids) !== count($mapList)) { | ||||||
|  | 					Logger::logError("Missing maps: ". implode(' ', array_diff($mapUids, $mapList))); | ||||||
|  | 				} | ||||||
|  | 	 | ||||||
|  | 				ksort($mapList); | ||||||
|  |  | ||||||
|  | 				$this->maniaControl->getClient()->chooseNextMapList(array_values($mapList)); | ||||||
|  | 			} catch (\Throwable $th) { | ||||||
|  | 				Logger::logError("Can't apply map list: ". $th->getMessage()); | ||||||
|  | 				$this->maniaControl->getChat()->sendError("Can't apply map list: ". $th->getMessage()); | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			$this->state = self::STATE_MATCH; | ||||||
|  | 			Logger::log('Sending match start callback'); | ||||||
|  | 			$this->maniaControl->getClient()->triggerModeScriptEvent(self::XMLRPC_METHOD_MATCHSTARTED, [], true); | ||||||
|  | 			$this->maniaControl->getMapManager()->getMapActions()->skipMap(); | ||||||
|  | 		}, $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_PICKANDBAN_RESULTDURATION)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * handlePluginUnloaded | ||||||
|  | 	 * | ||||||
|  | 	 * @param  string $pluginClass | ||||||
|  | 	 * @param  Plugin $plugin | ||||||
|  | 	 * @return void | ||||||
|  | 	 */ | ||||||
|  | 	public function handlePluginUnloaded(string $pluginClass, Plugin $plugin) { | ||||||
|  | 		if ($pluginClass == self::MATCHMANAGERCORE_PLUGIN) { | ||||||
|  | 			$this->maniaControl->getChat()->sendErrorToAdmins(self::PLUGIN_NAME . " disabled because MatchManager Core is now disabled"); | ||||||
|  | 			$this->maniaControl->getPluginManager()->deactivatePlugin((get_class())); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * handle Setting Changed callback | ||||||
|  | 	 *  | ||||||
|  | 	 * @param Setting $setting  | ||||||
|  | 	 * @return void  | ||||||
|  | 	 */ | ||||||
|  | 	public function handleSettingChanged(Setting $setting) { | ||||||
|  | 		if ($setting->setting === self::SETTING_PICKANDBAN_ENABLE || $setting->setting === $this->MatchManagerCore::SETTING_MATCH_SETTINGS_MODE) { | ||||||
|  | 			if ($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_PICKANDBAN_ENABLE)) { | ||||||
|  | 				if ($this->maniaControl->getSettingManager()->getSettingValue($this->MatchManagerCore, $this->MatchManagerCore::SETTING_MATCH_SETTINGS_MODE) !== "All from the plugin") { | ||||||
|  | 					$this->maniaControl->getChat()->sendErrorToAdmins('TMWT Pick and bans are only supported in Match Manager Core "All from the plugin" mode'); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * @see \ManiaControl\Plugins\Plugin::unload() | ||||||
|  | 	 */ | ||||||
|  | 	public function unload() { | ||||||
|  | 		$this->MatchManagerCore->removeCanStartFunction($this, 'canStartMatch');  | ||||||
|  | 		/** @var \MatchManagerSuite\MatchManagerAdminUI|null */ | ||||||
|  | 		$adminUIPlugin = $this->maniaControl->getPluginManager()->getPlugin(self::MATCHMANAGERADMINUI_PLUGIN); | ||||||
|  | 		if ($adminUIPlugin !== null) { | ||||||
|  | 			$adminUIPlugin->removeMenuItem(self::ML_ACTION_OPENSETTINGS); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user