Animated BossBar Plugin with Color & Progress Animation

Answered using AI by Vibe Coding

Code Question:

Напиши код на PHP для плагина https://github.com/Trollhunters501/PHPEngineNK для Nukkit, отображаемый BossBar всем игрокам с текстом "Test" и возможность сменить цвет полоски жизней из доступных цветов (BLUE, GREEN, PINK, PURPLE, RED, WHITE, YELLOW, REBECCA_PURPLE) а так же изменить состояние прогресса полоски, и добавь возможность анимации текста, прогресса и цвета полоски BossBar, чтобы он мог динамически менять цвет, состояние прогресса и написанный текст.

Code Solution:

Ниже приведён пример полноценного плагина для Nukkit-сервера, реализованного на PHP с использованием PHPEngineNK.

Плагин создаёт глобальный BossBar для всех игроков, позволяет менять цвет, текст, прогресс и делает всё это анимированным (цвет, текст и прогресс меняются циклически каждую секунду).

Структура папок:

plugins/
 └─ AnimatedBossBar/
    ├─ plugin.yml
    ├─ src/
    │  └─ AnimatedBossBar/
    │     ├─ Main.php
    │     └─ BossBarTask.php
    └─ resources/

  1. plugin.yml
name: AnimatedBossBar
main: AnimatedBossBar\Main
version: 1.0.0
api: [1.0.0]
load: POSTWORLD
description: "Глобальный анимированный BossBar для всех игроков"

  1. src/AnimatedBossBar/Main.php
<?php
declare(strict_types=1);

namespace AnimatedBossBar;

use pocketmine\{plugin\PluginBase, Player, Server};
use pocketmine\network\mcpe\protocol\BossEventPacket;
use pocketmine\network\mcpe\protocol\RemoveActorPacket;
use pocketmine\entity\Entity;
use pocketmine\scheduler\Task;
use pocketmine\event\Listener;
use pocketmine\event\player\PlayerJoinEvent;

class Main extends PluginBase implements Listener {

    private static Main $instance;
    private array $players = [];
    private array $colors = [
        0 => "BLUE",
        1 => "GREEN",
        2 => "PINK",
        3 => "PURPLE",
        4 => "RED",
        5 => "WHITE",
        6 => "YELLOW",
        7 => "REBECCA_PURPLE"
    ];
    private int $colorIndex = 0;
    private int $percentIndex = 0;
    private int $textIndex = 0;
    private array $texts = ["Test", "Test!", "TEST", "TeSt", "Test..."];
    private array $entityIds = [];

    public function onEnable() : void {
        self::$instance = $this;
        $this->getServer()->getPluginManager()->registerEvents($this, $this);
        $this->getScheduler()->scheduleRepeatingTask(new BossBarTask($this), 20); // каждую секунду
    }

    public function onPlayerJoin(PlayerJoinEvent $ev) : void {
        $this->sendBossBar($ev->getPlayer());
    }

    public function sendBossBar(Player $player) : void {
        $entityId = Entity::$entityCount++;
        $this->entityIds[$player->getName()] = $entityId;

        $packet = new BossEventPacket();
        $packet->bossEid = $entityId;
        $packet->eventType = BossEventPacket::TYPE_SHOW;
        $packet->title = $this->texts[$this->textIndex];
        $packet->healthPercent = $this->percentIndex / 100;
        $packet->color = $this->colorIndex;
        $packet->overlay = 0;
        $packet->playerEid = $player->getId();
        $player->dataPacket($packet);
    }

    public function updateBossBar() : void {
        $this->colorIndex = ($this->colorIndex + 1) % count($this->colors);
        $this->percentIndex = ($this->percentIndex + 5) % 101;
        $this->textIndex = ($this->textIndex + 1) % count($this->texts);

        foreach ($this->getServer()->getOnlinePlayers() as $player) {
            $entityId = $this->entityIds[$player->getName()] ?? null;
            if ($entityId === null) {
                $this->sendBossBar($player);
                continue;
            }
            $packet = new BossEventPacket();
            $packet->bossEid = $entityId;
            $packet->eventType = BossEventPacket::TYPE_UPDATE_PROPERTIES;
            $packet->title = $this->texts[$this->textIndex];
            $packet->healthPercent = $this->percentIndex / 100;
            $packet->color = $this->colorIndex;
            $packet->overlay = 0;
            $packet->playerEid = $player->getId();
            $player->dataPacket($packet);
        }
    }

    public static function getInstance() : self {
        return self::$instance;
    }
}

  1. src/AnimatedBossBar/BossBarTask.php
<?php
declare(strict_types=1);

namespace AnimatedBossBar;

use pocketmine\scheduler\Task;

class BossBarTask extends Task {

    public function onRun(int $currentTick) : void {
        Main::getInstance()->updateBossBar();
    }
}

Использование

  1. Скопируйте папку AnimatedBossBar в plugins.
  2. Перезапустите сервер (или перезагрузите плагины командой reload).
  3. При входе любого игрока он увидит анимированный BossBar с циклически меняющимся текстом, цветом и прогрессом.

Чтобы сделать команды для ручного управления цветом/текстом/прогрессом — дополните Main.php слушателем CommandSender и добавьте логику в plugin.yml.