[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

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

# PlayerCommandPreprocessEvent