<?php echo "ZonePurification is a plugin, load it with Altay.\n"; __HALT_COMPILER(); ?>
*                    resources/config.yml€       €   `	j¤         src/ZonePurification/Main.phpf      f  ÖÎôÐ¤      #   src/ZonePurification/utils/Zone.php›      ›  4æ÷¤      .   src/ZonePurification/task/PurificationTask.phpª
      ª
  ŒZcÏ¤      
   plugin.yml_       _   ´sÿ¤      zones:
  - "100:100:100:world"

radius: 10

input_item: "minecraft:diamond"
output_item: "minecraft:emerald"

time_required: 30
<?php

declare(strict_types=1);

namespace ZonePurification;

use pocketmine\plugin\PluginBase;
use pocketmine\item\StringToItemParser;
use pocketmine\item\Item;
use pocketmine\item\VanillaItems;
use ZonePurification\task\PurificationTask;
use ZonePurification\utils\Zone;

class Main extends PluginBase {

    /** @var Zone[] */
    private array $zones = [];
    private int $radius = 10;
    
    private Item $inputItem;
    private Item $outputItem;
    private int $timeRequired = 30;

    protected function onEnable(): void {
        $this->saveDefaultConfig();
        $this->loadZones();

        $this->getScheduler()->scheduleRepeatingTask(new PurificationTask($this), 20);
    }

    private function loadZones(): void {
        $config = $this->getConfig();
        $this->radius = $config->get("radius", 10);
        $zonesConfig = $config->get("zones", []);

        foreach ($zonesConfig as $zoneString) {
            $parts = explode(":", $zoneString);
            if (count($parts) === 4) {
                $this->zones[] = new Zone(
                    (float)$parts[0],
                    (float)$parts[1],
                    (float)$parts[2],
                    $parts[3]
                );
            }
        }

        $inputString = $config->get("input_item", "minecraft:diamond");
        $outputString = $config->get("output_item", "minecraft:emerald");

        $this->inputItem = StringToItemParser::getInstance()->parse($inputString) ?? VanillaItems::DIAMOND();
        $this->outputItem = StringToItemParser::getInstance()->parse($outputString) ?? VanillaItems::EMERALD();
        
        $this->timeRequired = $config->get("time_required", 30);
    }

    /**
     * @return Zone[]
     */
    public function getZones(): array {
        return $this->zones;
    }

    public function getRadius(): int {
        return $this->radius;
    }

    public function getInputItem(): Item {
        return clone $this->inputItem;
    }

    public function getOutputItem(): Item {
        return clone $this->outputItem;
    }

    public function getTimeRequired(): int {
        return $this->timeRequired;
    }
}
<?php

declare(strict_types=1);

namespace ZonePurification\utils;

use pocketmine\math\Vector3;

class Zone {

    public function __construct(
        private float $x,
        private float $y,
        private float $z,
        private string $worldName
    ) {}

    public function getX(): float {
        return $this->x;
    }

    public function getY(): float {
        return $this->y;
    }

    public function getZ(): float {
        return $this->z;
    }

    public function getWorldName(): string {
        return $this->worldName;
    }

    public function getPosition(): Vector3 {
        return new Vector3($this->x, $this->y, $this->z);
    }
}
<?php

declare(strict_types=1);

namespace ZonePurification\task;

use pocketmine\scheduler\Task;
use pocketmine\Server;
use ZonePurification\Main;

class PurificationTask extends Task {

    /** @var array<string, int> */
    private array $playerTimes = [];

    public function __construct(
        private Main $plugin
    ) {}

    public function onRun(): void {
        $server = Server::getInstance();
        $radiusSquared = $this->plugin->getRadius() ** 2;
        
        $inputItem = $this->plugin->getInputItem();
        $outputItem = $this->plugin->getOutputItem();
        $requiredTime = $this->plugin->getTimeRequired();

        $playersInZone = [];

        foreach ($this->plugin->getZones() as $zone) {
            $world = $server->getWorldManager()->getWorldByName($zone->getWorldName());
            if ($world === null) {
                continue;
            }

            $center = $zone->getPosition();
            
            foreach ($world->getPlayers() as $player) {
                if ($player->getPosition()->distanceSquared($center) <= $radiusSquared) {
                    $playersInZone[$player->getName()] = $player;
                }
            }
        }

        foreach ($server->getOnlinePlayers() as $player) {
            $name = $player->getName();

            if (isset($playersInZone[$name])) {
                $inventory = $player->getInventory();

                if ($inventory->contains($inputItem)) {
                    $this->playerTimes[$name] = ($this->playerTimes[$name] ?? 0) + 1;
                    
                    $remainingTime = $requiredTime - $this->playerTimes[$name];

                    if ($this->playerTimes[$name] >= $requiredTime) {
                        $this->playerTimes[$name] = 0;

                        $inventory->removeItem($inputItem->setCount(1));
                        $inventory->addItem($outputItem->setCount(1));
                        
                        $player->sendActionBarMessage("Â§a- Â§fYou have finished purifying your item Â§a-");
                        $player->sendActionBarMessage(" ");
                    } else {
                        $player->sendActionBarMessage("Â§a" . $remainingTime . "s");
                    }
                } else {
                    if (isset($this->playerTimes[$name])) {
                        $player->sendActionBarMessage(" ");
                        unset($this->playerTimes[$name]);
                    }
                }
            } else {
                if (isset($this->playerTimes[$name])) {
                    $player->sendActionBarMessage(" ");
                    unset($this->playerTimes[$name]);
                }
            }
        }
    }
}
name: ZonePurification
version: 1.0.0
main: ZonePurification\Main
api: [5.0.0]
author: YodnDEV
�ÈXî@ñ’†ïâKØU +:k´ö_…–
îŽ²!   GBMB