Напиши код на PHP для плагина https://github.com/Trollhunters501/PHPEngineNK для Nukkit, отображаемый BossBar всем игрокам с текстом "Test" и возможность сменить цвет полоски жизней из доступных цветов (BLUE, GREEN, PINK, PURPLE, RED, WHITE, YELLOW, REBECCA_PURPLE) а так же изменить состояние прогресса полоски, и добавь возможность анимации текста, прогресса и цвета полоски BossBar, чтобы он мог динамически менять цвет, состояние прогресса и написанный текст.
Ниже приведён пример полноценного плагина для Nukkit-сервера, реализованного на PHP с использованием PHPEngineNK.
Плагин создаёт глобальный BossBar для всех игроков, позволяет менять цвет, текст, прогресс и делает всё это анимированным (цвет, текст и прогресс меняются циклически каждую секунду).
Структура папок:
plugins/
└─ AnimatedBossBar/
├─ plugin.yml
├─ src/
│ └─ AnimatedBossBar/
│ ├─ Main.php
│ └─ BossBarTask.php
└─ resources/
name: AnimatedBossBar
main: AnimatedBossBar\Main
version: 1.0.0
api: [1.0.0]
load: POSTWORLD
description: "Глобальный анимированный BossBar для всех игроков"
<?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;
}
}
<?php
declare(strict_types=1);
namespace AnimatedBossBar;
use pocketmine\scheduler\Task;
class BossBarTask extends Task {
public function onRun(int $currentTick) : void {
Main::getInstance()->updateBossBar();
}
}
Использование
AnimatedBossBar в plugins.reload).Чтобы сделать команды для ручного управления цветом/текстом/прогрессом — дополните Main.php слушателем CommandSender и добавьте логику в plugin.yml.