- 관련 문서: 마인크래프트/개발, 마인크래프트/모드/개발
- 상위항목: 마인크래프트/플러그인
마인크래프트 주요 문서 | |||||||
게임 진행 관련 문서 | 명령어 | 마법부여 | 몹 | ||||
아이템 | 회로 | 업적 | |||||
바이옴 | 구조물 | 차원 | |||||
진행 외 주요 문서 | 모드 | 리소스팩 | 맵 | ||||
멀티플레이 | 플러그인 | 서버 구동 | |||||
출시된 에디션 | 포켓에디션 | 콘솔에디션 | |||||
스토리 모드 | 에듀케이션 에디션 | ||||||
관련 문서 | 튜토리얼 | 팁 | 여담 | ||||
핵 | 커뮤니티 | 닉네임 스킨 | |||||
개발 관련 | 기초 | 모드 | |||||
플러그인 | ModPE | ||||||
업데이트 | PC 업데이트 내역 | PE 업데이트 내역 |
목차
- 1 개요
- 2 도입
- 3 준비
- 4 첫 프로젝트 만들기
- 5 마인크래프트 버킷 외부 라이브러리 다운로드
- 6 마인크래프트 버킷 외부 라이브러리 적용하기
- 7 명령어 입력 받기
- 8 제목 표시하기
- 9 팁
- 10 레퍼런스
- 10.1 콜백 함수
- 10.2 JavaPlugin
- 10.2.1 getFile
- 10.2.2 getDefaultWorldGenerator(String worldName, String id)
- 10.2.3 getDatabase()
- 10.2.4 public FileConfiguration getConfig()
- 10.2.5 public InputStream getResource(String filename)
- 10.2.6 protected void installDDL()
- 10.2.7 protected void removeDDL()
- 10.2.8 public PluginCommand getCommand(String name)
- 10.2.9 public void onLoad()
- 10.2.10 public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args)
- 10.2.11 public void reloadConfig()
- 10.2.12 public void saveConfig()
- 10.2.13 public void saveDefaultConfig()
- 10.2.14 public void saveResource(String resourcePath, boolean replace)
- 10.2.15 public List<Class<?> getDatabaseClasses()
- 10.3 패키지
1 개요
본 문서는 마인크래프트 서버에 사용되는 플러그인 개발에 도움을 주고자 생성되었습니다.
또한 내용은 영상 촬영 및 문서 작성[1]일 기준jdk 1.8.0_91 과 craftbukkit-1.9.4 를 기반으로,
코드 및 전반 내용은 Bukkit Wiki 와 SpigotMC Wiki, Bukkit API 를 기반으로 작성되었습니다.
플러그인 코딩에 사용되는 코드는 Color Scripter 의 Java 기능을 이용해 주세요. 나무위키 에서 HTML 지원이 종료될 경우 테이블(표) 기능을 이용해 대채해 주시기 바랍니다.
만약 마인크래프트 모드 개발 을 찾아오셨다면 마인크래프트/모드/개발 문서로 이동해 주세요.
하지만 모드 만들기 프로그램 있지만 플러그인 만들기 프로그램은 그런거 없다.
2 도입
2.1 플러그인 이란?
플러그 인(Plug-in; PIN) 은 호스트 프로그램과 상호작용하는 컴퓨터 소프트웨어이다.
위에서 정의한 내용이 "플러그 인" 의 원래 정의이며, 마인크래프트 에서 정의하는 플러그인은
서버에서 모드 없이 바닐라 상태에서 커맨드와 이벤트 등을 추가시켜 플레이에 도움을 주거나 새로운 방식을 추가하는 파일
을 의미합니다.
모드 와는 다르게, 클라이언트 측 (플레이어)이 설치할 필요 없이 오로지 설치된 서버에만 접속하면 사용이 가능하다는 장점이 있지만,
싱글플레이에서는 이 파일로만 사용할 수 없고, 서버에 설치하여 사용해야한다는 단점이 있습니다.[2]
2.2 기초적인 지식
- 기본적인 마인크래프트 지식 (어떻게 하면 무엇을 얻을수 있는지 등)
- Java 또는 객체 지향 프로그래밍 에 대한 기초적인 상식
- 기초적인 중학교 영어 실력 (우리가 쓸 프로그램과 짤 코드가 전부 다 영어)
- (옵션) API 등의 레퍼런스 이해 능력
3 준비
3.1 통합 개발 환경(IDE) 설치
3.1.1 구버전 Eclipse (Mars 버전 이전; 미설치형)
3.1.2 신버전 Eclipse (Mars.1 버전 이후; 설치형)
3.2 Java Development Kit(JDK) 설치
4 첫 프로젝트 만들기
4.1 이클립스 실행
width=50%
위의 사진처럼 eclipse.exe 를 더블클릭하여 실행하면 됩니다.
4.2 작업공간(Workspace) 설정
width=50%
후에 생성할 프로젝트의 저장공간을 설정해 주시면 됩니다.
4.3 프로젝트 만들기
이 문단에서 생략된 과정이 있는데, Java EE 개발 환경을 Java SE 개발 환경으로 변경하는 과정입니다.
이는 우측 상단 Open Perspective 버튼을 눌러 Java 를 선택한 다음 OK 를 눌러주면 됩니다.
이 과정은 제일 중요하고 제일 기초적인 부분 이며, 공통적으로 사용되기 때문에 각 과정에서 생략됩니다.
width=50%
프로젝트는 File - New - Java Project 또는 New (추가 아이콘) - Java Project 를 통해 생성할 수 있습니다.
width=50%
이는 Java EE 환경에서 일반 프로젝트 생성할 때 또는 Java SE 환경에서 New 아이콘만 클릭했을 때 설정합니다.
width=50%
Project Name 은 한글 로 해도 상관 없습니다. 다만, 패키지명에 프로젝트 명을 포함시킬 생각[3]이라면 띄어쓰기를 하지 않는게 좋습니다.
이로써 프로젝트 생성 및 설정은 끝났습니다.
5 마인크래프트 버킷 외부 라이브러리 다운로드
서버를 실행할 때 사용되는 "Craftbukkit-1.8.9-R0.2.jar" 과 같은 파일을 '외부 라이브러리 라고 합니다.
이 파일을 이클립스를 통해 플러그인에 적용시켜야 정상적인 코딩이 가능하고, 서버에 적용시킬 수 있습니다.
하지만 Craftbukkit 은 DMCA 테이크 다운 사태로 인해 공식 사이트에서의 Bukkit 과 관련한 모든 개발 활동이 불가능하게 되었습니다.
그래서 다운로드 방법이 2가지로 나누어 집니다.
첫번째로는 SpigotMC 의 BuildTools 를 이용하여 Spigot 과 Craftbukkit 을 동시에 다운로드하는 방법[4]과, 두번째로는 MCAdmin 홈페이지를 통해 다운로드 하는 방법[5]이 있습니다.
이는 하위 문단에서 따로 설명합니다.
5.1 SpigotMC 의 BuildTools 를 이용한 다운로드
본 문단에서 다룬 활동으로 다운로드 한 파일들을 디컴파일하여 재배포 하는 것은 엄연한 저작권 위반 행위입니다.
본 문서의 내용은 SpigotMC Wiki 의 BuildTools 항목에서 가져옴을 알립니다.
BuildTools 를 이용해 파일을 다운로드 하기 위해선 다음과 같은 준비물이 필요합니다.
- BuildTools.jar BuildTools 다운로드 (자동 다운로드)
- Java Development Kit (자바 개발자용 도구; 이하 "jdk") JDK 다운로드
- Git Git 다운로드
준비물의 준비가 모두 끝났으면 아래와 같은 순서를 통해 진행합니다.
- BuildTools 을 다운로드하여 폴더 위치 중 띄어쓰기가 없는 폴더[6]에 저장 또는 옮깁니다.
- BuildTools 가 다운로드된 폴더로 이동하여 빈 공간에 커서를 옮기고 Shift + 우클릭 을 이용해 팝업 메뉴를 소환합니다. 그리고 Git Bash Here 를 클릭하여 Git 콘솔을 실행합니다.
- 콘솔에 java -jar BuildTools.jar 을 입력하고 엔터 를 누릅니다.
- 컴파일이 완료될 때 까지 콘솔을 종료하지 말고 기다립니다.
- 빌드가 종료되면 콘솔이 다시 입력 가능 상태로 변하고, BuildTools 가 저장된 폴더에 Craftbukkit 과 Spigot 이 저장된 것을 확인할 수 있습니다.
위와 같이 진행할 경우 그 시기의 최신 버전 이 다운로드가 되는데, 만약 1.6.2 버전을 다운로드 하고 싶다면
java -jar BuildTools.jar --rev 1.6.2 를 입력하여 1.6.2 버전의 Craftbukkit 과 Spigot 을 다운로드할 수 있습니다.
5.2 MCAdmin 홈페이지를 이용한 개별 다운로드
하지만 DMCA 테이크 다운 사태로 인해 공식 사이트에서 다운받을수 없게 되었습니다. 자세한 내용은 항목 참조
그래서 MCAdmin 같은 비공식 사이트에서 다운로드 받을수 있습니다. #1.10 다이렉트
6 마인크래프트 버킷 외부 라이브러리 적용하기
마인크래프트 플러그인은 외부 라이브러리가 없으면 적용되지 않습니다. 무조건 등록해 주셔야 합니다.
프로젝트 우클릭 - Build Path... - Configure Build Path... - Libraries 탭으로 이동 - Add External JARs... 를 사용하면 빠르게 등록 및 제거하실 수 있습니다.
6.1 패키지와 클래스 생성
패키지(Package) 의 역할은 클래스(Class) 를 단위 또는 그룹별로 모으는 역할과 클래스의 위치를 알려주는 역할을 합니다.
width=50%
패키지는 (프로젝트가 선택된 상태에서) File - New - Package 와 프로젝트 우클릭 - New - Package, 패키지 추가 아이콘 의 세가지 방법을 사용할 수 있습니다.
width=50%
패키지 이름은 프로젝트와 다르게 무조건 영어 로 입력하여야 합니다. 후에 입력할 plugin.yml 파일에서 메인 클래스를 찾지 못하는 상황이 발생할 수 있습니다. 또한 프로젝트 이름과 달리 절대 띄어쓰기 를 하면 안됩니다.
또한 통상적으로 Java 개발 시에는 패키지는 다음과 같은 규칙을 이용합니다.
최상위도메인(com, net 등등).도메인 이름 또는 닉네임.프로젝트 이름
굳이 위의 규칙을 지키지 않아도 프로그래밍 및 컴파일시에는 문제되지 않습니다.
클래스(Class) 는 Java 에서 컴파일 후 실행할 명령들이 코드로 담긴 문서라고 생각하시면 됩니다.
width=50%
클래스는 패키지와 비슷하게 (프로젝트가 선택된 상태에서) File - New - Class 와 프로젝트 우클릭 - New - Class, 클래스 추가 아이콘 의 세가지 방법을 사용할 수 있습니다.
width=50%
클래스 이름을 작성할 때에도 무조건 영어 로 작성하여야 하며, 굳이 대문자를 사용하지 않아도 됩니다.
또한 메인 클래스의 이름은 Main 이 아닌 자신의 플러그인의 이름 으로 사용해도 됩니다. (예: MyPlugin.java, YourPlugin.java 등등)
클래스도 패키지와 마찬가지로 절대 띄어쓰기 하면 안됩니다.
6.2 코드 작성
<syntaxhighlight lang="java" line="1">
package main;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.plugin.java.JavaPlugin;
public class Main extends JavaPlugin{
@Override
public void onEnable(){
Bukkit.getConsoleSender().sendMessage(ChatColor.BLUE + "플러그인이 활성화 되었습니다.");
}
@Override
public void onDisable(){
Bukkit.getConsoleSender().sendMessage(ChatColor.RED + "플러그인이 비활성화 되었습니다.");
}
}
</syntaxhighlight>
width=50%
파일:플러그인 개발 - plugin.yml 파일.png
파일:플러그인 개발 - plugin.yml 에디터 선택.png
파일:플러그인 개발 - plugin.yml 에디터 선택2.png
width=75%
코드 | |
파일명 | plugin.yml |
종류 | YAML |
name: First Minecraft Plugin |
name | 플러그인의 이름 (필수) |
version | 플러그인의 버전 (필수) |
author | 플러그인의 저자 |
description | 플러그인의 설명 |
main | 플러그인의 메인 클래스 (필수) |
7 명령어 입력 받기
<syntaxhighlight lang="java" line="1"> public class 클래스명 implements CommandExecutor { @Overridepublic boolean onCommand(CommandSender sender, Command command, String label, String[] args){코드입력}
} </syntaxhighlight> JavaPlugin을 상속받은 곳에서
<syntaxhighlight lang="java" line="1">
getCommand("명령어이름").setExecutor(클래스);
</syntaxhighlight>
프로젝트에 쓰고있는거 복붙
8 제목 표시하기
width=75% 이런걸 표시해봅시다.
<syntaxhighlight lang="java" line="1">
public class 클래스명
{
public void sendTitle(Player player, String title, int FadeInTime, int ShowTime, int FadeOutTime){
CraftPlayer p = (CraftPlayer)player;
PlayerConnection c = p.getHandle().playerConnection;
IChatBaseComponent TitleText = ChatSerializer.a(title);
Packet<?> Length = new PacketPlayOutTitle(EnumTitleAction.TIMES, TitleText, FadeInTime*20, ShowTime*20, FadeOutTime*20);
Packet<?> TitlePacket = new PacketPlayOutTitle(EnumTitleAction.TITLE, TitleText, FadeInTime*20, ShowTime*20, FadeOutTime*20);
c.sendPacket(TitlePacket);
c.sendPacket(Length);
}
}
</syntaxhighlight>
9 팁
- [1] 에서 레퍼런스를 보실 수 있습니다. 레퍼런스를 볼 능력이 요구됩니다.
- 딱히 Java를 모르셔도 그렇게 문제가 되지는 않습니다. 다만 객체 지향 프로그래밍 에 대해서는 알고 있어야 합니다.
- 이 문서에서 다루는 버킷 외에 스피곳(spigot, 포크 버킷)에 대해 관심이 있다면, [2] 이곳을 확인하세요.
- 이클립스에서는 단축키가 지원됩니다. 대표적으로 많이 쓰이는 단축키들 입니다.
Ctrl+Shift+F | 자동 정렬 |
Ctrl+Space | 자동 완성 |
Ctrl+Shift+O | 자동 import문 추가 |
10 레퍼런스
이 문서에 대한 토론이 진행되고 있습니다.
이 문서에서 생긴 의견 충돌로 이 문서의 토론방에서 토론이 이루어지고 있습니다. 이 문서의 수정을 원하는 사용자는 이 토론 에서 의견을 제시해 주시기 바랍니다. 또한 이 문서에서 토론하고 있는 부분을 토론 합의 없이 수정 시 문서 훼손으로 간주되어 차단될 수 있습니다.10.1 콜백 함수
10.1.1 onEnable
<syntaxhighlight lang="java" line="1"> public void onEnable(){//플러그인을 활성화 하였을때 발생하는 콜백 함수//버킷을 실행하거나 /reload 명령어로 재시작 하였을때 발생합니다.
} </syntaxhighlight>
10.1.2 onDisable
<syntaxhighlight lang="java" line="1"> public void onDisable(){//플러그인을 비활성화 하였을때 발생하는 콜백 함수//버킷을 종료하거나 /reload 명령어로 재시작 하였을때 발생합니다.
} </syntaxhighlight>
10.2 JavaPlugin
아래의 메소드는 JavaPlugin에 있는 메소드입니다. (@Override가 있는경우 오버라이드 가능)
10.2.1 getFile
<syntaxhighlight lang="java" line="1"> @Overrideprotected File getFile(){return super.getFile(); }
</syntaxhighlight>
10.2.2 getDefaultWorldGenerator(String worldName, String id)
<syntaxhighlight lang="java" line="1"> @Overridepublic ChunkGenerator getDefaultWorldGenerator(String worldName, String id){return super.getDefaultWorldGenerator(worldName, id); } </syntaxhighlight>
10.2.3 getDatabase()
<syntaxhighlight lang="java" line="1"> @Overridepublic EbeanServer getDatabase(){return super.getDatabase(); } </syntaxhighlight>
10.2.4 public FileConfiguration getConfig()
<syntaxhighlight lang="java" line="1"> @Overridepublic FileConfiguration getConfig(){return super.getConfig(); } </syntaxhighlight>
10.2.5 public InputStream getResource(String filename)
<syntaxhighlight lang="java" line="1"> @Overridepublic InputStream getResource(String filename){return super.getResource(filename); } </syntaxhighlight>
10.2.6 protected void installDDL()
<syntaxhighlight lang="java" line="1"> @Overrideprotected void installDDL(){super.installDDL(); } </syntaxhighlight>
10.2.7 protected void removeDDL()
<syntaxhighlight lang="java" line="1"> @Overrideprotected void removeDDL(){super.removeDDL(); } </syntaxhighlight>
10.2.8 public PluginCommand getCommand(String name)
<syntaxhighlight lang="java" line="1"> @Overridepublic PluginCommand getCommand(String name){return super.getCommand(name); } </syntaxhighlight>
10.2.9 public void onLoad()
<syntaxhighlight lang="java" line="1"> @Overridepublic void onLoad(){super.onLoad(); } </syntaxhighlight>
10.2.10 public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args)
<syntaxhighlight lang="java" line="1"> @Overridepublic List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args){return super.onTabComplete(sender, command, alias, args); } </syntaxhighlight>
10.2.11 public void reloadConfig()
<syntaxhighlight lang="java" line="1"> @Overridepublic void reloadConfig(){super.reloadConfig(); } </syntaxhighlight>
10.2.12 public void saveConfig()
<syntaxhighlight lang="java" line="1"> @Overridepublic void saveConfig(){super.saveConfig(); } </syntaxhighlight>
10.2.13 public void saveDefaultConfig()
<syntaxhighlight lang="java" line="1"> @Overridepublic void saveDefaultConfig(){super.saveDefaultConfig(); } </syntaxhighlight>
10.2.14 public void saveResource(String resourcePath, boolean replace)
<syntaxhighlight lang="java" line="1"> @Overridepublic void saveResource(String resourcePath, boolean replace){super.saveResource(resourcePath, replace); } </syntaxhighlight>
10.2.15 public List<Class<?> getDatabaseClasses()
<syntaxhighlight lang="java" line="1"> @Overridepublic List<Class<?>> getDatabaseClasses(){return super.getDatabaseClasses(); } </syntaxhighlight>
10.3 패키지
이 문단은 버킷의 패키지에 대해서 다룹니다.
10.3.1 org.bukkit.entity
10.3.1.1 Player 클래스
분류 | 의미 |
v | void(리턴 안함)) |
b | boolean(참, 거짓) |
i | int(32비트 정수) |
s | String(문자열) |
d | Double (배정밀도 부동소수점 실수) |
f | Float (단정밀도 부동소수점 실수) |
<이름> | 클래스 |
분류 | 메서드 | 기능 |
v | chat(String str) | 채팅 띄우기 |
InetSocketAddress | getAddress() | 접속 주소(IP) 구하기 |
i | getLevel()) | 레벨 구하기 |
f | getWalkSpeed() | 걷는속도 구하기 (-1.0 ~ 1.0) |
v | setWalkSpeed(float value) | 걷는속도 설정하기 (-1.0 ~ 1.0) |
v | setDisplayName(String name) | 디스플레이 이름 변경 |
s | getPlayerListName() | 플레이어 목록의 이름 구하기 |
v | setPlayerListName(String name)) | 링크 참고 |
v | setLevel(int level) | 경험치 레벨 설정 |
i | getLevel() | 경험치 레벨 얻어오기 |
v | giveExp(int amount) | 경험치를 amount만큼 주기 |
v | giveExpLevels(int amount) | 경험치 레벨을 amount만큼 주기 |
i | getFoodLevel() | 배고픔 수치 구하기 (0~10) |
v | setFoodLevel(int value) | 배고픔 수치를 value로 설정 |
v | kickPlayer(String message) | message를 사유로 퇴장시키기 |
v | hidePlayer(Player player) | player를 보이지 않게 하기 |
v | sendMessage(String message) | 플레이어에게 메시지 보내기 (ChatColor와 혼용 가능) |
PlayerInventory | getInventory() | 플레이어의 인벤토리를 불러옴 (HumanEntity에서 상속됨) |
10.3.1.1.1 setPlayerListName
인지 : String name 인게임 플레이어 리스트의 이름을 설정합니다. 16자까지 허용되며, 색깔이 지원됩니다. 일어날 수 있는 예외들:
- IllegalArgumentException - 이름이 길거나 누군가 쓰고있는 이름인 경우
(원문) Sets the name that is shown on the in-game player list. The name cannot be longer than 16 characters, but ChatColor is supported.
If the value is null, the name will be identical to HumanEntity.getName().
This name is case sensitive and unique, two names with different casing will appear as two different people. If a player joins afterwards with a name that conflicts with a player's custom list name, the joining player's player list name will have a random number appended to it (1-2 characters long in the default implementation). If the joining player's name is 15 or 16 characters long, part of the name will be truncated at the end to allow the addition of the two digits.
Parameters: name - new player list name Throws: IllegalArgumentException - if the name is already used by someone else IllegalArgumentException - if the length of the name is too long