Now you have a plugin in AmaiBeetroot. The following guidelines can help you change it into a ZekkouCake plugin. Create a plugin folder of your plugin name. Create file "plugin.yml" in your plugin folder. In /plugin.yml, write these: Name. It is necessary for a plugin. Write "name: ThisIsMyPluginName" on the first line API version. This tutorial is for API 1.0.0 so write "api: [1.0.0]" on the next line Plugin version. Use your favoured version code name. E.g. "version: 1.0.0" Load order. It can be either "STARTUP" or "POSTWORLD". If you don't strictly need STARTUP, use POSTWORLD. E.g. "load: POSTWORLD" Main class name. This class name is same as the old API one. However, note that plugin developers are encouraged/required to use namespaces in their plugins. Therefore, an example is "main: pemapmodder\exampleplugin\Main" The following are optional attributes: Author(s). If there is only one author, use "author: YourName". If there are multiple, use "authors: [MyName, YourName, HisName]". If you don't want to it are too lazy to specify the author, just skip this line. Website. The key is "website". Prefix. If left rmpty, it will be your plugin name. Prefix will be used if you use $this->getLogger()->log($msg) when you console. Dependencies. If your plugin requires another plugin to work with, name them. E.g. "depend: [SimpleAuth, PocketFactions]" Soft dependencies. If the plugin is not strictly required but it is better that it is there, use soft dependencies. E.g. "softdepend: [xEcon]' Create folder /src/ in your plugin folder. Create subfolders as your namespace like on java packages. E.g. if your namespace is pemapmodder\egplugin, create folders to /src/pemapmodder/egplugin/. Create a file according to your class name in the namespace. E.g. if your main class is pemapmodder\egplugin\Main, create file "/src/pemapmodder/egplugin/Main.php". Note that in the new API, with the SPL class loader, classes must be placed according to their namespaces and names in order to be loaded, unless you are doing the discouraged way of all classes in one file. Now, copy all your code in the old API plugin into the new one. The /*__PocketMine a plugin__ ...*/ thing can be omitted since they will be ignored. PocketMine-MP will only load those at "plugin.yml". After <?php: Add line "namespace your\namespace;". Add line "use pocketmine\plugin\PluginBase; Replace "implements Plugin" with "extends PluginBase". Add namespace class references at the beginning, e.g. "use pocketmine\Player;". The references can be found at the documentation. Replace the initialization: __construct(ServerAPI $api, $server=false): remove it init(): change it to onEnable(). Commands. For $this->api->console->register("cmd", "<usage>description", array($this, "onCommand"); and $this->api->console->alias("c", "cmd");: Use code method: Instantiate a new object of pocketmine\command\PluginCommand: $cmd = new PluginCommand("cmd", $this); where $this must be the plugin object. Set the description, usage and aliases: $cmd->setDescription("description"), $cmd->setUsage("/cmd <usage>"), $cmd->setAliases(array("c") Handle the command at onCommand(pocketmine\command\CommandSender $issuer, Command $cmd, $label, array $args) where the command name can be given by $cmd->getName(), and $sender can be an instance of pocketmine\Player or pocketmine\command\ConsoleCommandSender (or RCon, class pocketmine\command\RemoteConsoleCommandSender, subclass of pocketmine\command\ConsoleCommandSender. Use $issuer->sendMessage() instead of returning a string to send a message. Return a Boolean (true or false) value. If true nothing will happen. If false a usage information will be sent to the issuer. Use plugin.yml Add new key commands. "commands" is an array with string keys (a map as in YAML terms) Add a new element in the array. The key is the command name. The value is another string key array (map). For description, usage and aliases, add them with the values you add in method 1. E.g. " aliases: [c] Handle the command at onCommand() Create a subclass of PluginCommand or Command+PluginIdentifyableConmand. Events. Find the class name of the event you want to handle. Find them at https://github.com/PocketMine/PocketMine-MP/blob/Core-Rewrite/src/pocketmine/event where usually the events are located in the subdirectories in the link. Create functions of any name. Each function must only have one parameter. The parameter must have a type hint of the event class. Add your code to handle the events inside the functions. Add this line in onEnable(): $this->getServer()->getPluginManager()->registerEvents($this, $this); Scheduling Create a new class that extends pocketmine\scheduler\PluginTask. In the constructor of the class, add line "parent::__construct($plugin);", where $plugin is an instance of your plugin. You can get the plugin instance using Server::getInstance()->getPluginManager()->getPlugin("PluginName"). Add the code to run in function onRun($ticks). Schedule the task to be run using $this->getServer()->getScheduler()->scheduleDelayedTask($task, $delayTicks)|scheduleRepeatingTask($task, $interval). Use onDisable() instead of __destruct(). Replace $playet->entity with $player directly! Replace $player->addItem(), $player->setSlot() and other inventory-related methods with $player->getInventory()->...() Replace $player->sendChat() with $player->sendMessage(). Replace $this->api->... methods with correct function names. Common usages are $this->getServer()->getPlayer() and $this->getServer()->getLevel(). Use DevTools with FolderPluginLoader enabled to test your plugins. Compile your plugin by using command /makeplugin of DevTools and distribute/release your plugin in the compiled .phar file.