diff --git a/plugins/MCTeam/Common/RecordWidget.php b/plugins/MCTeam/Common/RecordWidget.php new file mode 100644 index 00000000..f3af5bd1 --- /dev/null +++ b/plugins/MCTeam/Common/RecordWidget.php @@ -0,0 +1,167 @@ + + * @copyright 2014-2017 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + */ +class RecordWidget { + + private $maniaControl; + private $lineHeight = 4.; + private $width = 40.; + + /** + * RecordWidget constructor. + * + * @param \ManiaControl\ManiaControl $maniaControl + */ + function __construct(ManiaControl $maniaControl) { + $this->maniaControl = $maniaControl; + } + + /** + * Returns a Frame with one line of the Record + * + * @param $record + * @param \ManiaControl\Players\Player|null $player + * @return \FML\Controls\Frame + */ + public function generateRecordLineFrame($record, Player $player = null) { + $width = $this->width; + $lineHeight = $this->lineHeight; + + $recordFrame = new Frame(); + + $largeNumberDiff = 0; + if ($record->rank > 999) { + $largeNumberDiff = 0.03; + } + + $rankLabel = new Label(); + $recordFrame->addChild($rankLabel); + $rankLabel->setHorizontalAlign($rankLabel::LEFT); + $rankLabel->setX($width * -0.49); + $rankLabel->setSize($width * (0.09 + $largeNumberDiff), $lineHeight); + $rankLabel->setTextSize(1); + $rankLabel->setTextPrefix('$o'); + $rankLabel->setText($record->rank); + $rankLabel->setTextEmboss(true); + + $nameLabel = new Label(); + $recordFrame->addChild($nameLabel); + $nameLabel->setHorizontalAlign($nameLabel::LEFT); + $nameLabel->setX($width * (-0.39 + $largeNumberDiff)); + $nameLabel->setSize($width * (0.6 - $largeNumberDiff), $lineHeight); + $nameLabel->setTextSize(1); + $nameLabel->setText($record->nickname); + $nameLabel->setTextEmboss(true); + + $timeLabel = new Label(); + $recordFrame->addChild($timeLabel); + $timeLabel->setHorizontalAlign($timeLabel::RIGHT); + $timeLabel->setX($width * 0.49); + $timeLabel->setSize($width * 0.27, $lineHeight); + $timeLabel->setTextSize(1); + if (isset($record->time)) { + $timeLabel->setText(Formatter::formatTime($record->time)); + } else { + $timeLabel->setText(Formatter::formatTime($record->best)); + } + $timeLabel->setTextEmboss(true); + + if ($player && $player->index == $record->playerIndex) { + $quad = new Quad(); + $recordFrame->addChild($quad); + $quad->setStyles(Quad_Bgs1InRace::STYLE, Quad_Bgs1InRace::SUBSTYLE_BgCardList); + $quad->setSize($width, $lineHeight); + } + + return $recordFrame; + } + + /** + * Returns a Frame with Records to a given limit + * + * @param $records + * @param $limit + * @param \ManiaControl\Players\Player|null $player + * @return \FML\Controls\Frame + */ + public function generateRecordsFrame($records, $limit, Player $player = null) { + $lineHeight = $this->lineHeight; + + $frame = new Frame(); + + foreach ($records as $index => $record) { + if ($index >= $limit) { + break; + } + + $y = -8. - $index * $lineHeight; + + $recordFrame = $this->generateRecordLineFrame($record, $player); + $frame->addChild($recordFrame); + $recordFrame->setPosition(0, $y); + + } + + return $frame; + } + + /** + * Returns the default separator Quad for the RecordWidget + * + * @param $width + * @return \FML\Controls\Quad + */ + public function getLineSeparatorQuad($width) { + $quad = new Quad(); + $quad->setStyles(Quad_Bgs1InRace::STYLE, Quad_Bgs1InRace::SUBSTYLE_BgCardList); + $quad->setSize($width, 0.4); + + return $quad; + } + + /** + * @return float + */ + public function getLineHeight() { + return $this->lineHeight; + } + + /** + * @param float $lineHeight + */ + public function setLineHeight($lineHeight) { + $this->lineHeight = $lineHeight; + } + + /** + * @return float + */ + public function getWidth() { + return $this->width; + } + + /** + * @param float $width + */ + public function setWidth($width) { + $this->width = $width; + } + + +} \ No newline at end of file diff --git a/plugins/MCTeam/Dedimania/DedimaniaPlugin.php b/plugins/MCTeam/Dedimania/DedimaniaPlugin.php index d6ac431e..b92e3d13 100644 --- a/plugins/MCTeam/Dedimania/DedimaniaPlugin.php +++ b/plugins/MCTeam/Dedimania/DedimaniaPlugin.php @@ -19,7 +19,10 @@ use ManiaControl\Manialinks\ManialinkManager; use ManiaControl\Players\Player; use ManiaControl\Players\PlayerManager; use ManiaControl\Plugins\Plugin; +use ManiaControl\Settings\Setting; +use ManiaControl\Settings\SettingManager; use ManiaControl\Utils\Formatter; +use MCTeam\Common\RecordWidget; /** * ManiaControl Dedimania Plugin @@ -56,6 +59,9 @@ class DedimaniaPlugin implements CallbackListener, CommandListener, TimerListene /** @var ManiaControl $maniaControl */ private $maniaControl = null; + /** @var \MCTeam\Common\RecordWidget $recordWidget */ + private $recordWidget = null; + private $checkpoints = array(); /** @var \MCTeam\Dedimania\DedimaniaWebHandler $webHandler */ @@ -100,6 +106,8 @@ class DedimaniaPlugin implements CallbackListener, CommandListener, TimerListene $this->maniaControl->getCallbackManager()->registerCallbackListener(Callbacks::TM_ONWAYPOINT, $this, 'handleCheckpointCallback'); $this->maniaControl->getCallbackManager()->registerCallbackListener(Callbacks::TM_ONFINISHLINE, $this, 'handleFinishCallback'); $this->maniaControl->getCallbackManager()->registerCallbackListener(Callbacks::TM_ONLAPFINISH, $this, 'handleFinishCallback'); + $this->maniaControl->getCallbackManager()->registerCallbackListener(SettingManager::CB_SETTING_CHANGED, $this, 'handleSettingChanged'); + $this->maniaControl->getTimerManager()->registerTimerListening($this, 'updateEverySecond', 1000); $this->maniaControl->getTimerManager()->registerTimerListening($this, 'handleEveryHalfMinute', 1000 * 30); @@ -129,6 +137,8 @@ class DedimaniaPlugin implements CallbackListener, CommandListener, TimerListene $this->webHandler = new DedimaniaWebHandler($this->maniaControl); $this->webHandler->setDedimaniaData($dedimaniaData); $this->webHandler->openDedimaniaSession(true); + + $this->recordWidget = new RecordWidget($this->maniaControl); } @@ -174,6 +184,7 @@ class DedimaniaPlugin implements CallbackListener, CommandListener, TimerListene $height = 7. + $lines * $lineHeight; $backgroundQuad->setSize($width * 1.05, $height); $backgroundQuad->setStyles($quadStyle, $quadSubstyle); + $backgroundQuad->setAction(self::ACTION_SHOW_DEDIRECORDSLIST); $titleLabel = new Label(); $frame->addChild($titleLabel); @@ -184,54 +195,8 @@ class DedimaniaPlugin implements CallbackListener, CommandListener, TimerListene $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->addChild($recordFrame); - $recordFrame->setPosition(0, $y); - - /*$backgroundQuad = new Quad(); - $recordFrame->addChild($backgroundQuad); - $backgroundQuad->setSize($width * 1.04, $lineHeight * 1.4); - $backgroundQuad->setStyles($quadStyle, $quadSubstyle);*/ - - //Rank - $rankLabel = new Label(); - $recordFrame->addChild($rankLabel); - $rankLabel->setHorizontalAlign($rankLabel::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->addChild($nameLabel); - $nameLabel->setHorizontalAlign($nameLabel::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->addChild($timeLabel); - $timeLabel->setHorizontalAlign($timeLabel::RIGHT); - $timeLabel->setX($width * 0.47); - $timeLabel->setSize($width * 0.25, $lineHeight); - $timeLabel->setTextSize(1); - $timeLabel->setText(Formatter::formatTime($record->best)); - $timeLabel->setTextEmboss(true); - } + $recordsFrame = $this->recordWidget->generateRecordsFrame($records,$lines); + $frame->addChild($recordsFrame); $this->maniaControl->getManialinkManager()->sendManialink($manialink); } @@ -626,13 +591,13 @@ class DedimaniaPlugin implements CallbackListener, CommandListener, TimerListene $recordFrame->addChild($lineQuad); $lineQuad->setSize($width, 4); $lineQuad->setSubStyle($lineQuad::SUBSTYLE_BgPlayerCardBig); - $lineQuad->setZ(0.001); + $lineQuad->setZ(-0.001); } - if (strlen($listRecord->nickName) < 2) { - $listRecord->nickName = $listRecord->login; + if (strlen($listRecord->nickname) < 2) { + $listRecord->nickname = $listRecord->login; } - $array = array($listRecord->rank => $posX + 5, '$fff' . $listRecord->nickName => $posX + 18, $listRecord->login => $posX + 70, Formatter::formatTime($listRecord->best) => $posX + 101); + $array = array($listRecord->rank => $posX + 5, '$fff' . $listRecord->nickname => $posX + 18, $listRecord->login => $posX + 70, Formatter::formatTime($listRecord->best) => $posX + 101); $this->maniaControl->getManialinkManager()->labelLine($recordFrame, $array); $recordFrame->setY($posY); @@ -654,6 +619,26 @@ class DedimaniaPlugin implements CallbackListener, CommandListener, TimerListene return $this->webHandler->getDedimaniaData()->records; } + /** + * Update the RecordWidget variables + */ + private function updateRecordWidget() { + $width = $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_WIDGET_WIDTH); + $lineHeight = $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_WIDGET_LINE_HEIGHT); + + $this->recordWidget->setWidth($width); + $this->recordWidget->setLineHeight($lineHeight); + + $this->webHandler->maniaLinkUpdateNeeded(); + } + + public function handleSettingChanged(Setting $setting){ + if (!$setting->belongsToClass($this)) { + return; + } + $this->updateRecordWidget(); + } + /** * @see \ManiaControl\Plugins\Plugin::unload() */ diff --git a/plugins/MCTeam/Dedimania/RecordData.php b/plugins/MCTeam/Dedimania/RecordData.php index a844eea4..ae7e32ec 100644 --- a/plugins/MCTeam/Dedimania/RecordData.php +++ b/plugins/MCTeam/Dedimania/RecordData.php @@ -17,7 +17,7 @@ class RecordData { */ public $nullRecord = false; public $login = ''; - public $nickName = ''; + public $nickname = ''; public $best = -1; public $rank = -1; public $maxRank = -1; @@ -38,7 +38,7 @@ class RecordData { } $this->login = $record['Login']; - $this->nickName = Formatter::stripDirtyCodes($record['NickName']); + $this->nickname = Formatter::stripDirtyCodes($record['NickName']); $this->best = $record['Best']; $this->rank = $record['Rank']; $this->maxRank = $record['MaxRank']; @@ -54,10 +54,10 @@ class RecordData { * @param int $checkpoints * @param bool $newRecord */ - public function constructNewRecord($login, $nickName, $best, $checkpoints, $newRecord = false) { + public function constructNewRecord($login, $nickname, $best, $checkpoints, $newRecord = false) { $this->nullRecord = false; $this->login = $login; - $this->nickName = $nickName; + $this->nickname = $nickname; $this->best = $best; $this->checkpoints = $checkpoints; $this->newRecord = $newRecord; diff --git a/plugins/MCTeam/LocalRecordsPlugin.php b/plugins/MCTeam/LocalRecordsPlugin.php index 030b70df..0763e255 100644 --- a/plugins/MCTeam/LocalRecordsPlugin.php +++ b/plugins/MCTeam/LocalRecordsPlugin.php @@ -29,6 +29,7 @@ use ManiaControl\Plugins\Plugin; use ManiaControl\Settings\Setting; use ManiaControl\Settings\SettingManager; use ManiaControl\Utils\Formatter; +use MCTeam\Common\RecordWidget; /** * ManiaControl Local Records Plugin @@ -66,7 +67,9 @@ class LocalRecordsPlugin implements ManialinkPageAnswerListener, CallbackListene * Private properties */ /** @var ManiaControl $maniaControl */ - private $maniaControl = null; + private $maniaControl = null; + /** @var \MCTeam\Common\RecordWidget $recordWidget */ + private $recordWidget = null; private $updateManialink = false; private $checkpoints = array(); @@ -120,6 +123,8 @@ class LocalRecordsPlugin implements ManialinkPageAnswerListener, CallbackListene $this->maniaControl = $maniaControl; $this->initTables(); + $this->recordWidget = new RecordWidget($this->maniaControl); + // Settings $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_WIDGET_TITLE, 'Local Records'); $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_WIDGET_POSX, -139.); @@ -266,12 +271,16 @@ class LocalRecordsPlugin implements ManialinkPageAnswerListener, CallbackListene $titleLabel->setText($title); $titleLabel->setTranslate(true); - $topRecordsCount = $lines - $recordsBeforeAfter * 2 - 1; - $preGeneratedRecordsFrame = $this->generateRecordsFrame($records, $topRecordsCount); + $topRecordsCount = $lines - $recordsBeforeAfter * 2 - 1; + $preGeneratedTopRecordsFrame = $this->recordWidget->generateRecordsFrame($records, $topRecordsCount); + $preGeneratedRecordsFrameWithRecord = $this->recordWidget->generateRecordsFrame($records, $lines - 1); - $players = $this->maniaControl->getPlayerManager()->getPlayers(); + $players = $this->maniaControl->getPlayerManager()->getPlayers(); + $playersWithoutRecord = array(); foreach ($players as $player) { + $sendManiaLink = true; + $maniaLink = new ManiaLink(self::MLID_RECORDS); $maniaLink->addChild($frame); @@ -280,116 +289,68 @@ class LocalRecordsPlugin implements ManialinkPageAnswerListener, CallbackListene $listFrame->setPosition($posX, $posY); if (isset($playerRecords[$player->index]) && $playerRecords[$player->index] >= $topRecordsCount) { - $listFrame->addChild($preGeneratedRecordsFrame); + $listFrame->addChild($preGeneratedTopRecordsFrame); $y = -8 - $topRecordsCount * $lineHeight; $playerIndex = $playerRecords[$player->index]; //Line separator - $quad = new Quad(); + $quad = $this->recordWidget->getLineSeparatorQuad($width); $listFrame->addChild($quad); - $quad->setStyles(Quad_Bgs1InRace::STYLE, Quad_Bgs1InRace::SUBSTYLE_BgCardList); - $quad->setSize($width, 0.4); $quad->setY($y + $lineHeight / 2); //Generate the Records around a player and display below topRecords for ($i = $playerIndex - $recordsBeforeAfter; $i <= $playerIndex + $recordsBeforeAfter; $i++) { - if(array_key_exists($i, $records)){ //If there are no records behind you - $recordFrame = $this->generateRecordLineFrame($records[$i], $player); + if (array_key_exists($i, $records)) { //If there are no records behind you + $recordFrame = $this->recordWidget->generateRecordLineFrame($records[$i], $player); $recordFrame->setY($y); $listFrame->addChild($recordFrame); $y -= $lineHeight; } } + } else if (isset($playerRecords[$player->index]) && $playerRecords[$player->index] < $topRecordsCount) { + $playersWithoutRecord[] = $player; + $sendManiaLink = false; } else { - $listFrame->addChild($this->generateRecordsFrame($records, $lines, $player)); //TODO Collect all players with this case and send a common manialink to save resources + if ($record = $this->getLocalRecord($map, $player)) { + $record->nickname = $player->nickname; + $recordFrame = $preGeneratedRecordsFrameWithRecord; + $listFrame->addChild($recordFrame); + + $y = -8 - ($lines - 1) * $lineHeight; + + //Line separator + $quad = $this->recordWidget->getLineSeparatorQuad($width); + $listFrame->addChild($quad); + $quad->setY($y + $lineHeight / 2); + + $frame = $this->recordWidget->generateRecordLineFrame($record, $player); + $listFrame->addChild($frame); + $frame->setY($y); + + } else { + $playersWithoutRecord[] = $player; + $sendManiaLink = false; + } } - $this->maniaControl->getManialinkManager()->sendManialink($maniaLink, $player); - } - } - - /** - * Returns a Frame with one line of the Record - * - * @param $record - * @param \ManiaControl\Players\Player|null $player - * @return \FML\Controls\Frame - */ - private function generateRecordLineFrame($record, Player $player = null) { - $width = $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_WIDGET_WIDTH); - $lineHeight = $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_WIDGET_LINEHEIGHT); - - $recordFrame = new Frame(); - - $rankLabel = new Label(); - $recordFrame->addChild($rankLabel); - $rankLabel->setHorizontalAlign($rankLabel::LEFT); - $rankLabel->setX($width * -0.49); - $rankLabel->setSize($width * 0.09, $lineHeight); - $rankLabel->setTextSize(1); - $rankLabel->setTextPrefix('$o'); - $rankLabel->setText($record->rank); - $rankLabel->setTextEmboss(true); - - $nameLabel = new Label(); - $recordFrame->addChild($nameLabel); - $nameLabel->setHorizontalAlign($nameLabel::LEFT); - $nameLabel->setX($width * -0.39); - $nameLabel->setSize($width * 0.6, $lineHeight); - $nameLabel->setTextSize(1); - $nameLabel->setText($record->nickname); - $nameLabel->setTextEmboss(true); - - $timeLabel = new Label(); - $recordFrame->addChild($timeLabel); - $timeLabel->setHorizontalAlign($timeLabel::RIGHT); - $timeLabel->setX($width * 0.49); - $timeLabel->setSize($width * 0.27, $lineHeight); - $timeLabel->setTextSize(1); - $timeLabel->setText(Formatter::formatTime($record->time)); - $timeLabel->setTextEmboss(true); - - if ($player && $player->index == $record->playerIndex) { - $quad = new Quad(); - $recordFrame->addChild($quad); - $quad->setStyles(Quad_Bgs1InRace::STYLE, Quad_Bgs1InRace::SUBSTYLE_BgCardList); - $quad->setSize($width, $lineHeight); - } - - return $recordFrame; - } - - /** - * Returns a Frame with Records to a given limit - * - * @param $records - * @param $limit - * @param \ManiaControl\Players\Player|null $player - * @return \FML\Controls\Frame - */ - private function generateRecordsFrame($records, $limit, Player $player = null) { - $lineHeight = $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_WIDGET_LINEHEIGHT); - - $frame = new Frame(); - - foreach ($records as $index => $record) { - if ($index >= $limit) { - break; + if ($sendManiaLink) { + $this->maniaControl->getManialinkManager()->sendManialink($maniaLink, $player); } - - $y = -8. - $index * $lineHeight; - - $recordFrame = $this->generateRecordLineFrame($record, $player); - $frame->addChild($recordFrame); - $recordFrame->setPosition(0, $y); - } - return $frame; - } + if ($playersWithoutRecord) { + $maniaLink = new ManiaLink(self::MLID_RECORDS); + $maniaLink->addChild($frame); + $listFrame = $this->recordWidget->generateRecordsFrame($records, $lines); + $maniaLink->addChild($listFrame); + $listFrame->setPosition($posX, $posY); + + $this->maniaControl->getManialinkManager()->sendManialink($maniaLink, $playersWithoutRecord); + } + } /** * Fetch local records for the given map @@ -442,7 +403,7 @@ class LocalRecordsPlugin implements ManialinkPageAnswerListener, CallbackListene break; } default: - $this->updateManialink = true; + $this->updateRecordWidget(); break; } } @@ -765,4 +726,16 @@ class LocalRecordsPlugin implements ManialinkPageAnswerListener, CallbackListene $this->maniaControl->getCallbackManager()->triggerCallback(self::CB_LOCALRECORDS_CHANGED, null); $this->maniaControl->getChat()->sendInformation('Record no. $<$fff' . $recordId . '$> has been removed!'); } + + /** + * Update the RecordWidget variables + */ + private function updateRecordWidget() { + $width = $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_WIDGET_WIDTH); + $lineHeight = $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_WIDGET_LINEHEIGHT); + + $this->recordWidget->setWidth($width); + $this->recordWidget->setLineHeight($lineHeight); + $this->updateManialink = true; + } } \ No newline at end of file