[Plugin開発]特定のコマンドの実行を無効にする方法

/help/plなどのコマンドをプラグイン側から無効化する方法を紹介したいと思います。もちろん独自で追加した・されたコマンドも無効化できます。

PlayerCommandPreprocessEventを使う

PlayerCommandPreprocessEventゲーム内からプレイヤーがコマンドを実行した時に発生します。似ているイベントとしてServerCommandEventがありますが、これはコンソールからコマンドを実行した時に発生します。

	@EventHandler
	public void playerCommand(PlayerCommandPreprocessEvent e){
		Player player = e.getPlayer(); //実行したプレイヤー
		String command = e.getMessage();//実行したコマンドを取得
		
		player.sendMessage("command: " + command);//プレイヤーに表示
	}

not-command
実行したコマンドの内容はgetMessage()で取得することができます。実行してみと/も一緒に取得されることがが分かりますね。

	@EventHandler
	public void playerCommand(PlayerCommandPreprocessEvent e){
		Player player = e.getPlayer(); //実行したプレイヤー
		String command = e.getMessage();//実行したコマンドを取得
		
		player.sendMessage("command: " + command);//プレイヤーに表示
		
		if(command.equalsIgnoreCase("/pl")){
			e.setCancelled(true);//キャンセル
			player.sendMessage("キャンセルした");
		}
	}

そのまま取得したコマンドと禁止したいコマンドが比例していた場合、イベントをキャンセルしてしまえば、実行したコマンドは無効化されます。

引数があると回避できる

実はこのままの場合、引数があるとキャンセルを回避することができます。

/pl hikisuu

例えばこのように実行するとコマンドは正しく実行されますが、プラグイン側では文字列全体で比べて判別しているので回避されてしまいます。

	@EventHandler
	public void playerCommand(PlayerCommandPreprocessEvent e){
		Player player = e.getPlayer(); //実行したプレイヤー
		String[] command = e.getMessage().split(" ", 0);//配列にする
		
		player.sendMessage("command: " + command);//プレイヤーに表示
		
		if(command[0].equalsIgnoreCase("/pl")){
			e.setCancelled(true);//キャンセル
			player.sendMessage("キャンセルした");
		}
	}

なのでsplit関数を使いスペース毎に分けて配列に一度いれます。

/pl hairetu
/plhairetu

そうするとこのように分割することができます。あとは一番最初の配列と禁止したいコマンドの文字列を比べるようにすれば、引数がいくつあっても回避されることは無くなります。

100万円&豪華景品のチャンス!

レンタルサーバーで有名な「ConoHaVPS」が8周年記念キャンペーン中!!

総額100万円クーポンが貰えたり、
Switch」「iPad Pro」「HHKB」が当たるチャンス!

参加条件は「ConoHaアカウントを持っている
ことなので誰でも無料で出来ます。

持っていないならアカウントを作って参加しよう!

\ 8月4日(水) ~ 18:00 締め切り迫ってます! / キャンペーンサイトへ
シェアする
脱・初心者を目指すマインクラフト

コメント

悩みが解決しない場合

次の方法を試してみましょう。

Twitterで質問する

当ブログの管理者に質問してみましょう。絶対ではありませんが答えてくれるか、記事に書いてくれるかもしれません。

キーワードで検索する

悩みのキーワードを検索してみましょう。ブログにはたくさんの記事が投稿されています。