
<?php
echo "PocketMine-MP plugin WorldProtection v3.2.0
This file has been generated using DevTools v1.15.0 at Sat, 27 Aug 2022 17:44:01 +0900
----------------
Name: WorldProtection
Version: 3.2.0
Main: roi611\\worldprotection\\Main
Api: 4.0.0, 4.0.0-BETA1
Depend: 
Description: ワールドの破壊や設置を制限します
Authors: 
Website: 
CreationDate: 1661589841
";
__HALT_COMPILER(); ?>
             Q  a:9:{s:4:"name";s:15:"WorldProtection";s:7:"version";s:5:"3.2.0";s:4:"main";s:27:"roi611\worldprotection\Main";s:3:"api";a:2:{i:0;s:5:"4.0.0";i:1;s:11:"4.0.0-BETA1";}s:6:"depend";s:0:"";s:11:"description";s:48:"ワールドの破壊や設置を制限します";s:7:"authors";s:0:"";s:7:"website";s:0:"";s:12:"creationDate";i:1661589841;}
   plugin.ymlg  Q	cg  @-      #   src/roi611/worldprotection/Main.phpG  Q	cG  cf      name: WorldProtection
main: roi611\worldprotection\Main
version: 3.2.0
api:
- 4.0.0
- 4.0.0-BETA1
load: POSTWORLD
author: roi611
description: ワールドの破壊や設置を制限します

commands: 
   worldbreak:
      description: ワールドのブロックの破壊できなくします
      usage: /worldbreak
      permission: "worldprotection.command"
   worldplace:
      description: ワールドにブロックの設置をできなくします
      usage: /worldplace
      permission: "worldprotection.command"
   canbreak:
      description: 設置保護の例外ブロックを追加します
      usage: /canbreak
      permission: "worldprotection.command"
   canplace:
      description: 破壊保護の例外ブロックを追加します
      usage: /canplace
      permission: "worldprotection.command"
   cantbreak:
      description: 破壊保護していないときの例外ブロックを追加します
      usage: /cantbreak
      permission: "worldprotection.command"
   cantplace:
      description: 設置保護していないときの例外ブロックを追加します
      usage: /cantplace
      permission: "worldprotection.command"
   world:
      description: ワールドを移動します
      permission: "worldteleport.command"

permissions:
   worldprotection.command:
      default: op
   worldteleport.command:
      default: op<?php
    
namespace roi611\worldprotection;
    
use pocketmine\plugin\PluginBase;

use pocketmine\command\Command;
use pocketmine\command\CommandSender;

use pocketmine\event\Listener;
use pocketmine\event\block\BlockBreakEvent;
use pocketmine\event\block\BlockPlaceEvent;

use pocketmine\player\Player;

use pocketmine\utils\Config;

use pocketmine\Server;
    
class Main extends PluginBase implements Listener {
    
    public function onEnable():void {
       
        $this->getServer()->getPluginManager()->registerEvents($this, $this);

        if(file_exists($this->getDataFolder()."place.yml")){
            if(rename($this->getDataFolder()."place.yml",$this->getDataFolder()."Protected_Place_World.yml")){
                $this->getLogger()->info("§9place.yml§e を最新バージョンに対応させました。");
            }
        }

        if(file_exists($this->getDataFolder()."break.yml")){
            if(rename($this->getDataFolder()."break.yml",$this->getDataFolder()."Protected_Break_World.yml")){
                $this->getLogger()->info("§9break.yml§e を最新バージョンに対応させました。");
            }
        }

        if(file_exists($this->getDataFolder()."idplace.yml")){
            if(rename($this->getDataFolder()."idplace.yml",$this->getDataFolder()."CanPlace.yml")){
                $this->getLogger()->info("§9idplace.yml§e を最新バージョンに対応させました。");
            }
        }

        if(file_exists($this->getDataFolder()."idbreak.yml")){
            if(rename($this->getDataFolder()."idbreak.yml",$this->getDataFolder()."CanBreak.yml")){
                $this->getLogger()->info("§9idbreak.yml§e を最新バージョンに対応させました。");
            }
        }

        $this->place = new Config($this->getDataFolder()."Protected_Place_World.yml", Config::YAML);
        $this->break = new Config($this->getDataFolder()."Protected_Break_World.yml", Config::YAML);
        $this->idbreak = new Config($this->getDataFolder()."CanBreak.yml", Config::YAML);
        $this->idplace = new Config($this->getDataFolder()."CanPlace.yml", Config::YAML);
        $this->cantbreak = new Config($this->getDataFolder()."CantBreak.yml", Config::YAML);
        $this->cantplace = new Config($this->getDataFolder()."CantPlace.yml", Config::YAML);

    }
    
    public function onCommand(CommandSender $sender, Command $command, string $label, array $args) : bool {

        if(!$sender instanceof Player && $label === "world"){
            $sender->sendMessage('§cPlease run in-game');
            return true;
        }

        if(isset($args[1])){
            $level = $args[1];
        } else if($sender instanceof Player){
            $level = $sender->getWorld()->getFolderName();
        } else {//Consoleからだったら
            $sender->sendMessage('§cコマンドに第二引数(WorldName)を指定してください');
            return true;
        }
        
        switch($label) {

            case "world":

                if(isset($args[0]) === false) {
                    $sender->sendMessage('§cコマンドにワールド名を指定してください');
                    return true;
                }

                $sender->sendMessage("[WorldProtection] World:§e '".$args[0]."' §rを準備しています。");

                if(Server::getInstance()->getWorldManager()->loadWorld($args[0]) !== false) {
                    $sender->sendMessage("[WorldProtection] テレポート中...");
                    $sender->teleport(Server::getInstance()->getWorldManager()->getWorldByName($args[0])->getSpawnLocation());
                } else {
                    $sender->sendMessage("[WorldProtection] World:§e '".$args[0]."' §rは存在しません。");
                }

                return true;

            break;

            case "worldbreak":

                if(isset($args[0])){
                    
                    if($args[0] === 'on' || $args[0] === 'off') {
                    
                        switch($this->protection($this->break,$level,$args[0])){
                            case 0:
                                $sender->sendMessage('§cすでに破壊保護されています');
                            break;
                            case 1:
                                $sender->sendMessage("§9{$level} §eの破壊保護を無効にしました");
                            break;
                            case 2:
                                $sender->sendMessage("§9{$level} §eの破壊保護を有効にしました");
                            break;
                            case 3:
                                $sender->sendMessage("§cすでに破壊保護が無効化されています");
                            break;
                        }

                    } else {
                        $sender->sendMessage("使い方:\n/worldbreak <on/off> <World(任意)>");
                    }

                } else {
                    $sender->sendMessage("使い方:\n/worldbreak <on/off> <World(任意)>");
                }

            break;

            case "worldplace":

                if(isset($args[0])){

                    if($args[0] === 'on' || $args[0] === 'off') {
                    
                        switch($this->protection($this->place,$level,$args[0])){
                            case 0:
                                $sender->sendMessage('§cすでに設置が保護されています');
                            break;
                            case 1:
                                $sender->sendMessage("§9{$level} §eの設置保護を無効にしました");
                            break;
                            case 2:
                                $sender->sendMessage("§9{$level} §eの設置保護を有効にしました");
                            break;
                            case 3:
                                $sender->sendMessage("§cすでに設置保護が無効化されています");
                            break;
                        }

                    } else {
                        $sender->sendMessage("使い方:\n/worldplace <on/off> <World(任意)>");
                    }

                } else {
                    $sender->sendMessage("使い方:\n/worldplace <on/off> <World(任意)>");
                }

            break;

            case "canbreak":

                if(!isset($args[0])) {
                    $sender->sendMessage("使い方:\n/canbreak id(:damage) <World(任意)>");
                    return true;
                }

                $data = explode(":",$args[0]);
                $count = count($data);

                if($count === 1){

                    if(ctype_digit($data[0])){
                        $string = "{$data[0]}:0";
                    } else {
                        $sender->sendMessage('§c不明なIDな入力されました');
                        return true;
                    }

                } else if($count === 2){

                    if(ctype_digit($data[0]) && ctype_digit($data[1])){
                        $string = "{$data[0]}:{$data[1]}";
                    } else {
                        $sender->sendMessage('§c不明なIDな入力されました');
                        return true;
                    }

                } else {
                    $sender->sendMessage('§c不明なIDな入力されました');
                    return true;
                }

                if($this->break->exists($level) === false){
                    $sender->sendMessage("§e{$level}§c の破壊保護が有効になっていません！");
                    return true;
                }

                $data = $this->idbreak->get($level,null);

                if($data === null){

                    $sender->sendMessage("§9{$string}§e を例外ブロックに追加しました");
                    $this->idbreak->set($level,array($string));

                } else {

                    if(!is_array($data)) $data = array($data);

                    if(in_array($string,$data,true)){

                        unset($data[array_search($string,$data)]);
                        $this->idbreak->set($level,$data);
                        $sender->sendMessage("§9{$string}§e を例外ブロックから削除しました");

                    } else {

                        array_push($data,$string);
                        $this->idbreak->set($level,$data);
                        $sender->sendMessage("§9{$string}§e を例外ブロックに追加しました");

                    }

                }

                $this->idbreak->save();

            break;

            case "canplace":

                if(!isset($args[0])) {
                    $sender->sendMessage("使い方:\n/canplace id(:meta) <World(任意)>");
                    return true;
                }

                $data = explode(":",$args[0]);
                $count = count($data);

                if($count === 1){

                    if(ctype_digit($data[0])){
                        $string = "{$data[0]}:0";
                    } else {
                        $sender->sendMessage('§c不明なIDな入力されました');
                        return true;
                    }

                } else if($count === 2){

                    if(ctype_digit($data[0]) && ctype_digit($data[1])){
                        $string = "{$data[0]}:{$data[1]}";
                    } else {
                        $sender->sendMessage('§c不明なIDな入力されました');
                        return true;
                    }

                } else {
                    $sender->sendMessage('§c不明なIDな入力されました');
                    return true;
                }

                if($this->place->exists($level) === false){
                    $sender->sendMessage("§e{$level}§c の設置保護が有効になっていません！");
                    return true;
                }

                $data = $this->idplace->get($level,null);

                if($data === null){

                    $sender->sendMessage("§9{$string}§e を例外ブロックに追加しました");
                    $this->idplace->set($level,array($string));

                } else {

                    if(!is_array($data)) $data = array($data);

                    if(in_array($string,$data,true)){

                        unset($data[array_search($string,$data)]);
                        $this->idplace->set($level,$data);
                        $sender->sendMessage("§9{$string}§e を例外ブロックから削除しました");

                    } else {

                        array_push($data,$string);
                        $this->idplace->set($level,$data);
                        $sender->sendMessage("§9{$string}§e を例外ブロックに追加しました");

                    }

                }

                $this->idplace->save();

            break;

            case "cantplace":

                if(!isset($args[0])) {
                    $sender->sendMessage("使い方:\n/cantplace id(:meta) <World(任意)>");
                    return true;
                }

                $data = explode(":",$args[0]);
                $count = count($data);

                if($count === 1){

                    if(ctype_digit($data[0])){
                        $string = "{$data[0]}:0";
                    } else {
                        $sender->sendMessage('§c不明なIDな入力されました');
                        return true;
                    }

                } else if($count === 2){

                    if(ctype_digit($data[0]) && ctype_digit($data[1])){
                        $string = "{$data[0]}:{$data[1]}";
                    } else {
                        $sender->sendMessage('§c不明なIDな入力されました');
                        return true;
                    }

                } else {
                    $sender->sendMessage('§c不明なIDな入力されました');
                    return true;
                }

                if($this->place->exists($level)){
                    $sender->sendMessage("§e{$level}§c は既に設置保護がされています！");
                    return true;
                }

                $data = $this->cantplace->get($level,null);

                if($data === null){

                    $sender->sendMessage("§9{$string}§e を例外ブロックに追加しました");
                    $this->cantplace->set($level,array($string));

                } else {

                    if(!is_array($data)) $data = array($data);

                    if(in_array($string,$data,true)){

                        unset($data[array_search($string,$data)]);
                        $this->cantplace->set($level,$data);
                        $sender->sendMessage("§9{$string}§e を例外ブロックから削除しました");

                    } else {

                        array_push($data,$string);
                        $this->cantplace->set($level,$data);
                        $sender->sendMessage("§9{$string}§e を例外ブロックに追加しました");

                    }

                }

                $this->cantplace->save();

            break;
            
            case "cantbreak":

                if(!isset($args[0])) {
                    $sender->sendMessage("使い方:\n/cantbreak id(:meta) <World(任意)>");
                    return true;
                }

                $data = explode(":",$args[0]);
                $count = count($data);

                if($count === 1){

                    if(ctype_digit($data[0])){
                        $string = "{$data[0]}:0";
                    } else {
                        $sender->sendMessage('§c不明なIDな入力されました');
                        return true;
                    }

                } else if($count === 2){

                    if(ctype_digit($data[0]) && ctype_digit($data[1])){
                        $string = "{$data[0]}:{$data[1]}";
                    } else {
                        $sender->sendMessage('§c不明なIDな入力されました');
                        return true;
                    }

                } else {
                    $sender->sendMessage('§c不明なIDな入力されました');
                    return true;
                }

                if($this->break->exists($level)){
                    $sender->sendMessage("§e{$level}§c は既に破壊保護がされています！");
                    return true;
                }

                $data = $this->cantbreak->get($level,null);

                if($data === null){

                    $sender->sendMessage("§9{$string}§e を例外ブロックに追加しました");
                    $this->cantbreak->set($level,array($string));

                } else {

                    if(!is_array($data)) $data = array($data);

                    if(in_array($string,$data,true)){

                        unset($data[array_search($string,$data)]);
                        $this->cantbreak->set($level,$data);
                        $sender->sendMessage("§9{$string}§e を例外ブロックから削除しました");

                    } else {

                        array_push($data,$string);
                        $this->cantbreak->set($level,$data);
                        $sender->sendMessage("§9{$string}§e を例外ブロックに追加しました");

                    }

                }

                $this->cantbreak->save();

            break;

        }

        return true;

    }

    public function onBreak(BlockBreakEvent $event) {

        $player = $event->getPlayer();
        $level = $player->getWorld()->getFolderName();
        $block = $event->getBlock();
        $id = $block->getId().":".$block->getMeta();

        if($this->getServer()->isOp($player->getName()) === false){

            if($this->break->exists($level)){

                $data = $this->idbreak->get($level,null);

                if($data !== null){
                    if(!is_array($data)) $data = array($data);
                    if(in_array($id,$data) === false) $event->cancel();
                } else {
                    $event->cancel();
                }

            } else {

                $data = $this->cantbreak->get($level,null);
                if($data !== null){
                    if(!is_array($data)) $data = array($data);
                    if(in_array($id,$data,true)) $event->cancel();
                }

            }
        }
    }

    public function onPlace(BlockPlaceEvent $event) {

        $player = $event->getPlayer();
        $level = $player->getWorld()->getFolderName();
        $block = $event->getBlock();
        $id = $block->getId().":".$block->getMeta();

        if($this->getServer()->isOp($player->getName()) === false){

            if($this->place->exists($level)){

                $data = $this->idplace->get($level,null);

                if($data !== null){
                    if(!is_array($data)) $data = array($data);
                    if(in_array($id,$data,true) === false) $event->cancel();
                } else {
                    $event->cancel();
                }

            } else {

                $data = $this->cantplace->get($level,null);

                if($data !== null){
                    if(!is_array($data)) $data = array($data);
                    if(in_array($id,$data,true)) $event->cancel();
                }

            }

        }

    }


    private function protection(Config $config,string $level,string $set):int{

        if($config->exists($level)){

            if($set === "on"){
                return 0;
            } else {
                $config->remove($level);
                $config->save();
                return 1;
            }

        } else {

            if($set === 'on'){
                $config->set($level,true);
                $config->save();
                return 2;
            } else {
                return 3;
            }

        }

    }


}.#$Sm5   GBMB