From 66eb685688e119154c38afba08e99f69411d0717 Mon Sep 17 00:00:00 2001 From: Alexander Nell Date: Fri, 24 Apr 2020 18:52:18 +0200 Subject: [PATCH] Unified usages of Karma-Gauge in new ElementBuilder --- changelog.txt | 5 + core/ManiaExchange/ManiaExchangeList.php | 32 +- core/Manialinks/ElementBuilder.php | 376 +++++++++++++++++++++++ core/Manialinks/ManialinkManager.php | 13 + core/Manialinks/StyleManager.php | 4 +- core/Maps/MapList.php | 68 +--- core/Utils/ColorUtil.php | 11 +- plugins/MCTeam/KarmaPlugin.php | 105 ++----- 8 files changed, 448 insertions(+), 166 deletions(-) create mode 100644 core/Manialinks/ElementBuilder.php diff --git a/changelog.txt b/changelog.txt index 08bea907..361f8b83 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,8 @@ +###v0.253### +#Changes +- //restart got replaced by //reboot +- Unified Creations of a Karma-Gauge in new Manialinks\ElementBuilder + ###v0.252### #Additions - Ingame-Changelog diff --git a/core/ManiaExchange/ManiaExchangeList.php b/core/ManiaExchange/ManiaExchangeList.php index d6e0723e..4b6e9fa7 100644 --- a/core/ManiaExchange/ManiaExchangeList.php +++ b/core/ManiaExchange/ManiaExchangeList.php @@ -294,31 +294,13 @@ class ManiaExchangeList implements CallbackListener, ManialinkPageAnswerListener } //Map Karma - $karma = $map->ratingVoteAverage / 100; - $voteCount = $map->ratingVoteCount; - if (is_numeric($karma) && $voteCount > 0) { - $karmaGauge = new Gauge(); - $mapFrame->addChild($karmaGauge); - $karmaGauge->setZ(-0.05); - $karmaGauge->setX($posX + 87); - $karmaGauge->setY(0.2); - $karmaGauge->setSize(20, 10); - $karmaGauge->setDrawBackground(false); - $karma = floatval($karma); - $karmaGauge->setRatio($karma + 0.15 - $karma * 0.15); - $karmaColor = ColorUtil::floatToStatusColor($karma); - $karmaGauge->setColor($karmaColor . '9'); - - $karmaLabel = new Label(); - $mapFrame->addChild($karmaLabel); - $karmaLabel->setZ(1); - $karmaLabel->setX($posX + 87); - $karmaLabel->setSize(20 * 0.9, 5); - $karmaLabel->setY(-0.2); - $karmaLabel->setTextSize(0.9); - $karmaLabel->setTextColor('000'); - $karmaLabel->setText(' ' . round($karma * 100.) . '% (' . $voteCount . ')'); - } + $karmaGauge = $this->maniaControl->getManialinkManager()->getElementBuilder()->buildKarmaGauge( + $map, + 20, + 10 + ); + $mapFrame->addChild($karmaGauge); + $karmaGauge->setX($posX + 87); $posY -= 4; diff --git a/core/Manialinks/ElementBuilder.php b/core/Manialinks/ElementBuilder.php new file mode 100644 index 00000000..8c295577 --- /dev/null +++ b/core/Manialinks/ElementBuilder.php @@ -0,0 +1,376 @@ + + * @copyright 2014-2020 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + */ +class ElementBuilder { + /** + * Constants + */ + const COLUMN_ACTION_WIDTH = 4; + const COLUMN_ACTION_WIDTH_MIN = 20; + const COLUMN_ENTRY_WIDTH = 4; + const FOOTER_BUTTON_HEIGHT = 4; + const FOOTER_HEIGHT = 5; + const FOOTER_SPACING = 2; + const FOOTER_SPACING_BOTTOM = 10; + const HEADER_HEIGHT = 5; + const HEADER_SPACING = 2; + const HEADER_WIDTH_FACTOR = 0.9; + const ROW_LINE_HEIGHT = 4; + const ROW_SPACING_BOTTOM = 5; + const ROW_SPACING_SIDES = 2; + const ROW_SPACING_TOP = 5; + + const DEFAULT_KARMA_PLUGIN = 'MCTeam\KarmaPlugin'; + + /** + * Private Properties + */ + /** @var array $actions */ + private $actions = array(); + /** @var array $columns */ + private $columns = array(); + /** @var callable $entryCurrent */ + private $entryCurrent = null; + /** @var array $footerButtons */ + private $footerButtons = array(); + /** @var Frame $headerFrame */ + private $headerFrame = null; + /** @var array $rowData */ + private $rowData = array(); + + /** + * Construct a new ElementBuilder instance + * + * @param ManiaControl $maniaControl + */ + public function __construct(ManiaControl $maniaControl) { + $this->maniaControl = $maniaControl; + } + + /** + * Adds actions to list entry + * @param string $icon + * @param bool $confirmation + * @param callable $tooltipFunction + */ + public function addAction($icon, $confirmation, $tooltipFunction) { + array_push($this->actions, array($icon, $confirmation, $tooltipFunction)); + } + + /** + * Adds a column to the list + * @param string $name + * @param float $widthFactor + * @param callable $dataFunction + */ + public function addColumn($name, $widthFactor, $dataFunction) { + array_push($this->columns, array($name, $widthFactor, $dataFunction)); + } + + /** + * Adds a arrow to point to the current/personal entry + * @param callable $function + */ + public function addEntryCurrent($function) { + $this->entryCurrent = $function; + } + + /** + * Adds a footer button to the list + * @param string $description + * @param string $action + * @param callable $tooltipFunction + */ + public function addFooterButton($description, $action, $tooltipFunction = null) { + array_push($this->footerButtons, array($description, $action, $tooltipFunction)); + } + + /** + * Adds a header frame to the list + * @param Frame $headerFrame + */ + public function addHeaderFrame(Frame $headerFrame) { + $this->headerFrame = $headerFrame; + $this->headerFrame->setHeight(self::HEADER_HEIGHT); + $this->headerFrame->setWidth($this->getHeaderFrameWidth()); + } + + /** + * Adds rows to the list + * @param array $rows + */ + public function addRows(array $rows) { + $this->rowData = array_merge($this->rowData, $rows); + } + + /** + * Build Karma Gauge + * @param Map|MXMapInfo $map + * @param float $width + * @param float $height + * @param float $textSize + */ + public function buildKarmaGauge($map, $width, $height, $textSize = 0.9) { + $karmaPlugin = $this->maniaControl->getPluginManager()->getPlugin(self::DEFAULT_KARMA_PLUGIN); + if (!$karmaPlugin) { + return null; + } + + // default elements + $frame = new Frame(); + + $karmaGauge = new Gauge(); + $frame->addChild($karmaGauge); + $karmaGauge->setDrawBackground(false); + $karmaGauge->setSize($width, $height); + $karmaGauge->setZ(-1); + + $karmaLabel = new Label_Text(); + $frame->addChild($karmaLabel); + $karmaLabel->setSize($width/2, $height * $textSize); + $karmaLabel->setStyle($this->maniaControl->getManialinkManager()->getStyleManager()->getDefaultLabelStyle()); + $karmaLabel->setTextColor('fff'); + $karmaLabel->setTextSize($textSize); + $karmaLabel->setY(-$height/50); + $karmaLabel->setZ(1); + + // fetch MX Karma + $displayMxKarma = $this->maniaControl->getSettingManager()->getSettingValue($karmaPlugin, $karmaPlugin::SETTING_WIDGET_DISPLAY_MX); + $karma = null; + $votes = null; + $mxInfo = null; + if ($map instanceof Map && isset($map->mx)) { + $mxInfo = $map->mx; + } elseif ($map instanceof MXMapInfo) { + $mxInfo = $map; + } + + if ($displayMxKarma && $mxInfo) { + $karma = $mxInfo->ratingVoteAverage / 100; + $votes = array("count" => $mxInfo->ratingVoteCount); + } elseif ($map instanceof Map) { + $karma = $karmaPlugin->getMapKarma($map); + $votes = $karmaPlugin->getMapVotes($map); + } + + if (!is_numeric($karma) || $votes['count'] <= 0) { + // No Karma + $karmaGauge->setColor('00fb'); + $karmaGauge->setRatio(0.); + + $karmaLabel->setText('-'); + return $frame; + } + + // Karma available + $karma = floatval($karma); + $karmaText = ''; + if ($this->maniaControl->getSettingManager()->getSettingValue($karmaPlugin, $karmaPlugin::SETTING_NEWKARMA)) { + $karmaText = ' ' . round($karma * 100.) . '% (' . $votes['count'] . ')'; + } else { + $minus = 0; + $plus = 0; + foreach ($votes as $vote) { + if (!isset($vote->vote) || $vote->vote === 0.5) { + continue; + } + + if ($vote->vote < 0.5) { + $minus += $vote->count; + } else { + $plus += $vote->count; + } + } + $endKarma = $plus - $minus; + $karmaText = ' ' . $endKarma . ' (' . $votes['count'] . 'x / ' . round($karma * 100.) . '%)'; + } + + $karmaColor = ColorUtil::floatToStatusColor($karma); + $karmaGauge->setColor($karmaColor . '8'); + $karmaGauge->setRatio(0.15 + 0.85*$karma); + + $karmaLabel->setText($karmaText); + + return $frame; + } + + /** + * Returns the width of the optional header frame + * + * @return int + */ + public function getHeaderFrameWidth() { + return (int) (self::HEADER_WIDTH_FACTOR * $this->maniaControl->getManialinkManager()->getStyleManager()->getListWidgetsWidth()); + } + + public function renderList(Player $player) { + $nbActions = count($this->actions); + $nbFooterButtons = count($this->footerButtons); + + $hasActions = $nbActions > 0; + $hasEntryCurrent = $this->entryCurrent !== null; + $hasFooter = $nbFooterButtons > 0; + $hasHeader = $this->headerFrame !== null; + + $height = $this->maniaControl->getManialinkManager()->getStyleManager()->getListWidgetsHeight(); + $width = $this->maniaControl->getManialinkManager()->getStyleManager()->getListWidgetsWidth(); + + $heightRows = $height - self::ROW_SPACING_TOP - self::ROW_SPACING_BOTTOM; + $posYRows = $height/2 - self::ROW_SPACING_TOP - self::ROW_LINE_HEIGHT/2; + + // Create ManiaLink + $maniaLink = new ManiaLink(ManialinkManager::MAIN_MLID); + $script = $maniaLink->getScript(); + $paging = new Paging(); + $script->addFeature($paging); + + // Main frame + $frame = $this->maniaControl->getManialinkManager()->getStyleManager()->getDefaultListFrame($script, $paging); + $maniaLink->addChild($frame); + + // Header frame + if ($hasHeader) { + $frame->addChild($this->headerFrame); + $this->headerFrame->setY($height/2 - self::HEADER_SPACING - self::HEADER_HEIGHT/2); + + $headerSize = 2*self::HEADER_SPACING + self::HEADER_HEIGHT; + $heightRows -= $headerSize; + if ($posYRows > $height/2 - $headerSize) + $posYRows = $height/2 - $headerSize; + } + + // Footer + if ($hasFooter) { + $nbFooterSections = 3*$nbFooterButtons + 1; + $buttonSpacing = (1. / $nbFooterSections) * $width; + $buttonWidth = $buttonSpacing * 2; + for ($i = 0; $i < $nbFooterButtons; $i++) { + list($description, $action, $tooltipFunction) = $this->footerButtons[$i]; + + $label = new Label_Button(); + $frame->addChild($label); + $label->setHeight(self::FOOTER_HEIGHT); + $label->setText($description); + $label->setTextSize(1); + $label->setWidth($buttonWidth); + $label->setX(-$width/2 + ($i+1)*$buttonSpacing + $i*$buttonWidth + $buttonWidth/2); + $label->setY(-$height/2 + self::FOOTER_SPACING_BOTTOM); + $label->setZ(0.1); + + $quad = new Quad_BgsPlayerCard(); + $frame->addChild($quad); + $quad->setAction($action); + $quad->setHeight(self::FOOTER_HEIGHT); + $quad->setSubStyle($quad::SUBSTYLE_BgPlayerCardBig); + $quad->setWidth($buttonWidth); + $quad->setX(-$width/2 + ($i+1)*$buttonSpacing + $i*$buttonWidth + $buttonWidth/2); + $quad->setY(-$height/2 + self::FOOTER_SPACING_BOTTOM); + $quad->setZ(0.01); + } + + $footerSize = self::FOOTER_SPACING_BOTTOM + self::FOOTER_HEIGHT + self::FOOTER_SPACING; + $heightRows -= $footerSize; + } + + $actionsWidth = max(self::COLUMN_ACTION_WIDTH_MIN, $nbActions * self::COLUMN_ACTION_WIDTH); + $baseColumnPosX = -$width / 2 + self::ROW_SPACING_SIDES + self::COLUMN_ENTRY_WIDTH; + $baseRowPosY = $posYRows; + $baseColumnWidth = $width - 2*self::ROW_SPACING_SIDES - self::COLUMN_ENTRY_WIDTH - $actionsWidth; + $nbRows = (int) ($heightRows / self::ROW_LINE_HEIGHT) - 1; + + // Description Row + $descriptionFrame = new Frame(); + $frame->addChild($descriptionFrame); + $descriptionFrame->setX($baseColumnPosX); + $descriptionFrame->setY($baseRowPosY); + + $labelLine = new LabelLine($descriptionFrame); + $columnPosX = self::ROW_SPACING_SIDES; + if ($hasEntryCurrent) { + $columnPosX += self::COLUMN_ENTRY_WIDTH; + } + + foreach ($this->columns as $column) { + list($name, $widthFactor, $dataFunction) = $column; + $labelLine->addLabelEntryText($name, $columnPosX); + $columnPosX += $widthFactor * $baseColumnWidth; + } + $labelLine->addLabelEntryText('Actions', $columnPosX); + $labelLine->render(); + + // Data Rows + $pageFrame = null; + $columnPosX = self::ROW_SPACING_SIDES; + $baseRowPosY -= self::ROW_LINE_HEIGHT; + $rowPosY = $baseRowPosY; + $pageNumber = 1; + for ($i = 0; $i < count($this->rowData); $i++) { + $data = $this->rowData[$i]; + + if ($i % $nbRows === 0) { + $pageFrame = new Frame(); + $frame->addChild($pageFrame); + + $paging->addPageControl($pageFrame, $pageNumber); + $pageNumber++; + $rowPosY = $baseRowPosY; + } + + $playerFrame = new Frame(); + $pageFrame->addChild($playerFrame); + $playerFrame->setX($baseColumnPosX); + $playerFrame->setY($rowPosY); + + if ($i % 2 === 1) { + $lineQuad = new Quad_BgsPlayerCard(); + $playerFrame->addChild($lineQuad); + $lineQuad->setSize($width, self::ROW_LINE_HEIGHT); + $lineQuad->setSubStyle($lineQuad::SUBSTYLE_BgPlayerCardBig); + $lineQuad->setZ(-1); + } + + if ($hasEntryCurrent) { + + } + + $rowPosY -= self::ROW_LINE_HEIGHT; + } + + $this->maniaControl->getManialinkManager()->sendManialink($maniaLink, $player); + $this->reset(); + } + + /** + * Resets the internal builder data + */ + private function reset() { + $this->actions = array(); + $this->columns = array(); + $this->entryCurrent = null; + $this->footerButtons = array(); + $this->headerFrame = null; + $this->rowData = array(); + } +} diff --git a/core/Manialinks/ManialinkManager.php b/core/Manialinks/ManialinkManager.php index 03b1a5b4..85cafef0 100644 --- a/core/Manialinks/ManialinkManager.php +++ b/core/Manialinks/ManialinkManager.php @@ -55,6 +55,9 @@ class ManialinkManager implements ManialinkPageAnswerListener, CallbackListener, /** @var SidebarMenuManager $sidebarMenuManager */ private $sidebarMenuManager = null; + /** @var ElementBuilder $elementBuilder */ + private $elementBuilder = null; + // TODO: use listening class private $pageAnswerListeners = array(); private $pageAnswerRegexListener = array(); @@ -72,6 +75,7 @@ class ManialinkManager implements ManialinkPageAnswerListener, CallbackListener, $this->customUIManager = new CustomUIManager($maniaControl); $this->iconManager = new IconManager($maniaControl); $this->sidebarMenuManager = new SidebarMenuManager($maniaControl); + $this->elementBuilder = new ElementBuilder($maniaControl); // Callbacks $this->registerManialinkPageAnswerListener(self::ACTION_CLOSEWIDGET, $this, 'closeWidgetCallback'); @@ -133,6 +137,15 @@ class ManialinkManager implements ManialinkPageAnswerListener, CallbackListener, return $this->iconManager; } + /** + * Return the element builder + * + * @return ElementBuilder + */ + public function getElementBuilder() { + return $this->elementBuilder; + } + /** * Register a new manialink page answer reg ex listener * diff --git a/core/Manialinks/StyleManager.php b/core/Manialinks/StyleManager.php index 62243cb5..02b4c9b8 100644 --- a/core/Manialinks/StyleManager.php +++ b/core/Manialinks/StyleManager.php @@ -142,7 +142,7 @@ class StyleManager implements UsageInformationAble { $entry->setName('SearchString'); if ($actionReset) { - $quad = new Quad_Icons64x64_1();; + $quad = new Quad_Icons64x64_1(); $frame->addChild($quad); $quad->setSubStyle($quad::SUBSTYLE_QuitRace); $quad->setColorize('aaa'); @@ -150,7 +150,7 @@ class StyleManager implements UsageInformationAble { $quad->setPosition(-$width / 2 + 15 + $width * 0.25 - 2, 0); $quad->setZ(1); $quad->setAction($actionReset); -} + } //Search for Map-Name $label = new Label_Button(); diff --git a/core/Maps/MapList.php b/core/Maps/MapList.php index ce1669a2..14859680 100644 --- a/core/Maps/MapList.php +++ b/core/Maps/MapList.php @@ -57,7 +57,6 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { const ACTION_RESET = 'MapList.ResetMapList'; const MAX_MAPS_PER_PAGE = 13; const MAX_PAGES_PER_CHUNK = 2; - const DEFAULT_KARMA_PLUGIN = 'MCTeam\KarmaPlugin'; const DEFAULT_CUSTOM_VOTE_PLUGIN = 'MCTeam\CustomVotesPlugin'; const CACHE_CURRENT_PAGE = 'CurrentPage'; const WIDGET_NAME = 'MapList'; @@ -249,8 +248,6 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { $frame->addChild($descriptionLabel); $queuedMaps = $this->maniaControl->getMapManager()->getMapQueue()->getQueuedMapsRanking(); - /** @var KarmaPlugin $karmaPlugin */ - $karmaPlugin = $this->maniaControl->getPluginManager()->getPlugin(self::DEFAULT_KARMA_PLUGIN); $pageNumber = 1 + $chunkIndex * self::MAX_PAGES_PER_CHUNK; $paging->setStartPageNumber($pageIndex + 1); @@ -460,63 +457,14 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { } // Display Karma bar - if ($karmaPlugin) { - $displayMxKarma = $this->maniaControl->getSettingManager()->getSettingValue($karmaPlugin, $karmaPlugin::SETTING_WIDGET_DISPLAY_MX); - - //Display Mx Karma - if ($displayMxKarma && $map->mx) { - $karma = $map->mx->ratingVoteAverage / 100; - $votes = array("count" => $map->mx->ratingVoteCount); - - //Display Local Karma - } else { - $karma = $karmaPlugin->getMapKarma($map); - $votes = $karmaPlugin->getMapVotes($map); - } - - if (is_numeric($karma) && $votes['count'] > 0) { - if ($this->maniaControl->getSettingManager()->getSettingValue($karmaPlugin, $karmaPlugin::SETTING_NEWKARMA)) { - $karmaText = ' ' . round($karma * 100.) . '% (' . $votes['count'] . ')'; - } else { - $min = 0; - $plus = 0; - foreach ($votes as $vote) { - if (isset($vote->vote)) { - if ($vote->vote !== 0.5) { - if ($vote->vote < 0.5) { - $min = $min + $vote->count; - } else { - $plus = $plus + $vote->count; - } - } - } - } - $endKarma = $plus - $min; - $karmaText = ' ' . $endKarma . ' (' . $votes['count'] . 'x / ' . round($karma * 100.) . '%)'; - } - - $karmaGauge = new Gauge(); - $mapFrame->addChild($karmaGauge); - $karmaGauge->setZ(0.2); - $karmaGauge->setX($posX + 120); - $karmaGauge->setY(0.2); - $karmaGauge->setSize(20, 10); - $karmaGauge->setDrawBackground(false); - $karma = floatval($karma); - $karmaGauge->setRatio($karma + 0.15 - $karma * 0.15); - $karmaColor = ColorUtil::floatToStatusColor($karma); - $karmaGauge->setColor($karmaColor . '9'); - - $karmaLabel = new Label(); - $mapFrame->addChild($karmaLabel); - $karmaLabel->setZ(2); - $karmaLabel->setX($posX + 120); - $karmaLabel->setSize(20 * 0.9, 5); - $karmaLabel->setY(-0.2); - $karmaLabel->setTextSize(0.9); - $karmaLabel->setTextColor('000'); - $karmaLabel->setText($karmaText); - } + $karmaGauge = $this->maniaControl->getManialinkManager()->getElementBuilder()->buildKarmaGauge( + $map, + 20, + 10 + ); + if ($karmaGauge) { + $mapFrame->addChild($karmaGauge); + $karmaGauge->setX($posX + 120); } $posY -= 4; diff --git a/core/Utils/ColorUtil.php b/core/Utils/ColorUtil.php index 25d0bb79..ed7e7da7 100644 --- a/core/Utils/ColorUtil.php +++ b/core/Utils/ColorUtil.php @@ -21,7 +21,7 @@ abstract class ColorUtil implements UsageInformationAble { * @param float $value * @return string */ - public static function floatToStatusColor($value) { + public static function floatToStatusColor($value, $addBlue = true) { $value = floatval($value); $red = 1.; $green = 1.; @@ -33,7 +33,12 @@ abstract class ColorUtil implements UsageInformationAble { } $red = ColorUtil::floatToCode($red); $green = ColorUtil::floatToCode($green); - return $red . $green . '0'; + + if ($addBlue) { + return $red . $green . '0'; + } else { + return $red . $green; + } } /** @@ -55,7 +60,7 @@ abstract class ColorUtil implements UsageInformationAble { if ($value < 10) { return (string) $value; } - $codes = array(10 => 'a', 11 => 'b', 12 => 'c', 13 => 'd', 14 => 'e', 15 => 'f'); + static $codes = array(10 => 'a', 11 => 'b', 12 => 'c', 13 => 'd', 14 => 'e', 15 => 'f'); return $codes[$value]; } } diff --git a/plugins/MCTeam/KarmaPlugin.php b/plugins/MCTeam/KarmaPlugin.php index f1d34978..b1be99af 100644 --- a/plugins/MCTeam/KarmaPlugin.php +++ b/plugins/MCTeam/KarmaPlugin.php @@ -3,7 +3,6 @@ namespace MCTeam; use FML\Controls\Frame; -use FML\Controls\Gauge; use FML\Controls\Label; use FML\Controls\Quad; use FML\ManiaLink; @@ -71,8 +70,6 @@ class KarmaPlugin implements CallbackListener, TimerListener, Plugin { /** @var ManiaControl $maniaControl */ private $maniaControl = null; private $updateManialink = false; - /** @var ManiaLink $manialink */ - private $manialink = null; // TODO: use some sort of model class instead of various array keys that you can't remember private $mxKarma = array(); @@ -150,9 +147,9 @@ class KarmaPlugin implements CallbackListener, TimerListener, Plugin { $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_WIDGET_ENABLE, true); $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_WIDGET_TITLE, 'Map-Karma'); $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_WIDGET_POSX, 160 - 27.5); - $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_WIDGET_POSY, 90 - 10 - 6); + $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_WIDGET_POSY, 90 - 9 - 5); $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_WIDGET_WIDTH, 25.); - $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_WIDGET_HEIGHT, 12.); + $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_WIDGET_HEIGHT, 10.); $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_NEWKARMA, true); // Callbacks @@ -270,9 +267,9 @@ class KarmaPlugin implements CallbackListener, TimerListener, Plugin { } else { Logger::logError("Error while authenticating on Mania-Exchange Karma"); - if($data->data->message == "invalid server"){ + if ($data->data->message == "invalid server") { Logger::log("You need to get a Karma Key from MX with registering your server"); - }else{ + } else { // TODO remove temp trigger $this->maniaControl->getErrorHandler()->triggerDebugNotice('auth error ' . json_encode($data->data->message)); } @@ -775,6 +772,7 @@ class KarmaPlugin implements CallbackListener, TimerListener, Plugin { return; } + $this->updateManialink = true; $serverLogin = $this->maniaControl->getServer()->login; $karmaSettingName = self::buildKarmaSettingName($serverLogin); @@ -785,10 +783,8 @@ class KarmaPlugin implements CallbackListener, TimerListener, Plugin { } case self::SETTING_WIDGET_ENABLE: { if ($setting->value) { - $this->updateManialink = true; $this->handle1Second(); } else { - $this->updateManialink = false; $this->maniaControl->getManialinkManager()->hideManialink(self::MLID_KARMA); } break; @@ -806,58 +802,21 @@ class KarmaPlugin implements CallbackListener, TimerListener, Plugin { $displayMxKarma = $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_WIDGET_DISPLAY_MX); - // Get players - $players = $this->updateManialink; - if ($players === true) { - $players = $this->maniaControl->getPlayerManager()->getPlayers(); - } - $this->updateManialink = false; - // Get map karma $map = $this->maniaControl->getMapManager()->getCurrentMap(); // Display the mx Karma if the setting is chosen and the MX session is available if ($displayMxKarma && isset($this->mxKarma['session']) && isset($this->mxKarma['voteCount'])) { - $karma = $this->mxKarma['modeVoteAverage'] / 100; - $voteCount = $this->mxKarma['modeVoteCount']; - } else { - $karma = $this->getMapKarma($map); - $votes = $this->getMapVotes($map); - $voteCount = $votes['count']; + $map->mx->ratingVoteAverage = $this->mxKarma['modeVoteAverage']; + $map->mx->ratingVoteCount = $this->mxKarma['modeVoteCount']; } if ($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_WIDGET_ENABLE)) { // Build karma manialink - $this->buildManialink(); - - // Update karma gauge & label - /** - * @var Gauge $karmaGauge - */ - $karmaGauge = $this->manialink->karmaGauge; - /** - * @var Label $karmaLabel - */ - $karmaLabel = $this->manialink->karmaLabel; - if (is_numeric($karma) && $voteCount > 0) { - $karma = floatval($karma); - $karmaGauge->setRatio($karma + 0.15 - $karma * 0.15); - $karmaColor = ColorUtil::floatToStatusColor($karma); - $karmaGauge->setColor($karmaColor . '7'); - $karmaLabel->setText(' ' . round($karma * 100.) . '% (' . $voteCount . ')'); - } else { - $karmaGauge->setRatio(0.); - $karmaGauge->setColor('00fb'); - $karmaLabel->setText('-'); - } - - - $this->maniaControl->getManialinkManager()->sendManialink($this->manialink, $players); - // TODO: show the player his own vote in some way - // $vote = $this->getPlayerVote($player, $map); - // $votesFrame = $this->manialink->votesFrame; - // $votesFrame->removeChildren(); + $this->buildManialink($map, $this->updateManialink); } + + $this->updateManialink = false; } /** @@ -920,10 +879,11 @@ class KarmaPlugin implements CallbackListener, TimerListener, Plugin { /** * Build Karma Voting Manialink if necessary * + * @param Map $map * @param bool $forceBuild */ - private function buildManialink($forceBuild = false) { - if (is_object($this->manialink) && !$forceBuild) { + private function buildManialink(Map $map = null, $forceBuild = false) { + if (!$forceBuild) { return; } @@ -944,39 +904,32 @@ class KarmaPlugin implements CallbackListener, TimerListener, Plugin { $backgroundQuad = new Quad(); $frame->addChild($backgroundQuad); - $backgroundQuad->setY($height * 0.15); $backgroundQuad->setSize($width, $height); $backgroundQuad->setStyles($quadStyle, $quadSubstyle); $titleLabel = new Label(); $frame->addChild($titleLabel); - $titleLabel->setY($height * 0.36); - $titleLabel->setWidth($width * 0.85); + $titleLabel->setScale(0.9); $titleLabel->setStyle($labelStyle); - $titleLabel->setTranslate(true); - $titleLabel->setTextSize(1); - $titleLabel->setScale(0.90); $titleLabel->setText($title); + $titleLabel->setTextSize(1); + $titleLabel->setTranslate(true); + $titleLabel->setWidth(0.85*$width); + $titleLabel->setY(0.2*$height); - $karmaGauge = new Gauge(); + if ($map === null) { + $map = $this->maniaControl->getMapManager()->getCurrentMap(); + } + + $karmaGauge = $this->maniaControl->getManialinkManager()->getElementBuilder()->buildKarmaGauge( + $map, + 0.95*$width, + 0.95*$height + ); + $karmaGauge->setY(-0.15*$height); $frame->addChild($karmaGauge); - $karmaGauge->setSize($width * 0.95, $height * 0.92); - $karmaGauge->setDrawBackground(false); - $manialink->karmaGauge = $karmaGauge; - $karmaLabel = new Label(); - $frame->addChild($karmaLabel); - $karmaLabel->setPosition(0, -0.4, 1); - $karmaLabel->setSize($width * 0.9, $height * 0.9); - $karmaLabel->setStyle($labelStyle); - $karmaLabel->setTextSize(1); - $manialink->karmaLabel = $karmaLabel; - - $votesFrame = new Frame(); - $frame->addChild($votesFrame); - $manialink->votesFrame = $votesFrame; - - $this->manialink = $manialink; + $this->maniaControl->getManialinkManager()->sendManialink($manialink); } /**