プレイヤーがコマンドでログインするまで、ブロックの配置/破壊、インベントリの変更、チャットなど、すべてのアクションをブロックする AuthMe に似たプラグインを作成したいと考えています。
AuthMe を使用したくない理由は、サイトのアカウントと同じパスワードを使用するなど、自分の Web サイトと通信したいからです。
Listener
キャンセルするすべてのイベントをリッスンする を作成します。
の下のさまざまなパッケージを見てくださいorg.bukkit.event
。org.bukkit.event.player
おそらく、ほとんどのイベントにフックする必要があります。
AuthMe Reloadedのソース コードを見て、それがどのように行われるかを理解することをお勧めします。fr.xephi.authme.listener
パッケージをチェックしてください。
私は自分で AuthMC のコピーを作成したので、これを行うためのコードをいくつか提供できます。
まず、キャンセルが必要なイベントのリストを作成する必要があります。次に、「ログインしている」プレイヤーの HashSet が必要になります。各イベント リスナーは、プレーヤーが HashSet 内にあるかどうかを確認し、そうでない場合はイベントをキャンセルします。
HashSet<String> loggedInPlayers = new HashSet<String>();
public void blockBreak(BlockBreakEvent e) {
if(!logginInPlayers.contains(e.getPlayer().getName()) {
e.setCancelled(true);
}
}
HashSet にはプレイヤー名が含まれている必要があることに注意してください。これは、よく知られているように、Player を直接保存すると大量のメモリが必要になるため、メモリを節約するためです。
また、プレイヤーがログアウトしたときに HashSet からプレイヤーを削除する Event Listener も必要です。
public void playerQuit(PlayerQuitEvent e) {
loggedInPlayers.remove(e.getPlayer().getName();
}
人々が以前に言ったように、あなたがしなければならないことは、イベントが発生するのをリッスンし、それらが指定されたリストにあるかどうかを確認することだけです. 必ずしもリストではなく、HashMap も同様に機能します。提案されているように、HashSet と同様です。ただし、サイトに接続するのは少し難しく、その方法については知識がないのでお答えできません。
プレーヤーがチャットしたときにイベントをキャンセルする例 (私は自分のプラグインで使用し、HashSet を使用してプレーヤーがログオンしているかどうかを判断します):
HashSet<String> loggedIn = new HashSet<String>();
@EventHandler
public void onPlayerChat(PlayerChatEvent event) {
if (!loggedIn.contains(event.getPlayer().getName()) {
event.setCancelled(true);
event.getPlayer().sendMessage("You must log in to chat!"); //Optional
}
}
また、終了時にログインしているプレーヤーのリストからそれらを削除することも必要です。
@EventHandler
public void onPlayerQuit(PlayerQuitEvent event) {
loggedIn.remove(event.getPlayer().getName());
}
他のイベントのチャットの例を繰り返すだけで、準備は完了です!