* @copyright 2014-2020 ManiaControl Team * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class ScriptManager implements UsageInformationAble { use UsageInformationTrait; //TODO add CB to MC Website const CB_PAUSE_STATUS_CHANGED = "ManiaControl.ScriptManager.PauseStatusChanged"; /* * Private properties */ /** @var ManiaControl $maniaControl */ private $maniaControl = null; private $isScriptMode = null; private $modeUsesPause = false; /** * Construct a new script manager instance * * @param ManiaControl $maniaControl */ public function __construct(ManiaControl $maniaControl) { $this->maniaControl = $maniaControl; } /** * Enable script callbacks * @return bool */ public function enableScriptCallbacks() { if (!$this->isScriptMode()) { return false; } try { $scriptSettings = $this->maniaControl->getClient()->getModeScriptSettings(); } catch (GameModeException $e) { var_dump("test"); return false; } //TODO remove later, than only the last 2 lines are needed in future if (array_key_exists('S_UseScriptCallbacks', $scriptSettings)) { $scriptSettings['S_UseScriptCallbacks'] = true; $this->maniaControl->getClient()->setModeScriptSettings($scriptSettings); } $this->maniaControl->getModeScriptEventManager()->enableCallbacks(); Logger::logInfo("Script Callbacks successfully enabled!"); //Checks if the Server is currently in TeamMode and sets it $this->maniaControl->getModeScriptEventManager()->isTeamMode()->setCallable(function (ModeUseTeamsStructure $structure) { if ($structure->modeIsUsingTeams()) { $this->maniaControl->getServer()->setTeamMode(true); } }); //Checks if the Mode Uses Pause $this->checkIfTheModeUsesPause(); return true; } /** * Checks if the Mode Uses Pause Async */ private function checkIfTheModeUsesPause() { try { $scriptInfos = $this->maniaControl->getClient()->getModeScriptInfo(); foreach ($scriptInfos->commandDescs as $param) { //TODO Mp3, can be removed later if ($param->name === "Command_ForceWarmUp" || $param->name === "Command_SetPause") { $this->setPauseStatus(true); return; } } } catch (GameModeException $e) { } //Checks if the Script has implemented the Pause Feature and Sets the Information $this->maniaControl->getModeScriptEventManager()->getPauseStatus()->setCallable(function (StatusCallbackStructure $structure) { if ($structure->isAvailable()) { $this->setPauseStatus(true); } }); } /** * Sets the New Pause Status * * @param boolean $status */ private function setPauseStatus($status) { $status = (boolean) $status; if ($this->modeUsesPause != $status) { $this->modeUsesPause = $status; $this->maniaControl->getCallbackManager()->triggerCallback(self::CB_PAUSE_STATUS_CHANGED, $status); } } /** * Check whether the Server is running in Script Mode * * @api * @return bool */ public function isScriptMode() { if (is_null($this->isScriptMode)) { // GetGameMode method has been removed in the API version "2022-03-21". So if the function return a "FaultException", consider it in script mode try { $gameMode = $this->maniaControl->getClient()->getGameMode(); $this->isScriptMode = ($gameMode === 0 || !is_int($gameMode)); } catch (\Throwable $th) { $this->isScriptMode = true; } } return $this->isScriptMode; } /** * Checks if the Mode Can be Forced to a Pause * * @api * @return bool */ public function modeUsesPause() { return $this->modeUsesPause; } /** * Checks if the Mode is in TeamMode * * @api * @return bool */ public function modeIsTeamMode() { return $this->maniaControl->getServer()->isTeamMode(); } }