<?php
namespace Halloween\HeadHunt;
use pocketmine\plugin\PluginBase;
use pocketmine\event\Listener;
use pocketmine\event\player\PlayerInteractEvent;
use pocketmine\math\Vector3;
use pocketmine\Player;
use pocketmine\level\particle\Particle;
use pocketmine\level\particle\GenericParticle;
use pocketmine\utils\Color;
use pocketmine\scheduler\Task;
use pocketmine\level\Level;
use pocketmine\utils\TextFormat;
use pocketmine\level\sound\MinecraftSound;
use pocketmine\utils\Config;
use sound\Sound;
class Main extends PluginBase implements Listener {
private $heads = [];
private $foundHeads = [];
private $completedPlayers = [];
public function onEnable(): void {
$this->getServer()->getPluginManager()->registerEvents($this, $this);
$this->saveDefaultConfig();
$this->loadCompletedPlayers();
$this->heads = [
new Vector3(56, 48, 156),
new Vector3(47, 46, 158),
new Vector3(66, 46, 167),
new Vector3(60, 46, 128),
new Vector3(35, 46, 130),
new Vector3(32, 46, 154),
new Vector3(37, 51, 177),
new Vector3(53, 60, 177),
new Vector3(78, 50, 184),
new Vector3(84, 47, 145)
];
}
public function onDisable(): void {
$this->saveCompletedPlayers();
}
public function onInteract(PlayerInteractEvent $event): void {
$player = $event->getPlayer();
$block = $event->getBlock();
if (in_array($block->asVector3(), $this->heads)) {
$headIndex = array_search($block->asVector3(), $this->heads);
if (!isset($this->foundHeads[$player->getName()])) {
$this->foundHeads[$player->getName()] = [];
}
if (in_array($headIndex, $this->foundHeads[$player->getName()])) {
$player->sendMessage(TextFormat::RED . "§a» §fВы §cуже §fнашли эту голову §6или §fсобрали все головы и §aполучили свой приз!");
$player->dataPacket(Sound::getSoundPacket($player->asVector3(), 'mob.cat.hiss'));
return;
}
$this->foundHeads[$player->getName()][] = $headIndex;
$this->spawnParticlesAroundHead($player, $block->asVector3());
// Вызов звука
$player->dataPacket(Sound::getSoundPacket($player->asVector3(), 'mob.cat.meow'));
$totalHeads = count($this->heads);
$foundHeads = count($this->foundHeads[$player->getName()]);
if ($foundHeads === $totalHeads) {
$player->sendTitle(TextFormat::GREEN . "Поздравляем!", "", 10, 70, 20);
$player->sendMessage(TextFormat::GOLD . "§a» §fВы нашли все головы§f! §dВаш приз §fждет вас на сервере§a. . .");
// Вызов звука
$player->dataPacket(Sound::getSoundPacket($player->asVector3(), 'random.levelup'));
} else {
$player->sendMessage(TextFormat::AQUA . "§a» §6Отлично! §fВы нашли одну голову, осталось найти §a" . ($totalHeads - $foundHeads) . " §fголовы. §aУдачи!");
}
}
}
public function spawnParticlesAroundHead(Player $player, Vector3 $headPosition): void {
$colors = [
new Color(255, 0, 0), // Red
new Color(255, 165, 0), // Orange
new Color(255, 255, 0), // Yellow
new Color(0, 255, 0), // Green
new Color(0, 0, 255), // Blue
new Color(128, 0, 128) // Purple
];
$level = $player->getLevel();
foreach ($colors as $color) {
for ($i = 0; $i < 10; $i++) {
$xOffset = mt_rand(-1, 1) / 2;
$yOffset = mt_rand(1, 2);
$zOffset = mt_rand(-1, 1) / 2;
$particlePosition = $headPosition->add($xOffset, $yOffset, $zOffset);
$level->addParticle(new GenericParticle(
$particlePosition,
Particle::TYPE_MOB_SPELL_INSTANTANEOUS,
((255 & 0xff) << 24) | (($color->getRed() & 0xff) << 16) | (($color->getGreen() & 0xff) << 8) | ($color->getBlue() & 0xff)
));
}
}
$this->getServer()->getScheduler()->scheduleDelayedTask(new class($level, $headPosition) extends Task {
private $level;
private $headPosition;
public function __construct(Level $level, Vector3 $headPosition) {
$this->level = $level;
$this->headPosition = $headPosition;
}
public function onRun($currentTick): void {
//:⁏‥⁚…⁘…⁇º¡⁝…º⸘‾⌁⸘⁔⁙⁞·…°⁘⁙⁌⁋⁑¶․ªª⁔⁐⁐°…¡¡⁝⁖⁽․⁝_⁖⁚⁚
}
}, 20 * 4);
}
public function saveCompletedPlayers(): void {
$config = $this->getConfig();
$config->set("completed_players", $this->completedPlayers);
$config->save();
}
public function loadCompletedPlayers(): void {
$config = $this->getConfig();
$this->completedPlayers = $config->get("completed_players", []);
}
public function sendSound(Player $player, string $soundId): void {
$level = $player->getLevel();
$pos = $player->asVector3();
$level->addSound(
new MinecraftSound(
$pos, $soundId
), [$player]
);
}
}