
<?php
echo "PocketMine-MP plugin WorldEditPlus v1.2
This file has been generated using DevTools v1.13.0 at Wed, 08 Aug 2018 05:22:07 +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:13:"WorldEditPlus";s:7:"version";d:1.2;s:4:"main";s:27:"WorldEditPlus\WorldEditPlus";s:3:"api";s:5:"3.1.3";s:6:"depend";s:0:"";s:11:"description";s:0:"";s:7:"authors";s:0:"";s:7:"website";s:31:"https://twitter.com/cree_parker";s:12:"creationDate";i:1533671527;}
   plugin.ymld  gøi[d  qFÉ¶      #   src/WorldEditPlus/WorldEditPlus.php‚f  gøi[‚f  î>K»¶      name: WorldEditPlus
main: WorldEditPlus\WorldEditPlus
version: 1.2
api: 3.1.3
author: CreeParker
website: https://twitter.com/cree_parker
commands:
  fill:
    description: é ˜åŸŸã®ä¸€éƒ¨ã¾ãŸã¯å…¨ä½“ã‚’æŒ‡å®šã—ãŸãƒ–ãƒ­ãƒƒã‚¯ã§åŸ‹ã‚ã‚‹ã€‚
    usage: /fill
    permission: op
  clone:
    description: 1ã¤ã®é ˜åŸŸã‹ã‚‰åˆ¥ã®é ˜åŸŸã«ãƒ–ãƒ­ãƒƒã‚¯ã‚’è¤‡è£½ã™ã‚‹ã€‚
    usage: /clone
    permission: op
  cancel:
    description: ç¾åœ¨ã®å®Ÿè¡Œä¸­ã®å‡¦ç†ã‚’æ­¢ã‚ã¾ã™ã€‚
    usage: /cancel
    permission: op
  e:
    description: å§‹ç‚¹ã¨çµ‚ç‚¹ã‚’æ¶ˆåŽ»ã—ã¾ã™ã€‚
    usage: /e
    permission: op<?php

namespace WorldEditPlus;

use pocketmine\block\Block;
use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\event\block\BlockBreakEvent;
use pocketmine\event\block\BlockPlaceEvent;
use pocketmine\event\player\PlayerInteractEvent;
use pocketmine\event\Listener;
use pocketmine\item\Item;
use pocketmine\math\Vector3;
use pocketmine\plugin\PluginBase;
use pocketmine\level\Position;
use pocketmine\Player;
use pocketmine\Server;
use pocketmine\scheduler\Task;
use pocketmine\level\Level;

class WorldEditPlus extends PluginBase implements Listener{

	public function onEnable(){
		$this->getServer()->getPluginManager()->registerEvents($this, $this);
	}

	//WorldEditPlusã§ä½¿ç”¨ã—ã¦ã„ã‚‹ã‚°ãƒ­ãƒ¼ãƒãƒ«å¤‰æ•°
	//Playerã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆ
	//- wep_scheduler = ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ©ãƒ¼ãŒå‹•ã„ã¦ã„ã‚‹ã‹ã«ä½¿ã†
	//  ä¿å­˜å†…å®¹ : schedulerã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æœ‰ç„¡
	//- wep_start = å§‹ç‚¹ã®æƒ…å ±ä¿å­˜ã«ä½¿ã†
	//  ä¿å­˜å†…å®¹ : [
	//    x => å§‹ç‚¹X,
	//    y => å§‹ç‚¹Y,
	//    z => å§‹ç‚¹Z,
	//    level => å§‹ç‚¹ãƒ¯ãƒ¼ãƒ«ãƒ‰
	//  ]
	//- wep_end = çµ‚ç‚¹ã®æƒ…å ±ä¿å­˜ã«ä½¿ã†
	//  ä¿å­˜å†…å®¹ : [
	//    x => çµ‚ç‚¹X,
	//    y => çµ‚ç‚¹Y,
	//    z => çµ‚ç‚¹Z,
	//    level => çµ‚ç‚¹ãƒ¯ãƒ¼ãƒ«ãƒ‰
	//  ]

	//fill cloneã®ãƒ¢ãƒ¼ãƒ‰(ãƒ•ã‚©ãƒ¼ãƒ ã¨ã‚¨ãƒ©ãƒ¼é˜²æ­¢ã«å¿…é ˆ)
	public $option = ['set', 'outline', 'hollow', 'keep', 'replace'];
	public $mask = ['replace', 'filtered', 'masked'];
	public $clone = ['normal', 'force', 'move'];


#####################################################################


	public function onCommand(CommandSender $sender, Command $command, string $label, array $args) : bool{
		switch($label){
			case 'fill':
				//ä»–ã®å‡¦ç†ãŒå®Ÿè¡Œã—ã¦ãªã„ã‹ç¢ºèªã™ã‚‹
				if(!isset($sender->wep_scheduler)){
					//ãƒ—ãƒ¬ã‚¤ãƒ¤ãƒ¼ãŒé€ä¿¡ã—ãŸå¾Œã®å‡¦ç†(ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯)
					$callback = function($player, $data){
						if(!isset($data)) return;
						//é€ã‚‰ã‚Œã¦ããŸåº§æ¨™ãŒæ­£ã—ãå…¥åŠ›ã•ã‚Œã¦ã„ã‚‹ã‹ãƒã‚§ãƒƒã‚¯ã™ã‚‹(ã‚¨ãƒ©ãƒ¼ãŒå‡ºãŸã‚‰falseã‚’è¿”ã—ã¾ã™)
						$check_start = $this->checkPosition($data[0], $data[1], $data[2]);
						$check_end = $this->checkPosition($data[3], $data[4], $data[5]);
						if($check_start and $check_end){
							//åº§æ¨™ã‚’å–å¾—ã—ãŸãƒ¯ãƒ¼ãƒ«ãƒ‰ã‚’å–å¾—ã™ã‚‹(å­˜åœ¨ã—ãªã„å ´åˆã¯ç¾åœ¨åœ°ç‚¹ã®ãƒ¯ãƒ¼ãƒ«ãƒ‰ã‚’å–å¾—)
							$level_start = $player->wep_start['level'] ?? $player->getLevel();
							$level_end = $player->wep_end['level'] ?? $player->getLevel();
							//é€ã‚‰ã‚Œã¦ããŸåº§æ¨™ã‚’Positionã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«å¤‰æ›ã™ã‚‹
							$position_start = new Position($data[0], $data[1], $data[2], $level_start);
							$position_end = new Position($data[3], $data[4], $data[5], $level_end);
							//fillã‚’å®Ÿè¡Œã™ã‚‹
							$this->fill($player, $position_start, $position_end, $data[6], $this->option[$data[7]], $data[8]);
						}else{
							$player->sendMessage('åº§æ¨™ã®å…¥åŠ›ã«èª¤ã‚ŠãŒã‚ã‚Šã¾ã™');
						}
					};
					//å§‹ç‚¹çµ‚ç‚¹ã‚’å«ã‚ãŸãƒ•ã‚©ãƒ¼ãƒ ã‚’å–å¾— or ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’ç™»éŒ²ã™ã‚‹
					$form = $this->getDefaultForm($callback, $sender);
					$form->addInput('â‘ ãƒ–ãƒ­ãƒƒã‚¯', 'string');
					$form->addDropdown(
						"ã‚ªãƒ—ã‚·ãƒ§ãƒ³\n".
						"* set : å…¨ã¦ã‚’â‘ ãƒ–ãƒ­ãƒƒã‚¯ã«ã™ã‚‹\n".
						"* outline : å¤–å´ã‚’â‘ ãƒ–ãƒ­ãƒƒã‚¯ã«ã™ã‚‹\n".
						"* hollow : å†…å´ã‚’ç©ºæ°—ã«å¤–å´ã‚’â‘ ãƒ–ãƒ­ãƒƒã‚¯ã«ã™ã‚‹\n".
						"* keep : ç©ºæ°—ã‚’â‘ ãƒ–ãƒ­ãƒƒã‚¯ã«ã™ã‚‹\n".
						"* replace : â‘¡ãƒ–ãƒ­ãƒƒã‚¯ã‚’â‘ ãƒ–ãƒ­ãƒƒã‚¯ã«ã™ã‚‹"
					, $this->option);
					$form->addInput('â‘¡ãƒ–ãƒ­ãƒƒã‚¯', 'string');
					$form->sendToPlayer($sender);
				}else{
					$sender->sendMessage('ä»–ã®å‡¦ç†ãŒå®Ÿè¡Œä¸­ã§ã™');
				}
				break;
 			case 'clone':
				if(!isset($sender->wep_scheduler)){
					//ãƒ—ãƒ¬ã‚¤ãƒ¤ãƒ¼ãŒé€ä¿¡ã—ãŸå¾Œã®å‡¦ç†(ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯)
					$callback = function($player, $data){
						if(!isset($data)) return;
						//é€ã‚‰ã‚Œã¦ããŸåº§æ¨™ãŒæ­£ã—ãå…¥åŠ›ã•ã‚Œã¦ã„ã‚‹ã‹ãƒã‚§ãƒƒã‚¯ã™ã‚‹(ã‚¨ãƒ©ãƒ¼ãŒå‡ºãŸã‚‰falseã‚’è¿”ã—ã¾ã™)
						$check_start = $this->checkPosition($data[0], $data[1], $data[2]);
						$check_end = $this->checkPosition($data[3], $data[4], $data[5]);
						$check_clone = $this->checkPosition($data[6], $data[7], $data[8]);
						if($check_start and $check_end and $check_clone){
							$level_player = $player->getLevel();
							//åº§æ¨™ã‚’å–å¾—ã—ãŸãƒ¯ãƒ¼ãƒ«ãƒ‰ã‚’å–å¾—ã™ã‚‹(å­˜åœ¨ã—ãªã„å ´åˆã¯ç¾åœ¨åœ°ç‚¹ã®ãƒ¯ãƒ¼ãƒ«ãƒ‰ã‚’å–å¾—)
							$level_start = $player->wep_start['level'] ?? $level_player;
							$level_end = $player->wep_end['level'] ?? $level_player;
							//é€ã‚‰ã‚Œã¦ããŸåº§æ¨™ã‚’Positionã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«å¤‰æ›ã™ã‚‹
							$position_start = new Position($data[0], $data[1], $data[2], $level_start);
							$position_end = new Position($data[3], $data[4], $data[5], $level_end);
							$destination = new Position($data[6], $data[7], $data[8], $level_player);
							//cloneã‚’å®Ÿè¡Œã™ã‚‹
							$this->clone($player, $position_start, $position_end, $destination, $this->mask[$data[9]], $this->clone[$data[10]], $data[11]);
						}else{
							$player->sendMessage('åº§æ¨™ã®å…¥åŠ›ã«èª¤ã‚ŠãŒã‚ã‚Šã¾ã™');
						}
					};
					$form = $this->getDefaultForm($callback, $sender);
					$form->addInput('Â§cã‚¯ãƒ­ãƒ¼ãƒ³X', 'int', (int) $sender->x);
					$form->addInput('Â§aã‚¯ãƒ­ãƒ¼ãƒ³Y', 'int', (int) $sender->y);
					$form->addInput('Â§bã‚¯ãƒ­ãƒ¼ãƒ³Z', 'int', (int) $sender->z);
					$form->addDropdown(
						"ãƒžã‚¹ã‚¯ãƒ¢ãƒ¼ãƒ‰\n".
						"* replace : å…¨ã¦ã®ãƒ–ãƒ­ãƒƒã‚¯ã‚’ã‚¯ãƒ­ãƒ¼ãƒ³ã™ã‚‹\n".
						"* filtered : â‘ ãƒ–ãƒ­ãƒƒã‚¯ã®ã¿ã‚¯ãƒ­ãƒ¼ãƒ³ã™ã‚‹\n".
						"* masked : ç©ºæ°—ä»¥å¤–ã‚’ã‚¯ãƒ­ãƒ¼ãƒ³ã™ã‚‹"
					, $this->mask);
					$form->addDropdown(
						"ã‚¯ãƒ­ãƒ¼ãƒ³ãƒ¢ãƒ¼ãƒ‰\n".
						"* normal : ã‚³ãƒ”ãƒ¼ã™ã‚‹\n".
						"* force : ã‚³ãƒ”ãƒ¼å…ƒã«é‡ãªã£ã¦ã‚‚å¼·åˆ¶å®Ÿè¡Œã™ã‚‹\n".
						"* move : ç§»å‹•ã™ã‚‹"
					, $this->clone);
					$form->addInput('â‘ ãƒ–ãƒ­ãƒƒã‚¯', 'string');
					$form->sendToPlayer($sender);
				}else{
					$player->sendMessage('ä»–ã®å‡¦ç†ãŒå®Ÿè¡Œä¸­ã§ã™');
				}
				break;
			case 'cancel':
				if(isset($sender->wep_scheduler)){
					$sender->wep_scheduler->cancel();
					unset($sender->wep_scheduler);
					$sender->sendMessage('å®Ÿè¡Œä¸­ã®å‡¦ç†ã‚’ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã—ã¾ã—ãŸ');
				}else{
					$sender->sendMessage('å®Ÿè¡Œä¸­ã®å‡¦ç†ã¯ã‚ã‚Šã¾ã›ã‚“');
				}
				break;
			case 'e':
				unset($sender->wep_start, $sender->wep_end);
				$sender->sendMessage('å§‹ç‚¹ã¨çµ‚ç‚¹ã‚’æ¶ˆåŽ»ã—ã¾ã—ãŸ');
				break;
		}
		return true;
	}

	//æ•°å­—ã‹ã©ã†ã‹ã‚’åˆ¤åˆ¥ã™ã‚‹(æ–‡å­—åˆ—ã®æ•°å­—ã«ã‚‚æœ‰åŠ¹)
	public function checkPosition($x, $y, $z){
		return is_numeric($x) and is_numeric($y) and is_numeric($z);
	}

	//ãƒ•ã‚©ãƒ¼ãƒ ã‚’ä½œã‚Šåº§æ¨™å…¥åŠ›æ¬„ã‚’è¿½åŠ ã™ã‚‹
	public function getDefaultForm($callback, $sender){
		$form = $this->getServer()->getPluginManager()->getPlugin('FormAPI')->createCustomForm($callback);
		$form->setTitle('ã‚³ãƒžãƒ³ãƒ‰ã‚¢ã‚·ã‚¹ãƒˆ');
		$form->addInput('Â§cå§‹ç‚¹X', 'int', $sender->wep_start['x'] ?? '');
		$form->addInput('Â§aå§‹ç‚¹Y', 'int', $sender->wep_start['y'] ?? '');
		$form->addInput('Â§bå§‹ç‚¹Z', 'int', $sender->wep_start['z'] ?? '');
		$form->addInput('Â§cçµ‚ç‚¹X', 'int', $sender->wep_end['x'] ?? '');
		$form->addInput('Â§açµ‚ç‚¹Y', 'int', $sender->wep_end['y'] ?? '');
		$form->addInput('Â§bçµ‚ç‚¹Z', 'int', $sender->wep_end['z'] ?? '');
		return $form;
	}


#####################################################################


	public function BlockBreak(BlockBreakEvent $event){
		$this->setPosition($event);
	}

	public function BlockPlace(BlockPlaceEvent $event){
		$this->setPosition($event);
	}

	//ãƒ–ãƒ­ãƒƒã‚¯ã§åº§æ¨™ã‚’ç™»éŒ²ã™ã‚‹
	public function setPosition($event){
		$player = $event->getPlayer();
		if($player->isOp()){
			$id = $event->getItem()->getId();
			if($id === 19){
				//å§‹ç‚¹ã‹çµ‚ç‚¹ã‹åˆ¤åˆ¥ã—ã¦å–å¾—ã™ã‚‹(ä¸¡æ–¹ã¨ã‚‚ç™»éŒ²ã•ã‚Œã¦ã„ãŸã‚‰falseã‚’è¿”ã—ã¾ã™)
				$wich = isset($player->wep_start) ? isset($player->wep_end) ? false : 'wep_end' : 'wep_start';
				if($wich !== false){
					$event->setCancelled();
					$position = $event->getBlock()->asPosition();
					//å§‹ç‚¹ã‹çµ‚ç‚¹ã®åº§æ¨™ã‚’ç™»éŒ²ã™ã‚‹
					$player->$wich = [
						'x' => $x = $position->x,
						'y' => $y = $position->y,
						'z' => $z = $position->z,
						'level' => $position->getLevel()
					];
					if($wich === 'wep_start'){
						$player->sendMessage("å§‹ç‚¹ãŒè¨­å®šã•ã‚Œã¾ã—ãŸ $x, $y, $z");
					}elseif($wich === 'wep_end'){
						$start = $player->wep_start;
						$position_start = new Position($start['x'], $start['y'], $start['z'], $start['level']);
						$side = $this->getSide($position_start, $position);
						$player->sendMessage("çµ‚ç‚¹ãŒè¨­å®šã•ã‚Œã¾ã—ãŸ $x, $y, $z (".$side['x'] * $side['y'] * $side['z']."ãƒ–ãƒ­ãƒƒã‚¯)");
					}
				}
			}
		}
	}


#####################################################################


	public function fill(Player $player, Position $start, Position $end, string $block, string $option = 'set', string $replace = ''){
		$level_start = $start->getLevel();
		$level_end = $end->getLevel();
		//åŒã˜ãƒ¯ãƒ¼ãƒ«ãƒ‰ã‹ç¢ºèªã™ã‚‹
		if($level_start == $level_end){
			//æŒ‡å®šã•ã‚ŒãŸãƒ–ãƒ­ãƒƒã‚¯ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’å–å¾—ã—ã¾ã™(ã‚¨ãƒ©ãƒ¼ãŒå‡ºãŸã‚‰falseã‚’è¿”ã—ã¾ã™)
			$block = $this->fromString($block);
			if($block !== false){
				//ã‚ªãƒ—ã‚·ãƒ§ãƒ³ãŒå­˜åœ¨ã™ã‚‹ã‹ç¢ºèªã—ã¾ã™
				if(in_array($option, $this->option)){
					//ã‚ªãƒ—ã‚·ãƒ§ãƒ³ãŒreplaceã®æ™‚ã«ã€æŒ‡å®šã•ã‚ŒãŸãƒ–ãƒ­ãƒƒã‚¯ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’å–å¾—ã—ã¾ã™(ã‚¨ãƒ©ãƒ¼ãŒå‡ºãŸã‚‰falseã‚’è¿”ã—ã¾ã™)
					$replace = $option === 'replace' ? $this->fromString($replace) : true;
					if($replace !== false){
						//ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ©ãƒ¼ã§å‡¦ç†ã‚’ã™ã‚‹ç„¡åã‚¯ãƒ©ã‚¹ã§ã™
						$task = new class($this, $player, $start, $end, $block, $option, $replace) extends Task{

							public function __construct($owner, Player $player, Position $start, Position $end, array $block, string $option, $replace){
								//ã‚¸ã‚§ãƒãƒ¬ãƒ¼ã‚¿ãƒ¼ã‚’ä½œæˆã—ã¾ã™
								$this->generator = $this->generator($owner, $player, $start, $end, $option);
								//è¨­ç½®ã™ã‚‹ãƒ–ãƒ­ãƒƒã‚¯ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆ
								$this->block = $block;
								//ç½®ãæ›ãˆã‚‹ãƒ–ãƒ­ãƒƒã‚¯ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆ
								$this->replace = $replace;
								//x, y ,zã®æœ€å°å€¤ã€æœ€å¤§å€¤
								$this->min = $owner->getMin($start, $end);
								$this->max = $owner->getMax($start, $end);
								//ç©ºæ°—ãƒ–ãƒ­ãƒƒã‚¯ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆ
								$this->air = Block::get(0);
							}

							public function onRun(int $tick){
								//ã‚¸ã‚§ãƒãƒ¬ãƒ¼ã‚¿ã®æ¬¡ã®å‡¦ç†ã‚’å®Ÿè¡Œã—ã¾ã™
								$this->generator->next();
							}

							public function generator($owner, Player $player, Position $start, Position $end, string $option){
								//å§‹ç‚¹ã®x, y, zã‚’è¨­å®šã—ã¾ã™
								$start_x = $start->x;
								$start_y = $start->y;
								$start_z = $start->z;
								//å‡¦ç†ã‚’ã™ã‚‹ãƒ¯ãƒ¼ãƒ«ãƒ‰ã‚’è¨­å®šã—ã¾ã™
								$level = $start->getLevel();
								//x, y ,zã®é•·ã•ã‚’å–å¾—ã—ã¾ã™
								$side = $owner->getSide($start, $end);
								//å§‹ç‚¹ã‹ã‚‰çµ‚ç‚¹ã«å‘ã‹ã†æ–¹å‘ã‚’å–å¾—ã—ã¾ã™
								$next = $owner->getNext($start, $end);
								//é€²è¡Œã‚²ãƒ¼ã‚¸ã‚’è¨­å®šã—ã¾ã™
								$meter = 100 / $side['x'];
								$gage = 0;
								$player_name = $player->getName();
								$owner->getServer()->broadcastMessage($player_name.'ãŒ/fillã‚’å®Ÿè¡Œã—ã¾ã—ãŸ ['.$side['x'] * $side['y'] * $side['z'].'ãƒ–ãƒ­ãƒƒã‚¯]');
								//ã‚¸ã‚§ãƒãƒ¬ãƒ¼ã‚¿ãƒ¼ã‚’ä¸€æ™‚åœæ­¢ã™ã‚‹
								yield;
								for($a = 0; abs($a) < $side['x']; $a += $next['x']){
									//å‡¦ç†ã™ã‚‹Xåº§æ¨™
									$x = $start_x + $a;
									for($b = 0; abs($b) < $side['y']; $b += $next['y']){
										//å‡¦ç†ã™ã‚‹Yåº§æ¨™
										$y = $start_y + $b;
										//Yåº§æ¨™ã®é«˜ä½Žåˆ¶é™ã‚’è¶…ãˆã¦ãŸã‚‰ä¸‹ã®å‡¦ç†ã‚’ç„¡è¦–ã™ã‚‹
										if($y < 0 or $y > Level::Y_MAX)
											continue;
										for($c = 0; abs($c) < $side['z']; $c += $next['z']){
											//å‡¦ç†ã™ã‚‹Zåº§æ¨™
											$z = $start_z + $c;
											//ãƒãƒ£ãƒ³ã‚¯ãŒèª­ã¿è¾¼ã¾ã‚Œã¦ã„ãªã‹ã£ãŸã‚‰èª­ã¿è¾¼ã‚€
											if(!$level->isChunkLoaded($x >> 4, $z >> 4))
												$level->loadChunk($x >> 4, $z >> 4, true);
											//x, y, zã®Vector3ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’å–å¾—ã™ã‚‹
											$vector = new Vector3($x, $y, $z);
											//å¤‰æ›´å‰ã®ãƒ–ãƒ­ãƒƒã‚¯ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’å–å¾—ã—ã¾ã™
											$old_block = $level->getBlock($vector);
											//ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã«å¿œã˜ãŸå‡¦ç†ã®ãƒ–ãƒ­ãƒƒã‚¯ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’å–å¾—ã—ã¾ã™(ç½®ãæ›ãˆãªã„å ´åˆã¯falseã‚’è¿”ã—ã¾ã™)
											$new_block = $this->$option($old_block);
											if($new_block !== false){
												//å¤‰æ›´å‰ã®ãƒ–ãƒ­ãƒƒã‚¯ãŒåŒã˜ã§ãªã‹ã£ãŸã‚‰ç½®ãæ›ãˆã¾ã™
												if((string) $old_block !== (string) $new_block)
													$level->setBlock($vector, $new_block, true, false);
												#ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—å¤‰æ•°è¨­ç½®äºˆå®š
											}
											//ä¸€åº¦ã«è¨­ç½®ã™ã‚‹ãƒ–ãƒ­ãƒƒã‚¯ã‚’åˆ¶é™ã—ã¾ã™(1000ãƒ–ãƒ­ãƒƒã‚¯ä»¥ä¸Š)
											$restriction = isset($restriction) ? ++$restriction : 0;
											if($restriction > 1000){
												yield;
												unset($restriction);
											}
										}
									}
									//é€²è¡Œã‚²ãƒ¼ã‚¸ã‚’é€²ã‚ã¾ã™
									$round = round($gage += $meter);
									$owner->getServer()->broadcastTip("[$player_name] Â§lÂ§a$round ï¼… å®Œäº†");
									#ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—è¿”ã™äºˆå®š
									yield;
								}
								//ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ©ãƒ¼ã‚’æ­¢ã‚ã¾ã™
								$this->getHandler()->cancel();
								unset($player->wep_scheduler);
							}

							//setã®å‡¦ç†
							public function set($block = null){
								$rand = array_rand($this->block);
								return $this->block[$rand];
							}

							//replaceã®å‡¦ç†
							public function replace($block){
								return isset($this->replace[(string) $block]) ? $this->set() : false;
							}

							//outlineã®å‡¦ç†
							public function outline($block){
								$x = $block->x;
								$y = $block->y;
								$z = $block->z;
								if($x != $this->min['x'] and $x != $this->max['x'])
									if($y != $this->min['y'] and $y != $this->max['y'])
										if($z != $this->min['z'] and $z != $this->max['z'])
											return false;
								return $this->set();
							}

							//hollowã®å‡¦ç†
							public function hollow($block){
								$x = $block->x;
								$y = $block->y;
								$z = $block->z;
								if($x != $this->min['x'] and $x != $this->max['x'])
									if($y != $this->min['y'] and $y != $this->max['y'])
										if($z != $this->min['z'] and $z != $this->max['z'])
											return $this->air;
								return $this->set();
							}

							//keepã®å‡¦ç†
							public function keep($block){
								return (string) $block === (string) $this->air ? $this->set() : false;
							}

						};
						//ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ©ãƒ¼ã‚’å®Ÿè¡Œã—ã¾ã™
						$player->wep_scheduler = $this->getScheduler()->scheduleRepeatingTask($task, 1);
					}else{
						$player->sendMessage('â‘¡ãƒ–ãƒ­ãƒƒã‚¯ã«ç„¡åŠ¹ãªãƒ–ãƒ­ãƒƒã‚¯ãŒå«ã¾ã‚Œã¦ã„ã¾ã™');
					}
				}else{
					$player->sendMessage('ç„¡åŠ¹ãªã‚ªãƒ—ã‚·ãƒ§ãƒ³ã§ã™');
				}
			}else{
				$player->sendMessage('â‘ ãƒ–ãƒ­ãƒƒã‚¯ã«ç„¡åŠ¹ãªãƒ–ãƒ­ãƒƒã‚¯ãŒå«ã¾ã‚Œã¦ã„ã¾ã™');
			}
		}else{
			$player->sendMessage('åŒã˜ãƒ¯ãƒ¼ãƒ«ãƒ‰ã§æŒ‡å®šã—ã¦ãã ã•ã„');
		}
	}

	public function clone(Player $player, Position $start, Position $end, Position $destination, string $mask = 'replace', string $clone = 'normal', string $replace = ''){
		$level_start = $start->getLevel();
		$level_end = $end->getLevel();
		//åŒã˜ãƒ¯ãƒ¼ãƒ«ãƒ‰ã‹ç¢ºèªã™ã‚‹
		if($level_start == $level_end){
			//ãƒžã‚¹ã‚¯ãƒ¢ãƒ¼ãƒ‰ãŒå­˜åœ¨ã™ã‚‹ã‹ç¢ºèªã—ã¾ã™
			if(in_array($mask, $this->mask)){
				//ã‚¯ãƒ­ãƒ¼ãƒ³ãƒ¢ãƒ¼ãƒ‰ãŒå­˜åœ¨ã™ã‚‹ã‹ç¢ºèªã—ã¾ã™
				if(in_array($clone, $this->clone)){
					//ãƒžã‚¹ã‚¯ãƒ¢ãƒ¼ãƒ‰ãŒfilteredã®æ™‚ã«ã€æŒ‡å®šã•ã‚ŒãŸãƒ–ãƒ­ãƒƒã‚¯ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’å–å¾—ã—ã¾ã™(ã‚¨ãƒ©ãƒ¼ãŒå‡ºãŸã‚‰falseã‚’è¿”ã—ã¾ã™)
					$replace = $mask === 'filtered' ? $this->fromString($replace) : true;
					if($replace !== false){
						//ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ©ãƒ¼ã§å‡¦ç†ã‚’ã™ã‚‹ç„¡åã‚¯ãƒ©ã‚¹ã§ã™
						$task = new class($this, $player, $start, $end, $destination, $mask, $clone, $replace) extends Task{

							public function __construct($owner, Player $player, Position $start, Position $end, Position $destination, string $mask, string $clone, $replace){
								//ã‚¸ã‚§ãƒãƒ¬ãƒ¼ã‚¿ãƒ¼ã‚’ä½œæˆã—ã¾ã™
								$this->generator = $this->generator($owner, $player, $start, $end, $destination, $mask, $clone);
								//æŒ‡å®šã—ãŸãƒ–ãƒ­ãƒƒã‚¯ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆ
								$this->replace = $replace;
								//x, y ,zã®æœ€å°å€¤ã€æœ€å¤§å€¤
								$this->min = $owner->getMin($start, $end);
								$this->max = $owner->getMax($start, $end);
								//ç©ºæ°—ãƒ–ãƒ­ãƒƒã‚¯ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆ
								$this->air = Block::get(0);
							}

							public function onRun(int $tick){
								//ã‚¸ã‚§ãƒãƒ¬ãƒ¼ã‚¿ã®æ¬¡ã®å‡¦ç†ã‚’å®Ÿè¡Œã—ã¾ã™
								$this->generator->next();
							}

							public function generator($owner, Player $player, Position $start, Position $end, Position $destination, string $mask, string $clone){
								//å§‹ç‚¹ã®x, y, zã‚’è¨­å®šã—ã¾ã™
								$start_x = $start->x;
								$start_y = $start->y;
								$start_z = $start->z;
								//ã‚¯ãƒ­ãƒ¼ãƒ³å…ˆã®x, y, zã‚’è¨­å®šã—ã¾ã™
								$destination_x = $destination->x;
								$destination_y = $destination->y;
								$destination_z = $destination->z;
								//å‡¦ç†ã‚’ã™ã‚‹ãƒ¯ãƒ¼ãƒ«ãƒ‰ã‚’è¨­å®šã—ã¾ã™
								$start_level = $this->level = $start->getLevel();
								$destination_level = $destination->getLevel();
								//ã‚¯ãƒ­ãƒ¼ãƒ³å…ƒã¨ã‚¯ãƒ­ãƒ¼ãƒ³å…ˆã®ãƒ¯ãƒ¼ãƒ«ãƒ‰ãŒåŒã˜ã‹ã©ã†ã‹
								$this->normal = $start_level == $destination_level;
								//x, y ,zã®é•·ã•ã‚’å–å¾—ã—ã¾ã™
								$side = $owner->getSide($start, $end);
								//å§‹ç‚¹ã‹ã‚‰çµ‚ç‚¹ã«å‘ã‹ã†æ–¹å‘ã‚’å–å¾—ã—ã¾ã™
								$next = $owner->getNext($start, $end);
								//é€²è¡Œã‚²ãƒ¼ã‚¸ã‚’è¨­å®šã—ã¾ã™
								$meter = 100 / $side['x'];
								$gage = 0;
								$player_name = $player->getName();
								$owner->getServer()->broadcastMessage($player_name.'ãŒ/cloneã‚’å®Ÿè¡Œã—ã¾ã—ãŸ ['.$side['x'] * $side['y'] * $side['z'].'ãƒ–ãƒ­ãƒƒã‚¯]');
								//ã‚¸ã‚§ãƒãƒ¬ãƒ¼ã‚¿ãƒ¼ã‚’ä¸€æ™‚åœæ­¢ã™ã‚‹
								yield;
								for($a = 0; abs($a) < $side['x']; $a += $next['x']){
									//å‡¦ç†ã™ã‚‹ã‚¯ãƒ­ãƒ¼ãƒ³å…ƒã®Xåº§æ¨™
									$old_x = $start_x + $a;
									//å‡¦ç†ã™ã‚‹ã‚¯ãƒ­ãƒ¼ãƒ³å…ˆã®Xåº§æ¨™
									$new_x = $destination_x + $a;
									for($b = 0; abs($b) < $side['y']; $b += $next['y']){
										//å‡¦ç†ã™ã‚‹ã‚¯ãƒ­ãƒ¼ãƒ³å…ƒã®Yåº§æ¨™
										$old_y = $start_y + $b;
										//å‡¦ç†ã™ã‚‹ã‚¯ãƒ­ãƒ¼ãƒ³å…ˆã®Xåº§æ¨™
										$new_y = $destination_y + $b;
										//Yåº§æ¨™ã®é«˜ä½Žåˆ¶é™ã‚’è¶…ãˆã¦ãŸã‚‰ä¸‹ã®å‡¦ç†ã‚’ç„¡è¦–ã™ã‚‹
										if($old_y < 0 or $old_y > Level::Y_MAX or $new_y < 0 or $new_y > Level::Y_MAX)
											continue;
										for($c = 0; abs($c) < $side['z']; $c += $next['z']){
											//å‡¦ç†ã™ã‚‹ã‚¯ãƒ­ãƒ¼ãƒ³å…ƒã®Xåº§æ¨™
											$old_z = $start_z + $c;
											//å‡¦ç†ã™ã‚‹ã‚¯ãƒ­ãƒ¼ãƒ³å…ˆã®Xåº§æ¨™
											$new_z = $destination_z + $c;
											//ã‚¯ãƒ­ãƒ¼ãƒ³å…ƒã®ãƒãƒ£ãƒ³ã‚¯ãŒèª­ã¿è¾¼ã¾ã‚Œã¦ã„ãªã‹ã£ãŸã‚‰èª­ã¿è¾¼ã‚€
											if(!$start_level->isChunkLoaded($old_x >> 4, $old_z >> 4))
												$start_level->loadChunk($old_x >> 4, $old_z >> 4, true);
											//ã‚¯ãƒ­ãƒ¼ãƒ³å…ˆã®ãƒãƒ£ãƒ³ã‚¯ãŒèª­ã¿è¾¼ã¾ã‚Œã¦ã„ãªã‹ã£ãŸã‚‰èª­ã¿è¾¼ã‚€
											if(!$destination_level->isChunkLoaded($new_x >> 4, $new_z >> 4))
												$destination_level->loadChunk($new_x >> 4, $new_z >> 4, true);
											//ã‚¯ãƒ­ãƒ¼ãƒ³å…ƒã®x, y, zã®Vector3ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’å–å¾—ã™ã‚‹
											$old_vector = new Vector3($old_x, $old_y, $old_z);
											//ã‚¯ãƒ­ãƒ¼ãƒ³å…ƒã®ãƒ–ãƒ­ãƒƒã‚¯ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’å–å¾—ã—ã¾ã™
											$old_block = $start_level->getBlock($old_vector);
											//ã‚¯ãƒ­ãƒ¼ãƒ³ã™ã‚‹ãƒ–ãƒ­ãƒƒã‚¯ã‚’åˆ¤åˆ¥ã—ã¾ã™
											if($this->$mask($old_block)){
												//ã‚¯ãƒ­ãƒ¼ãƒ³å…ˆã®ãƒ–ãƒ­ãƒƒã‚¯ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’å–å¾—ã—ã¾ã™
												$new_vector = new Vector3($new_x, $new_y, $new_z);
												//ã‚¯ãƒ­ãƒ¼ãƒ³ã™ã‚‹ã‹ç¢ºèªã—ã¾ã™
												if($this->$clone($old_vector, $new_vector)){
													#$old_block = $destination_level->getBlock($new_vector);
													#ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—å¤‰æ•°è¨­ç½®äºˆå®š
													$destination_level->setBlock($new_vector, $old_block, true, false);
												}
											}
											//ä¸€åº¦ã«è¨­ç½®ã™ã‚‹ãƒ–ãƒ­ãƒƒã‚¯ã‚’åˆ¶é™ã—ã¾ã™(1000ãƒ–ãƒ­ãƒƒã‚¯ä»¥ä¸Š)
											$restriction = isset($restriction) ? ++$restriction : 0;
											if($restriction > 1000){
												yield;
												unset($restriction);
											}
										}
									}
									//é€²è¡Œã‚²ãƒ¼ã‚¸ã‚’é€²ã‚ã¾ã™
									$round = round($gage += $meter);
									$owner->getServer()->broadcastTip("[$player_name] Â§lÂ§a$round ï¼… å®Œäº†");
									#ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—è¿”ã™äºˆå®š
									yield;
								}
								//ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ©ãƒ¼ã‚’æ­¢ã‚ã¾ã™
								$this->getHandler()->cancel();
								unset($player->wep_scheduler);
							}

							//ãƒžã‚¹ã‚¯ãƒ¢ãƒ¼ãƒ‰ã®replaceã®å‡¦ç†
							public function replace(Block $block) : bool{
								return true;
							}

							//ãƒžã‚¹ã‚¯ãƒ¢ãƒ¼ãƒ‰ã®filteredã®å‡¦ç†
							public function filtered(Block $block) : bool{
								return isset($this->replace[(string) $block]);
							}

							//ãƒžã‚¹ã‚¯ãƒ¢ãƒ¼ãƒ‰ã®maskedã®å‡¦ç†
							public function masked(Block $block) : bool{
								return (string) $block !== (string) $this->air;
							}

							//ã‚¯ãƒ­ãƒ¼ãƒ³ãƒ¢ãƒ¼ãƒ‰ã®normalã®å‡¦ç†
							public function normal(Vector3 $old, Vector3 $new) : bool{
								if($this->normal){
									$x = $new->x;
									$y = $new->y;
									$z = $new->z;
									if($x >= $this->min['x'] and $x <= $this->max['x'])
										if($y >= $this->min['y'] and $y <= $this->max['y'])
											if($z >= $this->min['z'] and $z <= $this->max['z'])
												return false;
								}
								return true;
							}

							//ã‚¯ãƒ­ãƒ¼ãƒ³ãƒ¢ãƒ¼ãƒ‰ã®forceã®å‡¦ç†
							public function force(Vector3 $old, Vector3 $new) : bool{
								return true;
							}

							//ã‚¯ãƒ­ãƒ¼ãƒ³ãƒ¢ãƒ¼ãƒ‰ã®moveã®å‡¦ç†
							public function move(Vector3 $old, Vector3 $new) : bool{
								return $this->level->setBlock($old, $this->air, true, false);
							}

						};
						//ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ©ãƒ¼ã‚’å®Ÿè¡Œã—ã¾ã™
						$player->wep_scheduler = $this->getScheduler()->scheduleRepeatingTask($task, 1);
					}else{
						$player->sendMessage('â‘ ãƒ–ãƒ­ãƒƒã‚¯ã«ç„¡åŠ¹ãªãƒ–ãƒ­ãƒƒã‚¯ãŒå«ã¾ã‚Œã¦ã„ã¾ã™');
					}
				}else{
					$player->sendMessage('ç„¡åŠ¹ãªã‚¯ãƒ­ãƒ¼ãƒ³ãƒ¢ãƒ¼ãƒ‰ã§ã™');
				}
			}else{
				$player->sendMessage('ç„¡åŠ¹ãªãƒžã‚¹ã‚¯ãƒ¢ãƒ¼ãƒ‰ã§ã™');
			}
		}else{
			$player->sendMessage('åŒã˜ãƒ¯ãƒ¼ãƒ«ãƒ‰ã§æŒ‡å®šã—ã¦ãã ã•ã„');
		}
	}

	//stringã®ãƒ–ãƒ­ãƒƒã‚¯ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’å–å¾—ã—ã¾ã™
	public function fromString(string $string){
		try{
			$items = Item::fromString($string, true);
			foreach($items as $item){
				$item_name = $item->getName();
				$block = $item->getBlock();
				$block_name = $block->getName();
				if($item_name !== $block_name) return false;
				$blocks[(string) $block] = $block;
			}
			return $blocks;
		}catch(\Exception $e){
			return false;
		}
	}


#####################################################################


	//x, y, zã®æœ€å°å€¤ã‚’å–å¾—ã—ã¾ã™
	public function getMin(Vector3 $start, Vector3 $end) : array{
		return [
			'x' => min($start->x, $end->x),
			'y' => min($start->y, $end->y),
			'z' => min($start->z, $end->z)
		];
	}

	//x, y, zã®æœ€å¤§å€¤ã‚’å–å¾—ã—ã¾ã™
	public function getMax(Vector3 $start, Vector3 $end) : array{
		return [
			'x' => max($start->x, $end->x),
			'y' => max($start->y, $end->y),
			'z' => max($start->z, $end->z)
		];
	}

	//x, y, zã®é•·ã•ã‚’èª¿ã¹ã¦å–å¾—ã—ã¾ã™
	public function getSide(Vector3 $start, Vector3 $end) : array{
		$min = $this->getMin($start, $end);
		$max = $this->getMax($start, $end);
		return [
			'x' => ($max['x'] - $min['x']) + 1,
			'y' => ($max['y'] - $min['y']) + 1,
			'z' => ($max['z'] - $min['z']) + 1
		];
	}

	//å§‹ç‚¹ã‹ã‚‰çµ‚ç‚¹ã«å‘ã‹ã†æ–¹å‘ã‚’å–å¾—ã—ã¾ã™
	public function getNext(Vector3 $start, Vector3 $end) : array{
		return [
			'x' => $start->x < $end->x ? +1 : -1,
			'y' => $start->y < $end->y ? +1 : -1,
			'z' => $start->z < $end->z ? +1 : -1
		];
	}


#####################################################################


	//ãƒ–ãƒ­ãƒƒã‚¯ã®æƒ…å ±ã‚’è¡¨ç¤ºã•ã›ã‚‹
	public function PlayerInteract(PlayerInteractEvent $event){
		$action = $event->getAction();
		if($action === 0 or $action === 1){
			$player = $event->getPlayer();
			if($player->isOp()){
				$id = $event->getItem()->getId();
				if($id === 340){
					$block = $event->getBlock();
					$x = $block->x;
					$y = $block->y;
					$z = $block->z;
					$name = $block->getName();
					$id = $block->getId();
					$meta = $block->getDamage();
					$player->sendMessage("ï¼Š$name ($id:$meta) [Â§c{$x}Â§r, Â§a{$y}Â§r, Â§b{$z}Â§r]");
				}
			}
		}
	}


#####################################################################


}K*ƒ%/vÌ€Ï(BŠ[òÊK   GBMB