
<?php
echo "PocketMine-MP plugin WorldEditPlus v2.1
This file has been generated using DevTools v1.13.0 at Sun, 19 Aug 2018 03:57:16 +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(); ?>
¨             1  a:9:{s:4:"name";s:13:"WorldEditPlus";s:7:"version";d:2.1;s:4:"main";s:27:"WorldEditPlus\WorldEditPlus";s:3:"api";a:2:{i:0;s:5:"3.0.0";i:1;s:5:"4.0.0";}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:1534616836;}
   plugin.yml  ex[  özº¶      #   src/WorldEditPlus/WorldEditPlus.php ²  ex[ ²  vžÄU¶      name: WorldEditPlus
main: WorldEditPlus\WorldEditPlus
version: 2.1
api: [3.0.0, 4.0.0]
author: CreeParker
website: https://twitter.com/cree_parker
commands:
  fill:
    description: é ˜åŸŸã®ä¸€éƒ¨ã¾ãŸã¯å…¨ä½“ã‚’æŒ‡å®šã—ãŸãƒ–ãƒ­ãƒƒã‚¯ã§åŸ‹ã‚ã‚‹ã€‚
    usage: /fill <x1> <y1> <z1> <x2> <y2> <z2> <block> [set|outline|hollow|keep|replace] [block]
    permission: op
  clone:
    description: 1ã¤ã®é ˜åŸŸã‹ã‚‰åˆ¥ã®é ˜åŸŸã«ãƒ–ãƒ­ãƒƒã‚¯ã‚’è¤‡è£½ã™ã‚‹ã€‚
    usage: /clone <x1> <y1> <z1> <x2> <y2> <z2> <x3> <y3> <z3> [replace|filtered|masked] [normal|force|move] [block] 
    permission: op
  cylinder:
    description: å††æŸ±ã®å½¢ã‚’ä½œã‚Šã¾ã™ã€‚
    usage: /cylinder <x1> <y1> <z1> <x2> <y2> <z2> <block> <x|y|z>
    permission: op
  sphere:
    description: çƒã®å½¢ã‚’ä½œã‚Šã¾ã™ã€‚
    usage: /sphere <x1> <y1> <z1> <x2> <y2> <z2> <block>
    permission: op
  cancel:
    description: ç¾åœ¨ã®å®Ÿè¡Œä¸­ã®å‡¦ç†ã‚’æ­¢ã‚ã¾ã™ã€‚
    usage: /cancel
    permission: op
  wand:
    description: å§‹ç‚¹ã¨çµ‚ç‚¹ã‚’æ±ºã‚ã‚‹æ–§ã‚’å–ã‚Šå‡ºã—ã¾ã™ã€‚
    usage: /wand
    permission: op
  pos1:
    description: å§‹ç‚¹ã‚’è¨­å®šã—ã¾ã™ã€‚
    usage: /pos1 [x] [y] [z]
    permission: 
  pos2:
    description: çµ‚ç‚¹ã‚’è¨­å®šã—ã¾ã™ã€‚
    usage: /pos2 [x] [y] [z]
    permission: op<?php

namespace WorldEditPlus;

use pocketmine\block\Block;
use pocketmine\command\Command;
use pocketmine\command\CommandSender as Sender;
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 $direction = ['x', 'y', 'z'];
	#public $accuracy = ['ä½Ž', 'ä¸­', 'é«˜', 'æœ€é«˜'];


#####################################################################


	public function onCommand(Sender $sender, Command $command, string $label, array $args) : bool{
		switch($label){
			case 'fill':
				//ä»–ã®å‡¦ç†ãŒå®Ÿè¡Œã—ã¦ãªã„ã‹ç¢ºèªã™ã‚‹
				if(!isset($sender->wep_scheduler)){
					if(isset($args[0])){
						if(!isset($args[6])) return false;
						//é€ã‚‰ã‚Œã¦ããŸåº§æ¨™ãŒæ­£ã—ãå…¥åŠ›ã•ã‚Œã¦ã„ã‚‹ã‹ãƒã‚§ãƒƒã‚¯ã™ã‚‹(ã‚¨ãƒ©ãƒ¼ãŒå‡ºãŸã‚‰falseã‚’è¿”ã—ã¾ã™)
						$check_start = $this->checkPosition($args[0], $args[1], $args[2]);
						$check_end = $this->checkPosition($args[3], $args[4], $args[5]);
						if($check_start and $check_end){
							//ãƒ—ãƒ¬ã‚¤ãƒ¤ãƒ¼ã®ãƒ¯ãƒ¼ãƒ«ãƒ‰ã‚’å–å¾—ã™ã‚‹(ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒ¯ãƒ¼ãƒ«ãƒ‰ã‚’å–å¾—ã—ã¾ã™)
							$sender_level = $sender instanceof Player ? $sender->getLevel() : $this->getServer()->getDefaultLevel();
							//é€ã‚‰ã‚Œã¦ããŸåº§æ¨™ã‚’Positionã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«å¤‰æ›ã™ã‚‹
							$position_start = new Position($args[0], $args[1], $args[2], $sender_level);
							$position_end = new Position($args[3], $args[4], $args[5], $sender_level);
							//å…¥åŠ›ã•ã‚Œã¦ãªã„é …ç›®ã‚’ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã«è¨­å®šã—ã¾ã™
							if(!isset($args[7])) $args[7] = 'set';
							if(!isset($args[8])) $args[8] = '';
							//fillã‚’å®Ÿè¡Œã™ã‚‹
							$this->fill($sender, $position_start, $position_end, $args[6], $args[7], $args[8]);
						}else{
							$sender->sendMessage('åº§æ¨™ã®å…¥åŠ›ã«èª¤ã‚ŠãŒã‚ã‚Šã¾ã™');
						}
					}elseif($sender instanceof Player){
						//ãƒ—ãƒ¬ã‚¤ãƒ¤ãƒ¼ãŒé€ä¿¡ã—ãŸå¾Œã®å‡¦ç†(ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯)
						$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{
						return false;
					}
				}else{
					$sender->sendMessage('ä»–ã®å‡¦ç†ãŒå®Ÿè¡Œä¸­ã§ã™');
				}
				break;
 			case 'clone':
				if(!isset($sender->wep_scheduler)){
					if(isset($args[0])){
						if(!isset($args[8])) return false;
						//é€ã‚‰ã‚Œã¦ããŸåº§æ¨™ãŒæ­£ã—ãå…¥åŠ›ã•ã‚Œã¦ã„ã‚‹ã‹ãƒã‚§ãƒƒã‚¯ã™ã‚‹(ã‚¨ãƒ©ãƒ¼ãŒå‡ºãŸã‚‰falseã‚’è¿”ã—ã¾ã™)
						$check_start = $this->checkPosition($args[0], $args[1], $args[2]);
						$check_end = $this->checkPosition($args[3], $args[4], $args[5]);
						$check_clone = $this->checkPosition($args[6], $args[7], $args[8]);
						if($check_start and $check_end and $check_clone){
							//ãƒ—ãƒ¬ã‚¤ãƒ¤ãƒ¼ã®ãƒ¯ãƒ¼ãƒ«ãƒ‰ã‚’å–å¾—ã™ã‚‹(ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒ¯ãƒ¼ãƒ«ãƒ‰ã‚’å–å¾—ã—ã¾ã™)
							$sender_level = $sender instanceof Player ? $sender->getLevel() : $this->getServer()->getDefaultLevel();
							//é€ã‚‰ã‚Œã¦ããŸåº§æ¨™ã‚’Positionã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«å¤‰æ›ã™ã‚‹
							$position_start = new Position($args[0], $args[1], $args[2], $sender_level);
							$position_end = new Position($args[3], $args[4], $args[5], $sender_level);
							$destination = new Position($args[6], $args[7], $args[8], $sender_level);
							//å…¥åŠ›ã•ã‚Œã¦ãªã„é …ç›®ã‚’ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã«è¨­å®šã—ã¾ã™
							if(!isset($args[9])) $args[9] = 'replace';
							if(!isset($args[10])) $args[10] = 'normal';
							if(!isset($args[11])) $args[11] = '';
							//cloneã‚’å®Ÿè¡Œã™ã‚‹
							$this->clone($sender, $position_start, $position_end, $destination, $args[9], $args[10], $args[11]);
						}else{
							$sender->sendMessage('åº§æ¨™ã®å…¥åŠ›ã«èª¤ã‚ŠãŒã‚ã‚Šã¾ã™');
						}
					}elseif($sender instanceof Player){
						//ãƒ—ãƒ¬ã‚¤ãƒ¤ãƒ¼ãŒé€ä¿¡ã—ãŸå¾Œã®å‡¦ç†(ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯)
						$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{
						return false;
					}
				}else{
					$player->sendMessage('ä»–ã®å‡¦ç†ãŒå®Ÿè¡Œä¸­ã§ã™');
				}
				break;
			case 'cylinder':
				//ä»–ã®å‡¦ç†ãŒå®Ÿè¡Œã—ã¦ãªã„ã‹ç¢ºèªã™ã‚‹
				if(!isset($sender->wep_scheduler)){
					if(isset($args[0])){
						if(!isset($args[7])) return false;
						//é€ã‚‰ã‚Œã¦ããŸåº§æ¨™ãŒæ­£ã—ãå…¥åŠ›ã•ã‚Œã¦ã„ã‚‹ã‹ãƒã‚§ãƒƒã‚¯ã™ã‚‹(ã‚¨ãƒ©ãƒ¼ãŒå‡ºãŸã‚‰falseã‚’è¿”ã—ã¾ã™)
						$check_start = $this->checkPosition($args[0], $args[1], $args[2]);
						$check_end = $this->checkPosition($args[3], $args[4], $args[5]);
						if($check_start and $check_end){
							//ãƒ—ãƒ¬ã‚¤ãƒ¤ãƒ¼ã®ãƒ¯ãƒ¼ãƒ«ãƒ‰ã‚’å–å¾—ã™ã‚‹(ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒ¯ãƒ¼ãƒ«ãƒ‰ã‚’å–å¾—ã—ã¾ã™)
							$sender_level = $sender instanceof Player ? $sender->getLevel() : $this->getServer()->getDefaultLevel();
							//é€ã‚‰ã‚Œã¦ããŸåº§æ¨™ã‚’Positionã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«å¤‰æ›ã™ã‚‹
							$position_start = new Position($args[0], $args[1], $args[2], $sender_level);
							$position_end = new Position($args[3], $args[4], $args[5], $sender_level);
							//cylinderã‚’å®Ÿè¡Œã™ã‚‹
							$this->cylinder($sender, $position_start, $position_end, $args[6], $args[7]);
						}else{
							$sender->sendMessage('åº§æ¨™ã®å…¥åŠ›ã«èª¤ã‚ŠãŒã‚ã‚Šã¾ã™');
						}
					}elseif($sender instanceof Player){
						//ãƒ—ãƒ¬ã‚¤ãƒ¤ãƒ¼ãŒé€ä¿¡ã—ãŸå¾Œã®å‡¦ç†(ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯)
						$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);
								//cylinderã‚’å®Ÿè¡Œã™ã‚‹
								$this->cylinder($player, $position_start, $position_end, $data[6], $this->direction[$data[7]]);
							}else{
								$player->sendMessage('åº§æ¨™ã®å…¥åŠ›ã«èª¤ã‚ŠãŒã‚ã‚Šã¾ã™');
							}
						};
						//å§‹ç‚¹çµ‚ç‚¹ã‚’å«ã‚ãŸãƒ•ã‚©ãƒ¼ãƒ ã‚’å–å¾— or ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’ç™»éŒ²ã™ã‚‹
						$form = $this->getDefaultForm($callback, $sender);
						$form->addInput('â‘ ãƒ–ãƒ­ãƒƒã‚¯', 'string');
						$form->addDropdown('å††æŸ±ã‚’ä½œæˆã™ã‚‹æ–¹å‘', $this->direction);
						$form->sendToPlayer($sender);
					}else{
						return false;
					}
				}else{
					$sender->sendMessage('ä»–ã®å‡¦ç†ãŒå®Ÿè¡Œä¸­ã§ã™');
				}
				break;
			case 'sphere':
				//ä»–ã®å‡¦ç†ãŒå®Ÿè¡Œã—ã¦ãªã„ã‹ç¢ºèªã™ã‚‹
				if(!isset($sender->wep_scheduler)){
					if(isset($args[0])){
						if(!isset($args[6])) return false;
						//é€ã‚‰ã‚Œã¦ããŸåº§æ¨™ãŒæ­£ã—ãå…¥åŠ›ã•ã‚Œã¦ã„ã‚‹ã‹ãƒã‚§ãƒƒã‚¯ã™ã‚‹(ã‚¨ãƒ©ãƒ¼ãŒå‡ºãŸã‚‰falseã‚’è¿”ã—ã¾ã™)
						$check_start = $this->checkPosition($args[0], $args[1], $args[2]);
						$check_end = $this->checkPosition($args[3], $args[4], $args[5]);
						if($check_start and $check_end){
							//ãƒ—ãƒ¬ã‚¤ãƒ¤ãƒ¼ã®ãƒ¯ãƒ¼ãƒ«ãƒ‰ã‚’å–å¾—ã™ã‚‹(ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒ¯ãƒ¼ãƒ«ãƒ‰ã‚’å–å¾—ã—ã¾ã™)
							$sender_level = $sender instanceof Player ? $sender->getLevel() : $this->getServer()->getDefaultLevel();
							//é€ã‚‰ã‚Œã¦ããŸåº§æ¨™ã‚’Positionã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«å¤‰æ›ã™ã‚‹
							$position_start = new Position($args[0], $args[1], $args[2], $sender_level);
							$position_end = new Position($args[3], $args[4], $args[5], $sender_level);
							//sphereã‚’å®Ÿè¡Œã™ã‚‹
							$this->sphere($sender, $position_start, $position_end, $args[6]);
						}else{
							$sender->sendMessage('åº§æ¨™ã®å…¥åŠ›ã«èª¤ã‚ŠãŒã‚ã‚Šã¾ã™');
						}
					}elseif($sender instanceof Player){
						//ãƒ—ãƒ¬ã‚¤ãƒ¤ãƒ¼ãŒé€ä¿¡ã—ãŸå¾Œã®å‡¦ç†(ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯)
						$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);
								//sphereã‚’å®Ÿè¡Œã™ã‚‹
								$this->sphere($player, $position_start, $position_end, $data[6]);
							}else{
								$player->sendMessage('åº§æ¨™ã®å…¥åŠ›ã«èª¤ã‚ŠãŒã‚ã‚Šã¾ã™');
							}
						};
						//å§‹ç‚¹çµ‚ç‚¹ã‚’å«ã‚ãŸãƒ•ã‚©ãƒ¼ãƒ ã‚’å–å¾— or ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’ç™»éŒ²ã™ã‚‹
						$form = $this->getDefaultForm($callback, $sender);
						$form->addInput('â‘ ãƒ–ãƒ­ãƒƒã‚¯', 'string');
						$form->sendToPlayer($sender);
					}else{
						return false;
					}
				}else{
					$sender->sendMessage('ä»–ã®å‡¦ç†ãŒå®Ÿè¡Œä¸­ã§ã™');
				}
				break;
			case 'cancel':
				if(isset($sender->wep_scheduler)){
					$sender->wep_scheduler->cancel();
					unset($sender->wep_scheduler);
					$sender->sendMessage('å®Ÿè¡Œä¸­ã®å‡¦ç†ã‚’ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã—ã¾ã—ãŸ');
				}else{
					$sender->sendMessage('å®Ÿè¡Œä¸­ã®å‡¦ç†ã¯ã‚ã‚Šã¾ã›ã‚“');
				}
				break;
			case 'wand':
				$axe = Item::get(271);
				$axe->setCustomName('wand');
				$sender->getInventory()->addItem($axe);
				$sender->sendMessage('å§‹ç‚¹ã¨çµ‚ç‚¹ã‚’æ±ºã‚ã‚‹æ–§ã‚’ä»˜ä¸Žã—ã¾ã—ãŸ');
				break;
			case 'pos1':
			case 'pos2':
				if($sender instanceof Player){
					$wich = $label === 'pos1' ? 'wep_start' : 'wep_end';
					if(isset($args[0])){
						if(!isset($args[2])) return false;
						if($this->checkPosition($args[0], $args[1], $args[2])){
							$sender_level = $sender->getLevel();
							$position = new Position($args[0], $args[1], $args[2], $sender_level);
							$this->setPosition($sender, $position, $wich);
						}else{
							$sender->sendMessage('åº§æ¨™ã®å…¥åŠ›ã«èª¤ã‚ŠãŒã‚ã‚Šã¾ã™');
						}
					}else{
						$position = $sender->asPosition();
						$this->setPosition($sender, $position, $wich);
					}
				}else{
					$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->setWand($event, 'wep_start');
	}

	//ãƒ–ãƒ­ãƒƒã‚¯ã§åº§æ¨™ã‚’ç™»éŒ²ã™ã‚‹
	public function setWand($event, $wich){
		$player = $event->getPlayer();
		if($player->isOp()){
			$item = $event->getItem();
			$item_id = $item->getId();
			$item_name = $item->getName();
			if($item_id === 271 and $item_name === 'wand'){
				$event->setCancelled();
				$position = $event->getBlock()->asPosition();
				$this->setPosition($player, $position, $wich);
			}
		}
	}

	//ãƒ–ãƒ­ãƒƒã‚¯ã§åº§æ¨™ã‚’ç™»éŒ²ã™ã‚‹
	public function setPosition(Player $player, Position $position, string $wich){
		//å§‹ç‚¹ã‹çµ‚ç‚¹ã®åº§æ¨™ã‚’ç™»éŒ²ã™ã‚‹
		$player->$wich = [
			'x' => $x = floor((string) $position->x),
			'y' => $y = floor((string) $position->y),
			'z' => $z = floor((string) $position->z),
			'level' => $position->getLevel()
		];
		if(isset($player->wep_start, $player->wep_end)){
			$start = $player->wep_start;
			$end = $player->wep_end;
			$position_start = new Position($start['x'], $start['y'], $start['z'], $start['level']);
			$position_end = new Position($end['x'], $end['y'], $end['z'], $end['level']);
			$side = $this->getSide($position_start, $position_end);
			$side_message = '(Â§e'.$side['x'] * $side['y'] * $side['z'].'ãƒ–ãƒ­ãƒƒã‚¯Â§r)';
		}else{
			$side_message = '';
		}
		if($wich === 'wep_start'){
			$player->sendMessage("å§‹ç‚¹ãŒè¨­å®šã•ã‚Œã¾ã—ãŸ Â§c{$x}Â§r, Â§a{$y}Â§r, Â§b{$z}Â§r $side_message");
		}elseif($wich === 'wep_end'){
			$player->sendMessage("çµ‚ç‚¹ãŒè¨­å®šã•ã‚Œã¾ã—ãŸ Â§c{$x}Â§r, Â§a{$y}Â§r, Â§b{$z}Â§r $side_message");
		}
	}


	//ãƒ–ãƒ­ãƒƒã‚¯ã®æƒ…å ±ã‚’è¡¨ç¤ºã•ã›ã‚‹
	public function PlayerInteract(PlayerInteractEvent $event){
		$action = $event->getAction();
		if($action === 0 or $action === 1){
			$player = $event->getPlayer();
			//çµ‚ç‚¹è¨­å®š
			$this->setWand($event, 'wep_end');
			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]");
				}
			}
		}
	}


#####################################################################


	public function fill(Sender $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, Sender $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, Sender $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ã‚’å®Ÿè¡Œã—ã¾ã—ãŸ (Â§e'.$side['x'] * $side['y'] * $side['z'].'ãƒ–ãƒ­ãƒƒã‚¯Â§r)');
								//ã‚¸ã‚§ãƒãƒ¬ãƒ¼ã‚¿ãƒ¼ã‚’ä¸€æ™‚åœæ­¢ã™ã‚‹
								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("Â§l$player_name : Â§a{$round} ï¼… å®Œäº†");
									#ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—è¿”ã™äºˆå®š
									#yield;
								}
								//ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ©ãƒ¼ã‚’æ­¢ã‚ã¾ã™
								$this->getHandler()->cancel();
								unset($player->wep_scheduler);
								$owner->getServer()->broadcastMessage($player_name.'ã®/fillãŒçµ‚äº†ã—ã¾ã—ãŸ');
							}

							//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(Sender $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, Sender $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, Sender $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ã‚’å®Ÿè¡Œã—ã¾ã—ãŸ (Â§e'.$side['x'] * $side['y'] * $side['z'].'ãƒ–ãƒ­ãƒƒã‚¯Â§r)');
								//ã‚¸ã‚§ãƒãƒ¬ãƒ¼ã‚¿ãƒ¼ã‚’ä¸€æ™‚åœæ­¢ã™ã‚‹
								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("Â§l$player_name : Â§a{$round} ï¼… å®Œäº†");
									#ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—è¿”ã™äºˆå®š
									#yield;
								}
								//ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ©ãƒ¼ã‚’æ­¢ã‚ã¾ã™
								$this->getHandler()->cancel();
								unset($player->wep_scheduler);
								$owner->getServer()->broadcastMessage($player_name.'ã®/cloneãŒçµ‚äº†ã—ã¾ã—ãŸ');
							}

							//ãƒžã‚¹ã‚¯ãƒ¢ãƒ¼ãƒ‰ã®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('åŒã˜ãƒ¯ãƒ¼ãƒ«ãƒ‰ã§æŒ‡å®šã—ã¦ãã ã•ã„');
		}
	}

	//æœªå®Œæˆ(ç¾åœ¨setã®ã¿å¯èƒ½ã§ã™)
	public function cylinder(Sender $player, Position $start, Position $end, string $block, string $direction){
		$level_start = $start->getLevel();
		$level_end = $end->getLevel();
		//åŒã˜ãƒ¯ãƒ¼ãƒ«ãƒ‰ã‹ç¢ºèªã™ã‚‹
		if($level_start == $level_end){
			//æŒ‡å®šã•ã‚ŒãŸãƒ–ãƒ­ãƒƒã‚¯ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’å–å¾—ã—ã¾ã™(ã‚¨ãƒ©ãƒ¼ãŒå‡ºãŸã‚‰falseã‚’è¿”ã—ã¾ã™)
			$block = $this->fromString($block);
			if($block !== false){
				//æ–¹å‘ãŒå­˜åœ¨ã™ã‚‹ã‹ç¢ºèªã—ã¾ã™
				if(in_array($direction, $this->direction)){
					//å‡¦ç†ã™ã‚‹æ–¹å‘ã‚’è¨­å®šã—ã¾ã™
					$direction_key = array_search($direction, $this->direction);
					$direction_clone = $this->direction;
					unset($direction_clone[$direction_key]);
					array_unshift($direction_clone, $this->direction[$direction_key]);
					//ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ©ãƒ¼ã§å‡¦ç†ã‚’ã™ã‚‹ç„¡åã‚¯ãƒ©ã‚¹ã§ã™
					$task = new class($this, $player, $start, $end, $block, $direction_clone) extends Task{

						public function __construct($owner, Sender $player, Position $start, Position $end, array $block, array $direction){
							//ã‚¸ã‚§ãƒãƒ¬ãƒ¼ã‚¿ãƒ¼ã‚’ä½œæˆã—ã¾ã™
							$this->generator = $this->generator($owner, $player, $start, $end, $direction);
							//è¨­ç½®ã™ã‚‹ãƒ–ãƒ­ãƒƒã‚¯ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆ
							$this->block = $block;
							//ç©ºæ°—ãƒ–ãƒ­ãƒƒã‚¯ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆ
							$this->air = Block::get(0);
						}

						public function onRun(int $tick){
							//ã‚¸ã‚§ãƒãƒ¬ãƒ¼ã‚¿ã®æ¬¡ã®å‡¦ç†ã‚’å®Ÿè¡Œã—ã¾ã™
							$this->generator->next();
						}

						public function generator($owner, Sender $player, Position $start, Position $end, array $direction){
							//å‘ãè¨­å®š 0=é€²è¡Œæ–¹å‘, 1ã¨2=å††ã‚’ä½œæˆã™ã‚‹å‘ã
							$direction_0 = $direction[0];
							$direction_1 = $direction[1];
							$direction_2 = $direction[2];
							//å§‹ç‚¹ã®é€²è¡Œæ–¹å‘ã‚’è¨­å®šã—ã¾ã™
							$start_0 = $start->$direction_0;
							//å‡¦ç†ã‚’ã™ã‚‹ãƒ¯ãƒ¼ãƒ«ãƒ‰ã‚’è¨­å®šã—ã¾ã™
							$level = $start->getLevel();
							//x, y ,zã®é•·ã•ã‚’å–å¾—ã—ã¾ã™
							$side = $owner->getSide($start, $end);
							//å§‹ç‚¹ã‹ã‚‰çµ‚ç‚¹ã«å‘ã‹ã†æ–¹å‘ã‚’å–å¾—ã—ã¾ã™
							$next = $owner->getNext($start, $end);
							//åŠå¾„ã‚’èª¿ã¹ã¾ã™
							$radius_1 = ($side[$direction_1] - 1) / 2;
							$radius_2 = ($side[$direction_2] - 1) / 2;
							//ä¸­å¿ƒç‚¹ã‚’èª¿ã¹ã¾ã™
							$center_1 = $start->$direction_1 + ($radius_1 * $next[$direction_1]);
							$center_2 = $start->$direction_2 + ($radius_2 * $next[$direction_2]);
							//é€²è¡Œã‚²ãƒ¼ã‚¸ã‚’è¨­å®šã—ã¾ã™
							$meter = 100 / ($side[$direction_0] * (360 / 0.05));
							$gage = 0;
							$player_name = $player->getName();
							$owner->getServer()->broadcastMessage($player_name.'ãŒ/cylinderã‚’å®Ÿè¡Œã—ã¾ã—ãŸ (Â§e'.$side['x'] * $side['y'] * $side['z'].'ãƒ–ãƒ­ãƒƒã‚¯Â§r)');
							//ã‚¸ã‚§ãƒãƒ¬ãƒ¼ã‚¿ãƒ¼ã‚’ä¸€æ™‚åœæ­¢ã™ã‚‹
							yield;
							//é€²è¡Œæ–¹å‘
							for($a = 0; abs($a) < $side[$direction_0]; $a += $next[$direction_0]){
								$y = $start_0 + $a;
								//å††ã®ä½œæˆå‡¦ç†
								for($b = 0; $b < 360; $b += 0.05){
									//ãƒ©ã‚¸ã‚¢ãƒ³ã‚’å–å¾—ã—ã¾ã™
									$radian = deg2rad($b);
									//è¨­ç½®ã™ã‚‹åº§æ¨™ã‚’è¨ˆç®—ã—ã¾ã™
									$x = round($center_1 + ($radius_1 * sin($radian)));
									$z = round($center_2 + ($radius_2 * cos($radian)));
									//å‘ãã«ã‚ã£ãŸVector3ã‚’å–å¾—ã—ã¾ã™
									if($direction_0 === 'x'){
										$vector = new Vector3($y, $x, $z);
									}elseif($direction_0 === 'y'){
										$vector = new Vector3($x, $y, $z);
									}elseif($direction_0 === 'z'){
										$vector = new Vector3($x, $z, $y);
									}
									$block = $this->set();
									$level->setBlock($vector, $block, true, false);
									//ä¸€åº¦ã«è¨­ç½®ã™ã‚‹ãƒ–ãƒ­ãƒƒã‚¯ã‚’åˆ¶é™ã—ã¾ã™(1000ãƒ–ãƒ­ãƒƒã‚¯ä»¥ä¸Š)
									$restriction = isset($restriction) ? ++$restriction : 0;
									if($restriction > 360){
										yield;
										unset($restriction);
									}
									//é€²è¡Œã‚²ãƒ¼ã‚¸ã‚’é€²ã‚ã¾ã™
									$round = round($gage += $meter);
									$owner->getServer()->broadcastTip("Â§l$player_name : Â§a{$round} ï¼… å®Œäº†");
								}
								#ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—è¿”ã™äºˆå®š
								#yield;
							}
							//ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ©ãƒ¼ã‚’æ­¢ã‚ã¾ã™
							$this->getHandler()->cancel();
							unset($player->wep_scheduler);
							$owner->getServer()->broadcastMessage($player_name.'ã®/cylinderãŒçµ‚äº†ã—ã¾ã—ãŸ');
						}

						//setã®å‡¦ç†
						public function set($block = null){
							$rand = array_rand($this->block);
							return $this->block[$rand];
						}

					};
					//ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ©ãƒ¼ã‚’å®Ÿè¡Œã—ã¾ã™
					$player->wep_scheduler = $this->getScheduler()->scheduleRepeatingTask($task, 1);
				}else{
					$player->sendMessage('ç„¡åŠ¹ãªæ–¹å‘ã§ã™');
				}
			}else{
				$player->sendMessage('â‘ ãƒ–ãƒ­ãƒƒã‚¯ã«ç„¡åŠ¹ãªãƒ–ãƒ­ãƒƒã‚¯ãŒå«ã¾ã‚Œã¦ã„ã¾ã™');
			}
		}else{
			$player->sendMessage('åŒã˜ãƒ¯ãƒ¼ãƒ«ãƒ‰ã§æŒ‡å®šã—ã¦ãã ã•ã„');
		}
	}

	//æœªå®Œæˆ(ç¾åœ¨setã®ã¿å¯èƒ½ã§ã™)
	public function sphere(Sender $player, Position $start, Position $end, string $block){
		$level_start = $start->getLevel();
		$level_end = $end->getLevel();
		//åŒã˜ãƒ¯ãƒ¼ãƒ«ãƒ‰ã‹ç¢ºèªã™ã‚‹
		if($level_start == $level_end){
			//æŒ‡å®šã•ã‚ŒãŸãƒ–ãƒ­ãƒƒã‚¯ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’å–å¾—ã—ã¾ã™(ã‚¨ãƒ©ãƒ¼ãŒå‡ºãŸã‚‰falseã‚’è¿”ã—ã¾ã™)
			$block = $this->fromString($block);
			if($block !== false){
				//ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ©ãƒ¼ã§å‡¦ç†ã‚’ã™ã‚‹ç„¡åã‚¯ãƒ©ã‚¹ã§ã™
				$task = new class($this, $player, $start, $end, $block) extends Task{

					public function __construct($owner, Sender $player, Position $start, Position $end, array $block){
						//ã‚¸ã‚§ãƒãƒ¬ãƒ¼ã‚¿ãƒ¼ã‚’ä½œæˆã—ã¾ã™
						$this->generator = $this->generator($owner, $player, $start, $end);
						//è¨­ç½®ã™ã‚‹ãƒ–ãƒ­ãƒƒã‚¯ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆ
						$this->block = $block;
						//ç©ºæ°—ãƒ–ãƒ­ãƒƒã‚¯ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆ
						$this->air = Block::get(0);
					}

					public function onRun(int $tick){
						//ã‚¸ã‚§ãƒãƒ¬ãƒ¼ã‚¿ã®æ¬¡ã®å‡¦ç†ã‚’å®Ÿè¡Œã—ã¾ã™
						$this->generator->next();
					}

					public function generator($owner, Sender $player, Position $start, Position $end){
						//å‡¦ç†ã‚’ã™ã‚‹ãƒ¯ãƒ¼ãƒ«ãƒ‰ã‚’è¨­å®šã—ã¾ã™
						$level = $start->getLevel();
						//x, y ,zã®é•·ã•ã‚’å–å¾—ã—ã¾ã™
						$side = $owner->getSide($start, $end);
						//å§‹ç‚¹ã‹ã‚‰çµ‚ç‚¹ã«å‘ã‹ã†æ–¹å‘ã‚’å–å¾—ã—ã¾ã™
						$next = $owner->getNext($start, $end);
						//åŠå¾„ã‚’èª¿ã¹ã¾ã™		$sx = ($side['x'] - 1) / 2;
						$radius_x = ($side['x'] - 1) / 2;
						$radius_y = ($side['y'] - 1) / 2;
						$radius_z = ($side['z'] - 1) / 2;
						//ä¸­å¿ƒç‚¹ã‚’èª¿ã¹ã¾ã™
						$center_x = $start->x + ($radius_x * $next['x']);
						$center_y = $start->y + ($radius_y * $next['y']);
						$center_z = $start->z + ($radius_z * $next['z']);
						//é€²è¡Œã‚²ãƒ¼ã‚¸ã‚’è¨­å®šã—ã¾ã™
						$meter = 100 / ((180 / 0.5) * (360 / 0.5));
						$gage = 0;
						$player_name = $player->getName();
						$owner->getServer()->broadcastMessage($player_name.'ãŒ/sphereã‚’å®Ÿè¡Œã—ã¾ã—ãŸ (Â§e'.$side['x'] * $side['y'] * $side['z'].'ãƒ–ãƒ­ãƒƒã‚¯Â§r)');
						//ã‚¸ã‚§ãƒãƒ¬ãƒ¼ã‚¿ãƒ¼ã‚’ä¸€æ™‚åœæ­¢ã™ã‚‹
						yield;
						for($a = 270; $a > 90; $a -= 0.5){

							$radian_1 = deg2rad($a);

							$sin_1 = sin($radian_1);
							$cos_1 = cos($radian_1);

							$x = round($center_x + ($radius_x * $sin_1));

							$radius_next_y = $radius_y * $cos_1;
							$radius_next_z = $radius_z * $cos_1;


							for($b = 0; $b < 360; $b += 0.5){

								$radian_2 = deg2rad($b);

								$y = round($center_y + ($radius_next_y * sin($radian_2)));
								$z = round($center_z + ($radius_next_z * cos($radian_2)));

								$vector = new Vector3($x, $y, $z);
								$block = $this->set();
								$level->setBlock($vector, $block, true, false);
								//ä¸€åº¦ã«è¨­ç½®ã™ã‚‹ãƒ–ãƒ­ãƒƒã‚¯ã‚’åˆ¶é™ã—ã¾ã™(1000ãƒ–ãƒ­ãƒƒã‚¯ä»¥ä¸Š)
								$restriction = isset($restriction) ? ++$restriction : 0;
								if($restriction > 360){
									yield;
									unset($restriction);
								}
								//é€²è¡Œã‚²ãƒ¼ã‚¸ã‚’é€²ã‚ã¾ã™
								$round = round($gage += $meter);
								$owner->getServer()->broadcastTip("Â§l$player_name : Â§a{$round} ï¼… å®Œäº†");
							}
							#ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—è¿”ã™äºˆå®š
							#yield;
						}
						//ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ©ãƒ¼ã‚’æ­¢ã‚ã¾ã™
						$this->getHandler()->cancel();
						unset($player->wep_scheduler);
						$owner->getServer()->broadcastMessage($player_name.'ã®/sphereãŒçµ‚äº†ã—ã¾ã—ãŸ');
					}

					//setã®å‡¦ç†
					public function set($block = null){
						$rand = array_rand($this->block);
						return $this->block[$rand];
					}

				};
				//ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ©ãƒ¼ã‚’å®Ÿè¡Œã—ã¾ã™
				$player->wep_scheduler = $this->getScheduler()->scheduleRepeatingTask($task, 1);
			}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
		];
	}


#####################################################################


}J=lõS±äžì¨¸EL„ß   GBMB