
<?php
echo "PocketMine-MP plugin ItemEditor v1.0.1
This file has been generated using DevTools v1.13.2 at Sun, 17 Mar 2019 17:49:41 +1030
----------------
";

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:"ItemEditor";s:7:"version";s:5:"1.0.1";s:4:"main";s:21:"aieuo\itemEditor\Main";s:3:"api";s:5:"3.0.0";s:6:"depend";s:0:"";s:11:"description";s:0:"";s:7:"authors";s:0:"";s:7:"website";s:0:"";s:12:"creationDate";i:1552807181;}
   plugin.ymlÖ   õ\Ö   (_É¶      	   README.md   õ\   Ö(óU¶         src/aieuo/itemEditor/Main.phpRF  õ\RF  L;˜¶      ---
name: ItemEditor
main: aieuo\itemEditor\Main
version: 1.0.1
api: 3.0.0
author: aieuo
commands:
 edititem:
  description: ã‚¢ã‚¤ãƒ†ãƒ ã®æƒ…å ±ã‚’å¤‰æ›´ã™ã‚‹
  usage: /edititem
  permission: op
...
# ItemEditor<?php

namespace aieuo\itemEditor;

use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\event\Listener;
use pocketmine\event\block\BlockBreakEvent;
use pocketmine\event\server\DataPacketReceiveEvent;
use pocketmine\item\Durable;
use pocketmine\item\enchantment\Enchantment;
use pocketmine\item\enchantment\EnchantmentInstance;
use pocketmine\network\mcpe\protocol\ModalFormResponsePacket;
use pocketmine\network\mcpe\protocol\ModalFormRequestPacket;
use pocketmine\plugin\PluginBase;
use pocketmine\nbt\NBT;
use pocketmine\nbt\tag\CompoundTag;
use pocketmine\nbt\tag\ListTag;
use pocketmine\nbt\tag\ShortTag;
use pocketmine\nbt\tag\StringTag;

class Main extends PluginBase implements Listener {

    private $forms = [];

    public function onEnable() {
        $this->getServer()->getPluginManager()->registerEvents($this, $this);
    }

    public function onCommand(CommandSender $sender, Command $command, string $label, array $args) : bool {
        if(!$command->testPermission($sender)) return true;
        $item = $sender->getInventory()->getItemInHand();
        if($item->getId() === 0) {
            $sender->sendMessage("ã‚¢ã‚¤ãƒ†ãƒ ã‚’æŒã£ã¦ã„ã¾ã›ã‚“");
            return true;
        }
        $form = [
            "type" => "form",
            "title" => "é¸æŠž",
            "content" => "Â§7ãƒœã‚¿ãƒ³ã‚’æŠ¼ã—ã¦ãã ã•ã„",
            "buttons" => [
                ["text" => "åå‰"],
                ["text" => "èª¬æ˜Ž"],
                ["text" => "ãƒ¡ã‚¿å€¤"],
                ["text" => "å€‹æ•°"],
                ["text" => "ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆ"],
                ["text" => "è€ä¹…å€¤ãŒ<æ¸›ã‚‹/æ¸›ã‚‰ãªã„>ã‚ˆã†ã«ã™ã‚‹"],
                ["text" => "<å£Šã›ã‚‹/å£Šã›ãªã„>ãƒ–ãƒ­ãƒƒã‚¯ã‚’è¨­å®šã™ã‚‹"]
            ]
        ];
        $this->sendForm($sender, $form, [$this, "onMenu"]);
        return true;
    }


    public function onBreak(BlockBreakEvent $event) {
        $item = $event->getItem();
        $count = 0;
        if(($blocks = $item->getNamedTagEntry("CannotDestroy")) instanceof ListTag) {
            $count = count($blocks);
            $block = $event->getBlock();
            foreach($blocks as $cannot) {
                if($cannot->getShort("id") == $block->getId() and $cannot->getShort("damage") == $block->getDamage()) {
                    $event->setCancelled();
                }
            }
        }
        if($count === 0 and ($blocks = $item->getNamedTagEntry("CanDestroy")) instanceof ListTag) {
            $block = $event->getBlock();
            if(count($blocks) == 0) return;
            $found = false;
            foreach($blocks as $cannot) {
                if($cannot->getShort("id") == $block->getId() and $cannot->getShort("damage") == $block->getDamage()) {
                    $found = true;
                }
            }
            if(!$found) $event->setCancelled();
        }
    }

    public function onMenu($player, $data) {
        if($data === null) return;
        $item = $player->getInventory()->getItemInHand();
        switch($data) {
            case 0:
                $form = [
                    "type" => "custom_form",
                    "title" => "åå‰å¤‰æ›´",
                    "content" => [
                        [
                            "type" => "input",
                            "text" => "åå‰",
                            "default" => $item->getName()
                        ]
                    ]
                ];
                $this->sendForm($player, $form, [$this, "onChangeName"]);
                break;
            case 1:
                $lore = $item->getLore();
                $form = [
                    "type" => "form",
                    "title" => "é¸æŠž",
                    "content" => "Â§7ãƒœã‚¿ãƒ³ã‚’æŠ¼ã—ã¦ãã ã•ã„",
                    "buttons" => array_map(function($str) { return ["text" => $str]; }, $lore)
                ];
                $form["buttons"][] = ["text" => "<è¿½åŠ ã™ã‚‹>"];
                $this->sendForm($player, $form, [$this, "onSelectLore"], $lore);
                break;
            case 2:
                $max = $item instanceof Durable ? $item->getMaxDurability() : 15;
                $form = [
                    "type" => "custom_form",
                    "title" => "ãƒ¡ã‚¿å€¤å¤‰æ›´",
                    "content" => [
                        [
                            "type" => "input",
                            "text" => "ãƒ¡ã‚¿å€¤",
                            "default" => (string)$item->getDamage(),
                            "placeholder" => "0~".$max
                        ]
                    ]
                ];
                $this->sendForm($player, $form, [$this, "onChangeDamage"]);
                break;
            case 3:
                $max = $item->getMaxStackSize();
                $form = [
                    "type" => "custom_form",
                    "title" => "å€‹æ•°å¤‰æ›´",
                    "content" => [
                        [
                            "type" => "input",
                            "text" => "å€‹æ•°",
                            "default" => (string)$item->getCount(),
                            "placeholder" => "1~".$max
                        ]
                    ]
                ];
                $this->sendForm($player, $form, [$this, "onChangeCount"]);
                break;
            case 4:
                $enchantments = $item->getEnchantments();
                $form = [
                    "type" => "form",
                    "title" => "é¸æŠž",
                    "content" => "Â§7ãƒœã‚¿ãƒ³ã‚’æŠ¼ã—ã¦ãã ã•ã„",
                    "buttons" => array_map(function($enchant) {
                        return ["text" => $enchant->getType()->getName().":".$enchant->getLevel()];
                    }, $enchantments)
                ];
                $form["buttons"][] = ["text" => "<è¿½åŠ ã™ã‚‹>"];
                $this->sendForm($player, $form, [$this, "onSelectEnchant"], $enchantments);
                break;
            case 5:
                $unbreakable = ($item instanceof Durable and $item->isUnbreakable());
                $form = [
                    "type" => "form",
                    "title" => "é¸æŠž",
                    "content" => "ä»Šã¯: è€ä¹…å€¤ãŒæ¸›ã‚Šã¾".($unbreakable ? "ã›ã‚“" : "ã™"),
                    "buttons" => [
                        ["text" => "è€ä¹…å€¤ãŒæ¸›ã‚‹ã‚ˆã†ã«ã™ã‚‹"],
                        ["text" => "è€ä¹…å€¤ãŒæ¸›ã‚‰ãªã„ã‚ˆã†ã«ã™ã‚‹"]
                    ]
                ];
                $this->sendForm($player, $form, [$this, "onChangeUnbreakable"]);
                break;
            case 6:
                $cannotDestroyBlocks = $item->getNamedTagEntry("CannotDestroy") ?? new ListTag("CannotDestroy", [], NBT::TAG_Compound);;
                $cannotDestroy = [];
                foreach($cannotDestroyBlocks as $cannot) {
                    $cannotDestroy[] = $cannot->getShort("id").":".$cannot->getShort("damage");
                }
                $canDestroyBlocks = $item->getNamedTagEntry("CanDestroy") ?? new ListTag("CanDestroy", [], NBT::TAG_Compound);;
                $canDestroy = [];
                foreach($canDestroyBlocks as $can) {
                    $canDestroy[] = $can->getShort("id").":".$can->getShort("damage");
                }
                if(count($cannotDestroy) == 0 and count($canDestroy) == 0) {
                    $content = "å…¨ã¦ã®ãƒ–ãƒ­ãƒƒã‚¯ãŒå£Šã›ã¾ã™";
                } elseif(count($cannotDestroy) == 0) {
                    $content = implode(", ", $canDestroy)." ã ã‘ãŒå£Šã›ã¾ã™";
                } else {
                    $content = implode(", ", $cannotDestroy)." ä»¥å¤–ãŒå£Šã›ã¾ã™";
                }
                $form = [
                    "type" => "form",
                    "title" => "é¸æŠž",
                    "content" => $content,
                    "buttons" => [
                        ["text" => "å£Šã›ãªã„ãƒ–ãƒ­ãƒƒã‚¯"],
                        ["text" => "å£Šã›ã‚‹ãƒ–ãƒ­ãƒƒã‚¯"]
                    ]
                ];
                $this->sendForm($player, $form, [$this, "onSelectDestroy"]);
                break;
        }
    }

    public function onChangeName($player, $data) {
        if($data === null) return;
        $item = $player->getInventory()->getItemInHand();
        $item->setCustomName($data[0]);
        $player->getInventory()->setItemInHand($item);
        $player->sendMessage("å¤‰æ›´ã—ã¾ã—ãŸ");
    }

    public function onSelectLore($player, $data, $lore) {
        if($data === null) return;
        $form = [
            "type" => "custom_form",
            "title" => "èª¬æ˜Žå¤‰æ›´",
            "content" => [
                [
                    "type" => "input",
                    "text" => "èª¬æ˜Ž",
                    "default" => isset($lore[$data]) ? $lore[$data] : ""
                ],
                [
                    "type" => "toggle",
                    "text" => "å‰Šé™¤ã™ã‚‹"
                ]
            ]
        ];
        $this->sendForm($player, $form, [$this, "onChangeLore"], $lore, $data);
    }

    public function onChangeLore($player, $data, $lore, $num) {
        if($data === null) return;
        $item = $player->getInventory()->getItemInHand();
        if($data[1]) {
            unset($lore[$num]);
        } else {
            $lore[$num] = $data[0];
        }
        $item->setLore($lore);
        $player->getInventory()->setItemInHand($item);
        $player->sendMessage($data[1] ? "å‰Šé™¤ã—ã¾ã—ãŸ" : "å¤‰æ›´ã—ã¾ã—ãŸ");
    }

    public function onChangeDamage($player, $data) {
        if($data === null) return;
        $item = $player->getInventory()->getItemInHand();
        $max = $item instanceof Durable ? $item->getMaxDurability() : 15;
        $damage = (int)$data[0];
        if($damage < 0 or $max < $damage) {
            $player->sendMessage("0~".$max."ã®ç¯„å›²ã§è¨­å®šã—ã¦ãã ã•ã„");
            return;
        }
        $item->setDamage($damage);
        $player->getInventory()->setItemInHand($item);
        $player->sendMessage("å¤‰æ›´ã—ã¾ã—ãŸ");
    }

    public function onChangeCount($player, $data) {
        if($data === null) return;
        $item = $player->getInventory()->getItemInHand();
        $max = $item->getMaxStackSize();
        $count = (int)$data[0];
        if($count < 1 or $max < $count) {
            $player->sendMessage("1~".$max."ã®ç¯„å›²ã§è¨­å®šã—ã¦ãã ã•ã„");
            return;
        }
        $item->setCount($count);
        $player->getInventory()->setItemInHand($item);
        $player->sendMessage("å¤‰æ›´ã—ã¾ã—ãŸ");
    }

    public function onSelectEnchant($player, $data, $enchantments) {
        if($data === null) return;
        if(!isset($enchantments[$data])) {
            $form = [
                "type" => "custom_form",
                "title" => "ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆ",
                "content" => [
                    [
                        "type" => "input",
                        "text" => "ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã®åå‰ã‹id"
                    ],
                    [
                        "type" => "input",
                        "text" => "ãƒ¬ãƒ™ãƒ«"
                    ]
                ]
            ];
            $this->sendForm($player, $form, [$this, "onAddEnchant"]);
        } else {
            $enchant = $enchantments[$data];
            $form = [
                "type" => "custom_form",
                "title" => "ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆ",
                "content" => [
                    [
                        "type" => "label",
                        "text" => $enchant->getType()->getName()."  id:".$enchant->getId()
                    ],
                    [
                        "type" => "input",
                        "text" => "ãƒ¬ãƒ™ãƒ«",
                        "default" => (string)$enchant->getLevel()
                    ],
                    [
                        "type" => "toggle",
                        "text" => "å‰Šé™¤ã™ã‚‹"
                    ]
                ]
            ];
            $this->sendForm($player, $form, [$this, "onAddEnchant"], $enchant->getId());
        }
    }

    public function onAddEnchant($player, $data, $id = null) {
        if($data === null) return;
        if($id === null) $id = $data[0];
        if(is_numeric($id)) {
            $enchant = Enchantment::getEnchantment((int)$id);
        } else {
            $enchant = Enchantment::getEnchantmentByName($id);
        }
        if(!($enchant instanceof Enchantment)) {
            $player->sendMessage("ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“");
            return;
        }
        $level = (int)$data[1];
        $item = $player->getInventory()->getItemInHand();
        $item->addEnchantment(new EnchantmentInstance($enchant, $level));
        $player->getInventory()->setItemInHand($item);
        $player->sendMessage("å¤‰æ›´ã—ã¾ã—ãŸ");
    }

    public function onChangeUnbreakable($player, $data) {
        if($data === null) return;
        $item = $player->getInventory()->getItemInHand();
        if(!($item instanceof Durable)) {
            $player->sendMessage("ãã®ã‚¢ã‚¤ãƒ†ãƒ ã«ã¯é©ç”¨ã§ãã¾ã›ã‚“");
            return;
        }
        $item->setUnbreakable((bool)$data);
        $player->getInventory()->setItemInHand($item);
        $player->sendMessage("è€ä¹…å€¤ãŒã¸".((bool)$data ? "ã‚‰ãªã„" : "ã‚‹")."ã‚ˆã†ã«ã—ã¾ã—ãŸ");
    }

    public function onSelectDestroy($player, $data) {
        if($data === null) return;
        $item = $player->getInventory()->getItemInHand();
        $type = $data == 0 ? "CannotDestroy" : "CanDestroy";
        $blocks = $item->getNamedTagEntry($type) ?? new ListTag($type, [], NBT::TAG_Compound);
        $buttons = [];
        foreach($blocks as $entry) {
            $buttons[] = ["text" => $entry->getShort("id").":".$entry->getShort("damage")];
        }
        $buttons[] = ["text" => "<è¿½åŠ ã™ã‚‹>"];
        $form = [
            "type" => "form",
            "title" => "é¸æŠž",
            "content" => "Â§7ãƒœã‚¿ãƒ³ã‚’æŠ¼ã—ã¦ãã ã•ã„",
            "buttons" => $buttons
        ];
        $this->sendForm($player, $form, [$this, "onSelectCanDestroy"], $blocks, $type);
    }

    public function onSelectCanDestroy($player, $data, $blocks, $type) {
        if($data === null) return;
        $form = [
            "type" => "custom_form",
            "title" => "å£Šã›".($type == "CanDestroy" ? "ã‚‹" : "ãªã„")."ãƒ–ãƒ­ãƒƒã‚¯",
            "content" => [
                [
                    "type" => "input",
                    "text" => "id",
                    "default" => isset($blocks[$data]) ? $blocks[$data]->getShort("id").":".$blocks[$data]->getShort("damage") : ""
                ],
                [
                    "type" => "toggle",
                    "text" => "å‰Šé™¤ã™ã‚‹"
                ]
            ]
        ];
        $this->sendForm($player, $form, [$this, "onChangeCanDestroy"], $blocks, $data);
    }

    public function onChangeCanDestroy($player, $data, $blocks, $num) {
        if($data === null) return;
        $item = $player->getInventory()->getItemInHand();
        $ids = explode(":", $data[0]);
        $found = false;
        foreach($blocks as $k => $entry) {
            if($entry->getShort("id") == $ids[0] and $entry->getShort("damage") == $ids[1]) {
                if($data[1]) $blocks->remove($k);
                $found = true;
                break;
            }
        }
        if(!$found and $data[1]) {
            $player->sendMessage("idãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ");
        } elseif(!$found) {
            $blocks->push(new CompoundTag("", [
                new ShortTag("id", (int)$ids[0]),
                new ShortTag("damage", (int)$ids[1])
            ]));
            $player->sendMessage("è¿½åŠ ã—ã¾ã—ãŸ");
        } elseif($data[1]) {
            $player->sendMessage("å‰Šé™¤ã—ã¾ã—ãŸ");
        } else {
            $player->sendMessage("ãã®idã¯ã™ã§ã«è¿½åŠ æ¸ˆã¿ã§ã™");
        }
        $item->setNamedTagEntry($blocks);
        $player->getInventory()->setItemInHand($item);
    }






    public function encodeJson($data){
        $json = json_encode($data, JSON_PRETTY_PRINT | JSON_BIGINT_AS_STRING | JSON_UNESCAPED_UNICODE);
        return $json;
    }

    public function sendForm($player, $form, $callable = null, ...$datas) {
        while(true) {
            $id = mt_rand(0, 999999999);
            if(!isset($this->forms[$id])) break;
        }
        $this->forms[$id] = [$callable, $datas];
        $pk = new ModalFormRequestPacket();
        $pk->formId = $id;
        $pk->formData = $this->encodeJson($form);
        $player->dataPacket($pk);
    }

    public function Receive(DataPacketReceiveEvent $event){
        $pk = $event->getPacket();
        $player = $event->getPlayer();
        if($pk instanceof ModalFormResponsePacket){
            if(isset($this->forms[$pk->formId])) {
                $json = str_replace([",]",",,"], [",\"\"]",",\"\","], $pk->formData);
                $data = json_decode($json);
                if(is_callable($this->forms[$pk->formId][0])) {
                    call_user_func_array($this->forms[$pk->formId][0], array_merge([$player, $data], $this->forms[$pk->formId][1]));
                }
                unset($this->forms[$pk->formId]);
            }
        }
    }
}XÍ—Ëú;õ Šò_øÓB¿kÙ   GBMB