diff --git a/MatchManagerSuite/MatchManagerCore.php b/MatchManagerSuite/MatchManagerCore.php index 71e354b..4af86b8 100644 --- a/MatchManagerSuite/MatchManagerCore.php +++ b/MatchManagerSuite/MatchManagerCore.php @@ -28,6 +28,7 @@ use ManiaControl\Configurator\GameModeSettings; use ManiaControl\Utils\Formatter; use Maniaplanet\DedicatedServer\InvalidArgumentException; use ManiaControl\Callbacks\TimerListener; +use ManiaControl\Maps\Map; /** * MatchManager Core @@ -60,15 +61,16 @@ class MatchManagerCore implements ManialinkPageAnswerListener, CallbackListener, const SETTING_MATCH_AUTHLEVEL = 'Auth level for the match* commands:'; const SETTING_MATCH_CUSTOM_GAMEMODE = 'Custom Gamemode file'; const SETTING_MATCH_GAMEMODE_BASE = 'Gamemode used during match:'; - const SETTING_MATCH_LOAD_MAPLIST_FILE = 'Load maps from maplist file'; - const SETTING_MATCH_MAPLIST = 'Maplist to use'; - const SETTING_MATCH_MATCHSETTINGS_CONF = 'Match settings from matchsettings file only:'; - const SETTING_MATCH_GAMEMODE_AFTERMATCH = 'Gamemode used after match:'; const SETTING_MATCH_PAUSE_DURATION = 'Default Pause Duration in seconds'; const SETTING_MATCH_PAUSE_POSX = 'Pause Widget-Position: X'; const SETTING_MATCH_PAUSE_POSY = 'Pause Widget-Position: Y'; - const SETTING_MATCH_SHUFFLEMAPS = 'Randomize map order (shuffle)'; + const SETTING_MATCH_SETTINGS_MODE = 'Loading mode for settings and maps'; + + const SETTING_MODE_MAPS = 'Maps to play'; + const SETTING_MODE_SHUFFLE = 'Randomize map order (shuffle)'; + const SETTING_MODE_HIDENEXTMAPS = 'Mask the next maps during the match'; + const SETTING_MODE_MAPLIST_FILE = 'Maplist to use'; // Gamemodes Settings const SETTING_MATCH_S_BESTLAPBONUSPOINTS = 'S_BestLapBonusPoints'; @@ -286,6 +288,34 @@ class MatchManagerCore implements ManialinkPageAnswerListener, CallbackListener, 'description' => 'Ratio of players who will win points' ] ]; + const SETTINGS_MODE_LIST = [ + self::SETTING_MODE_MAPS => [ + 'mode' => ['All from the plugin'], + 'type' => 'string', + 'default' => 'Campaigns/Training/Training - 01.Map.Gbx,Campaigns/Training/Training - 02.Map.Gbx', + 'description' => 'Map files separated by comma' ], + self::SETTING_MODE_SHUFFLE => [ + 'mode' => ['All from the plugin'], + 'type' => 'boolean', + 'default' => false, + 'description' => 'Shuffle maps order' ], + self::SETTING_MODE_HIDENEXTMAPS => [ + 'mode' => ['All from the plugin'], + 'type' => 'boolean', + 'default' => false, + 'description' => 'Hide maps to players' ], + self::SETTING_MODE_MAPLIST_FILE => [ + 'mode' => ['Maps from file & Settings from plugin', 'All from file'], + 'type' => 'string', + 'default' => 'match.txt', + 'description' => 'Maps + Matchsettings file to load (empty to use server login)' ], + self::SETTING_MATCH_CUSTOM_GAMEMODE => [ + 'mode' => ['All from the plugin', 'Maps from file & Settings from plugin'], + 'type' => 'string', + 'default' => '', + 'description' => 'Load custom gamemode script (some functions can bug, for expert only)' ], + ]; + /* * Private properties */ @@ -297,6 +327,7 @@ class MatchManagerCore implements ManialinkPageAnswerListener, CallbackListener, private $nbrounds = 0; private $nbspectators = 0; private $currentgmbase = ""; + private $currentsettingmode = ""; private $currentmap = null; private $matchrecover = false; private $pointstorecover = array(); @@ -322,7 +353,9 @@ class MatchManagerCore implements ManialinkPageAnswerListener, CallbackListener, private $settingsloaded = false; private $postmatch = false; private $mapsshuffled = false; - private $currentgmsettings = []; + private $mapshidden = false; + private $maps = array(); + private $currentgmsettings = array(); private $matchid = ""; @@ -379,18 +412,13 @@ class MatchManagerCore implements ManialinkPageAnswerListener, CallbackListener, //Settings $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_MATCH_AUTHLEVEL, AuthenticationManager::getPermissionLevelNameArray(AuthenticationManager::AUTH_LEVEL_ADMIN), "Admin level needed to use the plugin"); - $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_MATCH_CUSTOM_GAMEMODE, "", "Load custom gamemode script (some functions can bug, for expert only)"); - $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_MATCH_GAMEMODE_AFTERMATCH, array("TimeAttack"), "Gamemode to launch after the match"); - $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_MATCH_GAMEMODE_BASE, array("Champion", "Cup", "Knockout", "Laps", "Teams", "TimeAttack", "Rounds"), "Gamemode to launch for the match"); - $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_MATCH_LOAD_MAPLIST_FILE, false, "Load Maps + Matchsettings from the file (or use the current maplist on the server)"); - $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_MATCH_MAPLIST, "match.txt", "Maps + Matchsettings file to load (empty to use server login)"); - $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_MATCH_MATCHSETTINGS_CONF, false, "Load configuration from matchsettings file instead of Admin Interface (can be usefull with a custom script)"); + $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_MATCH_SETTINGS_MODE, array('All from the plugin', 'Maps from file & Settings from plugin', 'All from file'), "Loading mode for maps and match settings, depending on your needs"); $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_MATCH_PAUSE_DURATION, 120, "Default Pause Duration in seconds"); + $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_MATCH_GAMEMODE_BASE, array("Champion", "Cup", "Knockout", "Laps", "Teams", "TimeAttack", "Rounds"), "Gamemode to launch for the match"); $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_MATCH_PAUSE_POSX, 0, "Position of the Pause Countdown (on X axis)"); $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_MATCH_PAUSE_POSY, 43, "Position of the Pause Countdown (on Y axis)"); - $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_MATCH_SHUFFLEMAPS, true, "Shuffle maps order"); - // Init gamemode settings + // Init dynamics settings $this->updateSettings(); //Register Admin Commands @@ -414,7 +442,6 @@ class MatchManagerCore implements ManialinkPageAnswerListener, CallbackListener, $this->maniaControl->getCallbackManager()->registerCallbackListener(Callbacks::TM_WARMUPSTARTROUND, $this, 'handleStartWarmUpCallback'); $this->maniaControl->getCallbackManager()->registerCallbackListener(CallbackManager::CB_MP_BEGINMATCH, $this, 'handleBeginMatchCallback'); $this->maniaControl->getCallbackManager()->registerCallbackListener(Callbacks::TM_ONFINISHLINE, $this, 'handleFinishCallback'); - $this->maniaControl->getCallbackManager()->registerCallbackListener(CallbackManager::CB_MP_MAPLISTMODIFIED, $this, 'handleMapListModified'); // Register Socket commands $this->maniaControl->getCommunicationManager()->registerCommunicationListener("Match.GetMatchStatus", $this, function () { return new CommunicationAnswer($this->getMatchStatus()); }); @@ -562,47 +589,95 @@ class MatchManagerCore implements ManialinkPageAnswerListener, CallbackListener, * @param Setting $setting */ public function updateSettings(Setting $setting = null) { - if (isset($setting) && $setting->belongsToClass($this)) { - if ($this->matchStarted) { - if ($setting->setting == self::SETTING_MATCH_GAMEMODE_BASE && $setting->value != $this->currentgmbase) { - $setting->value = $this->currentgmbase; - $this->maniaControl->getSettingManager()->saveSetting($setting); - $this->maniaControl->getChat()->sendErrorToAdmins($this->chatprefix . 'You can\'t change Gamemode during a Match'); - } else { - if (!$this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_MATCHSETTINGS_CONF)) { - Logger::log("Load Script Settings"); - try { - $this->maniaControl->getClient()->setModeScriptSettings($this->getGMSettings($this->currentgmbase)); - Logger::log("Parameters updated"); - $this->maniaControl->getChat()->sendSuccessToAdmins($this->chatprefix . 'Parameters updated'); - } catch (InvalidArgumentException $e) { - Logger::log("Parameters not updated"); - $this->maniaControl->getChat()->sendErrorToAdmins($this->chatprefix . 'Parameters not updated'); - } - $this->updateGMvariables(); - } else { - $this->maniaControl->getChat()->sendErrorToAdmins($this->chatprefix . 'Settings are loaded by Matchsettings file only.'); + if (isset($setting) && $setting->belongsToClass($this) && $this->matchStarted) { + if ($setting->setting == self::SETTING_MATCH_GAMEMODE_BASE && $setting->value != $this->currentgmbase) { + $setting->value = $this->currentgmbase; + $this->maniaControl->getSettingManager()->saveSetting($setting); + $this->maniaControl->getChat()->sendErrorToAdmins($this->chatprefix . 'You can\'t change Gamemode during a Match'); + } else if ($setting->setting == self::SETTING_MATCH_SETTINGS_MODE && $setting->value != $this->currentsettingmode) { + $setting->value = $this->currentsettingmode; + $this->maniaControl->getSettingManager()->saveSetting($setting); + $this->maniaControl->getChat()->sendErrorToAdmins($this->chatprefix . 'You can\'t change the Setting Mode during a Match'); + } else { + if ($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_SETTINGS_MODE) != 'All from file') { + Logger::log("Load Script Settings"); + try { + $this->maniaControl->getClient()->setModeScriptSettings($this->getGMSettings($this->currentgmbase)); + Logger::log("Parameters updated"); + $this->maniaControl->getChat()->sendSuccessToAdmins($this->chatprefix . 'Parameters updated'); + } catch (InvalidArgumentException $e) { + Logger::log("Parameters not updated"); + $this->maniaControl->getChat()->sendErrorToAdmins($this->chatprefix . 'Parameters not updated'); } + $this->updateGMvariables(); + } else { + $this->maniaControl->getChat()->sendErrorToAdmins($this->chatprefix . 'Settings are loaded by Matchsettings file only.'); } } } $allsettings = $this->maniaControl->getSettingManager()->getSettingsByClass($this); - $gmsettings = $this->getGMSettings($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_GAMEMODE_BASE)); - + $settingsmode = $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_SETTINGS_MODE); + $modesettings = $this->getModeSettings($settingsmode); + foreach ($allsettings as $key => $value) { $name = $value->setting; - if (substr($name,0, 2) == "S_") { - if (isset($gmsettings[$name])) { - unset($gmsettings[$name]); + if (array_key_exists($name,self::SETTINGS_MODE_LIST)) { + if (isset($modesettings[$name])) { + unset($modesettings[$name]); } else { $this->maniaControl->getSettingManager()->deleteSetting($this, $name); } } } - foreach ($gmsettings as $key => $value) { - $this->maniaControl->getSettingManager()->initSetting($this, $key, $value, $this->getDescriptionPrefix($key) . self::GAMEMODES_LIST_SETTINGS[$key]['description']); + foreach ($modesettings as $key => $value) { + $this->maniaControl->getSettingManager()->initSetting($this, $key, $value, self::SETTINGS_MODE_LIST[$key]['description']); } + + + if ($settingsmode == 'Maps from file & Settings from plugin' || $settingsmode == 'All from the plugin') { + $gmsettings = $this->getGMSettings($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_GAMEMODE_BASE)); + + foreach ($allsettings as $key => $value) { + $name = $value->setting; + if (substr($name,0, 2) == "S_") { + if (isset($gmsettings[$name])) { + unset($gmsettings[$name]); + } else { + $this->maniaControl->getSettingManager()->deleteSetting($this, $name); + } + } + } + foreach ($gmsettings as $key => $value) { + $this->maniaControl->getSettingManager()->initSetting($this, $key, $value, $this->getDescriptionPrefix($key) . self::GAMEMODES_LIST_SETTINGS[$key]['description']); + } + } else { + foreach ($allsettings as $key => $value) { + $name = $value->setting; + if (substr($name,0, 2) == "S_") { + $this->maniaControl->getSettingManager()->deleteSetting($this, $name); + } + } + } + } + + + /** + * Reset match variables + * + * @param Setting $setting + */ + public function resetMatchVariables() { + $this->matchStarted = false; + $this->matchrecover = false; + $this->pointstorecover = array(); + $this->currentscore = array(); + $this->settingsloaded = false; + $this->mapsshuffled = false; + $this->mapshidden = false; + $this->maps = array(); + $this->postmatch = true; + $this->matchid = ""; } /** @@ -625,6 +700,26 @@ class MatchManagerCore implements ManialinkPageAnswerListener, CallbackListener, return $gamesettings; } + /** + * Get Array with all settings of the Gamemode + * + * @param String $gamemode + */ + public function getModeSettings(String $mode) { + $modesettings = []; + foreach (self::SETTINGS_MODE_LIST as $setting => $info) { + if (in_array('Global', $info['mode']) || in_array($mode, $info['mode'])) { + $value = $this->maniaControl->getSettingManager()->getSettingValue($this, $setting); + if ($value == null) { + $value = $info['default']; + } + settype($value, $info['type']); + $modesettings = array_merge($modesettings , array($setting => $value )); + } + } + return $modesettings; + } + /** * Load functionnal variables */ @@ -676,93 +771,127 @@ class MatchManagerCore implements ManialinkPageAnswerListener, CallbackListener, * Function called to start the match */ public function MatchStart() { - $this->matchid = $this->maniaControl->getServer()->login . "-" . time(); - $this->currentgmbase = $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_GAMEMODE_BASE); - $maplist = ""; - - if (empty($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_CUSTOM_GAMEMODE))) { - $scriptName = "Trackmania/TM_" ; - $scriptName .= $this->currentgmbase; - $scriptName .= "_Online.Script.txt"; - $this->maniaControl->getChat()->sendSuccess($this->chatprefix . 'Match start in ' . $this->currentgmbase . ' mode!'); - } else { - $scriptName = $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_CUSTOM_GAMEMODE); - $this->maniaControl->getChat()->sendSuccess($this->chatprefix . 'Match start with script ' . $scriptName . ' (based on ' . $this->currentgmbase . ')'); - - } - - Logger::log("Match start with script " . $scriptName . '!'); - - if ($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_LOAD_MAPLIST_FILE)) { - Logger::log("Loading maplist + matchsettings"); - if (empty($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_MAPLIST))) { - $server = $this->maniaControl->getServer()->login; - $maplist = 'MatchSettings' . DIRECTORY_SEPARATOR . $server . ".txt"; + try { + $this->matchid = $this->maniaControl->getServer()->login . "-" . time(); + $this->currentgmbase = $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_GAMEMODE_BASE); + $this->currentsettingmode = $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_SETTINGS_MODE); + $maplist = ""; + + if ($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_SETTINGS_MODE) != 'All from the plugin') { + Logger::log("Loading maplist + matchsettings"); + $maplist = $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MODE_MAPLIST_FILE); + if (empty($maplist)) { + $server = $this->maniaControl->getServer()->login; + $maplist = 'MatchSettings' . DIRECTORY_SEPARATOR . $server . ".txt"; + } else { + $maplist = 'MatchSettings' . DIRECTORY_SEPARATOR . $maplist; + } + Logger::log("Load matchsettings: " . $maplist); + if (!is_file($this->maniaControl->getServer()->getDirectory()->getMapsFolder() . $maplist)) { + throw new \Exception("The Maplist file is not accessible or does not exist (the match has not started)"); + } + $this->maniaControl->getClient()->loadMatchSettings($maplist); } else { - $maplist = $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_MAPLIST); - $maplist = 'MatchSettings' . DIRECTORY_SEPARATOR . $maplist; + if (strlen($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MODE_MAPS)) >= 1) { + $maps = explode(',', $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MODE_MAPS)); + + foreach ($maps as $map) { + try { + $mapInfo = new Map($this->maniaControl->getClient()->getMapInfo($map)); + } catch (Exception $e) { + throw new \Exception("Error with the map " . $map . ": " . $e->getMessage()); + } + } + + if ($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MODE_SHUFFLE)) { + //shuffle + $this->mapsshuffled = true; + shuffle($maps); + } + + //Remove all maps + foreach ($this->maniaControl->getMapManager()->getMaps() as $map) { + $this->maniaControl->getClient()->removeMap($map->fileName); + } + + $this->maps = $maps; + if ($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MODE_HIDENEXTMAPS)) { + $this->maniaControl->getClient()->addMap($this->maps[0]); + } else { + foreach ($this->maps as $map) { + $this->maniaControl->getClient()->addMap($map); + } + } + } else { + throw new \Exception("No maps defined (the match has not started)"); + } } - Logger::log("Load matchsettings: " . $maplist); - if (!is_file($this->maniaControl->getServer()->getDirectory()->getMapsFolder() . $maplist)) { - Logger::log("The Maplist file is not accessible or does not exist (the match has not started)"); - $this->maniaControl->getChat()->sendErrorToAdmins($this->chatprefix . "The Maplist file is not accessible or does not exist (the match has not started)"); - return; - } - $this->maniaControl->getClient()->loadMatchSettings($maplist); + Logger::log("Restructure maplist"); $this->maniaControl->getMapManager()->restructureMapList(); - } else { - if ($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_MATCHSETTINGS_CONF)) { - $this->maniaControl->getChat()->sendErrorToAdmins($this->chatprefix . 'FYI, No Settings will be load, check "' . self::SETTING_MATCH_MATCHSETTINGS_CONF . "\" and \"" . self::SETTING_MATCH_MAPLIST . "\""); + + if ($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_SETTINGS_MODE) != 'All from file') { + if (empty($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_CUSTOM_GAMEMODE))) { + $scriptName = "Trackmania/TM_" ; + $scriptName .= $this->currentgmbase; + $scriptName .= "_Online.Script.txt"; + $this->maniaControl->getChat()->sendSuccess($this->chatprefix . 'Match start in ' . $this->currentgmbase . ' mode!'); + } else { + $scriptName = $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_CUSTOM_GAMEMODE); + $this->maniaControl->getChat()->sendSuccess($this->chatprefix . 'Match start with script ' . $scriptName . ' (based on ' . $this->currentgmbase . ')'); + } + + Logger::log("Match start with script " . $scriptName . '!'); + $this->maniaControl->getClient()->setScriptName($scriptName); } + + $this->matchStarted = true; + $this->nbmaps = 0; + $this->nbrounds = 0; + + Logger::log("Get Players"); + $players = $this->maniaControl->getPlayerManager()->getPlayers(); + + Logger::log("Player State"); + foreach ($players as $player) { + $this->handlePlayerConnect($player); + } + + // MYSQL DATA INSERT + $mysqli = $this->maniaControl->getDatabase()->getMysqli(); + $query = 'INSERT INTO `' . self::DB_MATCHESINDEX . '` + (`matchid`, `server`, `gamemodebase`, `started`, `ended`) + VALUES + ("' . $this->matchid . '","' . $this->maniaControl->getServer()->login . '","' . $this->currentgmbase . '","' . time() . '","0" )'; + $mysqli->query($query); + if ($mysqli->error) { + throw new \Exception("Error during the MySQL insert: " . $mysqli->error); + } + + // Trigger Callback + $settings = [ + 'currentgmbase' => $this->currentgmbase, + 'scriptName' => $scriptName, + 'maplist' => $maplist, + 'mapsshuffled' => $this->mapsshuffled, + 'mapshidden' => $this->mapshidden, + 'maps' => $this->maps]; + $this->maniaControl->getCallbackManager()->triggerCallback(self::CB_MATCHMANAGER_STARTMATCH, $this->matchid, $settings); + + Logger::log("Skip map"); + $this->maniaControl->getMapManager()->getMapActions()->skipMap(); + } catch (Exception $e) { + $this->resetMatchVariables(); + Logger::log($e->getMessage()); + $this->maniaControl->getChat()->sendErrorToAdmins($this->chatprefix . $e->getMessage()); } - - Logger::log("Load Script"); - $this->maniaControl->getClient()->setScriptName($scriptName); - - $this->matchStarted = true; - $this->nbmaps = 0; - $this->nbrounds = 0; - - Logger::log("Get Players"); - $players = $this->maniaControl->getPlayerManager()->getPlayers(); - - Logger::log("Player State"); - foreach ($players as $player) { - $this->handlePlayerConnect($player); - } - - // MYSQL DATA INSERT - $mysqli = $this->maniaControl->getDatabase()->getMysqli(); - $query = 'INSERT INTO `' . self::DB_MATCHESINDEX . '` - (`matchid`, `server`, `gamemodebase`, `started`, `ended`) - VALUES - ("' . $this->matchid . '","' . $this->maniaControl->getServer()->login . '","' . $this->currentgmbase . '","' . time() . '","0" )'; - $mysqli->query($query); - if ($mysqli->error) { - trigger_error($mysqli->error); - return false; - } - - // Trigger Callback - $settings = [ - 'currentgmbase' => $this->currentgmbase, - 'scriptName' => $scriptName, - 'maplist' => $maplist, - 'mapsshuffled' => $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_SHUFFLEMAPS)]; - $this->maniaControl->getCallbackManager()->triggerCallback(self::CB_MATCHMANAGER_STARTMATCH, $this->matchid, $settings); - - Logger::log("Skip map"); - $this->maniaControl->getMapManager()->getMapActions()->skipMap(); } /** * Function called to end the match */ public function MatchEnd() { - $scriptName = "Trackmania/TM_" ; - $scriptName .= $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_GAMEMODE_AFTERMATCH); - $scriptName .= "_Online.Script.txt"; + $scriptName = "Trackmania/TM_TimeAttack_Online.Script.txt" ; try { $this->maniaControl->getClient()->setScriptName($scriptName); @@ -783,14 +912,8 @@ class MatchManagerCore implements ManialinkPageAnswerListener, CallbackListener, $this->maniaControl->getChat()->sendSuccess($this->chatprefix . "Match finished"); Logger::log("Loading script: $scriptName"); Logger::log("Match finished"); - $this->matchStarted = false; - $this->matchrecover = false; - $this->pointstorecover = array(); - $this->currentscore = []; - $this->settingsloaded = false; - $this->mapsshuffled = false; - $this->postmatch = true; - $this->matchid = ""; + + $this->resetMatchVariables(); // KO Specifics variables $this->nbstillalive = 0; @@ -808,9 +931,7 @@ class MatchManagerCore implements ManialinkPageAnswerListener, CallbackListener, */ public function MatchStop() { Logger::log("Match stop"); - $scriptName = "Trackmania/TM_" ; - $scriptName .= $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_GAMEMODE_AFTERMATCH); - $scriptName .= "_Online.Script.txt"; + $scriptName = "Trackmania/TM_TimeAttack_Online.Script.txt"; try { // Trigger Callback @@ -819,14 +940,8 @@ class MatchManagerCore implements ManialinkPageAnswerListener, CallbackListener, $this->maniaControl->getChat()->sendError($this->chatprefix . 'Match stopped by an Admin!'); $this->maniaControl->getClient()->setScriptName($scriptName); Logger::log("Loading script: $scriptName"); - $this->matchStarted = false; - $this->matchrecover = false; - $this->pointstorecover = array(); - $this->currentscore = []; - $this->settingsloaded = false; - $this->mapsshuffled = false; - $this->postmatch = true; - $this->matchid = ""; + + $this->resetMatchVariables(); } catch (Exception $e) { $this->maniaControl->getChat()->sendErrorToAdmins($this->chatprefix . 'Can not stop match: ' . $e->getMessage()); @@ -1055,18 +1170,6 @@ class MatchManagerCore implements ManialinkPageAnswerListener, CallbackListener, $this->closePauseWidget($player->login); } - /** - * Handle callback "MapListModified" - */ - public function handleMapListModified() { - Logger::log("handleMapListModified"); - if ($this->matchStarted && !$this->mapsshuffled && $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_SHUFFLEMAPS)) { - Logger::log("Shuffle maplist"); - $this->maniaControl->getMapManager()->shuffleMapList(); - $this->mapsshuffled = true; - } - } - /** * Handle callback "BeginMatch" */ @@ -1075,12 +1178,11 @@ class MatchManagerCore implements ManialinkPageAnswerListener, CallbackListener, if ($this->matchStarted === true) { Logger::log("Check settingsloaded: " . $this->settingsloaded); - if (!($this->settingsloaded)) - { + if (!($this->settingsloaded)) { Logger::log("Loading settings"); $this->settingsloaded = true; - if (!$this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_MATCHSETTINGS_CONF)) { + if ($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_SETTINGS_MODE) != 'All from file') { Logger::log("Load Script Settings"); $this->maniaControl->getClient()->setModeScriptSettings($this->getGMSettings($this->currentgmbase)); } @@ -1089,8 +1191,7 @@ class MatchManagerCore implements ManialinkPageAnswerListener, CallbackListener, Logger::log("Restarting Map for load settings"); $this->maniaControl->getClient()->restartMap(); - } - else { + } else { $this->nbmaps++; Logger::log('nbmaps: ' . $this->nbmaps); @@ -1347,6 +1448,10 @@ class MatchManagerCore implements ManialinkPageAnswerListener, CallbackListener, Logger::log("Rounds finished: " . $this->nbrounds); + if ($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MODE_HIDENEXTMAPS) && $this->nbrounds == $this->settings_nbroundsbymap) { + $this->maniaControl->getClient()->addMap($this->maps[$this->nbmaps]); + } + // Trigger Callback $this->maniaControl->getCallbackManager()->triggerCallback(self::CB_MATCHMANAGER_ENDROUND, $this->matchid, $this->currentscore, []); } @@ -1507,7 +1612,7 @@ class MatchManagerCore implements ManialinkPageAnswerListener, CallbackListener, return; } - if (($this->matchStarted) && ($this->currentgmbase != "TimeAttack" || !empty($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_CUSTOM_GAMEMODE)))) { + if (($this->matchStarted) && ($this->currentgmbase != "TimeAttack" || ($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_SETTINGS_MODE) != 'All from file' && !empty($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_CUSTOM_GAMEMODE))))) { $text = $chatCallback[1][2]; $text = explode(" ", $text); if (isset($text[1]) && $text[1] != "") { @@ -1542,7 +1647,7 @@ class MatchManagerCore implements ManialinkPageAnswerListener, CallbackListener, $this->maniaControl->getAuthenticationManager()->sendNotAllowed($player); return; } - if (($this->matchStarted) && ($this->currentgmbase != "TimeAttack" || !empty($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_CUSTOM_GAMEMODE))) && $this->pauseon) { + if (($this->matchStarted) && ($this->currentgmbase != "TimeAttack" || ( $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_SETTINGS_MODE) != 'All from file' && !empty($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_MATCH_CUSTOM_GAMEMODE)))) && $this->pauseon) { $this->maniaControl->getChat()->sendSuccess($this->chatprefix . 'Admin stopped the break'); $this->unsetNadeoPause(); } else { @@ -1605,4 +1710,3 @@ class MatchManagerCore implements ManialinkPageAnswerListener, CallbackListener, } } } -