이번에는 마인크래프트 플러그인 개발 중 명령어에 대해서 알아보도록 하겠습니다.
튜토리얼 에서는 명령어를 타이핑 했을 때 onCommand() 라는 메서드를 활용하면 된다고 합니다.
위 onCommand() 메서드는 플레이어가 "/"로 시작하는 명령어를 타이핑 했을 때 실행된다고 합니다.
버킷이 제공해주는 명령어와 이름이 겹치는 것을 피해야 하고 유니크한 명령어의 이름을 고려해야 한다고 합니다.
예를 들어, give 라는 명령어는 이미 여러 플러그인에서 사용되고 있는 명령어 입니다.
만약 give 라는 명령어를 플러그인에서 개발한다면 다른 플러그인과 호환되지 않습니다.
그리고 명령어는 plugin.yml 에 등록해야 하고 그렇지 않으면 onCommand 메서드가 실행되지 않을 것이라고 합니다.
다음은 onCommand 메서드의 4 개의 파라미터에 대해 설명하고 있는데요.
sender 의 경우, CommandSender 타입이고 누가 명령어를 입력했는지를 알려주는 인자인 것 같습니다.
cmd 의 경우, Command 타입이고 실행된 명령어의 정보를 가지고 있는 것 같습니다.
commandLabel 의 경우, String 타입이고 사용된 명령의 별명에 대해 알려주는 것 같습니다.
args 의 경우, String 배열 타입이고 추가적인 요소들의 배열을 알려준다는 것 같습니다.
튜토리얼에서는 basic 이라는 명령어를 만드는 방법에 대해 알려주는 것 같습니다.
7장 에서 제작한 방법과 동일하게 프로젝트를 만들고 진행해보도록 하겠습니다.
onCommand 메서드의 경우에도 Override/Implement Methods 창에서 추가할 수 있습니다.
package com.tistory.beingb;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin;
public class CommandPlugin extends JavaPlugin {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
// TODO Auto-generated method stub
return super.onCommand(sender, command, label, args);
}
@Override
public void onDisable() {
// TODO Auto-generated method stub
super.onDisable();
}
@Override
public void onEnable() {
// TODO Auto-generated method stub
super.onEnable();
}
}
최종적으로 위와 같은 onCommand 메서드가 포함된 클래스를 제작할 수 있습니다.
튜토리얼의 경우 위와 같은 onCommand 메서드를 우선 만들라고 합니다.
내용을 보면 /basic 이라는 명령어를 실행했을 때 해당 메서드가 실행되게 된다는 것 같습니다.
true 라는 값을 return 하게 되면 해당 메서드가 정상적으로 발동하게 되고
만약, 해당 메서드가 발동되기를 원하지 않는다면 false 라는 값을 리턴하라는 것 같습니다.
onCommand 메서드의 함수의 마지막에는 false 를 리턴해서 의도하지 않은 상황에 작동시키지 않는 것이 좋다고 합니다.
만약, false 를 리턴하게 되면 plugin.yml 에 정의한 usage 가 보이게 될 것이라고 합니다.
다음은 plugin.yml 에 커맨드를 추가하라는 내용이 나오게 됩니다.
위에서 이야기했듯이 plugin.yml 에 명령어를 등록해야 하고 그렇지 않으면 onCommand 메서드가 실행되지 않을 것이라 했습니다.
가장 위 basic 은 명령어의 이름을 의미합니다.
description 은 명령어의 설명을 의미합니다.
usage 는 onCommand 메서드에서 false 를 리턴했을 때 유저에게 보여주는 내용을 의미합니다.
permission 과 permission-message 는 다른 챕터에서 다루도록 하겠습니다.
name : CommandPlugin
main : com.tistory.beingb.CommandPlugin
version : 1.0.0
author : beingb
commands :
basic :
description : This is a demo command.
usage: /basic [player]
위와 같이 plugin.yml 파일을 구성해보도록 하겠습니다.
yml 파일을 제작하고는 yaml checker 를 통해 유효한 yml 파일인지 확인하는 것이 좋은 습관입니다.
YAML Checker - The YAML Syntax Validator
YAML Checker - The Best YAML Validator
A fast and easy-to-use YAML syntax validator for developers, devops, or anyone else using YAML syntax
yamlchecker.com
다음은 튜토리얼에서 CommandSender 타입의 sender 라는 파라미터에 대해 설명하고 있는데요.
CommandSender 은 두 가지 유용한 하위클래스를 가지고 있는 Bukkit 의 인터페이스라고 합니다.
내용을 살펴보면 이전 챕터에서 다뤘던 Player 라는 타입을 포함하고 있는 것이 CommandSender 라는 것을 알 수 있었습니다.
그리고 다음 내용은 CommandExecutor class 를 분리하는 방법에 대해 설명해줍니다.
해당 내용은 명령어 파일을 분리하는 예시에 대해 설명해주는데요.
자바라는 언어의 특성을 알아야 이해할 수 있는 내용이긴 하지만, 아래와 같은 방법을 통해 분리할 수 있다는 정도만 이해하면 좋을 것 같습니다.
MyPluginCommandExecutor 라는 CommandExecutor 를 implements 한 클래스를 만듭니다.
안의 내용에는 생성자와 onCommand 메서드를 포함하고 있습니다.
생성자의 인자로는 메인 클래스를 받습니다.
그 다음 main 클래스에서
this.getCommand("basic").setExecutor(myExecutor);
라는 코드를 통해 명령어를 등록할 수 있습니다.
여기서 "basic" 은 처리할 명령어를 의미하고, myExecutor 는 만든 명령어 클래스의 인스턴스를 넣습니다.
그러면 실습으로 basic 이라는 명령어를 입력하면
<플레이어의 이름>님 어서오세요.
라는 메세지를 보내주는 코드를 작성해보도록 하겠습니다.
2. 자바의 정석 2장 - 변수(variable) — 느리게 올라가는 달팽이 (tistory.com)
2. 자바의 정석 2장 - 변수(variable)
이 글의 내용은 자바의 정석 을 기반으로 합니다.이 카테고리는 마인크래프트 플러그인 개발에 포커스를 둡니다. Java의 정석 | 남궁성 - 교보문고 (kyobobook.co.kr) Java의 정석 | 남궁성 - 교보문고Ja
beingb.tistory.com
해당 내용을 간략하게라도 읽고오면 코드를 이해하는 것에 도움이 될 것입니다.
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (command.getName().equalsIgnoreCase("basic")) {
String playerName = sender.getName();
sender.sendMessage(playerName + "님 어서오세요.");
return true;
}
return false;
}
command 의 getName() 메서드를 통해 입력한 명령어 정보를 가져올 수 있다는 것을 튜토리얼을 통해 알 수 있었습니다.
sender 는 Player 를 하위 클래스로 가지고 있어 Player 클래스가 가지고 있는 변수나 메서드를 사용할 수 있는데요.
플레이어의 이름을 String 타입의 변수에 저장하고
sendMessage 메서드를 통해 <플레이어의 이름>님 어서오세요. 라는 메세지를 보내도록 합니다.
maven install 을 통해 플러그인을 제작하려 하니 실패하게 됩니다.
command 라는 패키지를 찾을 수 없다는 명령어 인 것 같은데요.
튜토리얼과 다른 내용을 확인해보니 CommandExecutor 라는 것을 implements 해주지 않아서 발생한 에러인 것 같습니다.
추가하고 maven install 해보도록 하겠습니다.
성공적으로 플러그인 파일이 만들어졌습니다.
명령어를 입력하려고 채팅창에 "/basi" 를 입력하면 추천 명령어로 basic 이 노출되게 됐습니다.
"/basic" 라는 명령어를 입력하면 아래와 같이 서버의 로그가 노출되고
의도했던대로 <플레이어의 이름>님 어서오세요. 라는 문구가 노출되게 됐습니다.