PocketMine的插件(plugin)是用世界上最好的語言PHP寫成的。
以下教學在Windows做一個自訂指令的PM插件,並放到伺服器上測試。
1. 安裝必要軟體#
如果只是單純寫php,不需要安裝這些有的沒的,手機也可以寫,但安裝這些工具可以方便除錯。
- 安裝 Windows版本的PHP,下載之後解壓縮,放到C槽的ProgramFiles。
設定環境變數,Path指向PHP資料夾。
本篇教學使用 VSCode編輯器,安裝"PHP Debug"和"PHP Intelephense"這二個熱門延伸模組後重啟VSCode。
從 Github下載PocketMine原始碼,解壓縮,然後安裝VSCode上的 PocketMine IDE延伸模組,開啟這個延伸模組的設定值,填入src資料夾的位置,例如"C:Program FilesPocketMine-MP-stablesrc" (有引號)
下載 Development Tools for PocketMine-MP,把這個插件放到伺服器的plugins資料夾,以插件形式安裝。
2. 專案結構#
插件的資料夾結構應該長這樣,頂層目錄是"MyPlugin":
MyPlugin
│ plugin.yml
│
└─src
└─examplePlugin
Main.php
src裡面的exmplePlugin資料夾可以自訂名字,而主程式就是Main.php。
首先編輯"plugin.yml",填入以下內容:
api: [3.0.0]
name: "MyPlugin"
version: 1.0
author: Ivon
commands:
getsteak:
description: "給予牛排"
usage: /getsteak number
main: examplePlugin\Main
permissions:
getsteak:
default: true
name是這個插件的名字,不要有空白。
main所指的就是主程式位置(不需附檔名),記得要跟src/資料夾下的一致。
permission是權限,預設是所有玩家都可以使用。
此外,有使用到自訂指令的話,也可以在這裡註明,例如這裡有一個叫做"getsteak"的指令。
3. 插件程式碼#
在Main.php
輸入以下內容:
<?php
//命名空間即src/下的路徑
namespace examplePlugin;
//會用到的PocketMine類別
use pocketmine\plugin\PluginBase;
use pocketmine\event\Listener;
use pocketmine\event\player\PlayerJoinEvent;
use pocketmine\utils\TextFormat;
use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\item\Item;
use pocketmine\Player;
class Main extends PluginBase implements Listener
{
//插件載入時
public function onLoad()
{
$this->getLogger()->info("插件載入中");
}
//插件啟用時
public function onEnable()
{
$this->getServer()->getPluginManager()->registerEvents($this, $this);
$this->getLogger()->info("插件已啟用");
}
//插件停用時
public function onDisable()
{
$this->getLogger()->info("插件已停用");
}
//玩家進入世界時
public function onJoin(PlayerJoinEvent $event)
{
$player = $event->getPlayer();
$name = $player->getName();
$this->getServer()->broadcastMessage(TextFormat::GREEN . "$name 加入了伺服器!");
}
//偵測指令
public function onCommand(CommandSender $sender, Command $cmd, string $label, array $args): bool
{
//檢查是在遊戲中輸入或是終端機
if (!$sender instanceof Player) {
$sender->sendMessage("僅限遊戲中使用。");
} else {
if ($cmd->getName() == "getsteak") {
if (!isset($args[0]) or (is_int($args[0]) and $args[0] > 0)) { //確認參數為0且為整數,否則就預設給4個
$args[0] = 4;
}
$sender->getInventory()->addItem(Item::get(364, 0, $args[0])); //給玩家牛排
$sender->sendMessage("已獲得" . $args[0] . "個牛排!");
}
}
return true;
}
}
4. 測試插件#
還不需要打包成phar,直接將專案資料夾複製到伺服器根目錄/plugins/下,接著啟動伺服器,就會有插件載入提示。
5. 打包插件成.phar檔#
插件以資料夾型態載入時可邊修改邊測試,但為避免影響到伺服器/plugins下的其他檔案,建議還是把開發中的專案分開放。
最後,可利用PocketMine DevTools將資料夾打包成.phar,上傳到 Poggit官方儲存庫給別人使用。
終端機輸入"makeplugin 插件名字",例如"makeplugin MyPlugin",插件的名字需與plugin.yml裡面所寫的一致,不要有空格。