diff --git a/application/plugins/Dedimania/Dedimania.php b/application/plugins/Dedimania/Dedimania.php index 26880947..5988965c 100644 --- a/application/plugins/Dedimania/Dedimania.php +++ b/application/plugins/Dedimania/Dedimania.php @@ -1,4 +1,5 @@ + * @copyright 2014 ManiaControl Team * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class Dedimania implements CallbackListener, CommandListener, TimerListener, Plugin { - /** + /* * Constants */ const ID = 8; const VERSION = 0.1; + const AUTHOR = 'MCTeam'; + const NAME = 'Dedimania Plugin'; const MLID_DEDIMANIA = 'Dedimania.ManialinkId'; const XMLRPC_MULTICALL = 'system.multicall'; const DEDIMANIA_URL = 'http://dedimania.net:8081/Dedimania'; @@ -56,7 +59,7 @@ class Dedimania implements CallbackListener, CommandListener, TimerListener, Plu const CB_DEDIMANIA_UPDATED = 'Dedimania.Updated'; const ACTION_SHOW_DEDIRECORDSLIST = 'Dedimania.ShowDediRecordsList'; - /** + /* * Private Properties */ /** @var ManiaControl $maniaControl */ @@ -68,23 +71,52 @@ class Dedimania implements CallbackListener, CommandListener, TimerListener, Plu private $init = false; /** - * Prepares the Plugin - * - * @param ManiaControl $maniaControl - * @return mixed + * @see \ManiaControl\Plugins\Plugin::prepare() */ public static function prepare(ManiaControl $maniaControl) { $servers = $maniaControl->server->getAllServers(); - foreach($servers as $server) { + foreach ($servers as $server) { $maniaControl->settingManager->initSetting(get_class(), self::SETTING_DEDIMANIA_CODE . $server->login . '$l', ''); } } /** - * Load the plugin - * - * @param \ManiaControl\ManiaControl $maniaControl - * @return bool + * @see \ManiaControl\Plugins\Plugin::getId() + */ + public static function getId() { + return self::ID; + } + + /** + * @see \ManiaControl\Plugins\Plugin::getName() + */ + public static function getName() { + return self::NAME; + } + + /** + * @see \ManiaControl\Plugins\Plugin::getVersion() + */ + public static function getVersion() { + return self::VERSION; + } + + /** + * @see \ManiaControl\Plugins\Plugin::getAuthor() + */ + public static function getAuthor() { + return self::AUTHOR; + } + + /** + * @see \ManiaControl\Plugins\Plugin::getDescription() + */ + public static function getDescription() { + return "Dedimania Plugin for Trackmania"; + } + + /** + * @see \ManiaControl\Plugins\Plugin::load() */ public function load(ManiaControl $maniaControl) { $this->maniaControl = $maniaControl; @@ -117,8 +149,8 @@ class Dedimania implements CallbackListener, CommandListener, TimerListener, Plu $serverInfo = $this->maniaControl->server->getInfo(); $serverVersion = $this->maniaControl->client->getVersion(); $packMask = $this->maniaControl->server->titleId; - if($packMask != 'Trackmania_2@nadeolabs') { - $packMask = substr($this->maniaControl->server->titleId, 2); + if ($packMask != 'Trackmania_2@nadeolabs') { + $packMask = substr($this->maniaControl->server->titleId, 2); } $dedimaniaCode = $this->maniaControl->settingManager->getSetting($this, self::SETTING_DEDIMANIA_CODE . $serverInfo->login . '$l'); @@ -147,7 +179,7 @@ class Dedimania implements CallbackListener, CommandListener, TimerListener, Plu $data = $self->decode($data); if (is_array($data)) { - foreach($data as $index => $methodResponse) { + foreach ($data as $index => $methodResponse) { if (xmlrpc_is_fault($methodResponse)) { $self->handleXmlRpcFault($methodResponse, Dedimania::DEDIMANIA_OPENSESSION); } else if ($index <= 0) { @@ -166,6 +198,194 @@ class Dedimania implements CallbackListener, CommandListener, TimerListener, Plu }, $content, true); } + /** + * Encode the given xml rpc method and params + * + * @param string $method + * @param array $params + * @return string + */ + private function encode_request($method, $params) { + $paramArray = array(array('methodName' => $method, 'params' => $params), array('methodName' => self::DEDIMANIA_WARNINGSANDTTR2, 'params' => array())); + return xmlrpc_encode_request(self::XMLRPC_MULTICALL, array($paramArray), array('encoding' => 'UTF-8', 'escaping' => 'markup')); + } + + /** + * Decodes xml rpc response + * + * @param string $response + * @return mixed + */ + private function decode($response) { + return xmlrpc_decode($response, 'utf-8'); + } + + /** + * Handle xml rpc fault + * + * @param $fault + * @param $method + */ + private function handleXmlRpcFault($fault, $method) { + trigger_error('XmlRpc Fault on ' . $method . ': ' . $fault['faultString'] . ' (' . $fault['faultCode'] . ')'); + } + + /** + * Fetch Dedimania Records + * + * @param bool $reset + */ + private function fetchDedimaniaRecords($reset = true) { + if (!$this->dedimaniaData || $this->dedimaniaData->sessionId == '') { + return false; + } + + // Reset records + if ($reset) { + $this->dedimaniaData->records = array(); + } + + + $serverInfo = $this->getServerInfo(); + $playerInfo = $this->getPlayerList(); + $mapInfo = $this->getMapInfo(); + $gameMode = $this->getGameModeString(); + + if (!$serverInfo || !$playerInfo || !$mapInfo || !$gameMode) { + return false; + } + + $data = array($this->dedimaniaData->sessionId, $mapInfo, $gameMode, $serverInfo, $playerInfo); + $content = $this->encode_request(self::DEDIMANIA_GETRECORDS, $data); + + $self = $this; + $this->maniaControl->fileReader->postData(self::DEDIMANIA_URL, function ($data, $error) use (&$self) { + if ($error != '') { + $self->maniaControl->log("Dedimania Error: " . $error); + } + + $data = $self->decode($data); + + if (is_array($data)) { + foreach ($data as $index => $methodResponse) { + if (xmlrpc_is_fault($methodResponse)) { + $self->handleXmlRpcFault($methodResponse, Dedimania::DEDIMANIA_GETRECORDS); + return false; + } else if ($index <= 0) { + $responseData = $methodResponse[0]; + $self->dedimaniaData->serverMaxRank = $responseData['ServerMaxRank']; + + foreach ($responseData['Players'] as $player) { + $dediPlayer = new DedimaniaPlayer(null); + $dediPlayer->constructNewPlayer($player['Login'], $player['MaxRank']); + $self->dedimaniaData->addPlayer($dediPlayer); + } + foreach ($responseData['Records'] as $key => $record) { + $self->dedimaniaData->records[$key] = new RecordData($record); + } + } + } + } + $self->updateManialink = true; + $self->maniaControl->callbackManager->triggerCallback(Dedimania::CB_DEDIMANIA_UPDATED, $self->dedimaniaData->records); + return true; + }, $content, true); + + return true; + } + + /** + * Build server info Structure for callbacks + */ + private function getServerInfo() { + $server = $this->maniaControl->client->getServerOptions(); + if (!$server) { + return null; + } + + if (count($this->maniaControl->playerManager->getPlayers()) == 0) { + return null; + } + + $playerCount = $this->maniaControl->playerManager->getPlayerCount(); + $spectatorCount = $this->maniaControl->playerManager->getSpectatorCount(); + + return array('SrvName' => $server->name, 'Comment' => $server->comment, 'Private' => (strlen($server->password) > 0), 'NumPlayers' => $playerCount, 'MaxPlayers' => $server->currentMaxPlayers, 'NumSpecs' => $spectatorCount, 'MaxSpecs' => $server->currentMaxSpectators); + } + + /** + * Build simple player list for callbacks + */ + private function getPlayerList() { + $players = $this->maniaControl->playerManager->getPlayers(); + + if (count($players) == 0) { + return null; + } + $playerInfo = array(); + foreach ($players as $player) { + /** @var Player $player */ + array_push($playerInfo, array('Login' => $player->login, 'IsSpec' => $player->isSpectator)); + } + return $playerInfo; + } + + /** + * Build map info struct for dedimania requests + */ + private function getMapInfo() { + $map = $this->maniaControl->mapManager->getCurrentMap(); + if (!$map) { + return null; + } + $mapInfo = array(); + $mapInfo['UId'] = $map->uid; + $mapInfo['Name'] = $map->rawName; + $mapInfo['Author'] = $map->authorLogin; + $mapInfo['Environment'] = $map->environment; + $mapInfo['NbCheckpoints'] = $map->nbCheckpoints; + $mapInfo['NbLaps'] = $map->nbLaps; + return $mapInfo; + } + + /** + * Get Dedimania string representation of the current game mode + * + * @return String + */ + private function getGameModeString() { + $gameMode = $this->maniaControl->server->getGameMode(); + $scriptNameResponse = $this->maniaControl->client->getScriptName(); + $scriptName = str_replace('.Script.txt', '', $scriptNameResponse["CurrentValue"]); + if ($gameMode === null) { + trigger_error("Couldn't retrieve game mode. "); + return null; + } + switch ($gameMode) { + case 0: + { + if ($scriptName == 'Rounds' || $scriptName == 'Cup' || $scriptName == 'Team') { + return 'Rounds'; + } else if ($scriptName == 'TimeAttack' || $scriptName == 'Laps' || $scriptName == 'TeamAttack' || $scriptName == 'TimeAttackPlus') { + return 'TA'; + } + break; + } + case 1: + case 3: + case 5: + { + return 'Rounds'; + } + case 2: + case 4: + { + return 'TA'; + } + } + return null; + } + /** * Handle 1Second callback */ @@ -185,6 +405,101 @@ class Dedimania implements CallbackListener, CommandListener, TimerListener, Plu } } + /** + * Build Manialink + * + * @return \FML\ManiaLink + */ + private function buildManialink() { + if (!$this->dedimaniaData->records) { + return null; + } + $records = $this->dedimaniaData->records; + + $title = $this->maniaControl->settingManager->getSetting($this, self::SETTING_WIDGET_TITLE); + $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); + $lines = $this->maniaControl->settingManager->getSetting($this, self::SETTING_WIDGET_LINESCOUNT); + $lineHeight = $this->maniaControl->settingManager->getSetting($this, self::SETTING_WIDGET_LINEHEIGHT); + $labelStyle = $this->maniaControl->manialinkManager->styleManager->getDefaultLabelStyle(); + $quadStyle = $this->maniaControl->manialinkManager->styleManager->getDefaultQuadStyle(); + $quadSubstyle = $this->maniaControl->manialinkManager->styleManager->getDefaultQuadSubstyle(); + + + $manialink = new ManiaLink(self::MLID_DEDIMANIA); + $frame = new Frame(); + $manialink->add($frame); + $frame->setPosition($pos_x, $pos_y); + + $backgroundQuad = new Quad(); + $frame->add($backgroundQuad); + $backgroundQuad->setVAlign(Control::TOP); + $height = 7. + $lines * $lineHeight; + $backgroundQuad->setSize($width * 1.05, $height); + $backgroundQuad->setStyles($quadStyle, $quadSubstyle); + + $titleLabel = new Label(); + $frame->add($titleLabel); + $titleLabel->setPosition(0, $lineHeight * -0.9); + $titleLabel->setWidth($width); + $titleLabel->setStyle($labelStyle); + $titleLabel->setTextSize(2); + $titleLabel->setText($title); + $titleLabel->setTranslate(true); + + foreach ($records as $index => $record) { + /** @var RecordData $record */ + if ($index >= $lines) { + break; + } + + $y = -8. - $index * $lineHeight; + + $recordFrame = new Frame(); + $frame->add($recordFrame); + $recordFrame->setPosition(0, $y); + + /*$backgroundQuad = new Quad(); + $recordFrame->add($backgroundQuad); + $backgroundQuad->setSize($width * 1.04, $lineHeight * 1.4); + $backgroundQuad->setStyles($quadStyle, $quadSubstyle);*/ + + //Rank + $rankLabel = new Label(); + $recordFrame->add($rankLabel); + $rankLabel->setHAlign(Control::LEFT); + $rankLabel->setX($width * -0.47); + $rankLabel->setSize($width * 0.06, $lineHeight); + $rankLabel->setTextSize(1); + $rankLabel->setTextPrefix('$o'); + $rankLabel->setText($record->rank); + $rankLabel->setTextEmboss(true); + + //Name + $nameLabel = new Label(); + $recordFrame->add($nameLabel); + $nameLabel->setHAlign(Control::LEFT); + $nameLabel->setX($width * -0.4); + $nameLabel->setSize($width * 0.6, $lineHeight); + $nameLabel->setTextSize(1); + $nameLabel->setText($record->nickName); + $nameLabel->setTextEmboss(true); + + //Time + $timeLabel = new Label(); + $recordFrame->add($timeLabel); + $timeLabel->setHAlign(Control::RIGHT); + $timeLabel->setX($width * 0.47); + $timeLabel->setSize($width * 0.25, $lineHeight); + $timeLabel->setTextSize(1); + $timeLabel->setText(Formatter::formatTime($record->best)); + $timeLabel->setTextEmboss(true); + } + + return $manialink; + } + /** * Check if the session is alive every minute * @@ -197,6 +512,42 @@ class Dedimania implements CallbackListener, CommandListener, TimerListener, Plu $this->checkDedimaniaSession(); } + /** + * Checks If a Dedimania Session exists, if not create a new oen + */ + private function checkDedimaniaSession() { + if ($this->dedimaniaData->sessionId == '') { + $this->openDedimaniaSession(); + return; + } + + $content = $this->encode_request(self::DEDIMANIA_CHECKSESSION, array($this->dedimaniaData->sessionId)); + + $self = $this; + $this->maniaControl->fileReader->postData(self::DEDIMANIA_URL, function ($data, $error) use (&$self) { + if ($error != '') { + $self->maniaControl->log("Dedimania Error: " . $error); + } + + $data = $self->decode($data); + if (is_array($data)) { + foreach ($data as $methodResponse) { + if (xmlrpc_is_fault($methodResponse)) { + $self->handleXmlRpcFault($methodResponse, Dedimania::DEDIMANIA_CHECKSESSION); + } else { + $responseData = $methodResponse[0]; + if (is_bool($responseData)) { + if (!$responseData) { + $self->openDedimaniaSession(); + } + } + } + } + } + }, $content, true); + return; + } + /** * Handle PlayerConnect callback * @@ -215,7 +566,7 @@ class Dedimania implements CallbackListener, CommandListener, TimerListener, Plu $data = $self->decode($data); if (is_array($data)) { - foreach($data as $index => $methodResponse) { + foreach ($data as $index => $methodResponse) { if (xmlrpc_is_fault($methodResponse)) { $self->handleXmlRpcFault($methodResponse, Dedimania::DEDIMANIA_PLAYERCONNECT); } else if ($index <= 0) { @@ -262,7 +613,7 @@ class Dedimania implements CallbackListener, CommandListener, TimerListener, Plu $data = $self->decode($data); if (is_array($data)) { - foreach($data as $methodResponse) { + foreach ($data as $methodResponse) { if (xmlrpc_is_fault($methodResponse)) { $self->handleXmlRpcFault($methodResponse, Dedimania::DEDIMANIA_PLAYERDISCONNECT); } @@ -301,7 +652,7 @@ class Dedimania implements CallbackListener, CommandListener, TimerListener, Plu $gameMode = $this->getGameModeString(); $times = array(); $replays = array(); - foreach($this->dedimaniaData->records as $record) { + foreach ($this->dedimaniaData->records as $record) { /** @var RecordData $record */ if ($record->rank > $this->dedimaniaData->serverMaxRank) { break; @@ -340,7 +691,7 @@ class Dedimania implements CallbackListener, CommandListener, TimerListener, Plu $data = $self->decode($data); if (is_array($data)) { - foreach($data as $index => $methodResponse) { + foreach ($data as $index => $methodResponse) { if (xmlrpc_is_fault($methodResponse)) { $self->handleXmlRpcFault($methodResponse, Dedimania::DEDIMANIA_SETCHALLENGETIMES); } else { @@ -357,7 +708,7 @@ class Dedimania implements CallbackListener, CommandListener, TimerListener, Plu $errors = $methodResponse[0]['methods'][0]['errors']; if ($errors) { $maniaControl->errorHandler->triggerDebugNotice($errors); - // TODO: check if this is sufficient + // TODO: check if this is sufficient } } } @@ -390,7 +741,7 @@ class Dedimania implements CallbackListener, CommandListener, TimerListener, Plu $data = $self->decode($data); if (is_array($data)) { - foreach($data as $methodResponse) { + foreach ($data as $methodResponse) { if (xmlrpc_is_fault($methodResponse)) { $self->handleXmlRpcFault($methodResponse, Dedimania::DEDIMANIA_UPDATESERVERPLAYERS); } @@ -405,6 +756,21 @@ class Dedimania implements CallbackListener, CommandListener, TimerListener, Plu }, $content, true); } + /** + * Build votes info struct for callbacks + */ + private function getVotesInfo() { + $map = $this->maniaControl->mapManager->getCurrentMap(); + if (!$map) { + return null; + } + $gameMode = $this->getGameModeString(); + if (!$gameMode) { + return null; + } + return array('UId' => $map->uid, 'GameMode' => $gameMode); + } + /** * Handle PlayerCheckpoint callback * @@ -452,7 +818,7 @@ class Dedimania implements CallbackListener, CommandListener, TimerListener, Plu if ($this->insertDedimaniaRecord($newRecord, $oldRecord)) { // Get newly saved record - foreach($this->dedimaniaData->records as &$record) { + foreach ($this->dedimaniaData->records as &$record) { /** @var RecordData $record */ if ($record->login !== $newRecord->login) { continue; @@ -482,6 +848,202 @@ class Dedimania implements CallbackListener, CommandListener, TimerListener, Plu } } + /** + * Get the dedimania record of the given login + * + * @param string $login + * @return RecordData $record + */ + private function getDedimaniaRecord($login) { + if (!$this->dedimaniaData->records) { + return new RecordData(null); + } + $records = $this->dedimaniaData->records; + foreach ($records as &$record) { + /** @var RecordData $record */ + if ($record->login === $login) { + return $record; + } + } + + return new RecordData(null); + } + + /** + * Get current checkpoint string for dedimania record + * + * @param string $login + * @return string + */ + private function getCheckpoints($login) { + if (!$login || !isset($this->checkpoints[$login])) { + return null; + } + $string = ''; + $count = count($this->checkpoints[$login]); + foreach ($this->checkpoints[$login] as $index => $check) { + $string .= $check; + if ($index < $count - 1) { + $string .= ','; + } + } + return $string; + } + + /** + * Inserts the given new Dedimania record at the proper position + * + * @param array $newRecord + * @return bool + */ + private function insertDedimaniaRecord(RecordData &$newRecord, RecordData $oldRecord) { + if ($newRecord->nullRecord) { + return false; + } + + $insert = false; + + // Get max possible rank + $maxRank = $this->dedimaniaData->getPlayerMaxRank($newRecord->login); + + // Loop through existing records + foreach ($this->dedimaniaData->records as $key => &$record) { + /** @var RecordData $record */ + if ($record->rank > $maxRank) { + // Max rank reached + return false; + } + if ($record->login === $newRecord->login) { + // Old record of the same player + if ($record->best <= $newRecord->best) { + // It's better - Do nothing + return false; + } + + // Replace old record + unset($this->dedimaniaData->records[$key]); + $insert = true; + break; + } + + // Other player's record + if ($record->best <= $newRecord->best) { + // It's better - Skip + continue; + } + + // New record is better - Insert it + $insert = true; + if ($oldRecord) { + // Remove old record + foreach ($this->dedimaniaData->records as $key2 => $record2) { + /** @var RecordData $record2 */ + if ($record2->login !== $oldRecord->login) { + continue; + } + unset($this->dedimaniaData->records[$key2]); + break; + } + } + break; + } + + if (!$insert && count($this->dedimaniaData->records) < $maxRank) { + // Records list not full - Append new record + $insert = true; + } + + if ($insert) { + // Insert new record + array_push($this->dedimaniaData->records, $newRecord); + + // Update ranks + $this->updateDedimaniaRecordRanks(); + + // Save replays + foreach ($this->dedimaniaData->records as &$record) { + if ($record->login !== $newRecord->login) { + continue; + } + $this->setRecordReplays($record); + break; + } + // Record inserted + return true; + } + // No new record + return false; + } + + /** + * Update the sorting and the ranks of all dedimania records + */ + private function updateDedimaniaRecordRanks() { + if ($this->dedimaniaData->getRecordCount() == 0) { + $this->maniaControl->callbackManager->triggerCallback(self::CB_DEDIMANIA_UPDATED, $this->dedimaniaData->records); + return; + } + //TODO move into class dedimania data + // Sort records + usort($this->dedimaniaData->records, array($this, 'compareRecords')); + + // Update ranks + $rank = 1; + foreach ($this->dedimaniaData->records as &$record) { + /** @var RecordData $record */ + $record->rank = $rank; + $rank++; + } + $this->maniaControl->callbackManager->triggerCallback(self::CB_DEDIMANIA_UPDATED, $this->dedimaniaData->records); + } + + /** + * Updates the replay values for the given record + * + * @param array $record + */ + private function setRecordReplays(RecordData &$record) { + // Set validation replay + $validationReplay = $this->maniaControl->server->getValidationReplay($record->login); + if ($validationReplay) { + $record->vReplay = $validationReplay; + } + + // Set ghost replay + if ($record->rank <= 1) { + $dataDirectory = $this->maniaControl->server->getDataDirectory(); + if (!isset($this->dedimaniaData->directoryAccessChecked)) { + $access = $this->maniaControl->server->checkAccess($dataDirectory); + if (!$access) { + trigger_error("No access to the servers data directory. Can't retrieve ghost replays."); + } + $this->dedimaniaData->directoryAccessChecked = $access; + } + if ($this->dedimaniaData->directoryAccessChecked) { + $ghostReplay = $this->maniaControl->server->getGhostReplay($record->login); + if ($ghostReplay) { + $record->top1GReplay = $ghostReplay; + } + } + } + } + + /** + * Handle PlayerManialinkPageAnswer callback + * + * @param array $callback + */ + public function handleManialinkPageAnswer(array $callback) { + $actionId = $callback[1][2]; + + $login = $callback[1][1]; + $player = $this->maniaControl->playerManager->getPlayer($login); + + if ($actionId == self::ACTION_SHOW_DEDIRECORDSLIST) { + $this->showDediRecordsList(array(), $player); + } + } + /** * Shows a ManiaLink list with the local records. * @@ -532,7 +1094,7 @@ class Dedimania implements CallbackListener, CommandListener, TimerListener, Plu $i = 0; $y = $height / 2 - 10; $pageFrames = array(); - foreach($records as $listRecord) { + foreach ($records as $listRecord) { if (!isset($pageFrame)) { $pageFrame = new Frame(); $frame->add($pageFrame); @@ -575,226 +1137,22 @@ class Dedimania implements CallbackListener, CommandListener, TimerListener, Plu } /** - * Handle PlayerManialinkPageAnswer callback + * Function to retrieve the dedimania records on the current map * - * @param array $callback + * @return array|RecordData */ - public function handleManialinkPageAnswer(array $callback) { - $actionId = $callback[1][2]; - - $login = $callback[1][1]; - $player = $this->maniaControl->playerManager->getPlayer($login); - - if ($actionId == self::ACTION_SHOW_DEDIRECORDSLIST) { - $this->showDediRecordsList(array(), $player); + public function getDedimaniaRecords() { + if (!$this->dedimaniaData->records) { + return null; } + $records = $this->dedimaniaData->records; + return $records; } /** - * Fetch Dedimania Records - * - * @param bool $reset + * @see \ManiaControl\Plugins\Plugin::unload() */ - private function fetchDedimaniaRecords($reset = true) { - if (!$this->dedimaniaData || $this->dedimaniaData->sessionId == '') { - return false; - } - - // Reset records - if ($reset) { - $this->dedimaniaData->records = array(); - } - - - $serverInfo = $this->getServerInfo(); - $playerInfo = $this->getPlayerList(); - $mapInfo = $this->getMapInfo(); - $gameMode = $this->getGameModeString(); - - if (!$serverInfo || !$playerInfo || !$mapInfo || !$gameMode) { - return false; - } - - $data = array($this->dedimaniaData->sessionId, $mapInfo, $gameMode, $serverInfo, $playerInfo); - $content = $this->encode_request(self::DEDIMANIA_GETRECORDS, $data); - - $self = $this; - $this->maniaControl->fileReader->postData(self::DEDIMANIA_URL, function ($data, $error) use (&$self) { - if ($error != '') { - $self->maniaControl->log("Dedimania Error: " . $error); - } - - $data = $self->decode($data); - - if (is_array($data)) { - foreach($data as $index => $methodResponse) { - if (xmlrpc_is_fault($methodResponse)) { - $self->handleXmlRpcFault($methodResponse, Dedimania::DEDIMANIA_GETRECORDS); - return false; - } else if ($index <= 0) { - $responseData = $methodResponse[0]; - $self->dedimaniaData->serverMaxRank = $responseData['ServerMaxRank']; - - foreach($responseData['Players'] as $player) { - $dediPlayer = new DedimaniaPlayer(null); - $dediPlayer->constructNewPlayer($player['Login'], $player['MaxRank']); - $self->dedimaniaData->addPlayer($dediPlayer); - } - foreach($responseData['Records'] as $key => $record) { - $self->dedimaniaData->records[$key] = new RecordData($record); - } - } - } - } - $self->updateManialink = true; - $self->maniaControl->callbackManager->triggerCallback(Dedimania::CB_DEDIMANIA_UPDATED, $self->dedimaniaData->records); - return true; - }, $content, true); - - return true; - } - - /** - * Checks If a Dedimania Session exists, if not create a new oen - */ - private function checkDedimaniaSession() { - if ($this->dedimaniaData->sessionId == '') { - $this->openDedimaniaSession(); - return; - } - - $content = $this->encode_request(self::DEDIMANIA_CHECKSESSION, array($this->dedimaniaData->sessionId)); - - $self = $this; - $this->maniaControl->fileReader->postData(self::DEDIMANIA_URL, function ($data, $error) use (&$self) { - if ($error != '') { - $self->maniaControl->log("Dedimania Error: " . $error); - } - - $data = $self->decode($data); - if (is_array($data)) { - foreach($data as $methodResponse) { - if (xmlrpc_is_fault($methodResponse)) { - $self->handleXmlRpcFault($methodResponse, Dedimania::DEDIMANIA_CHECKSESSION); - } else { - $responseData = $methodResponse[0]; - if (is_bool($responseData)) { - if (!$responseData) { - $self->openDedimaniaSession(); - } - } - } - } - } - }, $content, true); - return; - } - - /** - * Inserts the given new Dedimania record at the proper position - * - * @param array $newRecord - * @return bool - */ - private function insertDedimaniaRecord(RecordData &$newRecord, RecordData $oldRecord) { - if ($newRecord->nullRecord) { - return false; - } - - $insert = false; - - // Get max possible rank - $maxRank = $this->dedimaniaData->getPlayerMaxRank($newRecord->login); - - // Loop through existing records - foreach($this->dedimaniaData->records as $key => &$record) { - /** @var RecordData $record */ - if ($record->rank > $maxRank) { - // Max rank reached - return false; - } - if ($record->login === $newRecord->login) { - // Old record of the same player - if ($record->best <= $newRecord->best) { - // It's better - Do nothing - return false; - } - - // Replace old record - unset($this->dedimaniaData->records[$key]); - $insert = true; - break; - } - - // Other player's record - if ($record->best <= $newRecord->best) { - // It's better - Skip - continue; - } - - // New record is better - Insert it - $insert = true; - if ($oldRecord) { - // Remove old record - foreach($this->dedimaniaData->records as $key2 => $record2) { - /** @var RecordData $record2 */ - if ($record2->login !== $oldRecord->login) { - continue; - } - unset($this->dedimaniaData->records[$key2]); - break; - } - } - break; - } - - if (!$insert && count($this->dedimaniaData->records) < $maxRank) { - // Records list not full - Append new record - $insert = true; - } - - if ($insert) { - // Insert new record - array_push($this->dedimaniaData->records, $newRecord); - - // Update ranks - $this->updateDedimaniaRecordRanks(); - - // Save replays - foreach($this->dedimaniaData->records as &$record) { - if ($record->login !== $newRecord->login) { - continue; - } - $this->setRecordReplays($record); - break; - } - // Record inserted - return true; - } - // No new record - return false; - } - - /** - * Update the sorting and the ranks of all dedimania records - */ - private function updateDedimaniaRecordRanks() { - if ($this->dedimaniaData->getRecordCount() == 0) { - $this->maniaControl->callbackManager->triggerCallback(self::CB_DEDIMANIA_UPDATED, $this->dedimaniaData->records); - return; - } - //TODO move into class dedimania data - // Sort records - usort($this->dedimaniaData->records, array($this, 'compareRecords')); - - // Update ranks - $rank = 1; - foreach($this->dedimaniaData->records as &$record) { - /** @var RecordData $record */ - $record->rank = $rank; - $rank++; - } - $this->maniaControl->callbackManager->triggerCallback(self::CB_DEDIMANIA_UPDATED, $this->dedimaniaData->records); + public function unload() { } /** @@ -818,375 +1176,4 @@ class Dedimania implements CallbackListener, CommandListener, TimerListener, Plu } } } - - /** - * Updates the replay values for the given record - * - * @param array $record - */ - private function setRecordReplays(RecordData &$record) { - // Set validation replay - $validationReplay = $this->maniaControl->server->getValidationReplay($record->login); - if ($validationReplay) { - $record->vReplay = $validationReplay; - } - - // Set ghost replay - if ($record->rank <= 1) { - $dataDirectory = $this->maniaControl->server->getDataDirectory(); - if (!isset($this->dedimaniaData->directoryAccessChecked)) { - $access = $this->maniaControl->server->checkAccess($dataDirectory); - if (!$access) { - trigger_error("No access to the servers data directory. Can't retrieve ghost replays."); - } - $this->dedimaniaData->directoryAccessChecked = $access; - } - if ($this->dedimaniaData->directoryAccessChecked) { - $ghostReplay = $this->maniaControl->server->getGhostReplay($record->login); - if ($ghostReplay) { - $record->top1GReplay = $ghostReplay; - } - } - } - } - - /** - * Build server info Structure for callbacks - */ - private function getServerInfo() { - $server = $this->maniaControl->client->getServerOptions(); - if (!$server) { - return null; - } - - if (count($this->maniaControl->playerManager->getPlayers()) == 0) { - return null; - } - - $playerCount = $this->maniaControl->playerManager->getPlayerCount(); - $spectatorCount = $this->maniaControl->playerManager->getSpectatorCount(); - - return array('SrvName' => $server->name, 'Comment' => $server->comment, 'Private' => (strlen($server->password) > 0), 'NumPlayers' => $playerCount, 'MaxPlayers' => $server->currentMaxPlayers, 'NumSpecs' => $spectatorCount, 'MaxSpecs' => $server->currentMaxSpectators); - } - - /** - * Build simple player list for callbacks - */ - private function getPlayerList() { - $players = $this->maniaControl->playerManager->getPlayers(); - - if (count($players) == 0) { - return null; - } - $playerInfo = array(); - foreach($players as $player) { - /** @var Player $player */ - array_push($playerInfo, array('Login' => $player->login, 'IsSpec' => $player->isSpectator)); - } - return $playerInfo; - } - - /** - * Build map info struct for dedimania requests - */ - private function getMapInfo() { - $map = $this->maniaControl->mapManager->getCurrentMap(); - if (!$map) { - return null; - } - $mapInfo = array(); - $mapInfo['UId'] = $map->uid; - $mapInfo['Name'] = $map->rawName; - $mapInfo['Author'] = $map->authorLogin; - $mapInfo['Environment'] = $map->environment; - $mapInfo['NbCheckpoints'] = $map->nbCheckpoints; - $mapInfo['NbLaps'] = $map->nbLaps; - return $mapInfo; - } - - /** - * Build votes info struct for callbacks - */ - private function getVotesInfo() { - $map = $this->maniaControl->mapManager->getCurrentMap(); - if (!$map) { - return null; - } - $gameMode = $this->getGameModeString(); - if (!$gameMode) { - return null; - } - return array('UId' => $map->uid, 'GameMode' => $gameMode); - } - - /** - * Function to retrieve the dedimania records on the current map - * - * @return array|RecordData - */ - public function getDedimaniaRecords() { - if (!$this->dedimaniaData->records) { - return null; - } - $records = $this->dedimaniaData->records; - return $records; - } - - /** - * Get the dedimania record of the given login - * - * @param string $login - * @return RecordData $record - */ - private function getDedimaniaRecord($login) { - if (!$this->dedimaniaData->records) { - return new RecordData(null); - } - $records = $this->dedimaniaData->records; - foreach($records as &$record) { - /** @var RecordData $record */ - if ($record->login === $login) { - return $record; - } - } - - return new RecordData(null); - } - - /** - * Get Dedimania string representation of the current game mode - * - * @return String - */ - private function getGameModeString() { - $gameMode = $this->maniaControl->server->getGameMode(); - $scriptNameResponse = $this->maniaControl->client->getScriptName(); - $scriptName = str_replace('.Script.txt', '', $scriptNameResponse["CurrentValue"]); - if ($gameMode === null) { - trigger_error("Couldn't retrieve game mode. "); - return null; - } - switch($gameMode) { - case 0: - { - if ($scriptName == 'Rounds' || $scriptName == 'Cup' || $scriptName == 'Team') { - return 'Rounds'; - } else if ($scriptName == 'TimeAttack' || $scriptName == 'Laps' || $scriptName == 'TeamAttack' || $scriptName == 'TimeAttackPlus') { - return 'TA'; - } - break; - } - case 1: - case 3: - case 5: - { - return 'Rounds'; - } - case 2: - case 4: - { - return 'TA'; - } - } - return null; - } - - /** - * Get current checkpoint string for dedimania record - * - * @param string $login - * @return string - */ - private function getCheckpoints($login) { - if (!$login || !isset($this->checkpoints[$login])) { - return null; - } - $string = ''; - $count = count($this->checkpoints[$login]); - foreach($this->checkpoints[$login] as $index => $check) { - $string .= $check; - if ($index < $count - 1) { - $string .= ','; - } - } - return $string; - } - - /** - * Encode the given xml rpc method and params - * - * @param string $method - * @param array $params - * @return string - */ - private function encode_request($method, $params) { - $paramArray = array(array('methodName' => $method, 'params' => $params), array('methodName' => self::DEDIMANIA_WARNINGSANDTTR2, 'params' => array())); - return xmlrpc_encode_request(self::XMLRPC_MULTICALL, array($paramArray), array('encoding' => 'UTF-8', 'escaping' => 'markup')); - } - - /** - * Handle xml rpc fault - * - * @param $fault - * @param $method - */ - private function handleXmlRpcFault($fault, $method) { - trigger_error('XmlRpc Fault on ' . $method . ': ' . $fault['faultString'] . ' (' . $fault['faultCode'] . ')'); - } - - /** - * Build Manialink - * - * @return \FML\ManiaLink - */ - private function buildManialink() { - if (!$this->dedimaniaData->records) { - return null; - } - $records = $this->dedimaniaData->records; - - $title = $this->maniaControl->settingManager->getSetting($this, self::SETTING_WIDGET_TITLE); - $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); - $lines = $this->maniaControl->settingManager->getSetting($this, self::SETTING_WIDGET_LINESCOUNT); - $lineHeight = $this->maniaControl->settingManager->getSetting($this, self::SETTING_WIDGET_LINEHEIGHT); - $labelStyle = $this->maniaControl->manialinkManager->styleManager->getDefaultLabelStyle(); - $quadStyle = $this->maniaControl->manialinkManager->styleManager->getDefaultQuadStyle(); - $quadSubstyle = $this->maniaControl->manialinkManager->styleManager->getDefaultQuadSubstyle(); - - - $manialink = new ManiaLink(self::MLID_DEDIMANIA); - $frame = new Frame(); - $manialink->add($frame); - $frame->setPosition($pos_x, $pos_y); - - $backgroundQuad = new Quad(); - $frame->add($backgroundQuad); - $backgroundQuad->setVAlign(Control::TOP); - $height = 7. + $lines * $lineHeight; - $backgroundQuad->setSize($width * 1.05, $height); - $backgroundQuad->setStyles($quadStyle, $quadSubstyle); - - $titleLabel = new Label(); - $frame->add($titleLabel); - $titleLabel->setPosition(0, $lineHeight * -0.9); - $titleLabel->setWidth($width); - $titleLabel->setStyle($labelStyle); - $titleLabel->setTextSize(2); - $titleLabel->setText($title); - $titleLabel->setTranslate(true); - - foreach($records as $index => $record) { - /** @var RecordData $record */ - if ($index >= $lines) { - break; - } - - $y = -8. - $index * $lineHeight; - - $recordFrame = new Frame(); - $frame->add($recordFrame); - $recordFrame->setPosition(0, $y); - - /*$backgroundQuad = new Quad(); - $recordFrame->add($backgroundQuad); - $backgroundQuad->setSize($width * 1.04, $lineHeight * 1.4); - $backgroundQuad->setStyles($quadStyle, $quadSubstyle);*/ - - //Rank - $rankLabel = new Label(); - $recordFrame->add($rankLabel); - $rankLabel->setHAlign(Control::LEFT); - $rankLabel->setX($width * -0.47); - $rankLabel->setSize($width * 0.06, $lineHeight); - $rankLabel->setTextSize(1); - $rankLabel->setTextPrefix('$o'); - $rankLabel->setText($record->rank); - $rankLabel->setTextEmboss(true); - - //Name - $nameLabel = new Label(); - $recordFrame->add($nameLabel); - $nameLabel->setHAlign(Control::LEFT); - $nameLabel->setX($width * -0.4); - $nameLabel->setSize($width * 0.6, $lineHeight); - $nameLabel->setTextSize(1); - $nameLabel->setText($record->nickName); - $nameLabel->setTextEmboss(true); - - //Time - $timeLabel = new Label(); - $recordFrame->add($timeLabel); - $timeLabel->setHAlign(Control::RIGHT); - $timeLabel->setX($width * 0.47); - $timeLabel->setSize($width * 0.25, $lineHeight); - $timeLabel->setTextSize(1); - $timeLabel->setText(Formatter::formatTime($record->best)); - $timeLabel->setTextEmboss(true); - } - - return $manialink; - } - - /** - * Decodes xml rpc response - * - * @param string $response - * @return mixed - */ - private function decode($response) { - return xmlrpc_decode($response, 'utf-8'); - } - - /** - * Unload the plugin and its resources - */ - public function unload() { - } - - /** - * Get plugin id - * - * @return int - */ - public static function getId() { - return self::ID; - } - - /** - * Get Plugin Name - * - * @return string - */ - public static function getName() { - return "Dedimania Plugin"; - } - - /** - * Get Plugin Version - * - * @return float - */ - public static function getVersion() { - return self::VERSION; - } - - /** - * Get Plugin Author - * - * @return string - */ - public static function getAuthor() { - return "kremsy and steeffeen"; - } - - /** - * Get Plugin Description - * - * @return string - */ - public static function getDescription() { - return "Dedimania Plugin for Trackmania"; - } } \ No newline at end of file diff --git a/application/plugins/Dedimania/DedimaniaData.php b/application/plugins/Dedimania/DedimaniaData.php index 16b86ff7..704ea39b 100644 --- a/application/plugins/Dedimania/DedimaniaData.php +++ b/application/plugins/Dedimania/DedimaniaData.php @@ -1,4 +1,5 @@ + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class DedimaniaData { + /* + * Constants + */ public $game; public $path; public $packmask; @@ -27,6 +31,15 @@ class DedimaniaData { public $directoryAccessChecked = false; public $serverMaxRank = 30; + /** + * Construct a new Dedimania Data Model + * + * @param string $serverLogin + * @param string $dedimaniaCode + * @param string $path + * @param string $packmask + * @param Version $serverVersion + */ public function __construct($serverLogin, $dedimaniaCode, $path, $packmask, Version $serverVersion) { $this->game = "TM2"; $this->login = $serverLogin; @@ -41,7 +54,7 @@ class DedimaniaData { public function toArray() { $array = array(); - foreach(get_object_vars($this) as $key => $value) { + foreach (get_object_vars($this) as $key => $value) { if ($key == 'records' || $key == 'sessionId' || $key == 'directoryAccessChecked' || $key == 'serverMaxRank' || $key == 'players') { continue; } @@ -62,7 +75,7 @@ class DedimaniaData { */ public function getPlayerMaxRank($login) { $maxRank = $this->serverMaxRank; - foreach($this->players as $player) { + foreach ($this->players as $player) { /** @var DedimaniaPlayer $player */ if ($player->login === $login) { if ($player->maxRank > $maxRank) { diff --git a/application/plugins/Dedimania/DedimaniaPlayer.php b/application/plugins/Dedimania/DedimaniaPlayer.php index 33cbfc71..fbd187b5 100644 --- a/application/plugins/Dedimania/DedimaniaPlayer.php +++ b/application/plugins/Dedimania/DedimaniaPlayer.php @@ -1,22 +1,32 @@ + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class DedimaniaPlayer { + /* + * Public Properties + */ public $login = ''; public $maxRank = -1; public $banned = false; public $optionsEnabled = false; public $options = ''; + /** + * Construct a new Dedimania Player Model + * @param mixed$player + */ public function __construct($player) { - if (!$player) return; + if (!$player) { + return; + } $this->login = $player['Login']; $this->maxRank = $player['MaxRank']; @@ -28,8 +38,8 @@ class DedimaniaPlayer { /** * Construct a new Player by its login and maxRank * - * @param $login - * @param $maxRank + * @param string $login + * @param int $maxRank */ public function constructNewPlayer($login, $maxRank) { $this->login = $login; diff --git a/application/plugins/Dedimania/RecordData.php b/application/plugins/Dedimania/RecordData.php index 2687335b..1ae40d89 100644 --- a/application/plugins/Dedimania/RecordData.php +++ b/application/plugins/Dedimania/RecordData.php @@ -1,16 +1,20 @@ + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ -use ManiaControl\Formatter; - class RecordData { + /* + * Public Properties + */ public $nullRecord = false; public $login = ''; public $nickName = ''; @@ -25,7 +29,7 @@ class RecordData { /** * Construct a Record by a given Record Array * - * @param $record + * @param array $record */ public function __construct($record) { if (!$record) { @@ -42,13 +46,13 @@ class RecordData { } /** - * Constructs a new Record via it's properties + * Construct a new Record via its Properties * - * @param $login - * @param $nickName - * @param $best - * @param $checkpoints - * @param bool $newRecord + * @param string $login + * @param string $nickName + * @param float $best + * @param int $checkpoints + * @param bool $newRecord */ public function constructNewRecord($login, $nickName, $best, $checkpoints, $newRecord = false) { $this->nullRecord = false; @@ -58,4 +62,4 @@ class RecordData { $this->checkpoints = $checkpoints; $this->newRecord = $newRecord; } -} \ No newline at end of file +} diff --git a/application/plugins/MCTeam/ChatMessagePlugin.php b/application/plugins/MCTeam/ChatMessagePlugin.php index 70c80e89..328b453a 100644 --- a/application/plugins/MCTeam/ChatMessagePlugin.php +++ b/application/plugins/MCTeam/ChatMessagePlugin.php @@ -11,12 +11,12 @@ use Maniaplanet\DedicatedServer\Xmlrpc\Exception; /** * ManiaControl Chat-Message Plugin * - * @author kremsy + * @author ManiaControl Team * @copyright 2014 ManiaControl Team * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class ChatMessagePlugin implements CommandListener, Plugin { - /** + /* * Constants */ const PLUGIN_ID = 4; @@ -25,72 +25,55 @@ class ChatMessagePlugin implements CommandListener, Plugin { const PLUGIN_AUTHOR = 'kremsy'; const SETTING_AFK_FORCE_SPEC = 'AFK command forces spec'; - /** + /* * Private Properties */ - /** @var maniaControl $maniaControl */ + /** @var ManiaControl $maniaControl */ private $maniaControl = null; /** - * Prepares the Plugin - * - * @param ManiaControl $maniaControl - * @return mixed + * @see \ManiaControl\Plugins\Plugin::prepare() */ public static function prepare(ManiaControl $maniaControl) { - //do nothing } /** - * Get plugin id - * - * @return int + * @see \ManiaControl\Plugins\Plugin::getId() */ public static function getId() { return self::PLUGIN_ID; } /** - * Get Plugin Name - * - * @return string + * @see \ManiaControl\Plugins\Plugin::getName() */ public static function getName() { return self::PLUGIN_NAME; } /** - * Get Plugin Version - * - * @return float,, + * @see \ManiaControl\Plugins\Plugin::getVersion() */ public static function getVersion() { return self::PLUGIN_VERSION; } /** - * Get Plugin Author - * - * @return string + * @see \ManiaControl\Plugins\Plugin::getAuthor() */ public static function getAuthor() { return self::PLUGIN_AUTHOR; } /** - * Get Plugin Description - * - * @return string + * @see \ManiaControl\Plugins\Plugin::getDescription() */ public static function getDescription() { return "Plugin offers various Chat-Commands like /gg /hi /afk /rq..."; } /** - * Load the plugin - * - * @param \ManiaControl\ManiaControl $maniaControl - * @return bool + * @see \ManiaControl\Plugins\Plugin::load() */ public function load(ManiaControl $maniaControl) { $this->maniaControl = $maniaControl; @@ -119,7 +102,7 @@ class ChatMessagePlugin implements CommandListener, Plugin { } /** - * Unload the plugin and its resources + * @see \ManiaControl\Plugins\Plugin::unload() */ public function unload() { } diff --git a/application/plugins/MCTeam/ChatlogPlugin.php b/application/plugins/MCTeam/ChatlogPlugin.php index bd25b1b7..e8c23d1e 100644 --- a/application/plugins/MCTeam/ChatlogPlugin.php +++ b/application/plugins/MCTeam/ChatlogPlugin.php @@ -17,7 +17,7 @@ use ManiaControl\Settings\SettingManager; * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class ChatlogPlugin implements CallbackListener, Plugin { - /** + /* * Constants */ const ID = 26; @@ -31,7 +31,7 @@ class ChatlogPlugin implements CallbackListener, Plugin { const SETTING_LOGSERVERMESSAGES = 'Log Server Messages'; /** - * Private properties + * Private Properties */ /** @var ManiaControl $maniaControl */ private $maniaControl = null; diff --git a/application/plugins/MCTeam/CustomVotesPlugin.php b/application/plugins/MCTeam/CustomVotesPlugin.php index eacf0127..e874890d 100644 --- a/application/plugins/MCTeam/CustomVotesPlugin.php +++ b/application/plugins/MCTeam/CustomVotesPlugin.php @@ -14,6 +14,7 @@ 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 FML\Script\Features\KeyAction; use ManiaControl\Callbacks\CallbackListener; use ManiaControl\Callbacks\CallbackManager; use ManiaControl\Callbacks\TimerListener; @@ -28,15 +29,14 @@ 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 + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class CustomVotesPlugin implements CommandListener, CallbackListener, ManialinkPageAnswerListener, TimerListener, Plugin { /* @@ -73,7 +73,7 @@ class CustomVotesPlugin implements CommandListener, CallbackListener, ManialinkP const CB_CUSTOM_VOTE_FINISHED = 'CustomVotesPlugin.CustomVoteFinished'; - /** + /* * Private Properties */ /** @var maniaControl $maniaControl */ @@ -84,20 +84,48 @@ class CustomVotesPlugin implements CommandListener, CallbackListener, ManialinkP private $currentVote = null; /** - * Prepares the Plugin - * - * @param ManiaControl $maniaControl - * @return mixed + * @see \ManiaControl\Plugins\Plugin::prepare() */ public static function prepare(ManiaControl $maniaControl) { - //do nothing } /** - * Load the plugin - * - * @param \ManiaControl\ManiaControl $maniaControl - * @return bool + * @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 'Plugin offers your Custom Votes like Restart, Skip, Balance...'; + } + + /** + * @see \ManiaControl\Plugins\Plugin::load() */ public function load(ManiaControl $maniaControl) { $this->maniaControl = $maniaControl; @@ -140,7 +168,7 @@ class CustomVotesPlugin implements CommandListener, CallbackListener, ManialinkP $this->defineVote("pausegame", "Vote for Pause Game"); $this->defineVote("replay", "Vote to replay current map"); - foreach($this->voteCommands as $name => $voteCommand) { + foreach ($this->voteCommands as $name => $voteCommand) { $this->maniaControl->commandManager->registerCommandListener($name, $this, 'handleChatVote', false, $voteCommand->name); } @@ -169,7 +197,190 @@ class CustomVotesPlugin implements CommandListener, CallbackListener, ManialinkP } /** - * Unload the plugin and its resources + * 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; + } + + /** + * 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(); + } + + /** + * 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); + } + } + + /** + * 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); + } + + /** + * @see \ManiaControl\Plugins\Plugin::unload() */ public function unload() { //Enable Standard Votes @@ -194,6 +405,16 @@ class CustomVotesPlugin implements CommandListener, CallbackListener, ManialinkP $this->maniaControl->manialinkManager->hideManialink(self::MLID_ICON); } + /** + * Destroys the current Vote + */ + private function destroyVote() { + $emptyManialink = new ManiaLink(self::MLID_WIDGET); + $this->maniaControl->manialinkManager->sendManialink($emptyManialink); + + unset($this->currentVote); + } + /** * Handle PlayerConnect callback * @@ -203,21 +424,6 @@ class CustomVotesPlugin implements CommandListener, CallbackListener, ManialinkP $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 * @@ -233,167 +439,6 @@ class CustomVotesPlugin implements CommandListener, CallbackListener, ManialinkP } } - /** - * 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(); - $this->maniaControl->chat->sendInformation('$f8fVote to $fffbalance the teams$f8f has been successfull!'); - break; - case 'skipmap': - case 'skip': - case 'nextmap': - $this->maniaControl->client->nextMap(); - $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!'); - 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 * @@ -444,6 +489,98 @@ class CustomVotesPlugin implements CommandListener, CallbackListener, ManialinkP $this->maniaControl->chat->sendSuccess($message); } + /** + * 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(); + $this->maniaControl->chat->sendInformation('$f8fVote to $fffbalance the teams$f8f has been successfull!'); + break; + case 'skipmap': + case 'skip': + case 'nextmap': + $this->maniaControl->client->nextMap(); + $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!'); + 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); + } + } + + /** + * Undefines a Vote + * + * @param $voteIndex + */ + public function undefineVote($voteIndex) { + unset($this->voteCommands[$voteIndex]); + } + /** * Handles a Positive Vote * @@ -500,16 +637,6 @@ class CustomVotesPlugin implements CommandListener, CallbackListener, ManialinkP } } - /** - * 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 * @@ -566,7 +693,9 @@ class CustomVotesPlugin implements CommandListener, CallbackListener, ManialinkP $timeGauge->setY(1.5); $timeGauge->setSize($width * 0.95, 6); $timeGauge->setDrawBg(false); - if (!$timeUntilExpire) $timeUntilExpire = 1; + if (!$timeUntilExpire) { + $timeUntilExpire = 1; + } $timeGaugeRatio = (100 / $maxTime * $timeUntilExpire) / 100; $timeGauge->setRatio($timeGaugeRatio + 0.15 - $timeGaugeRatio * 0.15); $gaugeColor = ColorUtil::floatToStatusColor($timeGaugeRatio); @@ -626,12 +755,12 @@ class CustomVotesPlugin implements CommandListener, CallbackListener, ManialinkP $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(); + + $script = $maniaLink->getScript(); $keyActionPositive = new KeyAction(self::ACTION_POSITIVE_VOTE, 'F1'); $script->addFeature($keyActionPositive); $keyActionNegative = new KeyAction(self::ACTION_NEGATIVE_VOTE, 'F2'); @@ -640,152 +769,6 @@ class CustomVotesPlugin implements CommandListener, CallbackListener, ManialinkP // 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...'; - } } /** diff --git a/application/plugins/MCTeam/DonationPlugin.php b/application/plugins/MCTeam/DonationPlugin.php index 457b678d..39d59f93 100644 --- a/application/plugins/MCTeam/DonationPlugin.php +++ b/application/plugins/MCTeam/DonationPlugin.php @@ -12,7 +12,6 @@ use FML\Controls\Quads\Quad_BgsPlayerCard; use FML\Controls\Quads\Quad_Icons128x128_1; use FML\ManiaLink; use FML\Script\Features\Paging; - use ManiaControl\Admin\AuthenticationManager; use ManiaControl\Bills\BillManager; use ManiaControl\Callbacks\CallbackListener; @@ -23,21 +22,22 @@ use ManiaControl\Manialinks\ManialinkManager; use ManiaControl\Players\Player; use ManiaControl\Players\PlayerManager; use ManiaControl\Plugins\Plugin; -use ManiaControl\Statistics\StatisticManager; /** * ManiaControl Donation Plugin * - * @author kremsy and steeffeen - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class DonationPlugin implements CallbackListener, CommandListener, Plugin { - /** + /* * Constants */ const ID = 3; const VERSION = 0.1; + const AUTHOR = 'MCTeam'; + const NAME = 'Donation Plugin'; const SETTING_ANNOUNCE_SERVERDONATION = 'Enable Server-Donation Announcements'; const STAT_PLAYER_DONATIONS = 'Donated Planets'; const ACTION_DONATE_VALUE = 'Donate.DonateValue'; @@ -52,8 +52,8 @@ class DonationPlugin implements CallbackListener, CommandListener, Plugin { const SETTING_DONATION_VALUES = 'Donation Values'; const SETTING_MIN_AMOUNT_SHOWN = 'Minimum Donation amount to get shown'; - /** - * Private properties + /* + * Private Properties */ /** * @var maniaControl $maniaControl @@ -61,15 +61,45 @@ class DonationPlugin implements CallbackListener, CommandListener, Plugin { private $maniaControl = null; /** - * Prepares the Plugin - * - * @param ManiaControl $maniaControl - * @return mixed + * @see \ManiaControl\Plugins\Plugin::prepare() */ public static function prepare(ManiaControl $maniaControl) { - //do nothing } + /** + * @see \ManiaControl\Plugins\Plugin::getId() + */ + public static function getId() { + return self::ID; + } + + /** + * @see \ManiaControl\Plugins\Plugin::getName() + */ + public static function getName() { + return self::NAME; + } + + /** + * @see \ManiaControl\Plugins\Plugin::getVersion() + */ + public static function getVersion() { + return self::VERSION; + } + + /** + * @see \ManiaControl\Plugins\Plugin::getAuthor() + */ + public static function getAuthor() { + return self::AUTHOR; + } + + /** + * @see \ManiaControl\Plugins\Plugin::getDescription() + */ + public static function getDescription() { + return 'Plugin offering commands like /donate, /pay and /planets and a donation widget.'; + } /** * @see \ManiaControl\Plugins\Plugin::load() @@ -105,48 +135,6 @@ class DonationPlugin implements CallbackListener, CommandListener, Plugin { return true; } - /** - * @see \ManiaControl\Plugins\Plugin::unload() - */ - public function unload() { - $this->maniaControl->manialinkManager->hideManialink(self::MLID_DONATE_WIDGET); - } - - /** - * @see \ManiaControl\Plugins\Plugin::getId() - */ - public static function getId() { - return self::ID; - } - - /** - * @see \ManiaControl\Plugins\Plugin::getName() - */ - public static function getName() { - return 'Donations Plugin'; - } - - /** - * @see \ManiaControl\Plugins\Plugin::getVersion() - */ - public static function getVersion() { - return self::VERSION; - } - - /** - * @see \ManiaControl\Plugins\Plugin::getAuthor() - */ - public static function getAuthor() { - return 'steeffeen and kremsy'; - } - - /** - * @see \ManiaControl\Plugins\Plugin::getDescription() - */ - public static function getDescription() { - return 'Plugin offering commands like /donate, /pay and /planets and a donation widget.'; - } - /** * Handle ManiaControl OnStartup * @@ -158,35 +146,6 @@ class DonationPlugin implements CallbackListener, CommandListener, Plugin { } } - /** - * Handle ManialinkPageAnswer Callback - * - * @param array $callback - */ - public function handleManialinkPageAnswer(array $callback) { - $actionId = $callback[1][2]; - $boolSetting = (strpos($actionId, self::ACTION_DONATE_VALUE) === 0); - if (!$boolSetting) { - return; - } - $login = $callback[1][1]; - $player = $this->maniaControl->playerManager->getPlayer($login); - $actionArray = explode(".", $callback[1][2]); - $this->handleDonation($player, intval($actionArray[2])); - } - - /** - * Handle PlayerConnect callback - * - * @param Player $player - */ - public function handlePlayerConnect(Player $player) { - // Display Map Widget - if ($this->maniaControl->settingManager->getSetting($this, self::SETTING_DONATE_WIDGET_ACTIVATED)) { - $this->displayDonateWidget($player->login); - } - } - /** * Displays the Donate Widget * @@ -205,7 +164,7 @@ class DonationPlugin implements CallbackListener, CommandListener, Plugin { $itemMarginFactorY = 1.2; //If game is shootmania lower the icons position by 20 - if($this->maniaControl->mapManager->getCurrentMap()->getGame() == 'sm') { + if ($this->maniaControl->mapManager->getCurrentMap()->getGame() == 'sm') { $posY -= $shootManiaOffset; } @@ -249,7 +208,7 @@ class DonationPlugin implements CallbackListener, CommandListener, Plugin { $quad->setSize(strlen($values) * 2 + count($valueArray) * 1, $itemSize * $itemMarginFactorY); $popoutFrame->add($quad); - $itemQuad->addToggleFeature($popoutFrame); + $itemQuad->addToggleFeature($popoutFrame); // Description Label $descriptionFrame = new Frame(); @@ -267,7 +226,7 @@ class DonationPlugin implements CallbackListener, CommandListener, Plugin { // Add items $x = -2; - foreach(array_reverse($valueArray) as $value) { + foreach (array_reverse($valueArray) as $value) { $label = new Label_Button(); $popoutFrame->add($label); $label->setX($x); @@ -276,8 +235,8 @@ class DonationPlugin implements CallbackListener, CommandListener, Plugin { $label->setTextSize(1.2); $label->setAction(self::ACTION_DONATE_VALUE . "." . $value); $label->setStyle(Label_Text::STYLE_TextCardSmall); - $description = "Donate {$value} Planets"; - $label->addTooltipLabelFeature($descriptionLabel, $description); + $description = "Donate {$value} Planets"; + $label->addTooltipLabelFeature($descriptionLabel, $description); $x -= strlen($value) * 2 + 1.7; } @@ -286,6 +245,90 @@ class DonationPlugin implements CallbackListener, CommandListener, Plugin { $this->maniaControl->manialinkManager->sendManialink($maniaLink, $login); } + /** + * @see \ManiaControl\Plugins\Plugin::unload() + */ + public function unload() { + $this->maniaControl->manialinkManager->hideManialink(self::MLID_DONATE_WIDGET); + } + + /** + * Handle ManialinkPageAnswer Callback + * + * @param array $callback + */ + public function handleManialinkPageAnswer(array $callback) { + $actionId = $callback[1][2]; + $boolSetting = (strpos($actionId, self::ACTION_DONATE_VALUE) === 0); + if (!$boolSetting) { + return; + } + $login = $callback[1][1]; + $player = $this->maniaControl->playerManager->getPlayer($login); + $actionArray = explode(".", $callback[1][2]); + $this->handleDonation($player, intval($actionArray[2])); + } + + /** + * Handles a Player Donate + * + * @param Player $player + * @param $value + */ + private function handleDonation(Player $player, $amount, $receiver = '', $receiverName = false) { + + if (!$receiverName) { + $serverName = $this->maniaControl->client->getServerName(); + $message = 'Donate ' . $amount . ' Planets to $<' . $serverName . '$>?'; + } else { + $message = 'Donate ' . $amount . ' Planets to $<' . $receiverName . '$>?'; + } + + //Send and Handle the Bill + $self = $this; + $this->maniaControl->billManager->sendBill(function ($data, $status) use (&$self, &$player, $amount, $receiver) { + switch ($status) { + case BillManager::DONATED_TO_SERVER: + if ($self->maniaControl->settingManager->getSetting($self, DonationPlugin::SETTING_ANNOUNCE_SERVERDONATION, true) && $amount >= $self->maniaControl->settingManager->getSetting($self, DonationPlugin::SETTING_MIN_AMOUNT_SHOWN, true)) { + $login = null; + $message = '$<' . $player->nickname . '$> donated ' . $amount . ' Planets! Thanks.'; + } else { + $login = $player->login; + $message = 'Donation successful! Thanks.'; + } + $self->maniaControl->chat->sendSuccess($message, $login); + $self->maniaControl->statisticManager->insertStat(DonationPlugin::STAT_PLAYER_DONATIONS, $player, $self->maniaControl->server->index, $amount); + break; + case BillManager::DONATED_TO_RECEIVER: + $message = "Successfully donated {$amount} to '{$receiver}'!"; + $self->maniaControl->chat->sendSuccess($message, $player->login); + break; + case BillManager::PLAYER_REFUSED_DONATION: + $message = 'Transaction cancelled.'; + $self->maniaControl->chat->sendError($message, $player->login); + break; + case BillManager::ERROR_WHILE_TRANSACTION: + $message = $data; + $self->maniaControl->chat->sendError($message, $player->login); + break; + } + }, $player, $amount, $message); + + return true; + } + + /** + * Handle PlayerConnect callback + * + * @param Player $player + */ + public function handlePlayerConnect(Player $player) { + // Display Map Widget + if ($this->maniaControl->settingManager->getSetting($this, self::SETTING_DONATE_WIDGET_ACTIVATED)) { + $this->displayDonateWidget($player->login); + } + } + /** * Handle /donate command * @@ -318,51 +361,14 @@ class DonationPlugin implements CallbackListener, CommandListener, Plugin { } /** - * Handles a Player Donate + * Send an usage example for /donate to the player * * @param Player $player - * @param $value + * @return boolean */ - private function handleDonation(Player $player, $amount, $receiver = '', $receiverName = false) { - - if (!$receiverName) { - $serverName = $this->maniaControl->client->getServerName(); - $message = 'Donate ' . $amount . ' Planets to $<' . $serverName . '$>?'; - } else { - $message = 'Donate ' . $amount . ' Planets to $<' . $receiverName . '$>?'; - } - - //Send and Handle the Bill - $self = $this; - $this->maniaControl->billManager->sendBill(function ($data, $status) use (&$self, &$player, $amount, $receiver) { - switch($status) { - case BillManager::DONATED_TO_SERVER: - if ($self->maniaControl->settingManager->getSetting($self, DonationPlugin::SETTING_ANNOUNCE_SERVERDONATION, true) && $amount >= $self->maniaControl->settingManager->getSetting($self, DonationPlugin::SETTING_MIN_AMOUNT_SHOWN, true)) { - $login = null; - $message = '$<' . $player->nickname . '$> donated ' . $amount . ' Planets! Thanks.'; - } else { - $login = $player->login; - $message = 'Donation successful! Thanks.'; - } - $self->maniaControl->chat->sendSuccess($message, $login); - $self->maniaControl->statisticManager->insertStat(DonationPlugin::STAT_PLAYER_DONATIONS, $player, $self->maniaControl->server->index, $amount); - break; - case BillManager::DONATED_TO_RECEIVER: - $message = "Successfully donated {$amount} to '{$receiver}'!"; - $self->maniaControl->chat->sendSuccess($message, $player->login); - break; - case BillManager::PLAYER_REFUSED_DONATION: - $message = 'Transaction cancelled.'; - $self->maniaControl->chat->sendError($message, $player->login); - break; - case BillManager::ERROR_WHILE_TRANSACTION: - $message = $data; - $self->maniaControl->chat->sendError($message, $player->login); - break; - } - }, $player, $amount, $message); - - return true; + private function sendDonateUsageExample(Player $player) { + $message = "Usage Example: '/donate 100'"; + return $this->maniaControl->chat->sendChat($message, $player->login); } /** @@ -397,7 +403,7 @@ class DonationPlugin implements CallbackListener, CommandListener, Plugin { $self = $this; $this->maniaControl->billManager->sendPlanets(function ($data, $status) use (&$self, &$player, $amount, $receiver) { - switch($status) { + switch ($status) { case BillManager::PAYED_FROM_SERVER: $message = "Successfully payed out {$amount} to '{$receiver}'!"; $self->maniaControl->chat->sendSuccess($message, $player->login); @@ -416,6 +422,17 @@ class DonationPlugin implements CallbackListener, CommandListener, Plugin { return true; } + /** + * Send an usage example for /pay to the player + * + * @param Player $player + * @return boolean + */ + private function sendPayUsageExample(Player $player) { + $message = "Usage Example: '/pay 100 login'"; + return $this->maniaControl->chat->sendChat($message, $player->login); + } + /** * Handle //getplanets command * @@ -433,28 +450,6 @@ class DonationPlugin implements CallbackListener, CommandListener, Plugin { return $this->maniaControl->chat->sendInformation($message, $player->login); } - /** - * Send an usage example for /donate to the player - * - * @param Player $player - * @return boolean - */ - private function sendDonateUsageExample(Player $player) { - $message = "Usage Example: '/donate 100'"; - return $this->maniaControl->chat->sendChat($message, $player->login); - } - - /** - * Send an usage example for /pay to the player - * - * @param Player $player - * @return boolean - */ - private function sendPayUsageExample(Player $player) { - $message = "Usage Example: '/pay 100 login'"; - return $this->maniaControl->chat->sendChat($message, $player->login); - } - /** * Handles the /topdons command * @@ -479,8 +474,8 @@ class DonationPlugin implements CallbackListener, CommandListener, Plugin { // create manialink $maniaLink = new ManiaLink(ManialinkManager::MAIN_MLID); - $script = $maniaLink->getScript(); - $paging = new Paging(); + $script = $maniaLink->getScript(); + $paging = new Paging(); $script->addFeature($paging); // Main frame @@ -505,7 +500,7 @@ class DonationPlugin implements CallbackListener, CommandListener, Plugin { $i = 1; $y = $y - 10; $pageFrames = array(); - foreach($stats as $playerIndex => $donations) { + foreach ($stats as $playerIndex => $donations) { if (!isset($pageFrame)) { $pageFrame = new Frame(); $frame->add($pageFrame); @@ -531,7 +526,7 @@ class DonationPlugin implements CallbackListener, CommandListener, Plugin { } $donatingPlayer = $this->maniaControl->playerManager->getPlayerByIndex($playerIndex); - $array = array($i => $x + 5, $donatingPlayer->nickname => $x + 18, $donations => $x + 70); + $array = array($i => $x + 5, $donatingPlayer->nickname => $x + 18, $donations => $x + 70); $this->maniaControl->manialinkManager->labelLine($playerFrame, $array); $y -= 4; @@ -540,7 +535,7 @@ class DonationPlugin implements CallbackListener, CommandListener, Plugin { unset($pageFrame); } - if($i > 100) { + if ($i > 100) { break; } } diff --git a/application/plugins/MCTeam/KarmaPlugin.php b/application/plugins/MCTeam/KarmaPlugin.php index 280c4398..79cf5ead 100644 --- a/application/plugins/MCTeam/KarmaPlugin.php +++ b/application/plugins/MCTeam/KarmaPlugin.php @@ -32,6 +32,8 @@ class KarmaPlugin implements CallbackListener, TimerListener, Plugin { */ const ID = 2; const VERSION = 0.1; + const NAME = 'Karma Plugin'; + const AUTHOR = 'MCTeam'; const MLID_KARMA = 'KarmaPlugin.MLID'; const TABLE_KARMA = 'mc_karma'; const CB_KARMA_CHANGED = 'KarmaPlugin.Changed'; @@ -62,19 +64,15 @@ class KarmaPlugin implements CallbackListener, TimerListener, Plugin { /* * Private Properties */ - /** - * @var ManiaControl $maniaControl - */ + /** @var ManiaControl $maniaControl */ private $maniaControl = null; private $updateManialink = false; - /** - * @var ManiaLink $manialink - */ + /** @var ManiaLink $manialink */ private $manialink = null; private $mxKarma = array(); /** - * @see \ManiaControl\Plugins\Plugin + * @see \ManiaControl\Plugins\Plugin::prepare() */ public static function prepare(ManiaControl $maniaControl) { $maniaControl->settingManager->initSetting(get_class(), self::SETTING_MX_KARMA_ACTIVATED, true); @@ -97,7 +95,7 @@ class KarmaPlugin implements CallbackListener, TimerListener, Plugin { * @see \ManiaControl\Plugins\Plugin::getName() */ public static function getName() { - return 'Karma Plugin'; + return self::NAME; } /** @@ -111,7 +109,7 @@ class KarmaPlugin implements CallbackListener, TimerListener, Plugin { * @see \ManiaControl\Plugins\Plugin::getAuthor() */ public static function getAuthor() { - return 'steeffeen and kremsy'; + return self::AUTHOR; } /** diff --git a/application/plugins/MCTeam/LocalRecordsPlugin.php b/application/plugins/MCTeam/LocalRecordsPlugin.php index d3b8e730..de7c0f24 100644 --- a/application/plugins/MCTeam/LocalRecordsPlugin.php +++ b/application/plugins/MCTeam/LocalRecordsPlugin.php @@ -15,73 +15,101 @@ use ManiaControl\Callbacks\CallbackManager; use ManiaControl\Callbacks\Callbacks; use ManiaControl\Callbacks\TimerListener; use ManiaControl\Commands\CommandListener; -use ManiaControl\Settings\SettingManager; use ManiaControl\Formatter; use ManiaControl\ManiaControl; -use ManiaControl\Maps\Map; -use ManiaControl\Maps\MapManager; use ManiaControl\Manialinks\ManialinkManager; +use ManiaControl\Maps\Map; use ManiaControl\Players\Player; use ManiaControl\Players\PlayerManager; use ManiaControl\Plugins\Plugin; +use ManiaControl\Settings\SettingManager; /** * ManiaControl Local Records Plugin - * - * @author steeffeen - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class LocalRecordsPlugin implements CallbackListener, CommandListener, TimerListener, Plugin { /* * Constants */ - const ID = 7; - const VERSION = 0.2; - const MLID_RECORDS = 'ml_local_records'; - const TABLE_RECORDS = 'mc_localrecords'; - const SETTING_WIDGET_TITLE = 'Widget Title'; - const SETTING_WIDGET_POSX = 'Widget Position: X'; - const SETTING_WIDGET_POSY = 'Widget Position: Y'; - const SETTING_WIDGET_WIDTH = 'Widget Width'; - const SETTING_WIDGET_LINESCOUNT = 'Widget Displayed Lines Count'; - const SETTING_WIDGET_LINEHEIGHT = 'Widget Line Height'; - const SETTING_WIDGET_ENABLE = 'Enable Local Records Widget'; - const SETTING_NOTIFY_ONLY_DRIVER = 'Notify only the Driver on New Records'; + const ID = 7; + const VERSION = 0.2; + const NAME = 'Local Records Plugin'; + const AUTHOR = 'MCTeam'; + const MLID_RECORDS = 'ml_local_records'; + const TABLE_RECORDS = 'mc_localrecords'; + const SETTING_WIDGET_TITLE = 'Widget Title'; + const SETTING_WIDGET_POSX = 'Widget Position: X'; + const SETTING_WIDGET_POSY = 'Widget Position: Y'; + const SETTING_WIDGET_WIDTH = 'Widget Width'; + const SETTING_WIDGET_LINESCOUNT = 'Widget Displayed Lines Count'; + const SETTING_WIDGET_LINEHEIGHT = 'Widget Line Height'; + const SETTING_WIDGET_ENABLE = 'Enable Local Records Widget'; + const SETTING_NOTIFY_ONLY_DRIVER = 'Notify only the Driver on New Records'; const SETTING_NOTIFY_BEST_RECORDS = 'Notify Publicly only for the X Best Records'; const SETTING_ADJUST_OUTER_BORDER = 'Adjust outer Border to Number of actual Records'; - const CB_LOCALRECORDS_CHANGED = 'LocalRecords.Changed'; - const ACTION_SHOW_RECORDSLIST = 'LocalRecords.ShowRecordsList'; - + const CB_LOCALRECORDS_CHANGED = 'LocalRecords.Changed'; + const ACTION_SHOW_RECORDSLIST = 'LocalRecords.ShowRecordsList'; + /* * Private Properties */ - /** - * - * @var maniaControl $maniaControl - */ + /** @var ManiaControl $maniaControl */ private $maniaControl = null; private $updateManialink = false; private $checkpoints = array(); /** - * Prepares the Plugin - * - * @param ManiaControl $maniaControl - * @return mixed + * @see \ManiaControl\Plugins\Plugin::prepare() */ public static function prepare(ManiaControl $maniaControl) { - // do nothing } /** - * + * @see \ManiaControl\Plugins\Plugin::getId() + */ + public static function getId() { + return self::ID; + } + + /** + * @see \ManiaControl\Plugins\Plugin::getName() + */ + public static function getName() { + return self::NAME; + } + + /** + * @see \ManiaControl\Plugins\Plugin::getVersion() + */ + public static function getVersion() { + return self::VERSION; + } + + /** + * @see \ManiaControl\Plugins\Plugin::getAuthor() + */ + public static function getAuthor() { + return self::AUTHOR; + } + + /** + * @see \ManiaControl\Plugins\Plugin::getDescription() + */ + public static function getDescription() { + return 'Plugin offering tracking of local records and manialinks to display them.'; + } + + /** * @see \ManiaControl\Plugins\Plugin::load() */ public function load(ManiaControl $maniaControl) { $this->maniaControl = $maniaControl; $this->initTables(); - + // Init settings $this->maniaControl->settingManager->initSetting($this, self::SETTING_WIDGET_TITLE, 'Local Records'); $this->maniaControl->settingManager->initSetting($this, self::SETTING_WIDGET_POSX, -139.); @@ -93,7 +121,7 @@ class LocalRecordsPlugin implements CallbackListener, CommandListener, TimerList $this->maniaControl->settingManager->initSetting($this, self::SETTING_NOTIFY_ONLY_DRIVER, false); $this->maniaControl->settingManager->initSetting($this, self::SETTING_NOTIFY_BEST_RECORDS, -1); $this->maniaControl->settingManager->initSetting($this, self::SETTING_ADJUST_OUTER_BORDER, false); - + // Register for callbacks $this->maniaControl->timerManager->registerTimerListening($this, 'handle1Second', 1000); $this->maniaControl->callbackManager->registerCallbackListener(CallbackManager::CB_AFTERINIT, $this, 'handleAfterInit'); @@ -105,17 +133,10 @@ class LocalRecordsPlugin implements CallbackListener, CommandListener, TimerList $this->maniaControl->callbackManager->registerCallbackListener(CallbackManager::CB_MP_PLAYERMANIALINKPAGEANSWER, $this, 'handleManialinkPageAnswer'); $this->maniaControl->commandManager->registerCommandListener(array('recs', 'records'), $this, 'showRecordsList', false, 'Shows a list of Local Records on the current map.'); $this->maniaControl->commandManager->registerCommandListener('delrec', $this, 'deleteRecord', true, 'Removes a record from the database.'); - - $this->updateManialink = true; - - return true; - } - /** - * - * @see \ManiaControl\Plugins\Plugin::unload() - */ - public function unload() { + $this->updateManialink = true; + + return true; } /** @@ -123,7 +144,7 @@ class LocalRecordsPlugin implements CallbackListener, CommandListener, TimerList */ private function initTables() { $mysqli = $this->maniaControl->database->mysqli; - $query = "CREATE TABLE IF NOT EXISTS `" . self::TABLE_RECORDS . "` ( + $query = "CREATE TABLE IF NOT EXISTS `" . self::TABLE_RECORDS . "` ( `index` int(11) NOT NULL AUTO_INCREMENT, `mapIndex` int(11) NOT NULL, `playerIndex` int(11) NOT NULL, @@ -136,7 +157,7 @@ class LocalRecordsPlugin implements CallbackListener, CommandListener, TimerList if ($mysqli->error) { trigger_error($mysqli->error, E_USER_ERROR); } - + $mysqli->query("ALTER TABLE `" . self::TABLE_RECORDS . "` ADD `checkpoints` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL"); if ($mysqli->error) { if (!strstr($mysqli->error, 'Duplicate')) { @@ -146,43 +167,9 @@ class LocalRecordsPlugin implements CallbackListener, CommandListener, TimerList } /** - * - * @see \ManiaControl\Plugins\Plugin::getId() + * @see \ManiaControl\Plugins\Plugin::unload() */ - public static function getId() { - return self::ID; - } - - /** - * - * @see \ManiaControl\Plugins\Plugin::getName() - */ - public static function getName() { - return 'Local Records Plugin'; - } - - /** - * - * @see \ManiaControl\Plugins\Plugin::getVersion() - */ - public static function getVersion() { - return self::VERSION; - } - - /** - * - * @see \ManiaControl\Plugins\Plugin::getAuthor() - */ - public static function getAuthor() { - return 'steeffeen'; - } - - /** - * - * @see \ManiaControl\Plugins\Plugin::getDescription() - */ - public static function getDescription() { - return 'Plugin offering tracking of local records and manialinks to display them.'; + public function unload() { } /** @@ -194,14 +181,14 @@ class LocalRecordsPlugin implements CallbackListener, CommandListener, TimerList /** * Handle 1Second callback - * + * * @param $time */ public function handle1Second($time) { if (!$this->updateManialink) { return; } - + $this->updateManialink = false; if ($this->maniaControl->settingManager->getSetting($this, self::SETTING_WIDGET_ENABLE)) { $manialink = $this->buildManialink(); @@ -209,304 +196,9 @@ class LocalRecordsPlugin implements CallbackListener, CommandListener, TimerList } } - public function handleSettingsChanged($class, $settingName, $value) { - if (!$class = get_class()) { - return; - } - if ($settingName == 'Enable Local Records Widget' && $value == true) { - $this->updateManialink = true; - } - elseif ($settingName == 'Enable Local Records Widget' && $value == false) { - $ml = new ManiaLink(self::MLID_RECORDS); - $mltext = $ml->render()->saveXML(); - $this->maniaControl->manialinkManager->sendManialink($mltext); - } - } - - /** - * Handle PlayerCheckpoint callback - * - * @param $callback - */ - public function handlePlayerCheckpoint($callback) { - $data = $callback[1]; - $login = $data[1]; - $time = $data[2]; - // $lap = $data[3]; - $cpIndex = $data[4]; - if (!isset($this->checkpoints[$login]) || $cpIndex <= 0) { - $this->checkpoints[$login] = array(); - } - $this->checkpoints[$login][$cpIndex] = $time; - } - - /** - * Handle PlayerConnect callback - * - * @param Player $player - */ - public function handlePlayerConnect(Player $player) { - $this->updateManialink = true; - } - - /** - * Handle BeginMap callback - * - * @param Map $map - */ - public function handleMapBegin(Map $map) { - $this->updateManialink = true; - } - - /** - * Handle PlayerFinish callback - * - * @param array $callback - */ - public function handlePlayerFinish(array $callback) { - $data = $callback[1]; - if ($data[0] <= 0 || $data[2] <= 0) { - // Invalid player or time - return; - } - - $login = $data[1]; - $player = $this->maniaControl->playerManager->getPlayer($login); - if (!$player) { - // Invalid player - return; - } - - $time = $data[2]; - $map = $this->maniaControl->mapManager->getCurrentMap(); - - // Check old record of the player - $oldRecord = $this->getLocalRecord($map, $player); - $oldRank = -1; - if ($oldRecord) { - $oldRank = $oldRecord->rank; - if ($oldRecord->time < $time) { - // Not improved - return; - } - if ($oldRecord->time == $time) { - // Same time - $message = '$<$fff' . $player->nickname . '$> equalized his/her $<$ff0' . $oldRecord->rank . '.$> Local Record: $<$fff' . Formatter::formatTime($oldRecord->time) . '$>!'; - $this->maniaControl->chat->sendInformation('$3c0' . $message); - return; - } - } - - // Save time - $mysqli = $this->maniaControl->database->mysqli; - $query = "INSERT INTO `" . self::TABLE_RECORDS . "` ( - `mapIndex`, - `playerIndex`, - `time`, - `checkpoints` - ) VALUES ( - {$map->index}, - {$player->index}, - {$time}, - '{$this->getCheckpoints($player->login)}' - ) ON DUPLICATE KEY UPDATE - `time` = VALUES(`time`), - `checkpoints` = VALUES(`checkpoints`);"; - $mysqli->query($query); - if ($mysqli->error) { - trigger_error($mysqli->error); - return; - } - $this->updateManialink = true; - - // Announce record - $newRecord = $this->getLocalRecord($map, $player); - - $notifyOnlyDriver = $this->maniaControl->settingManager->getSetting($this, self::SETTING_NOTIFY_ONLY_DRIVER); - $notifyOnlyBestRecords = $this->maniaControl->settingManager->getSetting($this, self::SETTING_NOTIFY_BEST_RECORDS); - if ($notifyOnlyDriver || $notifyOnlyBestRecords > 0 && $newRecord->rank > $notifyOnlyBestRecords) { - $improvement = ((!$oldRecord || $newRecord->rank < $oldRecord->rank) ? 'gained the' : 'improved your'); - $message = 'You ' . $improvement . ' $<$ff0' . $newRecord->rank . '.$> Local Record: $<$fff' . Formatter::formatTime($newRecord->time) . '$>'; - if ($oldRecord) $oldRank = ($improvement == 'improved your') ? '' : $oldRecord->rank . '. '; - if ($oldRecord) $message .= ' ($<$ff0' . $oldRank . '$>$<$fff-' . Formatter::formatTime(($oldRecord->time - $newRecord->time)) . '$>!'; - $this->maniaControl->chat->sendInformation('$3c0' . $message.'!', $player->login); - } else { - $improvement = ((!$oldRecord || $newRecord->rank < $oldRecord->rank) ? 'gained the' : 'improved the'); - $message = '$<$fff' . $player->nickname . '$> ' . $improvement . ' $<$ff0' . $newRecord->rank . '.$> Local Record: $<$fff' . Formatter::formatTime($newRecord->time) . '$>'; - if ($oldRecord) $oldRank = ($improvement == 'improved the') ? '' : $oldRecord->rank . '. '; - if ($oldRecord) $message .= ' ($<$ff0' . $oldRank . '$>$<$fff-' . Formatter::formatTime(($oldRecord->time - $newRecord->time)) . '$>)'; - $this->maniaControl->chat->sendInformation('$3c0' . $message.'!'); - } - - $this->maniaControl->callbackManager->triggerCallback(self::CB_LOCALRECORDS_CHANGED, $newRecord); - } - - /** - * Handle PlayerManialinkPageAnswer callback - * - * @param array $callback - */ - public function handleManialinkPageAnswer(array $callback) { - $actionId = $callback[1][2]; - - $login = $callback[1][1]; - $player = $this->maniaControl->playerManager->getPlayer($login); - - if ($actionId == self::ACTION_SHOW_RECORDSLIST) { - $this->showRecordsList(array(), $player); - } - } - - /** - * Delete a Player's record - * - * @param array $chat - * @param Player $player - */ - public function deleteRecord(array $chat, Player $player) { - if (!$this->maniaControl->authenticationManager->checkRight($player, AuthenticationManager::AUTH_LEVEL_MASTERADMIN)) { - $this->maniaControl->authenticationManager->sendNotAllowed($player); - return; - } - - $chatCommand = explode(' ', $chat[1][2]); - $recordId = (int) $chatCommand[1]; - if (is_integer($recordId)) { - $currentMap = $this->maniaControl->mapManager->getCurrentMap(); - $records = $this->getLocalRecords($currentMap); - if (count($records) < $recordId) { - $this->maniaControl->chat->sendError('Cannot remove record $<$fff' . $recordId . '$>!', $player); - return; - } - - $mysqli = $this->maniaControl->database->mysqli; - $query = "DELETE FROM `" . self::TABLE_RECORDS . "` WHERE `mapIndex` = " . $currentMap->index . " AND `playerIndex` = " . $player->index . ""; - $mysqli->query($query); - if ($mysqli->error) { - trigger_error($mysqli->error); - return; - } - - $this->maniaControl->callbackManager->triggerCallback(self::CB_LOCALRECORDS_CHANGED, null); - $this->maniaControl->chat->sendInformation('Record no. $<$fff' . $recordId . '$> has been removed!'); - } - else { - $this->maniaControl->chat->sendError('Cannot remove record $<$fff' . $recordId . '$>, because it\'s not an integer!', $player); - } - } - - /** - * Shows a ManiaLink list with the local records. - * - * @param array $chat - * @param Player $player - */ - public function showRecordsList(array $chat, Player $player) { - $width = $this->maniaControl->manialinkManager->styleManager->getListWidgetsWidth(); - $height = $this->maniaControl->manialinkManager->styleManager->getListWidgetsHeight(); - - // get PlayerList - $records = $this->getLocalRecords($this->maniaControl->mapManager->getCurrentMap()); - - $pagesId = ''; - if (count($records) > 15) { - $pagesId = 'RecordsListPages'; - } - - // create manialink - $maniaLink = new ManiaLink(ManialinkManager::MAIN_MLID); - $script = $maniaLink->getScript(); - $paging = new Paging(); - $script->addFeature($paging); - - // Main frame - $frame = $this->maniaControl->manialinkManager->styleManager->getDefaultListFrame($script, $paging); - $maniaLink->add($frame); - - // Start offsets - $x = -$width / 2; - $y = $height / 2; - - // Predefine Description Label - $descriptionLabel = $this->maniaControl->manialinkManager->styleManager->getDefaultDescriptionLabel(); - $frame->add($descriptionLabel); - - // Headline - $headFrame = new Frame(); - $frame->add($headFrame); - $headFrame->setY($y - 5); - $array = array("Rank" => $x + 5, "Nickname" => $x + 18, "Login" => $x + 70, "Time" => $x + 101); - $this->maniaControl->manialinkManager->labelLine($headFrame, $array); - - $i = 0; - $y = $height / 2 - 10; - $pageFrames = array(); - foreach ($records as $listRecord) { - if (!isset($pageFrame)) { - $pageFrame = new Frame(); - $frame->add($pageFrame); - if (!empty($pageFrames)) { - $pageFrame->setVisible(false); - } - array_push($pageFrames, $pageFrame); - $y = $height / 2 - 10; - - $paging->addPage($pageFrame); - } - - $recordFrame = new Frame(); - $pageFrame->add($recordFrame); - - if ($i % 2 != 0) { - $lineQuad = new Quad_BgsPlayerCard(); - $recordFrame->add($lineQuad); - $lineQuad->setSize($width, 4); - $lineQuad->setSubStyle($lineQuad::SUBSTYLE_BgPlayerCardBig); - $lineQuad->setZ(0.001); - } - - if (strlen($listRecord->nickname) < 2) $listRecord->nickname = $listRecord->login; - $array = array($listRecord->rank => $x + 5, '$fff' . $listRecord->nickname => $x + 18, $listRecord->login => $x + 70, - Formatter::formatTime($listRecord->time) => $x + 101); - $this->maniaControl->manialinkManager->labelLine($recordFrame, $array); - - $recordFrame->setY($y); - - $y -= 4; - $i++; - if ($i % 15 == 0) { - unset($pageFrame); - } - } - - // Render and display xml - $this->maniaControl->manialinkManager->displayWidget($maniaLink, $player, 'PlayerList'); - } - - /** - * Get current checkpoint string for dedimania record - * - * @param string $login - * @return string - */ - private function getCheckpoints($login) { - if (!$login || !isset($this->checkpoints[$login])) { - return null; - } - $string = ''; - $count = count($this->checkpoints[$login]); - foreach ($this->checkpoints[$login] as $index => $check) { - $string .= $check; - if ($index < $count - 1) { - $string .= ','; - } - } - return $string; - } - /** * Build the local records manialink - * + * * @return string */ private function buildManialink() { @@ -514,37 +206,37 @@ class LocalRecordsPlugin implements CallbackListener, CommandListener, TimerList if (!$map) { return null; } - - $title = $this->maniaControl->settingManager->getSetting($this, self::SETTING_WIDGET_TITLE); - $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); - $lines = $this->maniaControl->settingManager->getSetting($this, self::SETTING_WIDGET_LINESCOUNT); - $lineHeight = $this->maniaControl->settingManager->getSetting($this, self::SETTING_WIDGET_LINEHEIGHT); - $labelStyle = $this->maniaControl->manialinkManager->styleManager->getDefaultLabelStyle(); - $quadStyle = $this->maniaControl->manialinkManager->styleManager->getDefaultQuadStyle(); + + $title = $this->maniaControl->settingManager->getSetting($this, self::SETTING_WIDGET_TITLE); + $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); + $lines = $this->maniaControl->settingManager->getSetting($this, self::SETTING_WIDGET_LINESCOUNT); + $lineHeight = $this->maniaControl->settingManager->getSetting($this, self::SETTING_WIDGET_LINEHEIGHT); + $labelStyle = $this->maniaControl->manialinkManager->styleManager->getDefaultLabelStyle(); + $quadStyle = $this->maniaControl->manialinkManager->styleManager->getDefaultQuadStyle(); $quadSubstyle = $this->maniaControl->manialinkManager->styleManager->getDefaultQuadSubstyle(); - + $records = $this->getLocalRecords($map); if (!is_array($records)) { trigger_error("Couldn't fetch player records."); return null; } - + $manialink = new ManiaLink(self::MLID_RECORDS); - $frame = new Frame(); + $frame = new Frame(); $manialink->add($frame); $frame->setPosition($pos_x, $pos_y); - + $backgroundQuad = new Quad(); $frame->add($backgroundQuad); $backgroundQuad->setVAlign(Control::TOP); $adjustOuterBorder = $this->maniaControl->settingManager->getSetting($this, self::SETTING_ADJUST_OUTER_BORDER); - $height = 7. + ($adjustOuterBorder ? count($records) : $lines) * $lineHeight; + $height = 7. + ($adjustOuterBorder ? count($records) : $lines) * $lineHeight; $backgroundQuad->setSize($width * 1.05, $height); $backgroundQuad->setStyles($quadStyle, $quadSubstyle); $backgroundQuad->setAction(self::ACTION_SHOW_RECORDSLIST); - + $titleLabel = new Label(); $frame->add($titleLabel); $titleLabel->setPosition(0, $lineHeight * -0.9); @@ -553,23 +245,23 @@ class LocalRecordsPlugin implements CallbackListener, CommandListener, TimerList $titleLabel->setTextSize(2); $titleLabel->setText($title); $titleLabel->setTranslate(true); - + // Times foreach ($records as $index => $record) { if ($index >= $lines) { break; } - + $y = -8. - $index * $lineHeight; - + $recordFrame = new Frame(); $frame->add($recordFrame); $recordFrame->setPosition(0, $y); - + /* * $backgroundQuad = new Quad(); $recordFrame->add($backgroundQuad); $backgroundQuad->setSize($width * 1.04, $lineHeight * 1.4); $backgroundQuad->setStyles($quadStyle, $quadSubstyle); */ - + $rankLabel = new Label(); $recordFrame->add($rankLabel); $rankLabel->setHAlign(Control::LEFT); @@ -579,7 +271,7 @@ class LocalRecordsPlugin implements CallbackListener, CommandListener, TimerList $rankLabel->setTextPrefix('$o'); $rankLabel->setText($record->rank); $rankLabel->setTextEmboss(true); - + $nameLabel = new Label(); $recordFrame->add($nameLabel); $nameLabel->setHAlign(Control::LEFT); @@ -588,7 +280,7 @@ class LocalRecordsPlugin implements CallbackListener, CommandListener, TimerList $nameLabel->setTextSize(1); $nameLabel->setText($record->nickname); $nameLabel->setTextEmboss(true); - + $timeLabel = new Label(); $recordFrame->add($timeLabel); $timeLabel->setHAlign(Control::RIGHT); @@ -598,21 +290,21 @@ class LocalRecordsPlugin implements CallbackListener, CommandListener, TimerList $timeLabel->setText(Formatter::formatTime($record->time)); $timeLabel->setTextEmboss(true); } - + return $manialink; } /** * Fetch local records for the given map - * + * * @param Map $map * @param int $limit * @return array */ public function getLocalRecords(Map $map, $limit = -1) { $mysqli = $this->maniaControl->database->mysqli; - $limit = ($limit > 0 ? "LIMIT " . $limit : ""); - $query = "SELECT * FROM ( + $limit = ($limit > 0 ? "LIMIT " . $limit : ""); + $query = "SELECT * FROM ( SELECT recs.*, @rank := @rank + 1 as `rank` FROM `" . self::TABLE_RECORDS . "` recs, (SELECT @rank := 0) ra WHERE recs.`mapIndex` = {$map->index} ORDER BY recs.`time` ASC @@ -632,16 +324,155 @@ class LocalRecordsPlugin implements CallbackListener, CommandListener, TimerList return $records; } + public function handleSettingsChanged($class, $settingName, $value) { + if (!$class = get_class()) { + return; + } + if ($settingName == 'Enable Local Records Widget' && $value == true) { + $this->updateManialink = true; + } elseif ($settingName == 'Enable Local Records Widget' && $value == false) { + $ml = new ManiaLink(self::MLID_RECORDS); + $mltext = $ml->render()->saveXML(); + $this->maniaControl->manialinkManager->sendManialink($mltext); + } + } + + /** + * Handle PlayerCheckpoint callback + * + * @param $callback + */ + public function handlePlayerCheckpoint($callback) { + $data = $callback[1]; + $login = $data[1]; + $time = $data[2]; + // $lap = $data[3]; + $cpIndex = $data[4]; + if (!isset($this->checkpoints[$login]) || $cpIndex <= 0) { + $this->checkpoints[$login] = array(); + } + $this->checkpoints[$login][$cpIndex] = $time; + } + + /** + * Handle PlayerConnect callback + * + * @param Player $player + */ + public function handlePlayerConnect(Player $player) { + $this->updateManialink = true; + } + + /** + * Handle BeginMap callback + * + * @param Map $map + */ + public function handleMapBegin(Map $map) { + $this->updateManialink = true; + } + + /** + * Handle PlayerFinish callback + * + * @param array $callback + */ + public function handlePlayerFinish(array $callback) { + $data = $callback[1]; + if ($data[0] <= 0 || $data[2] <= 0) { + // Invalid player or time + return; + } + + $login = $data[1]; + $player = $this->maniaControl->playerManager->getPlayer($login); + if (!$player) { + // Invalid player + return; + } + + $time = $data[2]; + $map = $this->maniaControl->mapManager->getCurrentMap(); + + // Check old record of the player + $oldRecord = $this->getLocalRecord($map, $player); + $oldRank = -1; + if ($oldRecord) { + $oldRank = $oldRecord->rank; + if ($oldRecord->time < $time) { + // Not improved + return; + } + if ($oldRecord->time == $time) { + // Same time + $message = '$<$fff' . $player->nickname . '$> equalized his/her $<$ff0' . $oldRecord->rank . '.$> Local Record: $<$fff' . Formatter::formatTime($oldRecord->time) . '$>!'; + $this->maniaControl->chat->sendInformation('$3c0' . $message); + return; + } + } + + // Save time + $mysqli = $this->maniaControl->database->mysqli; + $query = "INSERT INTO `" . self::TABLE_RECORDS . "` ( + `mapIndex`, + `playerIndex`, + `time`, + `checkpoints` + ) VALUES ( + {$map->index}, + {$player->index}, + {$time}, + '{$this->getCheckpoints($player->login)}' + ) ON DUPLICATE KEY UPDATE + `time` = VALUES(`time`), + `checkpoints` = VALUES(`checkpoints`);"; + $mysqli->query($query); + if ($mysqli->error) { + trigger_error($mysqli->error); + return; + } + $this->updateManialink = true; + + // Announce record + $newRecord = $this->getLocalRecord($map, $player); + + $notifyOnlyDriver = $this->maniaControl->settingManager->getSetting($this, self::SETTING_NOTIFY_ONLY_DRIVER); + $notifyOnlyBestRecords = $this->maniaControl->settingManager->getSetting($this, self::SETTING_NOTIFY_BEST_RECORDS); + if ($notifyOnlyDriver || $notifyOnlyBestRecords > 0 && $newRecord->rank > $notifyOnlyBestRecords) { + $improvement = ((!$oldRecord || $newRecord->rank < $oldRecord->rank) ? 'gained the' : 'improved your'); + $message = 'You ' . $improvement . ' $<$ff0' . $newRecord->rank . '.$> Local Record: $<$fff' . Formatter::formatTime($newRecord->time) . '$>'; + if ($oldRecord) { + $oldRank = ($improvement == 'improved your') ? '' : $oldRecord->rank . '. '; + } + if ($oldRecord) { + $message .= ' ($<$ff0' . $oldRank . '$>$<$fff-' . Formatter::formatTime(($oldRecord->time - $newRecord->time)) . '$>!'; + } + $this->maniaControl->chat->sendInformation('$3c0' . $message . '!', $player->login); + } else { + $improvement = ((!$oldRecord || $newRecord->rank < $oldRecord->rank) ? 'gained the' : 'improved the'); + $message = '$<$fff' . $player->nickname . '$> ' . $improvement . ' $<$ff0' . $newRecord->rank . '.$> Local Record: $<$fff' . Formatter::formatTime($newRecord->time) . '$>'; + if ($oldRecord) { + $oldRank = ($improvement == 'improved the') ? '' : $oldRecord->rank . '. '; + } + if ($oldRecord) { + $message .= ' ($<$ff0' . $oldRank . '$>$<$fff-' . Formatter::formatTime(($oldRecord->time - $newRecord->time)) . '$>)'; + } + $this->maniaControl->chat->sendInformation('$3c0' . $message . '!'); + } + + $this->maniaControl->callbackManager->triggerCallback(self::CB_LOCALRECORDS_CHANGED, $newRecord); + } + /** * Retrieve the local record for the given map and login - * - * @param Map $map + * + * @param Map $map * @param Player $player * @return mixed */ private function getLocalRecord(Map $map, Player $player) { $mysqli = $this->maniaControl->database->mysqli; - $query = "SELECT records.* FROM ( + $query = "SELECT records.* FROM ( SELECT recs.*, @rank := @rank + 1 as `rank` FROM `" . self::TABLE_RECORDS . "` recs, (SELECT @rank := 0) ra WHERE recs.`mapIndex` = {$map->index} ORDER BY recs.`time` ASC) records @@ -655,4 +486,167 @@ class LocalRecordsPlugin implements CallbackListener, CommandListener, TimerList $result->free(); return $record; } + + /** + * Get current checkpoint string for dedimania record + * + * @param string $login + * @return string + */ + private function getCheckpoints($login) { + if (!$login || !isset($this->checkpoints[$login])) { + return null; + } + $string = ''; + $count = count($this->checkpoints[$login]); + foreach ($this->checkpoints[$login] as $index => $check) { + $string .= $check; + if ($index < $count - 1) { + $string .= ','; + } + } + return $string; + } + + /** + * Handle PlayerManialinkPageAnswer callback + * + * @param array $callback + */ + public function handleManialinkPageAnswer(array $callback) { + $actionId = $callback[1][2]; + + $login = $callback[1][1]; + $player = $this->maniaControl->playerManager->getPlayer($login); + + if ($actionId == self::ACTION_SHOW_RECORDSLIST) { + $this->showRecordsList(array(), $player); + } + } + + /** + * Shows a ManiaLink list with the local records. + * + * @param array $chat + * @param Player $player + */ + public function showRecordsList(array $chat, Player $player) { + $width = $this->maniaControl->manialinkManager->styleManager->getListWidgetsWidth(); + $height = $this->maniaControl->manialinkManager->styleManager->getListWidgetsHeight(); + + // get PlayerList + $records = $this->getLocalRecords($this->maniaControl->mapManager->getCurrentMap()); + + $pagesId = ''; + if (count($records) > 15) { + $pagesId = 'RecordsListPages'; + } + + // create manialink + $maniaLink = new ManiaLink(ManialinkManager::MAIN_MLID); + $script = $maniaLink->getScript(); + $paging = new Paging(); + $script->addFeature($paging); + + // Main frame + $frame = $this->maniaControl->manialinkManager->styleManager->getDefaultListFrame($script, $paging); + $maniaLink->add($frame); + + // Start offsets + $x = -$width / 2; + $y = $height / 2; + + // Predefine Description Label + $descriptionLabel = $this->maniaControl->manialinkManager->styleManager->getDefaultDescriptionLabel(); + $frame->add($descriptionLabel); + + // Headline + $headFrame = new Frame(); + $frame->add($headFrame); + $headFrame->setY($y - 5); + $array = array("Rank" => $x + 5, "Nickname" => $x + 18, "Login" => $x + 70, "Time" => $x + 101); + $this->maniaControl->manialinkManager->labelLine($headFrame, $array); + + $i = 0; + $y = $height / 2 - 10; + $pageFrames = array(); + foreach ($records as $listRecord) { + if (!isset($pageFrame)) { + $pageFrame = new Frame(); + $frame->add($pageFrame); + if (!empty($pageFrames)) { + $pageFrame->setVisible(false); + } + array_push($pageFrames, $pageFrame); + $y = $height / 2 - 10; + + $paging->addPage($pageFrame); + } + + $recordFrame = new Frame(); + $pageFrame->add($recordFrame); + + if ($i % 2 != 0) { + $lineQuad = new Quad_BgsPlayerCard(); + $recordFrame->add($lineQuad); + $lineQuad->setSize($width, 4); + $lineQuad->setSubStyle($lineQuad::SUBSTYLE_BgPlayerCardBig); + $lineQuad->setZ(0.001); + } + + if (strlen($listRecord->nickname) < 2) { + $listRecord->nickname = $listRecord->login; + } + $array = array($listRecord->rank => $x + 5, '$fff' . $listRecord->nickname => $x + 18, $listRecord->login => $x + 70, Formatter::formatTime($listRecord->time) => $x + 101); + $this->maniaControl->manialinkManager->labelLine($recordFrame, $array); + + $recordFrame->setY($y); + + $y -= 4; + $i++; + if ($i % 15 == 0) { + unset($pageFrame); + } + } + + // Render and display xml + $this->maniaControl->manialinkManager->displayWidget($maniaLink, $player, 'PlayerList'); + } + + /** + * Delete a Player's record + * + * @param array $chat + * @param Player $player + */ + public function deleteRecord(array $chat, Player $player) { + if (!$this->maniaControl->authenticationManager->checkRight($player, AuthenticationManager::AUTH_LEVEL_MASTERADMIN)) { + $this->maniaControl->authenticationManager->sendNotAllowed($player); + return; + } + + $chatCommand = explode(' ', $chat[1][2]); + $recordId = (int)$chatCommand[1]; + if (is_integer($recordId)) { + $currentMap = $this->maniaControl->mapManager->getCurrentMap(); + $records = $this->getLocalRecords($currentMap); + if (count($records) < $recordId) { + $this->maniaControl->chat->sendError('Cannot remove record $<$fff' . $recordId . '$>!', $player); + return; + } + + $mysqli = $this->maniaControl->database->mysqli; + $query = "DELETE FROM `" . self::TABLE_RECORDS . "` WHERE `mapIndex` = " . $currentMap->index . " AND `playerIndex` = " . $player->index . ""; + $mysqli->query($query); + if ($mysqli->error) { + trigger_error($mysqli->error); + return; + } + + $this->maniaControl->callbackManager->triggerCallback(self::CB_LOCALRECORDS_CHANGED, null); + $this->maniaControl->chat->sendInformation('Record no. $<$fff' . $recordId . '$> has been removed!'); + } else { + $this->maniaControl->chat->sendError('Cannot remove record $<$fff' . $recordId . '$>, because it\'s not an integer!', $player); + } + } } diff --git a/application/plugins/MCTeam/ServerRankingPlugin.php b/application/plugins/MCTeam/ServerRankingPlugin.php index bff9a255..c6229e29 100644 --- a/application/plugins/MCTeam/ServerRankingPlugin.php +++ b/application/plugins/MCTeam/ServerRankingPlugin.php @@ -6,13 +6,12 @@ use FML\Controls\Frame; use FML\Controls\Quads\Quad_BgsPlayerCard; use FML\ManiaLink; use FML\Script\Features\Paging; - use ManiaControl\Callbacks\CallbackListener; use ManiaControl\Callbacks\Callbacks; use ManiaControl\Commands\CommandListener; use ManiaControl\ManiaControl; -use ManiaControl\Maps\Map; use ManiaControl\Manialinks\ManialinkManager; +use ManiaControl\Maps\Map; use ManiaControl\Players\Player; use ManiaControl\Players\PlayerManager; use ManiaControl\Plugins\Plugin; @@ -23,9 +22,9 @@ use Maniaplanet\DedicatedServer\Structures\AbstractStructure; /** * ManiaControl ServerRanking Plugin * - * @author kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class ServerRankingPlugin implements Plugin, CallbackListener, CommandListener { /** @@ -33,8 +32,8 @@ class ServerRankingPlugin implements Plugin, CallbackListener, CommandListener { */ const PLUGIN_ID = 6; const PLUGIN_VERSION = 0.1; - const PLUGIN_NAME = 'ServerRankingPlugin'; - const PLUGIN_AUTHOR = 'kremsy'; + const PLUGIN_NAME = 'Server Ranking Plugin'; + const PLUGIN_AUTHOR = 'MCTeam'; const TABLE_RANK = 'mc_rank'; const RANKING_TYPE_RECORDS = 'Records'; const RANKING_TYPE_RATIOS = 'Ratios'; @@ -49,26 +48,53 @@ class ServerRankingPlugin implements Plugin, CallbackListener, CommandListener { /** * Private Properties */ - /** @var maniaControl $maniaControl * */ + /** @var ManiaControl $maniaControl * */ private $maniaControl = null; private $recordCount = 0; /** - * Prepares the Plugin - * - * @param ManiaControl $maniaControl - * @return mixed + * @see \ManiaControl\Plugins\Plugin::prepare() */ public static function prepare(ManiaControl $maniaControl) { - //Todo } /** - * Load the plugin - * - * @param \ManiaControl\ManiaControl $maniaControl - * @throws Exception - * @return bool + * @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 "ServerRanking Plugin, ServerRanking by an avg build from the records, per count of points, or by a multiplication from Kill/Death Ratio and Laser accuracy"; + } + + /** + * @see \ManiaControl\Plugins\Plugin::load() */ public function load(ManiaControl $maniaControl) { $this->maniaControl = $maniaControl; @@ -111,57 +137,6 @@ class ServerRankingPlugin implements Plugin, CallbackListener, CommandListener { $this->resetRanks(); //TODO only update records count } - /** - * @see \ManiaControl\Plugins\Plugin::unload() - */ - public function unload() { - } - - /** - * 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 "ServerRanking Plugin, ServerRanking by an avg build from the records, per count of points, or by a multiplication from Kill/Death Ratio and Laser accuracy"; - } - /** * Create necessary database tables */ @@ -190,7 +165,7 @@ class ServerRankingPlugin implements Plugin, CallbackListener, CommandListener { $mysqli->query('TRUNCATE TABLE ' . self::TABLE_RANK); $type = $this->maniaControl->settingManager->getSetting($this, self::SETTING_MIN_RANKING_TYPE); - switch($type) { + switch ($type) { case self::RANKING_TYPE_RATIOS: $minHits = $this->maniaControl->settingManager->getSetting($this, self::SETTING_MIN_HITS_RATIO_RANKING); @@ -199,7 +174,7 @@ class ServerRankingPlugin implements Plugin, CallbackListener, CommandListener { $accuracies = $this->maniaControl->statisticManager->getStatsRanking(StatisticManager::SPECIAL_STAT_LASER_ACC); $ranks = array(); - foreach($hits as $player => $hitCount) { + foreach ($hits as $player => $hitCount) { if (!isset($killDeathRatios[$player]) || !isset($accuracies[$player])) { continue; } @@ -232,7 +207,7 @@ class ServerRankingPlugin implements Plugin, CallbackListener, CommandListener { $result = $mysqli->query($query); $players = array(); - while($row = $result->fetch_object()) { + while ($row = $result->fetch_object()) { $players[$row->playerIndex] = array(0, 0); //sum, count } $result->free_result(); @@ -240,11 +215,11 @@ class ServerRankingPlugin implements Plugin, CallbackListener, CommandListener { /** @var \MCTeam\LocalRecordsPlugin $localRecordsPlugin */ $localRecordsPlugin = $this->maniaControl->pluginManager->getPlugin('MCTeam\LocalRecordsPlugin'); $maps = $this->maniaControl->mapManager->getMaps(); - foreach($maps as $map) { + foreach ($maps as $map) { $records = $localRecordsPlugin->getLocalRecords($map, $maxRecords); $i = 1; - foreach($records as $record) { + foreach ($records as $record) { if (isset($players[$record->playerIndex])) { $players[$record->playerIndex][0] += $i; $players[$record->playerIndex][1]++; @@ -257,7 +232,7 @@ class ServerRankingPlugin implements Plugin, CallbackListener, CommandListener { //compute each players new average score $ranks = array(); - foreach($players as $player => $val) { + foreach ($players as $player => $val) { $sum = $val[0]; $cnt = $val[1]; // ranked maps sum + $maxRecs rank for all remaining maps @@ -278,7 +253,7 @@ class ServerRankingPlugin implements Plugin, CallbackListener, CommandListener { $query = "INSERT INTO " . self::TABLE_RANK . " VALUES "; $i = 1; - foreach($ranks as $player => $rankValue) { + foreach ($ranks as $player => $rankValue) { $query .= '(' . $player . ',' . $i . ',' . $rankValue . '),'; $i++; } @@ -287,6 +262,12 @@ class ServerRankingPlugin implements Plugin, CallbackListener, CommandListener { $mysqli->query($query); } + /** + * @see \ManiaControl\Plugins\Plugin::unload() + */ + public function unload() { + } + /** * Handle PlayerConnect callback * @@ -297,27 +278,6 @@ class ServerRankingPlugin implements Plugin, CallbackListener, CommandListener { $this->showNextRank($player); } - /** - * Shows Ranks on endMap - * - * @param Map $map - */ - public function handleEndMap(Map $map) { - $this->resetRanks(); - - foreach($this->maniaControl->playerManager->getPlayers() as $player) { - /** @var Player $player */ - if ($player->isFakePlayer()) { - continue; - } - $this->showRank($player); - $this->showNextRank($player); - } - - // Trigger callback - $this->maniaControl->callbackManager->triggerCallback(self::CB_RANK_BUILT); - } - /** * Shows the serverRank to a certain Player * @@ -330,7 +290,7 @@ class ServerRankingPlugin implements Plugin, CallbackListener, CommandListener { $message = ''; if ($rankObj) { - switch($type) { + switch ($type) { case self::RANKING_TYPE_RATIOS: $kd = $this->maniaControl->statisticManager->getStatisticData(StatisticManager::SPECIAL_STAT_KD_RATIO, $player->index); $acc = $this->maniaControl->statisticManager->getStatisticData(StatisticManager::SPECIAL_STAT_LASER_ACC, $player->index); @@ -343,7 +303,7 @@ class ServerRankingPlugin implements Plugin, CallbackListener, CommandListener { $message = '$0f3Your Server rank is $<$ff3' . $rankObj->rank . '$> / $<$fff' . $this->recordCount . '$> Avg: $fff' . round($rankObj->avg, 2); } } else { - switch($type) { + switch ($type) { case self::RANKING_TYPE_RATIOS: $minHits = $this->maniaControl->settingManager->getSetting($this, self::SETTING_MIN_HITS_RATIO_RANKING); $message = '$0f3 You must make $<$fff' . $minHits . '$> Hits on this server before receiving a rank...'; @@ -379,59 +339,12 @@ class ServerRankingPlugin implements Plugin, CallbackListener, CommandListener { $result->free_result(); return null; } - + $row = $result->fetch_array(); $result->free_result(); return Rank::fromArray($row); } - /** - * Get the Next Ranked Player - * - * @param Player $player - * @return Rank - */ - private function getNextRank(Player $player) { - $mysqli = $this->maniaControl->database->mysqli; - $rankObject = $this->getRank($player); - $nextRank = $rankObject->rank - 1; - - $result = $mysqli->query('SELECT * FROM ' . self::TABLE_RANK . ' WHERE Rank=' . $nextRank); - if ($result->num_rows > 0) { - $row = $result->fetch_array(); - $result->free_result(); - return Rank::fromArray($row); - } else { - $result->free_result(); - return null; - } - } - - - /** - * Shows the current Server-Rank - * - * @param array $chatCallback - * @param Player $player - */ - public function command_showRank(array $chatCallback, Player $player) { - $this->showRank($player); - } - - /** - * Show the next better ranked player - * - * @param array $chatCallback - * @param Player $player - */ - public function command_nextRank(array $chatCallback, Player $player) { - if (!$this->showNextRank($player)) { - $message = '$0f3You need to have a ServerRank first!'; - $this->maniaControl->chat->sendChat($message, $player->login); - } - } - - /** * Shows which Player is next ranked to you * @@ -455,6 +368,72 @@ class ServerRankingPlugin implements Plugin, CallbackListener, CommandListener { return false; } + /** + * Get the Next Ranked Player + * + * @param Player $player + * @return Rank + */ + private function getNextRank(Player $player) { + $mysqli = $this->maniaControl->database->mysqli; + $rankObject = $this->getRank($player); + $nextRank = $rankObject->rank - 1; + + $result = $mysqli->query('SELECT * FROM ' . self::TABLE_RANK . ' WHERE Rank=' . $nextRank); + if ($result->num_rows > 0) { + $row = $result->fetch_array(); + $result->free_result(); + return Rank::fromArray($row); + } else { + $result->free_result(); + return null; + } + } + + /** + * Shows Ranks on endMap + * + * @param Map $map + */ + public function handleEndMap(Map $map) { + $this->resetRanks(); + + foreach ($this->maniaControl->playerManager->getPlayers() as $player) { + /** @var Player $player */ + if ($player->isFakePlayer()) { + continue; + } + $this->showRank($player); + $this->showNextRank($player); + } + + // Trigger callback + $this->maniaControl->callbackManager->triggerCallback(self::CB_RANK_BUILT); + } + + /** + * Shows the current Server-Rank + * + * @param array $chatCallback + * @param Player $player + */ + public function command_showRank(array $chatCallback, Player $player) { + $this->showRank($player); + } + + /** + * Show the next better ranked player + * + * @param array $chatCallback + * @param Player $player + */ + public function command_nextRank(array $chatCallback, Player $player) { + if (!$this->showNextRank($player)) { + $message = '$0f3You need to have a ServerRank first!'; + $this->maniaControl->chat->sendChat($message, $player->login); + } + } + /** * Handles /topranks|top100 command * @@ -471,7 +450,7 @@ class ServerRankingPlugin implements Plugin, CallbackListener, CommandListener { * @param Player $player */ private function showTopRanksList(Player $player) { - $query = "SELECT * FROM `".self::TABLE_RANK."` ORDER BY `Rank` ASC LIMIT 0, 100"; + $query = "SELECT * FROM `" . self::TABLE_RANK . "` ORDER BY `Rank` ASC LIMIT 0, 100"; $mysqli = $this->maniaControl->database->mysqli; $result = $mysqli->query($query); if ($mysqli->error) { @@ -484,8 +463,8 @@ class ServerRankingPlugin implements Plugin, CallbackListener, CommandListener { // create manialink $maniaLink = new ManiaLink(ManialinkManager::MAIN_MLID); - $script = $maniaLink->getScript(); - $paging = new Paging(); + $script = $maniaLink->getScript(); + $paging = new Paging(); $script->addFeature($paging); // Main frame @@ -510,7 +489,7 @@ class ServerRankingPlugin implements Plugin, CallbackListener, CommandListener { $i = 1; $y = $y - 10; $pageFrames = array(); - while($rankedPlayer = $result->fetch_object()) { + while ($rankedPlayer = $result->fetch_object()) { if (!isset($pageFrame)) { $pageFrame = new Frame(); $frame->add($pageFrame); @@ -536,7 +515,7 @@ class ServerRankingPlugin implements Plugin, CallbackListener, CommandListener { } $playerObject = $this->maniaControl->playerManager->getPlayerByIndex($rankedPlayer->PlayerIndex); - $array = array($rankedPlayer->Rank => $x + 5, $playerObject->nickname => $x + 18, (string)round($rankedPlayer->Avg, 2) => $x + 70); + $array = array($rankedPlayer->Rank => $x + 5, $playerObject->nickname => $x + 18, (string)round($rankedPlayer->Avg, 2) => $x + 70); $this->maniaControl->manialinkManager->labelLine($playerFrame, $array); $y -= 4; diff --git a/application/plugins/MCTeam/WidgetPlugin.php b/application/plugins/MCTeam/WidgetPlugin.php index 9db5f5a6..0f461f61 100644 --- a/application/plugins/MCTeam/WidgetPlugin.php +++ b/application/plugins/MCTeam/WidgetPlugin.php @@ -29,8 +29,7 @@ use ManiaControl\Plugins\Plugin; * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class WidgetPlugin implements CallbackListener, TimerListener, Plugin { - - /** + /* * Constants */ const PLUGIN_ID = 1; @@ -70,74 +69,55 @@ class WidgetPlugin implements CallbackListener, TimerListener, Plugin { const SETTING_SERVERINFO_WIDGET_WIDTH = 'ServerInfo-Widget-Size: Width'; const SETTING_SERVERINFO_WIDGET_HEIGHT = 'ServerInfo-Widget-Size: Height'; - /** + /* * Private Properties */ - /** - * @var maniaControl $maniaControl - */ + /** @var ManiaControl $maniaControl */ private $maniaControl = null; /** - * Prepares the Plugin - * - * @param ManiaControl $maniaControl - * @return mixed + * @see \ManiaControl\Plugins\Plugin::prepare() */ public static function prepare(ManiaControl $maniaControl) { - //do nothing } /** - * Get plugin id - * - * @return int + * @see \ManiaControl\Plugins\Plugin::getId() */ public static function getId() { return self::PLUGIN_ID; } /** - * Get Plugin Name - * - * @return string + * @see \ManiaControl\Plugins\Plugin::getName() */ public static function getName() { return self::PLUGIN_NAME; } /** - * Get Plugin Version - * - * @return float,, + * @see \ManiaControl\Plugins\Plugin::getVersion() */ public static function getVersion() { return self::PLUGIN_VERSION; } /** - * Get Plugin Author - * - * @return string + * @see \ManiaControl\Plugins\Plugin::getAuthor() */ public static function getAuthor() { return self::PLUGIN_AUTHOR; } /** - * Get Plugin Description - * - * @return string + * @see \ManiaControl\Plugins\Plugin::getDescription() */ public static function getDescription() { return 'Plugin offers some Widgets'; } /** - * Load the plugin - * - * @param ManiaControl $maniaControl - * @return bool + * @see \ManiaControl\Plugins\Plugin::load() */ public function load(ManiaControl $maniaControl) { $this->maniaControl = $maniaControl; @@ -413,7 +393,7 @@ class WidgetPlugin implements CallbackListener, TimerListener, Plugin { } /** - * Unload the plugin and its resources + * @see \ManiaControl\Plugins\Plugin::unload() */ public function unload() { //Restore Siege Progression Layer @@ -426,9 +406,9 @@ class WidgetPlugin implements CallbackListener, TimerListener, Plugin { } /** - * Closes a Widget + * Close a Widget * - * @param $widgetId + * @param string $widgetId */ public function closeWidget($widgetId) { $emptyManialink = new ManiaLink($widgetId); diff --git a/application/plugins/steeffeen/EndurancePlugin.php b/application/plugins/steeffeen/EndurancePlugin.php index e18eab18..6c619c3a 100644 --- a/application/plugins/steeffeen/EndurancePlugin.php +++ b/application/plugins/steeffeen/EndurancePlugin.php @@ -2,13 +2,12 @@ namespace steeffeen; -use ManiaControl\Callbacks\Callbacks; -use ManiaControl\ManiaControl; use ManiaControl\Callbacks\CallbackListener; use ManiaControl\Callbacks\CallbackManager; +use ManiaControl\Callbacks\Callbacks; +use ManiaControl\ManiaControl; use ManiaControl\Maps\Map; use ManiaControl\Plugins\Plugin; -use ManiaControl\Maps\MapManager; /** * Plugin for the TM Game Mode 'Endurance' by TGYoshi @@ -16,56 +15,32 @@ use ManiaControl\Maps\MapManager; * @author steeffeen */ class EndurancePlugin implements CallbackListener, Plugin { - /** + /* * Constants */ - const ID = 25; - const VERSION = 0.2; + const ID = 25; + const VERSION = 0.2; + const NAME = 'Endurance Plugin'; + const AUTHOR = 'steeffeen'; const CB_CHECKPOINT = 'Endurance.Checkpoint'; - + /** - * Private properties + * Private Properties */ - /** @var maniaControl $maniaControl */ + /** @var ManiaControl $maniaControl */ private $maniaControl = null; /** @var Map $currentMap */ private $currentMap = null; private $playerLapTimes = array(); /** - * Prepares the Plugin - * - * @param ManiaControl $maniaControl - * @return mixed + * @see \ManiaControl\Plugins\Plugin::prepare() */ public static function prepare(ManiaControl $maniaControl) { //do nothing } /** - * - * @see \ManiaControl\Plugins\Plugin::load() - */ - public function load(ManiaControl $maniaControl) { - $this->maniaControl = $maniaControl; - - // Register for callbacks - $this->maniaControl->callbackManager->registerCallbackListener(CallbackManager::CB_ONINIT, $this, 'callback_OnInit'); - $this->maniaControl->callbackManager->registerCallbackListener(Callbacks::BEGINMAP, $this, 'callback_BeginMap'); - $this->maniaControl->callbackManager->registerScriptCallbackListener(self::CB_CHECKPOINT, $this, 'callback_Checkpoint'); - - return true; - } - - /** - * - * @see \ManiaControl\Plugins\Plugin::unload() - */ - public function unload() { - } - - /** - * * @see \ManiaControl\Plugins\Plugin::getId() */ public static function getId() { @@ -73,15 +48,13 @@ class EndurancePlugin implements CallbackListener, Plugin { } /** - * * @see \ManiaControl\Plugins\Plugin::getName() */ public static function getName() { - return 'Endurance Plugin'; + return self::NAME; } /** - * * @see \ManiaControl\Plugins\Plugin::getVersion() */ public static function getVersion() { @@ -89,28 +62,46 @@ class EndurancePlugin implements CallbackListener, Plugin { } /** - * * @see \ManiaControl\Plugins\Plugin::getAuthor() */ public static function getAuthor() { - return 'steeffeen'; + return self::AUTHOR; } /** - * * @see \ManiaControl\Plugins\Plugin::getDescription() */ public static function getDescription() { return "Plugin enabling Support for the TM Game Mode 'Endurance' by TGYoshi."; } + /** + * @see \ManiaControl\Plugins\Plugin::load() + */ + public function load(ManiaControl $maniaControl) { + $this->maniaControl = $maniaControl; + + // Register for callbacks + $this->maniaControl->callbackManager->registerCallbackListener(CallbackManager::CB_ONINIT, $this, 'callback_OnInit'); + $this->maniaControl->callbackManager->registerCallbackListener(Callbacks::BEGINMAP, $this, 'callback_BeginMap'); + $this->maniaControl->callbackManager->registerScriptCallbackListener(self::CB_CHECKPOINT, $this, 'callback_Checkpoint'); + + return true; + } + + /** + * @see \ManiaControl\Plugins\Plugin::unload() + */ + public function unload() { + } + /** * Handle ManiaControl OnInit callback * - * @param array $callback + * @param array $callback */ public function callback_OnInit(array $callback) { - $this->currentMap = $this->maniaControl->mapManager->getCurrentMap(); + $this->currentMap = $this->maniaControl->mapManager->getCurrentMap(); $this->playerLapTimes = array(); } @@ -120,14 +111,14 @@ class EndurancePlugin implements CallbackListener, Plugin { * @param Map $map */ public function callback_BeginMap(Map $map) { - $this->currentMap = $map; + $this->currentMap = $map; $this->playerLapTimes = array(); } /** * Handle Endurance Checkpoint callback * - * @param array $callback + * @param array $callback */ public function callback_Checkpoint(array $callback) { $callbackData = json_decode($callback[1]); diff --git a/application/plugins/steeffeen/ObstaclePlugin.php b/application/plugins/steeffeen/ObstaclePlugin.php index d37d63ce..623ab9f5 100644 --- a/application/plugins/steeffeen/ObstaclePlugin.php +++ b/application/plugins/steeffeen/ObstaclePlugin.php @@ -2,11 +2,11 @@ namespace steeffeen; -use ManiaControl\ManiaControl; use ManiaControl\Admin\AuthenticationManager; use ManiaControl\Callbacks\CallbackListener; use ManiaControl\Callbacks\CallbackManager; use ManiaControl\Commands\CommandListener; +use ManiaControl\ManiaControl; use ManiaControl\Players\Player; use ManiaControl\Plugins\Plugin; use Maniaplanet\DedicatedServer\Xmlrpc\Exception; @@ -17,63 +17,32 @@ use Maniaplanet\DedicatedServer\Xmlrpc\Exception; * @author steeffeen */ class ObstaclePlugin implements CallbackListener, CommandListener, Plugin { - /** + /* * Constants */ - const ID = 24; - const VERSION = 0.2; - const CB_JUMPTO = 'Obstacle.JumpTo'; - const SCB_ONFINISH = 'OnFinish'; - const SCB_ONCHECKPOINT = 'OnCheckpoint'; + const ID = 24; + const VERSION = 0.2; + const NAME = 'Obstacle Plugin'; + const AUTHOR = 'steeffeen'; + const CB_JUMPTO = 'Obstacle.JumpTo'; + const SCB_ONFINISH = 'OnFinish'; + const SCB_ONCHECKPOINT = 'OnCheckpoint'; const SETTING_JUMPTOAUTHLEVEL = 'Authentication level for JumpTo commands'; - + /** * Private Properties */ - /** - * @var maniaControl $maniaControl - */ + /** @var ManiaControl $maniaControl */ private $maniaControl = null; /** - * Prepares the Plugin - * - * @param ManiaControl $maniaControl - * @return mixed + * @see \ManiaControl\Plugins\Plugin::prepare() */ public static function prepare(ManiaControl $maniaControl) { // do nothing } /** - * - * @see \ManiaControl\Plugins\Plugin::load() - */ - public function load(ManiaControl $maniaControl) { - $this->maniaControl = $maniaControl; - - // Init settings - $this->maniaControl->settingManager->initSetting($this, self::SETTING_JUMPTOAUTHLEVEL, AuthenticationManager::AUTH_LEVEL_MODERATOR); - - // Register for commands - $this->maniaControl->commandManager->registerCommandListener('jumpto', $this, 'command_JumpTo'); - - // Register for callbacks - $this->maniaControl->callbackManager->registerScriptCallbackListener(self::SCB_ONFINISH, $this, 'callback_OnFinish'); - $this->maniaControl->callbackManager->registerScriptCallbackListener(self::SCB_ONCHECKPOINT, $this, 'callback_OnCheckpoint'); - - return true; - } - - /** - * - * @see \ManiaControl\Plugins\Plugin::unload() - */ - public function unload() { - } - - /** - * * @see \ManiaControl\Plugins\Plugin::getId() */ public static function getId() { @@ -81,15 +50,13 @@ class ObstaclePlugin implements CallbackListener, CommandListener, Plugin { } /** - * * @see \ManiaControl\Plugins\Plugin::getName() */ public static function getName() { - return 'Obstacle Plugin'; + return self::NAME; } /** - * * @see \ManiaControl\Plugins\Plugin::getVersion() */ public static function getVersion() { @@ -97,25 +64,48 @@ class ObstaclePlugin implements CallbackListener, CommandListener, Plugin { } /** - * * @see \ManiaControl\Plugins\Plugin::getAuthor() */ public static function getAuthor() { - return 'steeffeen'; + return self::AUTHOR; } /** - * * @see \ManiaControl\Plugins\Plugin::getDescription() */ public static function getDescription() { return "Plugin offering CP Jumping and Local Records Support for the ShootManie Gamemode 'Obstacle'."; } + /** + * @see \ManiaControl\Plugins\Plugin::load() + */ + public function load(ManiaControl $maniaControl) { + $this->maniaControl = $maniaControl; + + // Init settings + $this->maniaControl->settingManager->initSetting($this, self::SETTING_JUMPTOAUTHLEVEL, AuthenticationManager::AUTH_LEVEL_MODERATOR); + + // Register for commands + $this->maniaControl->commandManager->registerCommandListener('jumpto', $this, 'command_JumpTo'); + + // Register for callbacks + $this->maniaControl->callbackManager->registerScriptCallbackListener(self::SCB_ONFINISH, $this, 'callback_OnFinish'); + $this->maniaControl->callbackManager->registerScriptCallbackListener(self::SCB_ONCHECKPOINT, $this, 'callback_OnCheckpoint'); + + return true; + } + + /** + * @see \ManiaControl\Plugins\Plugin::unload() + */ + public function unload() { + } + /** * Handle JumpTo command * - * @param array $chatCallback + * @param array $chatCallback * @param Player $player * @return bool */ @@ -127,11 +117,10 @@ class ObstaclePlugin implements CallbackListener, CommandListener, Plugin { } // Send jump callback $params = explode(' ', $chatCallback[1][2], 2); - $param = $player->login . ";" . $params[1] . ";"; + $param = $player->login . ";" . $params[1] . ";"; try { $this->maniaControl->client->triggerModeScriptEvent(self::CB_JUMPTO, $param); - } - catch (Exception $e) { + } catch (Exception $e) { if ($e->getMessage() == 'Not in script mode.') { trigger_error("Couldn't send jump callback for '{$player->login}'. " . $e->getMessage()); return; @@ -146,7 +135,7 @@ class ObstaclePlugin implements CallbackListener, CommandListener, Plugin { * @param array $callback */ public function callback_OnFinish(array $callback) { - $data = json_decode($callback[1]); + $data = json_decode($callback[1]); $player = $this->maniaControl->playerManager->getPlayer($data->Player->Login); if (!$player) { return; @@ -154,8 +143,7 @@ class ObstaclePlugin implements CallbackListener, CommandListener, Plugin { $time = $data->Run->Time; // Trigger trackmania player finish callback $finishCallback = array($player->pid, $player->login, $time); - $this->maniaControl->callbackManager->triggerCallback(CallbackManager::CB_TM_PLAYERFINISH, - array(CallbackManager::CB_TM_PLAYERFINISH, $finishCallback)); + $this->maniaControl->callbackManager->triggerCallback(CallbackManager::CB_TM_PLAYERFINISH, array(CallbackManager::CB_TM_PLAYERFINISH, $finishCallback)); } /** @@ -164,15 +152,14 @@ class ObstaclePlugin implements CallbackListener, CommandListener, Plugin { * @param array $callback */ public function callback_OnCheckpoint(array $callback) { - $data = json_decode($callback[1]); + $data = json_decode($callback[1]); $player = $this->maniaControl->playerManager->getPlayer($data->Player->Login); - $time = $data->Run->Time; + $time = $data->Run->Time; if (!$player || $time <= 0) { return; } // Trigger Trackmania player checkpoint callback $checkpointCallback = array($player->pid, $player->login, $time, 0, 0); - $this->maniaControl->callbackManager->triggerCallback(CallbackManager::CB_TM_PLAYERCHECKPOINT, - array(CallbackManager::CB_TM_PLAYERCHECKPOINT, $checkpointCallback)); + $this->maniaControl->callbackManager->triggerCallback(CallbackManager::CB_TM_PLAYERCHECKPOINT, array(CallbackManager::CB_TM_PLAYERCHECKPOINT, $checkpointCallback)); } }