
<?php
echo "PocketMine-MP plugin ReplenishResources v2.4.1
This file has been generated using DevTools v1.13.2 at Sun, 07 Jul 2019 22:53:46 +0930
----------------
";

if(extension_loaded("phar")){
	$phar = new \Phar(__FILE__);
	foreach($phar->getMetadata() as $key => $value){
		echo ucfirst($key) . ": " . (is_array($value) ? implode(", ", $value) : $value) . "\n";
	}
}

__HALT_COMPILER(); ?>
í             ÿ   a:9:{s:4:"name";s:18:"ReplenishResources";s:7:"version";s:5:"2.4.1";s:4:"main";s:24:"aieuo\ReplenishResources";s:3:"api";s:5:"3.0.0";s:6:"depend";s:0:"";s:11:"description";s:0:"";s:7:"authors";s:0:"";s:7:"website";s:0:"";s:12:"creationDate";i:1562505826;}
   plugin.ymlö   bò!]ö   äÍL¶¶         src/aieuo/AutoReplenishTask.php÷  bò!]÷  w‚¶          src/aieuo/ReplenishResources.phpýu  bò!]ýu  ßt/a¶      #   src/aieuo/ReplenishResourcesAPI.php–  bò!]–  Ô9G¶      name: ReplenishResources
main: aieuo\ReplenishResources
version: 2.4.1
api: 3.0.0
load: POSTWORLD
author: aieuo
commands:
 reso:
  description: äººå·¥è³‡æºè£œå……
  usage: /reso <pos1 | pos2 | add | del | change | auto | setting>
  permission: op<?php

namespace aieuo;

use pocketmine\scheduler\Task;
use pocketmine\level\Position;

class AutoReplenishTask extends Task {
    public function __construct(ReplenishResourcesAPI $api) {
        $this->api = $api;
    }

    public function onRun(int $currentTick) {
        $api = $this->api;
        foreach ($api->getAutoReplenishResources() as $place) {
            if($api->setting->get("announcement")) {
                $api->getOwner()->getServer()->broadcastMessage("è³‡æº(".$place.")ã®è£œå……ã‚’è¡Œã„ã¾ã™");
            }
            $pos = explode(",", $place);
            $api->replenish(new Position((int)$pos[0], (int)$pos[1], (int)$pos[2], $api->getOwner()->getServer()->getLevelByName($pos[3])));
        }
    }
}<?php
namespace aieuo;

use pocketmine\Player;
use pocketmine\block\Block;
use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\command\ConsoleCommandSender;
use pocketmine\event\Listener;
use pocketmine\event\block\BlockBreakEvent;
use pocketmine\event\player\PlayerInteractEvent;
use pocketmine\event\server\DataPacketReceiveEvent;
use pocketmine\network\mcpe\protocol\ModalFormRequestPacket;
use pocketmine\network\mcpe\protocol\ModalFormResponsePacket;
use pocketmine\math\Vector3;
use pocketmine\plugin\PluginBase;
use pocketmine\utils\Config;
use pocketmine\scheduler\TaskHandler;

class ReplenishResources extends PluginBase implements Listener {

    private $taskHandler = null;

    public function onEnable(){
        $this->getServer()->getPluginManager()->registerEvents($this,$this);
        if(!file_exists($this->getDataFolder())) @mkdir($this->getDataFolder(), 0721, true);
        $this->config = new Config($this->getDataFolder()."config.yml", Config::YAML);
        $this->setting = new Config($this->getDataFolder()."setting.yml", Config::YAML, [
            "enable-wait" => true,
            "wait" => 60,
            "sneak" => true,
            "announcement" => false,
            "enable-count" => true,
            "count" => 0,
            "check-inside" => true,
            "period" => 1,
            "tick-place" => 100,
            "enable-auto-replenish" => true,
            "auto-replenish-time" => 3600,
            "auto-replenish-resources" => [],
        ]);
        $this->setting->save();

        $this->checkConfig();

        $this->api = new ReplenishResourcesAPI($this, $this->config, $this->setting);

        if($this->setting->get("enable-auto-replenish")) {
            $time = (float)$this->setting->get("auto-replenish-time", 60) * 20;
            $this->startAutoReplenishTask($time);
        }

        $this->formIds = [
            "settings" => mt_rand(0, 99999999),
            "wait" => mt_rand(0, 99999999),
            "count" => mt_rand(0, 99999999),
            "place" => mt_rand(0, 99999999),
            "autoreplenish" => mt_rand(0, 99999999),
        ];
    }

    public function onDisable() {
        $this->setting->save();
    }

    public function checkConfig() {
        if(version_compare("2.4.0", $this->setting->get("version", ""), "<=")) return;
        $version = $this->getDescription()->getVersion();
        $this->setting->set("version", $version);
        $resources = [];
        foreach($this->config->getAll() as $place => $resource) {
            if(isset($resource["id"]["id"]) or isset($resource["id"]["damage"])) {
                $resource["id"] = [[
                    "id" => $resource["id"]["id"],
                    "damage" => $resource["id"]["damage"],
                    "per" => 1,
                ]];
            }
            $resources[$place] = $resource;
        }
        $this->config->setAll($resources);
        $this->config->save();
    }

    public function startAutoReplenishTask($time) {
        if($time === 0) {
            if($this->taskHandler instanceof TaskHandler and !$this->taskHandler->isCancelled())
                $this->getScheduler()->cancelTask($this->taskHandler->getTaskId());
            $this->taskHandler = null;
            return;
        }
        if($this->taskHandler instanceof TaskHandler and !$this->taskHandler->isCancelled()) {
            if($time === $this->taskHandler->getPeriod()) return;
            $this->getScheduler()->cancelTask($this->taskHandler->getTaskId());
        }
        $task = new AutoReplenishTask($this->api);
        $handler = $this->getScheduler()->scheduleRepeatingTask($task, $time);
        $this->taskHandler = $handler;
    }

    public function onCommand(CommandSender $sender, Command $command, string $label, array $args): bool {
        if(!$sender->isOp()) return false;
        if(!($sender instanceof Player)){
            $sender->sendMessage("ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã‹ã‚‰ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“");
            return true;
        }
        if(!isset($args[0])) {
            $sender->sendMessage("/reso <pos1 | pos2 | add | del | change | cancel | auto | setting>");
            return true;
        }

        $name = $sender->getName();
        switch ($args[0]) {
            case 'pos1':
            case 'pos2':
                $this->break[$name] = $args[0];
                $sender->sendMessage("ãƒ–ãƒ­ãƒƒã‚¯ã‚’å£Šã—ã¦ãã ã•ã„");
                break;
            case 'add':
                if(!isset($args[1])) {
                    $sender->sendMessage("/reso add <id>");
                    return true;
                }
                if(!isset($this->pos1[$name]) or !isset($this->pos2[$name])){
                    $sender->sendMessage("ã¾ãš/reso pos1ã¨/reso pos2ã§ç¯„å›²ã‚’è¨­å®šã—ã¦ãã ã•ã„");
                    return true;
                }
                if($this->pos1[$name]->level->getFolderName() != $this->pos2[$name]->level->getFolderName()) {
                    $sender->sendMessage("pos1ã¨pos2ã¯åŒã˜ãƒ¯ãƒ¼ãƒ«ãƒ‰ã«è¨­å®šã—ã¦ãã ã•ã„");
                    return true;
                }
                $this->tap[$name] = ["type" => "add", "id" => $args[1]];
                $sender->sendMessage("è¿½åŠ ã™ã‚‹çœ‹æ¿ã‚’ã‚¿ãƒƒãƒ—ã—ã¦ãã ã•ã„");
                break;
            case 'del':
                $this->tap[$name] = ["type" => "del"];
                $sender->sendMessage("å‰Šé™¤ã™ã‚‹çœ‹æ¿ã‚’ã‚¿ãƒƒãƒ—ã—ã¦ãã ã•ã„");
                break;
            case "change":
                if(!isset($args[1])) {
                    $sender->sendMessage("/reso change <id>");
                    return true;
                }
                $this->tap[$name] = ["type" => "change", "id" => $args[1]];
                $sender->sendMessage("å¤‰æ›´ã™ã‚‹çœ‹æ¿ã‚’ã‚¿ãƒƒãƒ—ã—ã¦ãã ã•ã„");
                break;
            case 'cancel':
                unset($this->pos1[$name], $this->pos2[$name], $this->tap[$name], $this->break[$name]);
                $sender->sendMessage("ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã—ã¾ã—ãŸ");
                break;
            case 'auto':
                if(!isset($args[1])) {
                    $sender->sendMessage("/reso auto <add | del>");
                    return true;
                }
                switch ($args[1]) {
                    case 'add':
                        $this->tap[$name] = ["type" => "auto_add"];
                        $sender->sendMessage("è¿½åŠ ã™ã‚‹çœ‹æ¿ã‚’ã‚¿ãƒƒãƒ—ã—ã¦ãã ã•ã„");
                        break;
                    case 'del':
                        $this->tap[$name] = ["type" => "auto_del"];
                        $sender->sendMessage("å‰Šé™¤ã™ã‚‹çœ‹æ¿ã‚’ã‚¿ãƒƒãƒ—ã—ã¦ãã ã•ã„");
                        break;
                    default:
                        $sender->sendMessage("/reso auto <add | del>");
                        break;
                }
                break;
            case 'setting':
                $this->sendSettingForm($sender);
                break;
            default:
                $sender->sendMessage("/reso <pos1 | pos2 | add | del | change | cancel | auto | setting>");
                break;
        }
        return true;
    }

    public function onBreak(BlockBreakEvent $event){
        $player = $event->getPlayer();
        $block = $event->getBlock();
        $name = $player->getName();
        if(isset($this->break[$name])){
            $event->setCancelled();
            $type = $this->break[$name];
            switch ($type) {
                case 'pos1':
                case 'pos2':
                    $this->{$type}[$name] = $block;
                    $player->sendMessage($type."ã‚’è¨­å®šã—ã¾ã—ãŸ (".$block->x.",".$block->y.",".$block->z.",".$block->level->getFolderName().")");
                    break;
            }
            unset($this->break[$name]);
            return;
        }

        if(($block->getId() == 63 or $block->getId() == 68) and !$event->isCancelled()) {
            if($this->api->existsResource($block)) {
                if(!$player->isOp()) {
                    $player->sendMessage("Â§cã“ã®çœ‹æ¿ã¯å£Šã›ã¾ã›ã‚“");
                    $event->setCancelled();
                    return;
                }
                $player->sendMessage("è£œå……çœ‹æ¿ã‚’å£Šã—ã¾ã—ãŸ");
                $this->api->removeResource($place);
            }
        }
    }

    public function onTouch(PlayerInteractEvent $event) {
        $player = $event->getPlayer();
        $block = $event->getBlock();
        $name = $player->getName();

        if($block->getId() == 63 or $block->getId() == 68) {
            if(isset($this->tap[$name])) {
                $event->setCancelled();
                switch ($this->tap[$name]["type"]) {
                    case 'add':
                        $ids = array_map(function($id2) {
                            $ids2 = explode(":", $id2);
                            if(!isset($ids2[1])) $ids2[1] = 0;
                            if(!isset($ids2[2])) $ids2[2] = 100;
                            return ["id" => $ids2[0], "damage" => $ids2[1], "per" => $ids2[2]];
                        }, explode(",", $this->tap[$name]["id"]));
                        $this->api->addResource($block, $this->pos1[$name], $this->pos2[$name], $ids);
                        $player->sendMessage("è¿½åŠ ã—ã¾ã—ãŸ");
                        break;
                    case 'change':
                        if(($resource = $this->api->getResource($block)) === null) {
                            $player->sendMessage("ãã®å ´æ‰€ã«ã¯ã¾ã è¿½åŠ ã•ã‚Œã¦ã„ã¾ã›ã‚“");
                            return;
                        }
                        $ids = array_map(function($id2) {
                            $ids2 = explode(":", $id2);
                            if(!isset($ids2[1])) $ids2[1] = 0;
                            if(!isset($ids2[2])) $ids2[2] = 1;
                            return ["id" => $ids2[0], "damage" => $ids2[1], "per" => $ids2[2]];
                        }, explode(",", $this->tap[$name]["id"]));
                        $this->api->updateResource($block, "id", $ids);
                        $player->sendMessage("å¤‰æ›´ã—ã¾ã—ãŸ");
                        break;
                    case 'del':
                        if($this->api->removeResource($block)) {
                            $player->sendMessage("å‰Šé™¤ã—ã¾ã—ãŸ");
                        } else {
                            $player->sendMessage("ãã®å ´æ‰€ã«ã¯ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã›ã‚“");
                        }
                        break;
                    case 'auto_add':
                        if(!$this->api->existsResource($block)) {
                            $player->sendMessage("ãã‚Œã¯è£œå……çœ‹æ¿ã§ã¯ã‚ã‚Šã¾ã›ã‚“");
                            return true;
                        }
                        if(!$this->api->addAutoReplenishResource($block)) {
                            $player->sendMessage("ã™ã§ã«è¿½åŠ ã•ã‚Œã¦ã„ã¾ã™");
                            return true;
                        }
                        $player->sendMessage("è¿½åŠ ã—ã¾ã—ãŸ");
                        if(!$this->setting->get("enable-auto-replenish")) $player->sendMessage("Â§eè‡ªå‹•è£œå……ãŒã‚ªãƒ•ã«ãªã£ã¦ã„ã¾ã™ã€‚/reso settingã§ã‚ªãƒ³ã«ã—ã¦ãã ã•ã„");
                        break;
                    case 'auto_del':
                        if(!$this->api->removeAutoReplenishResource($block)) {
                            $player->sendMessage("ã¾ã è¿½åŠ ã•ã‚Œã¦ã„ã¾ã›ã‚“");
                            return true;
                        }
                        $player->sendMessage("å‰Šé™¤ã—ã¾ã—ãŸ");
                        break;
                }
                unset($this->tap[$name]);
                return;
            }

            if(!$this->api->existsResource($block)) return;

            $place = $block->x.",".$block->y.",".$block->z.",".$block->level->getFolderName();

            if($this->setting->get("sneak", false) and !$player->isSneaking()) {
                $player->sendMessage("ã‚¹ãƒ‹ãƒ¼ã‚¯ã—ãªãŒã‚‰ã‚¿ãƒƒãƒ—ã™ã‚‹ã¨è£œå……ã—ã¾ã™");
                return;
            }
            if($this->setting->get("enable-wait", false) and (float)$this->setting->get("wait") > 0) {
                $time = $this->checkTime($player->getName(), $place);
                if($time !== true) {
                    $player->sendMessage($this->setting->get("wait")."ç§’ä»¥å†…ã«ä½¿ç”¨ã—ã¦ã„ã¾ã™\nã‚ã¨".round($time, 1)."ç§’ãŠå¾…ã¡ãã ã•ã„");
                    return;
                }
            }
            $resource = $this->api->getResource($block);
            if($this->setting->get("check-inside", false)) {
                $players = $player->level->getPlayers();
                $inside = false;
                foreach($players as $p) {
                    if($resource["level"] == $p->level->getFolderName()
                        and $resource["startx"] <= floor($p->x) and floor($p->x) <= $resource["endx"]
                        and $resource["starty"] <= floor($p->y) and floor($p->y) <= $resource["endy"]
                        and $resource["startz"] <= floor($p->z) and floor($p->z) <= $resource["endz"]
                    ) {
                        $p->sendTip("Â§e".$name."ãŒã‚ãªãŸã®ã„ã‚‹è³‡æºã‚’è£œå……ã—ã‚ˆã†ã¨ã—ã¦ã„ã¾ã™");
                        $inside = true;
                    }
                }
                if($inside) {
                    $player->sendMessage("è³‡æºå†…ã«ãƒ—ãƒ¬ã‚¤ãƒ¤ãƒ¼ãŒã„ã‚‹ãŸã‚è£œå……ã§ãã¾ã›ã‚“");
                    return;
                }
            }
            $allow = (int)$this->setting->get("count");
            $count = $this->countBlocks($resource);
            if($this->setting->get("enable-count", false) and $allow >= 0 and $count > $allow){
                $player->sendMessage("ã¾ã ãƒ–ãƒ­ãƒƒã‚¯ãŒæ®‹ã£ã¦ã„ã¾ã™ (".($count - $allow).")");
                return;
            }
            if($this->setting->get("announcement")) $this->getServer()->broadcastMessage($name."ã•ã‚“ãŒè³‡æº(".$place.")ã®è£œå……ã‚’è¡Œã„ã¾ã™");
            $this->api->replenish($block);
        }
    }

    public function checkTime($name, $type) {
        if(!isset($this->time[$name][$type])) {
            $this->time[$name][$type] = microtime(true);
            return true;
        }
        $time = microtime(true) -$this->time[$name][$type];
        if($time <= (float)$this->setting->get("wait")) {
            return (float)$this->setting->get("wait") - $time;
        }
        $this->time[$name][$type] = microtime(true);
        return true;
    }

    public function countBlocks($datas){
        $sx = $datas["startx"];
        $sy = $datas["starty"];
        $sz = $datas["startz"];
        $ex = $datas["endx"];
        $ey = $datas["endy"];
        $ez = $datas["endz"];
        $level = $this->getServer()->getLevelByName($datas["level"]);
        $count = 0;
        for ($x = $sx; $x <= $ex; $x++) {
            for ($y = $sy; $y <= $ey; $y++) {
                for ($z = $sz; $z <= $ez; $z++) {
                    $block = $level->getBlock(new Vector3($x,$y,$z));
                    if($block->getId() !== 0) $count ++;
                }
            }
        }
        return $count;
    }

    public function sendSettingForm($player) {
        if(!$this->setting->get("sneak")) {
            $sneak = "[ã‚¹ãƒ‹ãƒ¼ã‚¯] ä»Šã¯Â§cOFFÂ§r (ã‚¹ãƒ‹ãƒ¼ã‚¯ã—ãªãã¦ã‚‚åå¿œã—ã¾ã™)";
        } else {
            $sneak = "[ã‚¹ãƒ‹ãƒ¼ã‚¯] ä»Šã¯Â§bONÂ§r (ã‚¹ãƒ‹ãƒ¼ã‚¯ã—ãªã„ã¨åå¿œã—ã¾ã›ã‚“)";
        }
        if(!$this->setting->get("announcement")) {
            $announcement = "[ã‚¢ãƒŠã‚¦ãƒ³ã‚¹] ä»Šã¯Â§cOFFÂ§r (è£œå……æ™‚ã«ã¿ã‚“ãªã«çŸ¥ã‚‰ã›ã¾ã›ã‚“)";
        } else {
            $announcement = "[ã‚¢ãƒŠã‚¦ãƒ³ã‚¹] ä»Šã¯Â§bONÂ§r (è£œå……æ™‚ã«ã¿ã‚“ãªã«çŸ¥ã‚‰ã›ã¾ã™)";
        }
        if(($time = (float)$this->setting->get("wait")) <= 0 or !$this->setting->get("enable-wait")) {
            $wait = "[é€£ç¶šè£œå……ã®åˆ¶é™] ä»Šã¯Â§cOFFÂ§r (é€£ç¶šè£œå……ã‚’åˆ¶é™ã—ã¾ã›ã‚“)";
        } else {
            $wait = "[é€£ç¶šè£œå……ã®åˆ¶é™] ä»Šã¯Â§bONÂ§r (åŒã˜çœ‹æ¿ã®ã‚¿ãƒƒãƒ—ã‚’".$time."ç§’é–“åˆ¶é™ã—ã¾ã™)";
        }
        if(($check = (int)$this->setting->get("count")) === -1 or !$this->setting->get("enable-count")) {
            $count = "[æ®‹ã•ãšã«æŽ˜ã‚‹] ä»Šã¯Â§cOFFÂ§r (ãƒ–ãƒ­ãƒƒã‚¯ãŒæ®‹ã£ã¦ã„ã¦ã‚‚è£œå……ã—ã¾ã™)";
        } else {
            $count = "[æ®‹ã•ãšã«æŽ˜ã‚‹] ä»Šã¯Â§bONÂ§r (æ®‹ã£ã¦ã„ã‚‹ãƒ–ãƒ­ãƒƒã‚¯ãŒ".$check."å€‹ä»¥ä¸‹ã®æ™‚ã ã‘è£œå……ã—ã¾ã™)";
        }
        if(!$this->setting->get("check-inside")) {
            $inside = "[è³‡æºå†…ã®ãƒ—ãƒ¬ã‚¤ãƒ¤ãƒ¼ç¢ºèª] ä»Šã¯Â§cOFFÂ§r (è³‡æºå†…ã«ãƒ—ãƒ¬ã‚¤ãƒ¤ãƒ¼ãŒã„ã¦ã‚‚è£œå……ã—ã¾ã™)";
        } else {
            $inside = "[è³‡æºå†…ã®ãƒ—ãƒ¬ã‚¤ãƒ¤ãƒ¼ç¢ºèª] ä»Šã¯Â§bONÂ§r (è³‡æºå†…ã«ãƒ—ãƒ¬ã‚¤ãƒ¤ãƒ¼ãŒã„ã‚‹ã¨è£œå……ã—ã¾ã›ã‚“)";
        }
        if(!$this->setting->get("enable-auto-replenish")) {
            $autoreplenish = "[è‡ªå‹•è£œå……] ä»Šã¯Â§cOFFÂ§r (è¨­å®šã—ãŸè³‡æºã‚’å®šæœŸçš„ã«è£œå……ã—ã¾ã›ã‚“)";
        } else {
            $autoreplenish = "[è‡ªå‹•è£œå……] ä»Šã¯Â§bONÂ§r (è¨­å®šã—ãŸè³‡æºã‚’".$this->setting->get("auto-replenish-time")."ã«1å›žè£œå……ã—ã¾ã™)";
        }
        $place = "[è£œå……] ".$this->setting->get("tick-place", 100)."ãƒ–ãƒ­ãƒƒã‚¯ç½®ã„ã¦".$this->setting->get("period")."tickå¾…ã¤";
        $data = [
            "type" => "form",
            "title" => "è¨­å®š",
            "content" => "Â§7ãƒœã‚¿ãƒ³ã‚’æŠ¼ã—ã¦ãã ã•ã„",
            "buttons" => [
                ["text" => $sneak],
                ["text" => $announcement],
                ["text" => $wait],
                ["text" => $count],
                ["text" => $inside],
                ["text" => $place],
                ["text" => $autoreplenish],
                ["text" => "çµ‚äº†"],
            ]
        ];
        $this->sendForm($player, $data, $this->formIds["settings"]);
    }

    public function sendWaitSettingForm($player, $mes = "", $default = null) {
        $data = [
            "type" => "custom_form",
            "title" => "è¨­å®š > é€£ç¶šè£œå……ã®åˆ¶é™",
            "content" => [
                [
                    "type" => "input",
                    "text" => "åˆ¶é™ã™ã‚‹ç§’æ•°ã‚’å…¥åŠ›ã—ã¦ãã ã•ã„".($mes === "" ? "" : "\n".$mes),
                    "default" => $default ?? (string)$this->setting->get("wait"),
                    "placeholder" => "1ç§’ã‚ˆã‚Šé•·ãè¨­å®šã—ã¦ãã ã•ã„"
                ],
                [
                    "type" => "toggle",
                    "text" => "åˆæœŸå€¤ã«æˆ»ã™ (60ç§’)"
                ],
            ]
        ];
        $this->sendForm($player, $data, $this->formIds["wait"]);
    }

    public function sendCountSettingForm($player, $mes = "", $default = null) {
        $data = [
            "type" => "custom_form",
            "title" => "è¨­å®š > æ®‹ã•ãšã«æŽ˜ã‚‹",
            "content" => [
                [
                    "type" => "input",
                    "text" => "æ®‹ã£ã¦ã„ã¦ã‚‚ã„ã„ãƒ–ãƒ­ãƒƒã‚¯ã®æ•°ã‚’å…¥åŠ›ã—ã¦ãã ã•ã„".($mes === "" ? "" : "\n".$mes),
                    "default" => $default ?? (string)$this->setting->get("count"),
                    "placeholder" => "0å€‹ä»¥ä¸Šã§è¨­å®šã—ã¦ãã ã•ã„"
                ],
                [
                    "type" => "toggle",
                    "text" => "åˆæœŸå€¤ã«æˆ»ã™ (0å€‹)"
                ],
            ]
        ];
        $this->sendForm($player, $data, $this->formIds["count"]);
    }

    public function sendPlaceSettingForm($player, $mes1 = "", $mes2 = "", $default1 = null, $default2 = null) {
        $data = [
            "type" => "custom_form",
            "title" => "è¨­å®š > è£œå……",
            "content" => [
                [
                    "type" => "input",
                    "text" => "ä¸€åº¦ã«ç½®ããƒ–ãƒ­ãƒƒã‚¯ã®æ•°".($mes1 === "" ? "" : "\n".$mes1),
                    "default" => $default1 ?? (string)$this->setting->get("tick-place"),
                    "placeholder" => "1ä»¥ä¸Šã§è¨­å®šã—ã¦ãã ã•ã„"
                ],
                [
                    "type" => "input",
                    "text" => "ãƒ–ãƒ­ãƒƒã‚¯ã‚’ç½®ã„ã¦ã‹ã‚‰å¾…æ©Ÿã™ã‚‹tickæ•°".($mes2 === "" ? "" : "\n".$mes2),
                    "default" => $default2 ?? (string)$this->setting->get("period"),
                    "placeholder" => "1ä»¥ä¸Šã§è¨­å®šã—ã¦ãã ã•ã„"
                ],
                [
                    "type" => "toggle",
                    "text" => "åˆæœŸå€¤ã«æˆ»ã™ (100å€‹, 1tick)"
                ],
            ]
        ];
        $this->sendForm($player, $data, $this->formIds["place"]);
    }

    public function sendAutoReplenishSettingForm($player, $mes = "", $default = null) {
        $data = [
            "type" => "custom_form",
            "title" => "è¨­å®š > è‡ªå‹•è£œå……",
            "content" => [
                [
                    "type" => "input",
                    "text" => "è£œå……ã™ã‚‹é–“éš”ã‚’ç§’ã§å…¥åŠ›ã—ã¦ãã ã•ã„\nè¨­å®šã¯å†èµ·å‹•å¾Œåæ˜ ã•ã‚Œã¾ã™".($mes === "" ? "" : "\n".$mes),
                    "default" => $default ?? (string)$this->setting->get("auto-replenish-time"),
                    "placeholder" => "1ç§’ä»¥ä¸Šã§è¨­å®šã—ã¦ãã ã•ã„"
                ],
                [
                    "type" => "toggle",
                    "text" => "åˆæœŸå€¤ã«æˆ»ã™ (3600ç§’)"
                ],
            ]
        ];
        $this->sendForm($player, $data, $this->formIds["autoreplenish"]);
    }

    public function Receive(DataPacketReceiveEvent $event){
        $pk = $event->getPacket();
        $player = $event->getPlayer();
        $name = $player->getName();
        if($pk instanceof ModalFormResponsePacket){
            if($pk->formId === $this->formIds["settings"]) {
                $data = json_decode($pk->formData);
                if($data === null) return;
                switch($data) {
                    case 0:
                        if(!$this->setting->get("sneak")) {
                            $this->setting->set("sneak", true);
                            $player->sendMessage("ã‚¹ãƒ‹ãƒ¼ã‚¯ã‚’ã‚ªãƒ³ã«ã—ã¾ã—ãŸ");
                        } else {
                            $this->setting->set("sneak", false);
                            $player->sendMessage("ã‚¹ãƒ‹ãƒ¼ã‚¯ã‚’ã‚ªãƒ•ã«ã—ã¾ã—ãŸ");
                        }
                        break;
                    case 1:
                        if(!$this->setting->get("announcement")) {
                            $this->setting->set("announcement", true);
                            $player->sendMessage("ã‚¢ãƒŠã‚¦ãƒ³ã‚¹ã‚’ã‚ªãƒ³ã«ã—ã¾ã—ãŸ");
                        } else {
                            $this->setting->set("announcement", false);
                            $player->sendMessage("ã‚¢ãƒŠã‚¦ãƒ³ã‚¹ã‚’ã‚ªãƒ•ã«ã—ã¾ã—ãŸ");
                        }
                        break;
                    case 2:
                        if(!$this->setting->get("enable-wait")) {
                            $this->sendWaitSettingForm($player);
                            return;
                        } else {
                            $this->setting->set("enable-wait", false);
                            $player->sendMessage("é€£ç¶šè£œå……ã®åˆ¶é™ã‚’ã‚ªãƒ•ã«ã—ã¾ã—ãŸ");
                        }
                        break;
                    case 3:
                        if(!$this->setting->get("enable-count")) {
                            $this->sendCountSettingForm($player);
                            return;
                        } else {
                            $this->setting->set("enable-count", false);
                            $player->sendMessage("ãƒ–ãƒ­ãƒƒã‚¯ãŒæ®‹ã£ã¦ã„ã¦ã‚‚è£œå……ã™ã‚‹ã‚ˆã†ã«ã—ã¾ã—ãŸ");
                        }
                        break;
                    case 4:
                        if(!$this->setting->get("check-inside")) {
                            $this->setting->set("check-inside", true);
                            $player->sendMessage("è³‡æºå†…ã«ãƒ—ãƒ¬ã‚¤ãƒ¤ãƒ¼ãŒã„ã‚‹ã¨è£œå……ã§ããªã„ã‚ˆã†ã«ã—ã¾ã—ãŸ");
                        } else {
                            $this->setting->set("check-inside", false);
                            $player->sendMessage("è³‡æºå†…ã«ãƒ—ãƒ¬ã‚¤ãƒ¤ãƒ¼ãŒã„ã¦ã‚‚è£œå……ã§ãã‚‹ã‚ˆã†ã«ã—ã¾ã—ãŸ");
                        }
                        break;
                    case 5:
                        $this->sendPlaceSettingForm($player);
                        return;
                    case 6:
                        if(!$this->setting->get("enable-auto-replenish")) {
                            $this->sendAutoReplenishSettingForm($player);
                            return;
                        } else {
                            $this->setting->set("enable-auto-replenish", false);
                            $this->startAutoReplenishTask(0);
                            $player->sendMessage("è‡ªå‹•è£œå……ã‚’ã—ãªã„ã‚ˆã†ã«ã—ã¾ã—ãŸ");
                        }
                        break;
                    case 7:
                        return;
                }
                $this->sendSettingForm($player);
            } elseif($pk->formId === $this->formIds["wait"]) {
                $data = json_decode($pk->formData);
                if($data === null) return;
                if($data[1]) $data[0] = 60;
                if($data[0] === "") {
                    $this->sendWaitSettingForm($player, "Â§cå¿…è¦äº‹é …ã‚’è¨˜å…¥ã—ã¦ãã ã•ã„Â§f");
                    return;
                }
                if((float)$data[0] < 1) {
                    $this->sendWaitSettingForm($player, "Â§c1ã‚ˆã‚Šå¤§ãã„æ•°ã‚’å…¥åŠ›ã—ã¦ãã ã•ã„Â§f", $data[0]);
                    return;
                }
                $this->setting->set("enable-wait", true);
                $this->setting->set("wait", (float)$data[0]);
                $player->sendMessage("é€£ç¶šè£œå……ã®åˆ¶é™ã‚’".floatval($data[0])."ç§’ã«è¨­å®šã—ã¾ã—ãŸ");
                $this->sendSettingForm($player);
            } elseif($pk->formId === $this->formIds["count"]) {
                $data = json_decode($pk->formData);
                if($data === null) return;
                if($data[1]) $data[0] = 0;
                if($data[0] === "") {
                    $this->sendWaitSettingForm($player, "Â§cå¿…è¦äº‹é …ã‚’è¨˜å…¥ã—ã¦ãã ã•ã„Â§f");
                    return;
                }
                if((int)$data[0] < 0) {
                    $this->sendWaitSettingForm($player, "Â§c0ä»¥ä¸Šã§å…¥åŠ›ã—ã¦ãã ã•ã„Â§f", $data[0]);
                    return;
                }
                $this->setting->set("enable-count", true);
                $this->setting->set("count", (int)$data[0]);
                $player->sendMessage("æ®‹ã£ã¦ã„ã‚‹ãƒ–ãƒ­ãƒƒã‚¯ã®æ•°ãŒ".(int)$data[0]."å€‹ä»¥ä¸‹ã®æ™‚ã ã‘è£œå……ã™ã‚‹ã‚ˆã†ã«ã—ã¾ã—ãŸ");
                $this->sendSettingForm($player);
            } elseif($pk->formId === $this->formIds["place"]) {
                $data = json_decode($pk->formData);
                if($data === null) return;
                if($data[2]) {
                    $data[0] = 100;
                    $data[1] = 1;
                }
                $errors = ["", ""];
                if((int)$data[0] < 1) $error[0] = "Â§c1ä»¥ä¸Šã§å…¥åŠ›ã—ã¦ãã ã•ã„Â§f";
                if((int)$data[1] < 1) $error[1] = "Â§c1ä»¥ä¸Šã§å…¥åŠ›ã—ã¦ãã ã•ã„Â§f";
                if($data[0] === "") $error[0] = "Â§cå¿…è¦äº‹é …ã‚’è¨˜å…¥ã—ã¦ãã ã•ã„Â§f";
                if($data[1] === "") $error[1] = "Â§cå¿…è¦äº‹é …ã‚’è¨˜å…¥ã—ã¦ãã ã•ã„Â§f";
                if($errors[0] !== "" or $errors[1] !== "") {
                    $this->sendWaitSettingForm($player, $error[0], $error[1],
                        $error[0] == "Â§cå¿…è¦äº‹é …ã‚’è¨˜å…¥ã—ã¦ãã ã•ã„Â§f" ? null : $data[0], $error[1] == "Â§cå¿…è¦äº‹é …ã‚’è¨˜å…¥ã—ã¦ãã ã•ã„Â§f" ? null : $data[1]);
                    return;
                }
                $this->setting->set("tick-place", (int)$data[0]);
                $this->setting->set("period", (int)$data[1]);
                $player->sendMessage("ä¸€åº¦ã«ç½®ããƒ–ãƒ­ãƒƒã‚¯ã«æ•°ã‚’".(int)$data[0]."å€‹ã«ã—ã¾ã—ãŸ");
                $player->sendMessage("ãƒ–ãƒ­ãƒƒã‚¯ã‚’ç½®ã„ã¦ã‹ã‚‰å¾…æ©Ÿã™ã‚‹".(int)$data[1]."æ•°ã‚’1ã«ã—ã¾ã—ãŸ");
                $this->sendSettingForm($player);
            } elseif($pk->formId === $this->formIds["autoreplenish"]) {
                $data = json_decode($pk->formData);
                if($data === null) return;
                if($data[1]) $data[0] = 3600;
                if($data[0] === "") {
                    $this->sendWaitSettingForm($player, "Â§cå¿…è¦äº‹é …ã‚’è¨˜å…¥ã—ã¦ãã ã•ã„Â§f");
                    return;
                }
                if((float)$data[0] < 1) {
                    $this->sendWaitSettingForm($player, "Â§c1ã‚ˆã‚Šå¤§ãã„æ•°ã‚’å…¥åŠ›ã—ã¦ãã ã•ã„Â§f", $data[0]);
                    return;
                }
                $this->setting->set("enable-auto-replenish", true);
                $this->setting->set("auto-replenish-time", (float)$data[0]);
                $this->startAutoReplenishTask((float)$data[0] * 20);
                $player->sendMessage("è‡ªå‹•è£œå……ã®é–“éš”ã‚’".(float)$data[0]."ç§’ã«è¨­å®šã—ã¾ã—ãŸ");
                $this->sendSettingForm($player);
            }
        }
    }

    public function sendForm($player, $form, $id) {
        $json = json_encode($form, JSON_PRETTY_PRINT | JSON_BIGINT_AS_STRING | JSON_UNESCAPED_UNICODE);
        $pk = new ModalFormRequestPacket();
        $pk->formId = $id;
        $pk->formData = $json;
        $player->dataPacket($pk);
    }
}<?php
namespace aieuo;

use pocketmine\level\Position;
use pocketmine\math\Vector3;
use pocketmine\scheduler\Task;

class ReplenishResourcesAPI {
    private static $instance;

    public function __construct($owner, $resources, $setting) {
        $this->owner = $owner;
        $this->resources = $resources;
        $this->setting = $setting;
        self::$instance = $this;
    }

    public static function getInstance() {
        return self::$instance;
    }

    public function getOwner() {
        return $this->owner;
    }

    public function getResources() {
        return $this->resources;
    }

    public function existsResource(Position $pos) {
        return $this->resources->exists($pos->x.",".$pos->y.",".$pos->z.",".$pos->level->getFolderName());
    }

    public function getResource(Position $pos) {
        return $this->resources->get($pos->x.",".$pos->y.",".$pos->z.",".$pos->level->getFolderName(), null);
    }

    public function addResource(Position $signpos, Position $pos1, Position $pos2, array $ids) {
        $this->resources->set($signpos->x.",".$signpos->y.",".$signpos->z.",".$signpos->level->getFolderName(), [
            "startx" => min($pos1->x, $pos2->x),
            "starty" => min($pos1->y, $pos2->y),
            "startz" => min($pos1->z, $pos2->z),
            "endx" => max($pos1->x, $pos2->x),
            "endy" => max($pos1->y, $pos2->y),
            "endz" => max($pos1->z, $pos2->z),
            "level" => $pos1->level->getFolderName(),
            "id" => $ids,
        ]);
        $this->resources->save();
    }

    public function updateResource(Position $pos, string $key, $data) {
        $resource = $this->getResource($pos);
        if($resource === null) return false;
        $resource[$key] = $data;
        $this->resources->set($pos->x.",".$pos->y.",".$pos->z.",".$pos->level->getFolderName(), $resource);
        $this->resources->save();
    }

    public function removeResource(Position $pos) {
        if(!$this->existsResource($pos)) return false;
        $this->resources->remove($pos->x.",".$pos->y.",".$pos->z.",".$pos->level->getFolderName());
        $this->resources->save();
        return true;
    }

    public function getAutoReplenishResources() {
        return $this->setting->get("auto-replenish-resources", []);
    }

    public function addAutoReplenishResource(Position $pos) {
        $resources = $this->getAutoReplenishResources();
        $add = $pos->x.",".$pos->y.",".$pos->z.",".$pos->level->getFolderName();
        if(in_array($add, $resources)) return false;
        $this->setting->set("auto-replenish-resources", array_merge($resources, [$add]));
        $this->setting->save();
        return true;
    }

    public function removeAutoReplenishResource(Position $pos) {
        $resources = $this->getAutoReplenishResources();
        $remove = $pos->x.",".$pos->y.",".$pos->z.",".$pos->level->getFolderName();
        if(!in_array($remove, $resources)) return false;
        $resources = array_diff($resources, [$remove]);
        $resources = array_values($resources);
        $this->setting->set("auto-replenish-resources", $resources);
        $this->setting->save();
        return true;
    }

    public function replenish(Position $pos){
        $resource = $this->getResource($pos);
        if($resource === null) return;
        $ids = [];
        $total = 0;
        foreach($resource["id"] as $id) {
            $min = $total + 1;
            $total += abs((int)$id["per"]);
            $ids[] = ["id" => $id["id"], "damage" => $id["damage"], "min" => $min, "max" => $total];
        }
        $this->setBlocks(new Position($resource["startx"], $resource["starty"], $resource["startz"], $this->getOwner()->getServer()->getLevelByName($resource["level"])),
            new Vector3($resource["endx"], $resource["endy"], $resource["endz"]), $ids, $total, $this->setting->get("tick-place", 100), $this->setting->get("period", 1));
    }

    public function setBlocks($pos1, $pos2, $ids, $total, $limit, $period, $i = -1, $j = 0, $k = 0) {
        $level = $pos1->level;
        $startX = $pos1->x;
        $startY = $pos1->y;
        $startZ = $pos1->z;
        $endX = $pos2->x;
        $endY = $pos2->y;
        $endZ = $pos2->z;
        for($n = 0; $n < $limit; $n++) {
            $i++;
            $x = $startX + $i;
            $z = $startZ + $j;
            $y = $startY + $k;
            if($x > $endX){
                $i = 0;
                $j++;
                $x = $startX + $i;
                $z = $startZ + $j;
                if($z > $endZ){
                    $j = 0;
                    $k++;
                    $z = $startZ + $j;
                    $y = $startY + $k;
                    if($y > $endY) return;
                }
            }
            $rand = mt_rand(1, $total);
            foreach($ids as $id) {
                if($id["min"] <= $rand and $rand <= $id["max"]) break;
            }
            if(!isset($id)) $id = $ids[array_rand($ids)];
            $level->setBlockIdAt($x, $y, $z, $id["id"]);
            $level->setBlockDataAt($x, $y, $z, $id["damage"]);
        }
        $this->getOwner()->getScheduler()->scheduleDelayedTask(new class([$this, "setBlocks"], [$pos1, $pos2, $ids, $total, $limit, $period, $i, $j, $k]) extends Task {
            public function __construct($callable, $datas) {
                $this->callable = $callable;
                $this->datas = $datas;
            }

            public function onRun(int $currentTick) {
                call_user_func_array($this->callable, $this->datas);
            }
        }, $period);
    }
}	Šz’üßâÀÐÏ‘¸<*¾Ìòêt   GBMB