maniaControl = $maniaControl; $this->maniaControl->getCallbackManager()->registerCallbackListener(Callbacks::AFTERLOOP, $this, 'handleAfterLoop'); $this->maniaControl->getCallbackManager()->registerCallbackListener(SettingManager::CB_SETTING_CHANGED, $this, 'updateSettings'); $this->maniaControl->getCallbackManager()->registerCallbackListener(PlayerManager::CB_PLAYERCONNECT, $this, 'handlePlayerConnect'); $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_POSX, 156., ""); $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_POSY, 24., ""); $this->maniaControl->getAuthenticationManager()->definePluginPermissionLevel($this, self::SETTING_ADMIN_LEVEL, AuthenticationManager::AUTH_LEVEL_ADMIN); return true; } /** * @see \ManiaControl\Plugins\Plugin::unload() */ public function unload() { $this->maniaControl->getManialinkManager()->hideManialink(self::MLID_ADMINUI_SIDEMENU); } /** * afterPluginInit * * @return void */ public function handleAfterLoop() { if ($this->updateManialink) { $this->updateManialink = false; $this->generateManialink(); } } /** * Update Widgets on Setting Changes * * @param Setting $setting */ public function updateSettings(Setting $setting) { if ($setting->belongsToClass($this)) { $this->updateManialink = true; } } /** * Handle when a player connects * * @param Player $player */ public function handlePlayerConnect(Player $player) { $authLevel = $this->maniaControl->getAuthenticationManager()->getAuthLevelInt($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_ADMIN_LEVEL)); if ($this->maniaControl->getAuthenticationManager()->checkRight($player, $authLevel)) { $this->maniaControl->getManialinkManager()->sendManialink($this->manialink, $player->login); } } /** * send Manialink to admins * * @return void */ private function displayManialink() { $authLevel = $this->maniaControl->getAuthenticationManager()->getAuthLevelInt($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_ADMIN_LEVEL)); $admins = $this->maniaControl->getAuthenticationManager()->getAdmins($authLevel); if (count($admins) > 0) { $this->maniaControl->getManialinkManager()->sendManialink($this->manialink, $admins); } } /** * generate, store and automatically send it to the admin * * @return void */ public function generateManialink() { $quadStyle = $this->maniaControl->getManialinkManager()->getStyleManager()->getDefaultQuadStyle(); $quadSubstyle = $this->maniaControl->getManialinkManager()->getStyleManager()->getDefaultQuadSubstyle(); $itemMarginFactorX = 1.3; $itemMarginFactorY = 1.2; $maniaLink = new ManiaLink(self::MLID_ADMINUI_SIDEMENU); $frame = new Frame(); $maniaLink->addChild($frame); $frame->setZ(ManialinkManager::MAIN_MANIALINK_Z_VALUE); $posX = $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_POSX); $posY = $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_POSY); if (count($this->menuItems) > 0) { // Admin Menu Icon Frame $iconFrame = new Frame(); $frame->addChild($iconFrame); $iconFrame->setPosition($posX, $posY); $backgroundQuad = new Quad(); $iconFrame->addChild($backgroundQuad); $backgroundQuad->setSize(self::ML_ITEM_SIZE * $itemMarginFactorX, self::ML_ITEM_SIZE * $itemMarginFactorY); $backgroundQuad->setStyles($quadStyle, $quadSubstyle); $backgroundQuad->setZ(-1.); $itemQuad = new Label(); $iconFrame->addChild($itemQuad); $itemQuad->setText('$fc3$w🏆$m'); $itemQuad->setSize(self::ML_ITEM_SIZE, self::ML_ITEM_SIZE); $itemQuad->setAreaFocusColor("00000000"); $itemQuad->setAreaColor("00000000"); // Admin Menu Description $descriptionLabel = new Label(); $frame->addChild($descriptionLabel); $descriptionLabel->setAlign(Label::RIGHT, Label::TOP); $descriptionLabel->setSize(40, 4); $descriptionLabel->setTextSize(1); $descriptionLabel->setTextColor('fff'); $descriptionLabel->setTextPrefix('$s'); // Admin Menu $popoutFrame = new Frame(); $frame->addChild($popoutFrame); $popoutFrame->setPosition($posX - self::ML_ITEM_SIZE * 0.5, $posY); $popoutFrame->setHorizontalAlign($popoutFrame::RIGHT); $popoutFrame->setVisible(false); $backgroundQuad = new Quad(); $popoutFrame->addChild($backgroundQuad); $backgroundQuad->setHorizontalAlign($backgroundQuad::RIGHT); $backgroundQuad->setStyles($quadStyle, $quadSubstyle); $backgroundQuad->setZ(-1.); $itemQuad->addToggleFeature($popoutFrame); // Add items $itemPosX = -4.; // sort by Order desc usort($this->menuItems, function($a, $b) { return $b->getOrder() <=> $a->getOrder(); }); foreach ($this->menuItems as $menuItem) { $menuItem->buildControl($popoutFrame, $descriptionLabel, $itemPosX); $itemPosX -= self::ML_ITEM_SIZE * 1.05; } $descriptionLabel->setPosition($posX - (count($popoutFrame->getChildren()) - 1) * self::ML_ITEM_SIZE * 1.05 - 5, $posY); $backgroundQuad->setSize((count($popoutFrame->getChildren()) - 1) * self::ML_ITEM_SIZE * 1.05 + 2, self::ML_ITEM_SIZE * $itemMarginFactorY); } $this->manialink = $maniaLink; $this->displayManialink(); } public function addMenuItem(MatchManagerAdminUI_MenuItem $menuItem) { $this->removeMenuItem($menuItem->getActionId()); $this->menuItems[] = $menuItem; $this->updateManialink = true; } public function removeMenuItem(string $actionId) { $this->menuItems = array_filter($this->menuItems, function($menuItem) use ($actionId) { return $menuItem->getActionId() !== $actionId; }); $this->updateManialink = true; } } class MatchManagerAdminUI_MenuItem { private string $actionId ; private int $order = 100; private string $description = ''; private string $text = ''; private string $imageUrl = ''; private string $style = ''; private string $subStyle = ''; private float $size = MatchManagerAdminUI::ML_ITEM_SIZE; public function getActionId() { return $this->actionId; } public function setActionId(string $actionId) { $this->actionId = $actionId; return $this; } public function getOrder() { return $this->order; } public function setOrder(int $order) { $this->order = $order; return $this; } public function getDescription() { return $this->description; } public function setDescription(string $description) { $this->description = $description; return $this; } public function getImageUrl() { return $this->imageUrl; } public function setImageUrl(string $imageUrl) { $this->imageUrl = $imageUrl; return $this; } public function getSize() { return $this->size; } public function setSize(float $size) { $this->size = $size; return $this; } public function getStyle() { return $this->imageUrl; } public function setStyle(string $style) { $this->style = $style; return $this; } public function getSubStyle() { return $this->imageUrl; } public function setSubStyle(string $subStyle) { $this->subStyle = $subStyle; return $this; } public function buildControl(Frame $parent, Label $descriptionLabel, float $posX) { $control = null; if ($this->text !== '') { $control = new Label(); $control->setText($this->text); } else { $control = new Quad(); if ($this->imageUrl !== '') { $control->setImageUrl($this->imageUrl); $control->setKeepRatio('fit'); $control->setColorize('ffffff'); } else if ($this->style !== '') { $control->setStyles($this->style, $this->subStyle); } else { $control->setBackgroundColor('cccccc'); } } $parent->addChild($control); $control->setSize($this->size, $this->size); $control->setX($posX); $control->setHorizontalAlign(Quad::CENTER); $control->addTooltipLabelFeature($descriptionLabel, $this->description); $control->setAction($this->actionId); } }