| Date==== |
Time==== |
Update==== |
Time==== |
Title==== |
[[W]WRITE [RET]READ [?]HELP] |
| 2023-04-06 |
02:04:40 |
0000-00-00 |
00:00:00 |
Spigotプラグイン開発で、BungeeCordを操作する時に困った話 |
TEXT FILE ( 8KiB ) を受信しますか? [Y]/[N] > Y
Spigotプラグイン開発で、BungeeCordを操作する時に困った話です。
どういうことか?説明しましょう
Spigotプラグインで、棒を右クリックしたらインベントリを使ったメニューを出す
↓
ダイヤモンドをクリックしたら、「main」という鯖に転送する
というのを作りたかった。つまり、ハイピとかで良くあるインベントリを使ったメニューのあれです()
簡単そうに見えて、実は結構落とし穴があった;;
それではやり方を説明します!
前提条件
・Spigotのプラグインのプロジェクトがある
・IDEはIntelliJ(違うくても別に弊害はない)
やり方
まずは以下のコードを
ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.writeUTF("Connect");
out.writeUTF("移動先の鯖の名前");
player.sendPluginMessage(this, "BungeeCord", out.toByteArray());
つまり、「Menu」というインベントリでダイヤモンドをクリックしたらこれを実行するなら、以下のようにメインクラス内に記述します↓↓
public void onInventoryClick(InventoryClickEvent event) {
if (!event.getView().getTitle().equals("Menu")) { // インベントリのタイトルが"Menu"ではない場合は処理しない
return;
}
event.setCancelled(true); // イベントをキャンセルする(アイテムを移動できなくする)
if (event.getCurrentItem() == null || event.getCurrentItem().getType() == Material.AIR) { // クリックされたアイテムが空気の場合は処理しない
return;
}
Player player = (Player) event.getWhoClicked();
switch (event.getCurrentItem().getType()) {
case DIAMOND
// ダイヤモンドがクリックされた場合の処理
ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.writeUTF("Connect");
out.writeUTF("移動先の鯖名");
player.sendPluginMessage(this, "BungeeCord", out.toByteArray());
break;
}
}
理解できましたか?
まあ、この後なぜ私がつまずいて発狂しかけたのか解説します・・・・
つまずいた理由ですが、わたしはこれを別のクラスでやっていました。
メインクラスから、イベント処理としてOpenMenuというクラスを呼び出していました。
なぜ動かないのか?それは「player.sendPluginMessage(this, "BungeeCord", out.toByteArray());」にあります。
「sendPluginMessage」の引数を見てみましょう
sendPluginMessage(Plugin, Channnel, Byte(?))
このPluginというのは、私のよくわからないんですが、おそらく自分自身、つまりプラグイン自信の事だと思います、たぶん(?)
これをわたしはIntelliJの促すがままに「(Plugin) this」といれていました、これが発狂の原因、つまりエラーの原因です。。。
Pluginはメインクラスで、一番最初に初期化しないといけない?らしいのですが、
もちろん適当にいれたこのthisは初期化されていないので、エラーが出たわけです
これのせいで時間を結構消費しました;;
プラグインは情報も少ないしね、、、
最後にエラー文を貼っておきます
エラー文
まあ、以上で終わります、コメント欄で補足説明をしてくれるとありがたいです。。。。
じゃ!