<?php echo "Altay plugin FlatPreset v1\nThis file has been generated using Turanic at Wed, 03 Oct 2018 17:29:55 +0900.\n----------------\n";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:10:"FlatPreset";s:7:"version";s:1:"1";s:4:"main";s:16:"aieuo\FlatPreset";s:3:"api";a:2:{i:0;s:5:"3.0.0";i:1;s:5:"4.0.0";}s:6:"depend";a:0:{}s:11:"description";s:0:"";s:7:"authors";a:1:{i:0;s:5:"aieuo";}s:7:"website";s:0:"";s:12:"creationDate";i:1538555395;}
   plugin.yml×   ~´[×   ȃ¯¶         src/aieuo/FlatPreset.php  ~´[  l,ƶ      name: FlatPreset
main: aieuo\FlatPreset
version: 1.0
api: [3.0.0, 4.0.0]
load: POSTWORLD
author: aieuo
commands:
 preset:
  description: 好きなブロックでワールド作成
  usage: /preset
  permission: op
 <?php
namespace aieuo;

use pocketmine\plugin\PluginBase;
use pocketmine\event\Listener;
use pocketmine\Player;
use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\utils\Config;
use pocketmine\item\Item;
use pocketmine\level\generator\generatorManager;
use pocketmine\event\block\BlockBreakEvent;
use pocketmine\math\Vector3;
use pocketmine\block\Block;

class FlatPreset extends PluginBase implements Listener{

    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);
    }

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

	public function onCommand(CommandSender $sender, Command $command,string $label, array $args):bool{
		$cmd = $command->getName();
		$name = $sender->getName();
		if($cmd == "preset"){
			if(!isset($args[0]))return false;
			switch ($args[0]) {
				case 'pos1':
					$this->pos1break[$name] = true;
					unset($this->pos2[$name]);
					$sender->sendMessage("ブロックを壊してください");
					return true;
				case 'pos2':
					if(!isset($this->pos1[$name])){
						$sender->sendMessage("まずpos1を設定してください");
						return true;
					}
					$this->pos2break[$name] = true;
					$sender->sendMessage("ブロックを壊してください");
					return true;
				case 'save':
					if(!isset($args[1])){
						$sender->sendMessage("/preset save <name>");
						return true;
					}
					if($this->config->exists($args[1])){
						$sender->sendMessage("その名前は既に作成されています");
						return true;
					}
					if(!isset($this->pos1[$name]) or !isset($this->pos2[$name])){
						$sender->sendMessage("まずposを設定してください");
						return true;
					}
					$preset = $this->getPreset($this->pos1[$name]["level"], $this->pos1[$name], $this->pos2[$name]);
					$this->config->set($args[1], $preset);
					$sender->sendMessage("保存しました");
					return true;
				case 'generate':
					if(!isset($args[1])){
						$sender->sendMessage("/preset generate <ワールドの名前> <プリセットの名前>");
						return true;
					}
					if($this->getServer()->isLevelGenerated($args[1])){
						$sender->sendMessage("そのワールドは既に存在します");
						return true;
					}
					if(!isset($args[2])){
						if(!isset($this->pos1[$name]) or !isset($this->pos2[$name])){
							$sender->sendMessage("まずposを設定してください");
							return true;
						}
						$preset = $this->getPreset($this->pos1[$name]["level"], $this->pos1[$name], $this->pos2[$name]);
						$this->getServer()->generateLevel($args[1], null, generatorManager::getGenerator("flat"),["preset"=>$preset]);
						$sender->sendMessage("ワールドを作成しました");
					}else{
						if(!$this->config->exists($args[2])){
							$sender->sendMessage("そんなものはありません");
							return true;
						}
						$preset = $this->config->get($args[2]);
						$this->getServer()->generateLevel($args[1], null, generatorManager::getGenerator("flat"),["preset"=>$preset]);
						$sender->sendMessage("ワールドを作成しました");
					}
					return true;
				default:
					return false;
			}
		}
	}

	public function getPreset($level, $pos1, $pos2){
		$sy = min($pos1["y"], $pos2);
		$ey = max($pos1["y"], $pos2);
		$preset = "2;";
		$block = $level->getBlock(new Vector3($pos1["x"], $sy, $pos1["z"]));
		$prev = $block->getId().":".$block->getDamage();
		$count = 0;
		for($y = $sy; $y <= $ey; $y ++){
			$block = $level->getBlock(new Vector3($pos1["x"], $y, $pos1["z"]));
			$id = $block->getId().":".$block->getDamage();
			if($prev === $id){
				$count ++;
			}else{
				$preset .= $count."x".$prev.",";
				$prev = $id;
				$count = 1;
			}
			if($y == $ey){
				$preset .= $count."x".$prev.";1";
			}
		}
		return $preset;
	}

	public function onBreak(BlockBreakEvent $event){
		$player = $event->getPlayer();
		$name = $player->getName();
		if(isset($this->pos1break[$name])){
			$event->setCancelled();
			$block = $event->getBlock();
			$this->pos1[$name] = [
				"x" => $block->x,
				"y" => $block->y,
				"z" => $block->z,
				"level" => $block->level
			];
			unset($this->pos1break[$name]);
			$player->sendMessage("設定しました(".$this->pos1[$name]["x"].",".$this->pos1[$name]["y"].",".$this->pos1[$name]["z"].",".$this->pos1[$name]["level"]->getFolderName().")");
		}elseif(isset($this->pos2break[$name])){
			$event->setCancelled();
			$block = $event->getBlock();
			if($block->x !== $this->pos1[$name]["x"] or $block->z !== $this->pos1[$name]["z"]){
				$player->sendMessage("高さ以外は最初に設定したのと同じ場所にしてください\n(".$this->pos1[$name]["x"].", y ,".$this->pos1[$name]["z"].",".$this->pos1[$name]["level"]->getFolderName().")");
				return;
			}
			$this->pos2[$name] = $block->y;
			unset($this->pos2break[$name]);
			$player->sendMessage("設定しました");
		}
	}
}­r-@õ	¨Ã÷“WéU$éø   GBMB