
<?php
echo "PocketMine-MP plugin WorldProtection v3.0.0
This file has been generated using DevTools v1.14.2 at Mon, 16 Aug 2021 22:52:38 +0900
----------------
Name: WorldProtection
Version: 3.0.0
Main: roi611\\worldprotection\\Main
Api: 3.0.0
Depend: 
Description: ワールドの破壊や設置を制限します
Authors: 
Website: 
CreationDate: 1629121958
";
__HALT_COMPILER(); ?>
             0  a:9:{s:4:"name";s:15:"WorldProtection";s:7:"version";s:5:"3.0.0";s:4:"main";s:27:"roi611\worldprotection\Main";s:3:"api";s:5:"3.0.0";s:6:"depend";s:0:"";s:11:"description";s:48:"ワールドの破壊や設置を制限します";s:7:"authors";s:0:"";s:7:"website";s:0:"";s:12:"creationDate";i:1629121958;}
   plugin.ymlr  mar  ^      #   src/roi611/worldprotection/Main.php,  ma,  wQ      name: WorldProtection
main: roi611\worldprotection\Main
version: 3.0.0
api: 3.0.0
load: POSTWORLD
author: roi611
description: ワールドの破壊や設置を制限します

commands: 
  worldbreak:
     description: ワールドのブロックの破壊できなくします
     usage: /worldbreak
  worldplace:
     description: ワールドにブロックの設置をできなくします
     usage: /worldplace
  canbreak:
     description: 設置保護の例外ブロックを追加します
     usage: /canbreak
  canplace:
     description: 破壊保護の例外ブロックを追加します
     usage: /canplace
<?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;

use pocketmine\utils\Config;
    
    class Main extends PluginBase implements Listener {
    
    public function onEnable() {
       
        $this->getServer()->getPluginManager()->registerEvents($this, $this);
        $this->place = new Config($this->getDataFolder()."place.yml", Config::YAML);
        $this->break = new Config($this->getDataFolder()."break.yml", Config::YAML);
        $this->idbreak = new Config($this->getDataFolder()."idbreak.yml", Config::YAML);
        $this->idplace = new Config($this->getDataFolder()."idplace.yml", Config::YAML);

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

        if(!($sender->isOp())) {

            $sender->sendMessage("権限がないためコマンドを実行できません");
            return true;

        }

        if($sender instanceof Player) {

            if(isset($args[1])){
                $level = $args[1];
            } else {
                $level = $sender->getLevel()->getName();
            }

        } else {

            if(isset($args[1])){
                $level = $args[1];
            } else {
                $sender->sendMessage('§cコマンドに第二引数(World)を指定してください');
                return true;
            }

        }
        
        switch($label) {

            case "worldbreak":

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

                    if($args[0] === 'on' or $args[0] === 'off'){

                        $int = $this->protection($this->break,$level,$args[0]);
                        
                        switch($int){
                            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' or $args[0] === 'off'){

                        $int = $this->protection($this->place,$level,$args[0]);
                        
                        switch($int){
                            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])) {

                    $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("{$string} を例外ブロックに登録しました");
                        $this->idbreak->set($level,array($string));
                        $this->idbreak->save();

                    } 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);
                            $this->idbreak->save();
                            $player->sendMessage("§9{$string}§e を例外ブロックから削除しました");

                        } else {

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

                        }

                    }

                } else {

                    $sender->sendMessage("使い方:\n/canbreak id(:damage) <World(任意)>");

                }

            break;

            case "canplace":

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

                    $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("{$string} を例外ブロックに登録しました");
                        $this->idplace->set($level,array($string));
                        $this->idplace->save();

                    } 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);
                            $this->idplace->save();

                        } else {

                            array_push($data,$string);
                            $this->idplace->set($level,$data);
                            $this->idplace->save();

                        }

                    }

                } else {

                    $sender->sendMessage("使い方:\n/canplace id(:damage) <World(任意)>");

                }

            break;

        }

        return true;

    }

    public function onBreak(BlockBreakEvent $event) {

        $player = $event->getPlayer();
        $level = $player->getLevel()->getName();
        $block = $event->getBlock();
        $id = $block->getId().":".$block->getDamage();

        if($player->isOp() === 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->setCancelled();
                    }
                    // else{//例外ブロック

                } else {
                    $event->setCancelled();
                }

            }

        }

    }

    public function onPlace(BlockPlaceEvent $event) {

        $player = $event->getPlayer();
        $level = $player->getLevel()->getName();
        $block = $event->getBlock();
        $id = $block->getId().":".$block->getDamage();

        if($player->isOp() === 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) === false){
                        $event->setCancelled();
                    }
                    // else{//例外ブロック

                } else {
                    $event->setCancelled();
                }

            }

        }

    }


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

        }

    }


}G@sK:l1e@d   GBMB