Cara Membuat Menu Form UI | Plugin PocketMine #1

Cara Membuat Menu Form UI | Plugin PocketMine #1
Cara membuat menu Form UI untuk plugin PocketMine-MP 5

PocketMine-MP adalah software server untuk Minecraft Bedrock Edition, yang bisa dimainkan di Android, iOS, Windows, dan konsol. Kelebihannya, fungsi server bisa ditambah lewat plugin yang ditulis dengan bahasa PHP.

Di artikel ini kita membuat plugin sederhana bernama MenuUI. Saat pemain mengetik /menu, muncul jendela menu (Form UI) berisi judul, deskripsi, dan tombol. Kodenya sudah disesuaikan untuk PocketMine-MP 5, versi yang dipakai server sekarang.

Kode lama tidak jalan lagiVersi awal artikel ini ditulis untuk PocketMine 3 dan memakai plugin FormAPI. Di PocketMine 5 banyak bagian yang berubah, misalnya pocketmine\Player sekarang pocketmine\player\Player, dan setiap perintah wajib punya permission. Kode di bawah memakai form bawaan PocketMine, jadi tidak perlu FormAPI.

Yang perlu disiapkan

Langkah 1: Buat struktur folder

Buat folder dan file seperti di bawah. Nama folder di dalam src harus sama dengan namespace di kode (Rendii09\MenuUI).

MenuUI/
├── plugin.yml
├── resources/
│   └── config.yml
└── src/
    └── Rendii09/
        └── MenuUI/
            ├── Main.php
            └── MenuForm.php
Struktur folder plugin MenuUI di code editor
Pakai nama sendiriGanti Rendii09 dengan nama Anda dan MenuUI dengan nama plugin. Kalau diganti, ubah juga nama foldernya, namespace di kedua file PHP, dan baris main di plugin.yml.

Langkah 2: Isi plugin.yml

File ini berisi nama plugin, versi API PocketMine, perintah /menu, dan permission-nya. default: true artinya semua pemain boleh memakai perintah ini.

name: MenuUI
version: 1.0.0
main: Rendii09\MenuUI\Main
api: 5.0.0
author: Rendii09
description: "Menu Form UI sederhana untuk PocketMine-MP 5"

permissions:
  menuui.command.menu:
    description: "Membuka MenuUI"
    default: true

commands:
  menu:
    description: "Membuka MenuUI"
    usage: "/menu"
    aliases: [menuui]
    permission: menuui.command.menu

Langkah 3: Isi config.yml

Semua teks yang tampil di menu disimpan di sini, jadi bisa diubah tanpa menyentuh kode. Tanda § diikuti angka atau huruf dipakai untuk memberi warna, misalnya §e kuning dan §l tebal.

# MenuUI config.
# Gunakan "§" untuk memberi warna, dan "\n" untuk baris baru.

# Pesan yang muncul saat perintah dipakai.
messages:
  use_in_game: "§l§7Error: §rGunakan perintah ini di dalam game"
  close_plugin: "§l§aMenu! §r§fTerima kasih telah menggunakan"

# Judul dan deskripsi menu.
menu:
  title: "§l§eMENU"
  description: "§bTuliskan deskripsi tentang MenuUI di sini"

# Nama tombol penutup.
btn:
  close: "§lTUTUP"

Langkah 4: Isi Main.php

Kelas utama plugin. Saat plugin aktif, config.yml disalin ke folder data server. Saat pemain mengetik /menu, menu dikirim ke pemain tersebut.

<?php

declare(strict_types=1);

namespace Rendii09\MenuUI;

use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\player\Player;
use pocketmine\plugin\PluginBase;

class Main extends PluginBase {

    protected function onEnable(): void {
        // Copies resources/config.yml to the plugin's data folder on first run
        $this->saveDefaultConfig();
    }

    public function onCommand(CommandSender $sender, Command $command, string $label, array $args): bool {
        if ($command->getName() !== "menu") {
            return false;
        }
        if (!$sender instanceof Player) {
            $sender->sendMessage((string) $this->getConfig()->getNested("messages.use_in_game"));
            return true;
        }
        $sender->sendForm(new MenuForm($this));
        return true;
    }
}

Langkah 5: Isi MenuForm.php

File ini membentuk jendela menunya. jsonSerialize() menentukan isi form, dan handleResponse() menangani tombol yang ditekan. Nilai $data adalah nomor tombol, dimulai dari 0, atau null kalau form ditutup lewat tombol ×.

<?php

declare(strict_types=1);

namespace Rendii09\MenuUI;

use pocketmine\form\Form;
use pocketmine\player\Player;

/**
 * A simple form: a title, a description and buttons, read from config.yml.
 */
class MenuForm implements Form {

    public function __construct(private Main $plugin) {}

    public function jsonSerialize(): array {
        $config = $this->plugin->getConfig();
        return [
            "type" => "form",
            "title" => (string) $config->getNested("menu.title"),
            "content" => (string) $config->getNested("menu.description"),
            "buttons" => [
                ["text" => (string) $config->getNested("btn.close")]
            ]
        ];
    }

    /**
     * @param mixed $data index of the pressed button, or null when the form is closed with X
     */
    public function handleResponse(Player $player, $data): void {
        if ($data === 0) {
            $player->sendMessage((string) $this->plugin->getConfig()->getNested("messages.close_plugin"));
        }
    }
}

Langkah 6: Jadikan file .phar

PocketMine-MP 5 hanya memuat plugin dalam bentuk file .phar. Pilih salah satu cara:

  • Lewat DevTools. Pasang plugin DevTools dari Poggit di server, unggah folder MenuUI ke folder plugins, lalu restart. Setelah itu jalankan makeplugin MenuUI di console server. Lokasi file .phar yang dihasilkan ditampilkan di console.
  • Lewat PHP di komputer. Simpan kode berikut sebagai build.php di samping folder MenuUI, lalu jalankan php -d phar.readonly=0 build.php.
<?php
// Run from the folder that contains MenuUI/: php -d phar.readonly=0 build.php
$phar = new Phar("MenuUI.phar");
$phar->buildFromDirectory(__DIR__ . "/MenuUI");
$phar->setStub("<?php __HALT_COMPILER();");
echo "MenuUI.phar selesai dibuat\n";

Unggah MenuUI.phar ke folder plugins di server, lalu restart server. Kalau berhasil, console menampilkan tulisan bahwa MenuUI sudah aktif.

Langkah 7: Coba di dalam game

Masuk ke server, lalu ketik /menu di chat. Jendela menu akan muncul. Tekan TUTUP, dan pesan terima kasih dari config.yml muncul di chat.

Menu Form UI muncul setelah mengetik /menu

Menambah tombol

Untuk menambah tombol, tambahkan item di "buttons" pada MenuForm.php. Urutannya menentukan nomor tombol:

"buttons" => [
    ["text" => "Info Server"],
    ["text" => (string) $config->getNested("btn.close")]
]

Lalu tangani nomor tombolnya di handleResponse():

public function handleResponse(Player $player, $data): void {
    if ($data === 0) {
        $player->sendMessage("Selamat datang di server kami!");
    } elseif ($data === 1) {
        $player->sendMessage((string) $this->plugin->getConfig()->getNested("messages.close_plugin"));
    }
}

Kalau menu tidak muncul

  • Plugin tidak aktif. Cek console saat server menyala. Pesan error biasanya menyebutkan baris yang salah, misalnya namespace yang tidak cocok dengan nama folder.
  • Muncul "Unknown command". Pastikan bagian commands di plugin.yml tertulis rapi dengan spasi, bukan tab.
  • Versi API tidak cocok. Pastikan server memakai PocketMine-MP 5, sesuai baris api: 5.0.0.

Penutup

Sekarang Anda punya plugin menu sendiri yang bisa dikembangkan, misalnya tombol teleport, info server, atau daftar aturan. Semua teks tetap bisa diubah lewat config.yml tanpa menyentuh kode.

Spesifikasi

ixrbm

Yoo!

Baca juga

Komentar 0

Daftar isi