renamed server.xml
This commit is contained in:
		| @@ -1,888 +0,0 @@ | ||||
| <?php | ||||
|  | ||||
| namespace MCTeam; | ||||
|  | ||||
| use FML\Controls\Control; | ||||
| use FML\Controls\Frame; | ||||
| use FML\Controls\Gauge; | ||||
| use FML\Controls\Label; | ||||
| use FML\Controls\Labels\Label_Button; | ||||
| use FML\Controls\Labels\Label_Text; | ||||
| use FML\Controls\Quad; | ||||
| use FML\Controls\Quads\Quad_BgsPlayerCard; | ||||
| use FML\Controls\Quads\Quad_Icons128x32_1; | ||||
| use FML\Controls\Quads\Quad_Icons64x64_1; | ||||
| use FML\Controls\Quads\Quad_UIConstruction_Buttons; | ||||
| use FML\ManiaLink; | ||||
| use ManiaControl\Callbacks\CallbackListener; | ||||
| use ManiaControl\Callbacks\CallbackManager; | ||||
| use ManiaControl\Callbacks\TimerListener; | ||||
| use ManiaControl\ColorUtil; | ||||
| use ManiaControl\Commands\CommandListener; | ||||
| use ManiaControl\ManiaControl; | ||||
| use ManiaControl\Manialinks\ManialinkPageAnswerListener; | ||||
| use ManiaControl\Players\Player; | ||||
| use ManiaControl\Players\PlayerManager; | ||||
| use ManiaControl\Plugins\Plugin; | ||||
| use ManiaControl\Server\Server; | ||||
| use ManiaControl\Server\ServerCommands; | ||||
| use Maniaplanet\DedicatedServer\Structures\VoteRatio; | ||||
| use Maniaplanet\DedicatedServer\Xmlrpc\NotInScriptModeException; | ||||
| use FML\Script\Features\KeyAction; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * ManiaControl Custom-Votes Plugin | ||||
|  * | ||||
|  * @author kremsy | ||||
|  * @copyright ManiaControl Copyright © 2014 ManiaControl Team | ||||
|  * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 | ||||
|  */ | ||||
| class CustomVotesPlugin implements CommandListener, CallbackListener, ManialinkPageAnswerListener, TimerListener, Plugin { | ||||
| 	/* | ||||
| 	 * Constants | ||||
| 	 */ | ||||
| 	const PLUGIN_ID      = 5; | ||||
| 	const PLUGIN_VERSION = 0.1; | ||||
| 	const PLUGIN_NAME    = 'CustomVotesPlugin'; | ||||
| 	const PLUGIN_AUTHOR  = 'kremsy'; | ||||
|  | ||||
| 	const SETTING_VOTE_ICON_POSX   = 'Vote-Icon-Position: X'; | ||||
| 	const SETTING_VOTE_ICON_POSY   = 'Vote-Icon-Position: Y'; | ||||
| 	const SETTING_VOTE_ICON_WIDTH  = 'Vote-Icon-Size: Width'; | ||||
| 	const SETTING_VOTE_ICON_HEIGHT = 'Vote-Icon-Size: Height'; | ||||
|  | ||||
| 	const SETTING_WIDGET_POSX                = 'Widget-Position: X'; | ||||
| 	const SETTING_WIDGET_POSY                = 'Widget-Position: Y'; | ||||
| 	const SETTING_WIDGET_WIDTH               = 'Widget-Size: Width'; | ||||
| 	const SETTING_WIDGET_HEIGHT              = 'Widget-Size: Height'; | ||||
| 	const SETTING_VOTE_TIME                  = 'Voting Time'; | ||||
| 	const SETTING_DEFAULT_PLAYER_RATIO       = 'Minimum Player Voters Ratio'; | ||||
| 	const SETTING_DEFAULT_RATIO              = 'Default Success Ratio'; | ||||
| 	const SETTING_SPECTATOR_ALLOW_VOTE       = 'Allow Specators to vote'; | ||||
| 	const SETTING_SPECTATOR_ALLOW_START_VOTE = 'Allow Specators to start a vote'; | ||||
|  | ||||
| 	const MLID_WIDGET = 'CustomVotesPlugin.WidgetId'; | ||||
| 	const MLID_ICON   = 'CustomVotesPlugin.IconWidgetId'; | ||||
|  | ||||
|  | ||||
| 	const ACTION_POSITIVE_VOTE = 'CustomVotesPlugin.PositiveVote'; | ||||
| 	const ACTION_NEGATIVE_VOTE = 'CustomVotesPlugin.NegativeVote'; | ||||
| 	const ACTION_START_VOTE    = 'CustomVotesPlugin.StartVote.'; | ||||
|  | ||||
|  | ||||
| 	const CB_CUSTOM_VOTE_FINISHED = 'CustomVotesPlugin.CustomVoteFinished'; | ||||
|  | ||||
| 	/** | ||||
| 	 * Private properties | ||||
| 	 */ | ||||
| 	/** @var maniaControl $maniaControl */ | ||||
| 	private $maniaControl = null; | ||||
| 	private $voteCommands = array(); | ||||
| 	private $voteMenuItems = array(); | ||||
| 	/** @var CurrentVote $currentVote */ | ||||
| 	private $currentVote = null; | ||||
|  | ||||
| 	/** | ||||
| 	 * Prepares the Plugin | ||||
| 	 * | ||||
| 	 * @param ManiaControl $maniaControl | ||||
| 	 * @return mixed | ||||
| 	 */ | ||||
| 	public static function prepare(ManiaControl $maniaControl) { | ||||
| 		//do nothing | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Load the plugin | ||||
| 	 * | ||||
| 	 * @param \ManiaControl\ManiaControl $maniaControl | ||||
| 	 * @return bool | ||||
| 	 */ | ||||
| 	public function load(ManiaControl $maniaControl) { | ||||
| 		$this->maniaControl = $maniaControl; | ||||
|  | ||||
| 		$this->maniaControl->commandManager->registerCommandListener('vote', $this, 'chat_vote', false, 'Starts a new vote.'); | ||||
| 		$this->maniaControl->timerManager->registerTimerListening($this, 'handle1Second', 1000); | ||||
| 		$this->maniaControl->callbackManager->registerCallbackListener(ServerCommands::CB_VOTE_CANCELED, $this, 'handleVoteCanceled'); | ||||
| 		$this->maniaControl->manialinkManager->registerManialinkPageAnswerListener(self::ACTION_POSITIVE_VOTE, $this, 'handlePositiveVote'); | ||||
| 		$this->maniaControl->manialinkManager->registerManialinkPageAnswerListener(self::ACTION_NEGATIVE_VOTE, $this, 'handleNegativeVote'); | ||||
|  | ||||
| 		$this->maniaControl->callbackManager->registerCallbackListener(CallbackManager::CB_MP_PLAYERMANIALINKPAGEANSWER, $this, 'handleManialinkPageAnswer'); | ||||
| 		$this->maniaControl->callbackManager->registerCallbackListener(self::CB_CUSTOM_VOTE_FINISHED, $this, 'handleVoteFinished'); | ||||
| 		$this->maniaControl->callbackManager->registerCallbackListener(PlayerManager::CB_PLAYERCONNECT, $this, 'handlePlayerConnect'); | ||||
| 		$this->maniaControl->callbackManager->registerCallbackListener(Server::CB_TEAM_MODE_CHANGED, $this, 'constructMenu'); | ||||
|  | ||||
| 		//Settings | ||||
| 		$this->maniaControl->settingManager->initSetting($this, self::SETTING_VOTE_ICON_POSX, 156.); | ||||
| 		$this->maniaControl->settingManager->initSetting($this, self::SETTING_VOTE_ICON_POSY, -38.6); | ||||
| 		$this->maniaControl->settingManager->initSetting($this, self::SETTING_VOTE_ICON_WIDTH, 6); | ||||
| 		$this->maniaControl->settingManager->initSetting($this, self::SETTING_VOTE_ICON_HEIGHT, 6); | ||||
|  | ||||
| 		$this->maniaControl->settingManager->initSetting($this, self::SETTING_WIDGET_POSX, -80); //160 -15 | ||||
| 		$this->maniaControl->settingManager->initSetting($this, self::SETTING_WIDGET_POSY, 80); //-15 | ||||
| 		$this->maniaControl->settingManager->initSetting($this, self::SETTING_WIDGET_WIDTH, 50); //30 | ||||
| 		$this->maniaControl->settingManager->initSetting($this, self::SETTING_WIDGET_HEIGHT, 20); //25 | ||||
|  | ||||
| 		$this->maniaControl->settingManager->initSetting($this, self::SETTING_DEFAULT_RATIO, 0.75); | ||||
| 		$this->maniaControl->settingManager->initSetting($this, self::SETTING_DEFAULT_PLAYER_RATIO, 0.65); | ||||
| 		$this->maniaControl->settingManager->initSetting($this, self::SETTING_SPECTATOR_ALLOW_VOTE, false); | ||||
| 		$this->maniaControl->settingManager->initSetting($this, self::SETTING_SPECTATOR_ALLOW_START_VOTE, false); | ||||
| 		$this->maniaControl->settingManager->initSetting($this, self::SETTING_VOTE_TIME, 60); | ||||
|  | ||||
| 		//Define Votes | ||||
| 		$this->defineVote("teambalance", "Vote for Team Balance"); | ||||
| 		$this->defineVote("skipmap", "Vote for Skip Map"); | ||||
| 		$this->defineVote("nextmap", "Vote for Skip Map"); | ||||
| 		$this->defineVote("skip", "Vote for Skip Map"); | ||||
| 		$this->defineVote("restartmap", "Vote for Restart Map"); | ||||
| 		$this->defineVote("restart", "Vote for Restart Map"); | ||||
| 		$this->defineVote("pausegame", "Vote for Pause Game"); | ||||
| 		$this->defineVote("replay", "Vote to replay current map"); | ||||
|  | ||||
| 		foreach($this->voteCommands as $name => $voteCommand) { | ||||
| 			$this->maniaControl->commandManager->registerCommandListener($name, $this, 'handleChatVote', false, $voteCommand->name); | ||||
| 		} | ||||
|  | ||||
| 		/* Disable Standard Votes */ | ||||
| 		$array["Command"] = VoteRatio::COMMAND_BAN; | ||||
| 		$array["Param"]   = ""; | ||||
| 		$array["Ratio"]   = (float)-1; | ||||
| 		$ratioArray[]     = $array; | ||||
|  | ||||
| 		$array["Command"] = VoteRatio::COMMAND_KICK; | ||||
| 		$ratioArray[]     = $array; | ||||
|  | ||||
| 		$array["Command"] = VoteRatio::COMMAND_RESTART_MAP; | ||||
| 		$ratioArray[]     = $array; | ||||
|  | ||||
| 		$array["Command"] = VoteRatio::COMMAND_TEAM_BALANCE; | ||||
| 		$ratioArray[]     = $array; | ||||
|  | ||||
| 		$array["Command"] = VoteRatio::COMMAND_NEXT_MAP; | ||||
| 		$ratioArray[]     = $array; | ||||
|  | ||||
| 		$this->maniaControl->client->setCallVoteRatiosEx(false, $ratioArray); | ||||
|  | ||||
| 		$this->constructMenu(); | ||||
| 		return true; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Unload the plugin and its resources | ||||
| 	 */ | ||||
| 	public function unload() { | ||||
| 		//Enable Standard Votes | ||||
| 		$defaultRatio = $this->maniaControl->client->getCallVoteRatio(); | ||||
|  | ||||
| 		$array["Command"] = VoteRatio::COMMAND_BAN; | ||||
| 		$array["Param"]   = ""; | ||||
| 		$array["Ratio"]   = (float)$defaultRatio; | ||||
| 		$ratioArray[]     = $array; | ||||
| 		$array["Command"] = VoteRatio::COMMAND_KICK; | ||||
| 		$ratioArray[]     = $array; | ||||
| 		$array["Command"] = VoteRatio::COMMAND_RESTART_MAP; | ||||
| 		$ratioArray[]     = $array; | ||||
| 		$array["Command"] = VoteRatio::COMMAND_TEAM_BALANCE; | ||||
| 		$ratioArray[]     = $array; | ||||
| 		$array["Command"] = VoteRatio::COMMAND_NEXT_MAP; | ||||
| 		$ratioArray[]     = $array; | ||||
|  | ||||
| 		$this->maniaControl->client->setCallVoteRatiosEx(false, $ratioArray); | ||||
|  | ||||
| 		$this->destroyVote(); | ||||
| 		$emptyManialink = new ManiaLink(self::MLID_ICON); | ||||
| 		$this->maniaControl->manialinkManager->sendManialink($emptyManialink); | ||||
| 		$this->maniaControl->commandManager->unregisterCommandListener($this); | ||||
| 		$this->maniaControl->callbackManager->unregisterCallbackListener($this); | ||||
| 		$this->maniaControl->manialinkManager->unregisterManialinkPageAnswerListener($this); | ||||
| 		$this->maniaControl->timerManager->unregisterTimerListenings($this); | ||||
| 		unset($this->maniaControl); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Handle PlayerConnect callback | ||||
| 	 * | ||||
| 	 * @param Player $player | ||||
| 	 */ | ||||
| 	public function handlePlayerConnect(Player $player) { | ||||
| 		$this->showIcon($player->login); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Add a new Vote Menu Item | ||||
| 	 * | ||||
| 	 * @param Control $control | ||||
| 	 * @param int     $order | ||||
| 	 * @param string  $description | ||||
| 	 */ | ||||
| 	public function addVoteMenuItem(Control $control, $order = 0, $description = null) { | ||||
| 		if (!isset($this->voteMenuItems[$order])) { | ||||
| 			$this->voteMenuItems[$order] = array(); | ||||
| 			array_push($this->voteMenuItems[$order], array($control, $description)); | ||||
| 			krsort($this->voteMenuItems); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Chat Vote | ||||
| 	 * | ||||
| 	 * @param array  $chat | ||||
| 	 * @param Player $player | ||||
| 	 */ | ||||
| 	public function chat_vote(array $chat, Player $player) { | ||||
| 		$command = explode(" ", $chat[1][2]); | ||||
| 		if (isset($command[1])) { | ||||
| 			if (isset($this->voteCommands[$command[1]])) { | ||||
| 				$this->startVote($player, strtolower($command[1])); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Handle ManiaControl OnInit callback | ||||
| 	 * | ||||
| 	 * @internal param array $callback | ||||
| 	 */ | ||||
| 	public function constructMenu() { | ||||
| 		// Menu RestartMap | ||||
| 		$itemQuad = new Quad_UIConstruction_Buttons(); | ||||
| 		$itemQuad->setSubStyle($itemQuad::SUBSTYLE_Reload); | ||||
| 		$itemQuad->setAction(self::ACTION_START_VOTE . 'restartmap'); | ||||
| 		$this->addVoteMenuItem($itemQuad, 5, 'Vote for Restart-Map'); | ||||
|  | ||||
| 		//Check if Pause exists in current GameMode | ||||
| 		try { | ||||
| 			$scriptInfos = $this->maniaControl->client->getModeScriptInfo(); | ||||
|  | ||||
| 			$pauseExists = false; | ||||
| 			foreach($scriptInfos->commandDescs as $param) { | ||||
| 				if ($param->name == "Command_ForceWarmUp") { | ||||
| 					$pauseExists = true; | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			// Menu Pause | ||||
| 			if ($pauseExists) { | ||||
| 				$itemQuad = new Quad_Icons128x32_1(); | ||||
| 				$itemQuad->setSubStyle($itemQuad::SUBSTYLE_ManiaLinkSwitch); | ||||
| 				$itemQuad->setAction(self::ACTION_START_VOTE . 'pausegame'); | ||||
| 				$this->addVoteMenuItem($itemQuad, 10, 'Vote for a pause of Current Game'); | ||||
| 			} | ||||
| 		} catch(NotInScriptModeException $e) { | ||||
| 		} | ||||
|  | ||||
| 		//Menu SkipMap | ||||
| 		$itemQuad = new Quad_Icons64x64_1(); | ||||
| 		$itemQuad->setSubStyle($itemQuad::SUBSTYLE_ArrowFastNext); | ||||
| 		$itemQuad->setAction(self::ACTION_START_VOTE . 'skipmap'); | ||||
| 		$this->addVoteMenuItem($itemQuad, 15, 'Vote for a Mapskip'); | ||||
|  | ||||
| 		if ($this->maniaControl->server->isTeamMode()) { | ||||
| 			//Menu TeamBalance | ||||
| 			$itemQuad = new Quad_Icons128x32_1(); | ||||
| 			$itemQuad->setSubStyle($itemQuad::SUBSTYLE_RT_Team); | ||||
| 			$itemQuad->setAction(self::ACTION_START_VOTE . 'teambalance'); | ||||
| 			$this->addVoteMenuItem($itemQuad, 20, 'Vote for Team-Balance'); | ||||
| 		} | ||||
| 		//Show the Menu's icon | ||||
| 		$this->showIcon(); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Destroy the Vote on Canceled Callback | ||||
| 	 * | ||||
| 	 * @param Player $player | ||||
| 	 */ | ||||
| 	public function handleVoteCanceled(Player $player) { | ||||
| 		//reset vote | ||||
| 		$this->destroyVote(); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Handle Standard Votes | ||||
| 	 * | ||||
| 	 * @param $voteName | ||||
| 	 * @param $voteResult | ||||
| 	 */ | ||||
| 	public function handleVoteFinished($voteName, $voteResult) { | ||||
| 		if ($voteResult >= $this->currentVote->neededRatio) { | ||||
| 			// Call Closure if one exists | ||||
| 			if (is_callable($this->currentVote->function)) { | ||||
| 				call_user_func($this->currentVote->function, $voteResult); | ||||
| 				return; | ||||
| 			} | ||||
|  | ||||
| 			switch($voteName) { | ||||
| 				case 'teambalance': | ||||
| 					$this->maniaControl->client->autoTeamBalance(); | ||||
| <<<<<<< HEAD | ||||
| 					$this->maniaControl->chat->sendInformation('$f8fVote to $fffbalance the teams$f8f has been successfull!'); | ||||
| ======= | ||||
| 					$this->maniaControl->chat->sendInformation('$s$f8fVote to $fffbalance the teams$f8f was successful!'); | ||||
| >>>>>>> aa6357d... added custom voting with f1 & f2 | ||||
| 					break; | ||||
| 				case 'skipmap': | ||||
| 				case 'skip': | ||||
| 				case 'nextmap': | ||||
| 					$this->maniaControl->client->nextMap(); | ||||
| <<<<<<< HEAD | ||||
| 					$this->maniaControl->chat->sendInformation('$f8fVote to $fffskip the map$f8f has been successfull!'); | ||||
| 					break; | ||||
| 				case 'restartmap': | ||||
| 					$this->maniaControl->client->restartMap(); | ||||
| 					$this->maniaControl->chat->sendInformation('$f8fVote to $fffrestart the map$f8f has been successfull!'); | ||||
| 					break; | ||||
| 				case 'pausegame': | ||||
| 					$this->maniaControl->client->sendModeScriptCommands(array('Command_ForceWarmUp' => True)); | ||||
| 					$this->maniaControl->chat->sendInformation('$f8fVote to $fffpause the current game$f8f has been successfull!'); | ||||
| 					break; | ||||
| 				case 'replay': | ||||
| 					$this->maniaControl->mapManager->mapQueue->addFirstMapToMapQueue($this->currentVote->voter, $this->maniaControl->mapManager->getCurrentMap()); | ||||
| 					$this->maniaControl->chat->sendInformation('$f8fVote to $fffreplay the map$f8f has been successfull!'); | ||||
| ======= | ||||
| 					$this->maniaControl->chat->sendInformation('$s$f8fVote to $fffskip the map$f8f was successful!'); | ||||
| 					break; | ||||
| 				case 'restartmap': | ||||
| 					$this->maniaControl->client->restartMap(); | ||||
| 					$this->maniaControl->chat->sendInformation('$s$f8fVote to $fffrestart the map$f8f was successful!'); | ||||
| 					break; | ||||
| 				case 'pausegame': | ||||
| 					$this->maniaControl->client->sendModeScriptCommands(array('Command_ForceWarmUp' => True)); | ||||
| 					$this->maniaControl->chat->sendInformation('$s$f8fVote to $fffpause the current game$f8f was successful!'); | ||||
| 					break; | ||||
| 				case 'replay': | ||||
| 					$this->maniaControl->mapManager->mapQueue->addFirstMapToMapQueue($this->currentVote->voter, $this->maniaControl->mapManager->getCurrentMap()); | ||||
| 					$this->maniaControl->chat->sendInformation('$s$f8fVote to $fffreplay the map$f8f was successful!'); | ||||
| >>>>>>> aa6357d... added custom voting with f1 & f2 | ||||
| 					break; | ||||
| 			} | ||||
| 		} else { | ||||
| 			$this->maniaControl->chat->sendError('Vote Failed!'); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Handles the ManialinkPageAnswers and start a vote if a button in the panel got clicked | ||||
| 	 * | ||||
| 	 * @param array $callback | ||||
| 	 */ | ||||
| 	public function handleManialinkPageAnswer(array $callback) { | ||||
| 		$actionId    = $callback[1][2]; | ||||
| 		$actionArray = explode('.', $actionId); | ||||
| 		if (count($actionArray) <= 2) { | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		$voteIndex = $actionArray[2]; | ||||
| 		if (isset($this->voteCommands[$voteIndex])) { | ||||
| 			$login  = $callback[1][1]; | ||||
| 			$player = $this->maniaControl->playerManager->getPlayer($login); | ||||
| 			$this->startVote($player, $voteIndex); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	public function handleChatVote(array $chat, Player $player) { | ||||
| 		$chatCommand = explode(' ', $chat[1][2]); | ||||
| 		$chatCommand = $chatCommand[0]; | ||||
| 		$chatCommand = str_replace('/', '', $chatCommand); | ||||
|  | ||||
| 		if (isset($this->voteCommands[$chatCommand])) { | ||||
| 			$this->startVote($player, $chatCommand); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Defines a Vote | ||||
| 	 * | ||||
| 	 * @param      $voteIndex | ||||
| 	 * @param      $voteName | ||||
| 	 * @param bool $idBased | ||||
| 	 * @param      $neededRatio | ||||
| 	 */ | ||||
| 	public function defineVote($voteIndex, $voteName, $idBased = false, $startText = '', $neededRatio = -1) { | ||||
| 		if ($neededRatio == -1) { | ||||
| 			$neededRatio = $this->maniaControl->settingManager->getSetting($this, self::SETTING_DEFAULT_RATIO); | ||||
| 		} | ||||
| 		$voteCommand                    = new VoteCommand($voteIndex, $voteName, $idBased, $neededRatio); | ||||
| 		$voteCommand->startText         = $startText; | ||||
| 		$this->voteCommands[$voteIndex] = $voteCommand; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Undefines a Vote | ||||
| 	 * | ||||
| 	 * @param $voteIndex | ||||
| 	 */ | ||||
| 	public function undefineVote($voteIndex) { | ||||
| 		unset($this->voteCommands[$voteIndex]); | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	/** | ||||
| 	 * Starts a vote | ||||
| 	 * | ||||
| 	 * @param \ManiaControl\Players\Player $player | ||||
| 	 * @param                              $voteIndex | ||||
| 	 * @param                              $action | ||||
| 	 */ | ||||
| 	public function startVote(Player $player, $voteIndex, $function = null) { | ||||
| 		//Player is muted | ||||
| 		if ($this->maniaControl->playerManager->playerActions->isPlayerMuted($player)) { | ||||
| 			$this->maniaControl->chat->sendError('Muted Players are not allowed to start a vote.', $player->login); | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		//Specators are not allowed to start a vote | ||||
| 		if ($player->isSpectator && !$this->maniaControl->settingManager->getSetting($this, self::SETTING_SPECTATOR_ALLOW_START_VOTE)) { | ||||
| 			$this->maniaControl->chat->sendError('Spectators are not allowed to start a vote.', $player->login); | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		//Vote does not exist | ||||
| 		if (!isset($this->voteCommands[$voteIndex])) { | ||||
| 			$this->maniaControl->chat->sendError('Undefined vote.', $player->login); | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		//A vote is currently running | ||||
| 		if (isset($this->currentVote)) { | ||||
| 			$this->maniaControl->chat->sendError('There is currently another vote running.', $player->login); | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		$maxTime = $this->maniaControl->settingManager->getSetting($this, self::SETTING_VOTE_TIME); | ||||
|  | ||||
| 		$this->currentVote = $this->voteCommands[$voteIndex]; | ||||
|  | ||||
| 		$this->currentVote                    = new CurrentVote($this->voteCommands[$voteIndex], $player, time() + $maxTime); | ||||
| 		$this->currentVote->neededRatio       = floatval($this->maniaControl->settingManager->getSetting($this, self::SETTING_DEFAULT_RATIO)); | ||||
| 		$this->currentVote->neededPlayerRatio = floatval($this->maniaControl->settingManager->getSetting($this, self::SETTING_DEFAULT_PLAYER_RATIO)); | ||||
| 		$this->currentVote->function          = $function; | ||||
|  | ||||
| 		if ($this->currentVote->voteCommand->startText != '') { | ||||
| 			$message = $this->currentVote->voteCommand->startText; | ||||
| 		} else { | ||||
| 			$message = '$fff$<' . $player->nickname . '$>$f8f started a $fff$<' . $this->currentVote->voteCommand->name . '$>$f8f!'; | ||||
| 		} | ||||
|  | ||||
| 		$this->maniaControl->chat->sendSuccess($message); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Handles a Positive Vote | ||||
| 	 * | ||||
| 	 * @param array  $callback | ||||
| 	 * @param Player $player | ||||
| 	 */ | ||||
| 	public function handlePositiveVote(array $callback, Player $player) { | ||||
| 		if (!isset($this->currentVote) || $player->isSpectator && !$this->maniaControl->settingManager->getSetting($this, self::SETTING_SPECTATOR_ALLOW_VOTE)) { | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		$this->currentVote->votePositive($player->login); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Handles a negative Vote | ||||
| 	 * | ||||
| 	 * @param array  $callback | ||||
| 	 * @param Player $player | ||||
| 	 */ | ||||
| 	public function handleNegativeVote(array $callback, Player $player) { | ||||
| 		if (!isset($this->currentVote) || $player->isSpectator && !$this->maniaControl->settingManager->getSetting($this, self::SETTING_SPECTATOR_ALLOW_VOTE)) { | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		$this->currentVote->voteNegative($player->login); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Handle ManiaControl 1 Second callback | ||||
| 	 * | ||||
| 	 * @param $time | ||||
| 	 */ | ||||
| 	public function handle1Second($time) { | ||||
| 		if (!isset($this->currentVote)) { | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		$votePercentage = $this->currentVote->positiveVotes / $this->currentVote->getVoteCount(); | ||||
|  | ||||
| 		$timeUntilExpire = $this->currentVote->expireTime - time(); | ||||
| 		$this->showVoteWidget($timeUntilExpire, $votePercentage); | ||||
|  | ||||
| 		$playerCount      = $this->maniaControl->playerManager->getPlayerCount(); | ||||
| 		$playersVoteRatio = (100 / $playerCount * $this->currentVote->getVoteCount()) / 100; | ||||
|  | ||||
| 		//Check if vote is over | ||||
| 		if ($timeUntilExpire <= 0 || (($playersVoteRatio >= $this->currentVote->neededPlayerRatio) && (($votePercentage >= $this->currentVote->neededRatio) || ($votePercentage <= 1 - $this->currentVote->neededRatio)))) { | ||||
| 			// Trigger callback | ||||
| 			$this->maniaControl->callbackManager->triggerCallback(self::CB_CUSTOM_VOTE_FINISHED, $this->currentVote->voteCommand->index, $votePercentage); | ||||
|  | ||||
| 			//reset vote | ||||
| 			$this->destroyVote(); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Destroys the current Vote | ||||
| 	 */ | ||||
| 	private function destroyVote() { | ||||
| 		$emptyManialink = new ManiaLink(self::MLID_WIDGET); | ||||
| 		$this->maniaControl->manialinkManager->sendManialink($emptyManialink); | ||||
|  | ||||
| 		unset($this->currentVote); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Shows the vote widget | ||||
| 	 * | ||||
| 	 * @param $timeUntilExpire | ||||
| 	 * @param $votePercentage | ||||
| 	 */ | ||||
| 	private function showVoteWidget($timeUntilExpire, $votePercentage) { | ||||
| 		$pos_x   = $this->maniaControl->settingManager->getSetting($this, self::SETTING_WIDGET_POSX); | ||||
| 		$pos_y   = $this->maniaControl->settingManager->getSetting($this, self::SETTING_WIDGET_POSY); | ||||
| 		$width   = $this->maniaControl->settingManager->getSetting($this, self::SETTING_WIDGET_WIDTH); | ||||
| 		$height  = $this->maniaControl->settingManager->getSetting($this, self::SETTING_WIDGET_HEIGHT); | ||||
| 		$maxTime = $this->maniaControl->settingManager->getSetting($this, self::SETTING_VOTE_TIME); | ||||
|  | ||||
| 		$quadStyle    = $this->maniaControl->manialinkManager->styleManager->getDefaultQuadStyle(); | ||||
| 		$quadSubstyle = $this->maniaControl->manialinkManager->styleManager->getDefaultQuadSubstyle(); | ||||
| 		$labelStyle   = $this->maniaControl->manialinkManager->styleManager->getDefaultLabelStyle(); | ||||
|  | ||||
| 		$maniaLink = new ManiaLink(self::MLID_WIDGET); | ||||
|  | ||||
| 		// mainframe | ||||
| 		$frame = new Frame(); | ||||
| 		$maniaLink->add($frame); | ||||
| 		$frame->setSize($width, $height); | ||||
| 		$frame->setPosition($pos_x, $pos_y, 30); | ||||
|  | ||||
| 		// Background Quad | ||||
| 		$backgroundQuad = new Quad(); | ||||
| 		$frame->add($backgroundQuad); | ||||
| 		$backgroundQuad->setSize($width, $height); | ||||
| 		$backgroundQuad->setStyles($quadStyle, $quadSubstyle); | ||||
|  | ||||
| 		//Vote for label | ||||
| 		$label = new Label_Text(); | ||||
| 		$frame->add($label); | ||||
| 		$label->setY($height / 2 - 3); | ||||
| 		$label->setAlign(Control::CENTER, Control::CENTER); | ||||
| 		$label->setSize($width - 5, $height); | ||||
| 		$label->setTextSize(1.3); | ||||
| 		$label->setText('$s ' . $this->currentVote->voteCommand->name); | ||||
|  | ||||
| 		//Started by nick | ||||
| 		$label = new Label_Text(); | ||||
| 		$frame->add($label); | ||||
| 		$label->setY($height / 2 - 6); | ||||
| 		$label->setAlign(Control::CENTER, Control::CENTER); | ||||
| 		$label->setSize($width - 5, 2); | ||||
| 		$label->setTextSize(1); | ||||
| 		$label->setTextColor("F80"); | ||||
| 		$label->setText('$sStarted by ' . $this->currentVote->voter->nickname); | ||||
|  | ||||
| 		//Time Gauge | ||||
| 		$timeGauge = new Gauge(); | ||||
| 		$frame->add($timeGauge); | ||||
| 		$timeGauge->setY(1.5); | ||||
| 		$timeGauge->setSize($width * 0.95, 6); | ||||
| 		$timeGauge->setDrawBg(false); | ||||
| 		if (!$timeUntilExpire) $timeUntilExpire = 1; | ||||
| 		$timeGaugeRatio = (100 / $maxTime * $timeUntilExpire) / 100; | ||||
| 		$timeGauge->setRatio($timeGaugeRatio + 0.15 - $timeGaugeRatio * 0.15); | ||||
| 		$gaugeColor = ColorUtil::floatToStatusColor($timeGaugeRatio); | ||||
| 		$timeGauge->setColor($gaugeColor . '9'); | ||||
|  | ||||
| 		//Time Left | ||||
| 		$label = new Label_Text(); | ||||
| 		$frame->add($label); | ||||
| 		$label->setY(0); | ||||
| 		$label->setAlign(Control::CENTER, Control::CENTER); | ||||
| 		$label->setSize($width - 5, $height); | ||||
| 		$label->setTextSize(1.1); | ||||
| 		$label->setText('$sTime left: ' . $timeUntilExpire . "s"); | ||||
| 		$label->setTextColor("FFF"); | ||||
|  | ||||
| 		//Vote Gauge | ||||
| 		$voteGauge = new Gauge(); | ||||
| 		$frame->add($voteGauge); | ||||
| 		$voteGauge->setY(-4); | ||||
| 		$voteGauge->setSize($width * 0.65, 12); | ||||
| 		$voteGauge->setDrawBg(false); | ||||
| 		$voteGauge->setRatio($votePercentage + 0.10 - $votePercentage * 0.10); | ||||
| 		$gaugeColor = ColorUtil::floatToStatusColor($votePercentage); | ||||
| 		$voteGauge->setColor($gaugeColor . '6'); | ||||
|  | ||||
| 		$y         = -4.4; | ||||
| 		$voteLabel = new Label(); | ||||
| 		$frame->add($voteLabel); | ||||
| 		$voteLabel->setY($y); | ||||
| 		$voteLabel->setSize($width * 0.65, 12); | ||||
| 		$voteLabel->setStyle($labelStyle); | ||||
| 		$voteLabel->setTextSize(1); | ||||
| 		$voteLabel->setText('  ' . round($votePercentage * 100.) . '% (' . $this->currentVote->getVoteCount() . ')'); | ||||
|  | ||||
|  | ||||
| 		$positiveQuad = new Quad_BgsPlayerCard(); | ||||
| 		$frame->add($positiveQuad); | ||||
| 		$positiveQuad->setPosition(-$width / 2 + 6, $y); | ||||
| 		$positiveQuad->setSubStyle($positiveQuad::SUBSTYLE_BgPlayerCardBig); | ||||
| 		$positiveQuad->setSize(5, 5); | ||||
|  | ||||
| 		$positiveLabel = new Label_Button(); | ||||
| 		$frame->add($positiveLabel); | ||||
| 		$positiveLabel->setPosition(-$width / 2 + 6, $y); | ||||
| 		$positiveLabel->setStyle($labelStyle); | ||||
| 		$positiveLabel->setTextSize(1); | ||||
| 		$positiveLabel->setSize(3, 3); | ||||
| 		$positiveLabel->setTextColor("0F0"); | ||||
| 		$positiveLabel->setText("F1"); | ||||
|  | ||||
| 		$negativeQuad = clone $positiveQuad; | ||||
| 		$frame->add($negativeQuad); | ||||
| 		$negativeQuad->setX($width / 2 - 6); | ||||
|  | ||||
| 		$negativeLabel = clone $positiveLabel; | ||||
| 		$frame->add($negativeLabel); | ||||
| 		$negativeLabel->setX($width / 2 - 6); | ||||
| 		$negativeLabel->setTextColor("F00"); | ||||
| 		$negativeLabel->setText("F2"); | ||||
| 		 | ||||
| 		// Voting Actions | ||||
| 		$positiveQuad->addActionTriggerFeature(self::ACTION_POSITIVE_VOTE); | ||||
| 		$negativeQuad->addActionTriggerFeature(self::ACTION_NEGATIVE_VOTE); | ||||
| 		 | ||||
| 		$script = $maniaLink->getScript(); | ||||
| 		$keyActionPositive = new KeyAction(self::ACTION_POSITIVE_VOTE, 'F1'); | ||||
| 		$script->addFeature($keyActionPositive); | ||||
| 		$keyActionNegative = new KeyAction(self::ACTION_NEGATIVE_VOTE, 'F2'); | ||||
| 		$script->addFeature($keyActionNegative); | ||||
|  | ||||
| 		// Send manialink | ||||
| 		$this->maniaControl->manialinkManager->sendManialink($maniaLink); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Shows the Icon Widget | ||||
| 	 * | ||||
| 	 * @param bool $login | ||||
| 	 */ | ||||
| 	private function showIcon($login = false) { | ||||
| 		$posX              = $this->maniaControl->settingManager->getSetting($this, self::SETTING_VOTE_ICON_POSX); | ||||
| 		$posY              = $this->maniaControl->settingManager->getSetting($this, self::SETTING_VOTE_ICON_POSY); | ||||
| 		$width             = $this->maniaControl->settingManager->getSetting($this, self::SETTING_VOTE_ICON_WIDTH); | ||||
| 		$height            = $this->maniaControl->settingManager->getSetting($this, self::SETTING_VOTE_ICON_HEIGHT); | ||||
| 		$shootManiaOffset  = $this->maniaControl->manialinkManager->styleManager->getDefaultIconOffsetSM(); | ||||
| 		$quadStyle         = $this->maniaControl->manialinkManager->styleManager->getDefaultQuadStyle(); | ||||
| 		$quadSubstyle      = $this->maniaControl->manialinkManager->styleManager->getDefaultQuadSubstyle(); | ||||
| 		$itemMarginFactorX = 1.3; | ||||
| 		$itemMarginFactorY = 1.2; | ||||
|  | ||||
| 		//If game is shootmania lower the icons position by 20 | ||||
| 		if($this->maniaControl->mapManager->getCurrentMap()->getGame() == 'sm') { | ||||
| 			$posY -= $shootManiaOffset; | ||||
| 		} | ||||
|  | ||||
| 		$itemSize = $width; | ||||
|  | ||||
| 		$maniaLink = new ManiaLink(self::MLID_ICON); | ||||
|  | ||||
| 		//Custom Vote Menu Iconsframe | ||||
| 		$frame = new Frame(); | ||||
| 		$maniaLink->add($frame); | ||||
| 		$frame->setPosition($posX, $posY); | ||||
|  | ||||
| 		$backgroundQuad = new Quad(); | ||||
| 		$frame->add($backgroundQuad); | ||||
| 		$backgroundQuad->setSize($width * $itemMarginFactorX, $height * $itemMarginFactorY); | ||||
| 		$backgroundQuad->setStyles($quadStyle, $quadSubstyle); | ||||
|  | ||||
| 		$iconFrame = new Frame(); | ||||
| 		$frame->add($iconFrame); | ||||
|  | ||||
| 		$iconFrame->setSize($itemSize, $itemSize); | ||||
| 		$itemQuad = new Quad_UIConstruction_Buttons(); | ||||
| 		$itemQuad->setSubStyle($itemQuad::SUBSTYLE_Add); | ||||
| 		$itemQuad->setSize($itemSize, $itemSize); | ||||
| 		$iconFrame->add($itemQuad); | ||||
|  | ||||
| 		//Define Description Label | ||||
| 		$menuEntries      = count($this->voteMenuItems); | ||||
| 		$descriptionFrame = new Frame(); | ||||
| 		$maniaLink->add($descriptionFrame); | ||||
| 		$descriptionFrame->setPosition($posX - $menuEntries * $itemSize * 1.15 - 6, $posY); | ||||
|  | ||||
| 		$descriptionLabel = new Label(); | ||||
| 		$descriptionFrame->add($descriptionLabel); | ||||
| 		$descriptionLabel->setAlign(Control::RIGHT, Control::TOP); | ||||
| 		$descriptionLabel->setSize(40, 4); | ||||
| 		$descriptionLabel->setTextSize(1.4); | ||||
| 		$descriptionLabel->setTextColor('fff'); | ||||
|  | ||||
| 		//Popout Frame | ||||
| 		$popoutFrame = new Frame(); | ||||
| 		$maniaLink->add($popoutFrame); | ||||
| 		$popoutFrame->setPosition($posX - $itemSize * 0.5, $posY); | ||||
| 		$popoutFrame->setHAlign(Control::RIGHT); | ||||
| 		$popoutFrame->setSize(4 * $itemSize * $itemMarginFactorX, $itemSize * $itemMarginFactorY); | ||||
| 		$popoutFrame->setVisible(false); | ||||
|  | ||||
| 		$backgroundQuad = new Quad(); | ||||
| 		$popoutFrame->add($backgroundQuad); | ||||
| 		$backgroundQuad->setHAlign(Control::RIGHT); | ||||
| 		$backgroundQuad->setStyles($quadStyle, $quadSubstyle); | ||||
| 		$backgroundQuad->setSize($menuEntries * $itemSize * 1.15 + 2, $itemSize * $itemMarginFactorY); | ||||
|  | ||||
|         $itemQuad->addToggleFeature($popoutFrame); | ||||
|  | ||||
| 		// Add items | ||||
| 		$x = -1; | ||||
| 		foreach($this->voteMenuItems as $menuItems) { | ||||
| 			foreach($menuItems as $menuItem) { | ||||
| 				$menuQuad = $menuItem[0]; | ||||
| 				/** | ||||
| 				 * @var Quad $menuQuad | ||||
| 				 */ | ||||
| 				$popoutFrame->add($menuQuad); | ||||
| 				$menuQuad->setSize($itemSize, $itemSize); | ||||
| 				$menuQuad->setX($x); | ||||
| 				$menuQuad->setHAlign(Control::RIGHT); | ||||
| 				$x -= $itemSize * 1.05; | ||||
|  | ||||
| 				if ($menuItem[1]) { | ||||
| 						$menuQuad->removeScriptFeatures(); | ||||
| 					$description = '$s' . $menuItem[1]; | ||||
|                     $menuQuad->addTooltipLabelFeature($descriptionLabel, $description); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
|  | ||||
| 		// Send manialink | ||||
| 		$this->maniaControl->manialinkManager->sendManialink($maniaLink, $login); | ||||
| 	} | ||||
|  | ||||
|  | ||||
| 	/** | ||||
| 	 * Get plugin id | ||||
| 	 * | ||||
| 	 * @return int | ||||
| 	 */ | ||||
| 	public static function getId() { | ||||
| 		return self::PLUGIN_ID; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Get Plugin Name | ||||
| 	 * | ||||
| 	 * @return string | ||||
| 	 */ | ||||
| 	public static function getName() { | ||||
| 		return self::PLUGIN_NAME; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Get Plugin Version | ||||
| 	 * | ||||
| 	 * @return float,, | ||||
| 	 */ | ||||
| 	public static function getVersion() { | ||||
| 		return self::PLUGIN_VERSION; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Get Plugin Author | ||||
| 	 * | ||||
| 	 * @return string | ||||
| 	 */ | ||||
| 	public static function getAuthor() { | ||||
| 		return self::PLUGIN_AUTHOR; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Get Plugin Description | ||||
| 	 * | ||||
| 	 * @return string | ||||
| 	 */ | ||||
| 	public static function getDescription() { | ||||
| 		return 'Plugin offers your Custom Votes like Restart, Skip, Balance...'; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Vote Command Structure | ||||
|  */ | ||||
| class VoteCommand { | ||||
| 	public $index = ''; | ||||
| 	public $name = ''; | ||||
| 	public $neededRatio = 0; | ||||
| 	public $idBased = false; | ||||
| 	public $startText = ''; | ||||
|  | ||||
| 	public function __construct($index, $name, $idBased, $neededRatio) { | ||||
| 		$this->index       = $index; | ||||
| 		$this->name        = $name; | ||||
| 		$this->idBased     = $idBased; | ||||
| 		$this->neededRatio = $neededRatio; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Current Vote Structure | ||||
|  */ | ||||
| class CurrentVote { | ||||
| 	const VOTE_FOR_ACTION     = '1'; | ||||
| 	const VOTE_AGAINST_ACTION = '-1'; | ||||
|  | ||||
| 	public $voteCommand = null; | ||||
| 	public $expireTime = 0; | ||||
| 	public $positiveVotes = 0; | ||||
| 	public $neededRatio = 0; | ||||
| 	public $neededPlayerRatio = 0; | ||||
| 	public $voter = null; | ||||
| 	public $map = null; | ||||
| 	public $player = null; | ||||
| 	public $function = null; | ||||
|  | ||||
| 	private $playersVoted = array(); | ||||
|  | ||||
| 	public function __construct(VoteCommand $voteCommand, Player $voter, $expireTime) { | ||||
| 		$this->expireTime  = $expireTime; | ||||
| 		$this->voteCommand = $voteCommand; | ||||
| 		$this->voter       = $voter; | ||||
| 		$this->votePositive($voter->login); | ||||
| 	} | ||||
|  | ||||
| 	public function votePositive($login) { | ||||
| 		if (isset($this->playersVoted[$login])) { | ||||
| 			if ($this->playersVoted[$login] == self::VOTE_AGAINST_ACTION) { | ||||
| 				$this->playersVoted[$login] = self::VOTE_FOR_ACTION; | ||||
| 				$this->positiveVotes++; | ||||
| 			} | ||||
| 		} else { | ||||
| 			$this->playersVoted[$login] = self::VOTE_FOR_ACTION; | ||||
| 			$this->positiveVotes++; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	public function voteNegative($login) { | ||||
| 		if (isset($this->playersVoted[$login])) { | ||||
| 			if ($this->playersVoted[$login] == self::VOTE_FOR_ACTION) { | ||||
| 				$this->playersVoted[$login] = self::VOTE_AGAINST_ACTION; | ||||
| 				$this->positiveVotes--; | ||||
| 			} | ||||
| 		} else { | ||||
| 			$this->playersVoted[$login] = self::VOTE_AGAINST_ACTION; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	public function getVoteCount() { | ||||
| 		return count($this->playersVoted); | ||||
| 	} | ||||
|  | ||||
| } | ||||
		Reference in New Issue
	
	Block a user