마인크래프트/플러그인/개발

덤프버전 :

파일:나무위키+상위문서.png   상위 문서: 마인크래프트/플러그인

파일:나무위키+넘겨주기.png   관련 문서: 마인크래프트/개발




파일:마인크래프트 로고.svg


[ 펼치기 · 접기 ]
기본 플레이
시스템
세계 · 게임 모드 · 난이도 · 게임 규칙 · 엔딩 · 죽음 메시지 · 스플래시 · 명령어 · NBT
인게임
아이템 · · 개체 · 날씨 · 차원 · 생물군계 · 구조물 · 마법 부여 · 상태 효과 · 조작법 · 피해 · 업적(발전 과제)
도움말
튜토리얼 · (탐험 · 파밍 · 회로) · 브릿징 · PVP · 파쿠르 · 스피드런 · 건축
시리즈 및 매체
출시 에디션
자바 에디션 (업데이트) · 베드락 에디션 (업데이트) · 포켓 에디션* · 콘솔 에디션* · 파이 에디션*
파생 게임
Minecraft Dungeons · Minecraft Legends · Minecraft Education · Minecraft: Story Mode* · Minecraft Earth*
미디어
OST · 관련 서적 · 레고 · 더 무비 · Minecraft Live · Minecraft Now · Minecraft Monthly
유저 콘텐츠
창작 요소
2차 창작 · 망토 · · 모드 (개발 · · 모드팩) · 애드온 · (리소스 팩 · 데이터 팩) · 외부 프로그램 ·
멀티 콘텐츠
멀티플레이 · 서버 · 플러그인 · Realms · EULA
개발
개발 기초 · 모드 개발 · 플러그인 개발
기타
이야깃거리
여담 · 커뮤니티 · 사건사고 · 문제점 · 용어 · 지원 언어 · 머나먼 땅 · 이미테이션 게임
관련 문서
나무위키 마인크래프트 프로젝트 · 마인크래프트로 분류된 문서 · 마인크래프트의 하위 문서
* 표시는 서비스가 종료되었거나 개발이 중단되었다는 표시이다.
공식 MINECRAFT 서비스가 아닙니다. 나무위키는 MOJANG 또는 MICROSOFT에 의해 승인되지 않았거나 관련되지 않았습니다.



1. 개요
2. 편집 지침
3. 도입
3.1. 플러그인 이란?
3.2. 기초적인 지식
4. 준비
4.1.1. 구버전 Eclipse (Mars 버전 이전; 미설치형)
4.1.2. 신버전 Eclipse (Mars.1 버전 이후; 설치형)
4.1.3. 신버전 Eclipse (Mars.1 버전 이후; 미설치형)
4.1.4. IntelliJ IDEA
4.2. Java Development Kit (JDK) 설치
5. 첫 프로젝트 만들기
5.1. Eclipse
5.1.1. 이클립스 실행
5.1.2. 작업공간(Workspace) 설정
5.1.3. 프로젝트 만들기
6. Bukkit API 외부 라이브러리 다운로드
6.1. Gradle을 사용한 Paper API 다운로드
6.2. SpigotMC의 BuildTools를 이용한 다운로드
7. Bukkit API 외부 라이브러리 적용하기
7.1. 패키지와 클래스 생성
7.2. 코드 작성
8. 명령어 입력 받기
9. 제목 표시하기
10. 팁
11. Bukkit API 레퍼런스
11.1. org.bukkit.plugin.java.JavaPlugin
11.1.1. 콜백 함수
11.1.1.1. public void onLoad()
11.1.1.2. public void onEnable()
11.1.1.3. public void onDisable()
11.1.2. protected File getFile()
11.1.3. public ChunkGenerator getDefaultWorldGenerator(String worldName, String id)
11.1.4. public EbeanServer getDatabase()
11.1.5. public FileConfiguration getConfig()
11.1.6. public InputStream getResource(String filename)
11.1.7. protected void installDDL()
11.1.8. protected void removeDDL()
11.1.9. public PluginCommand getCommand(String name)
11.1.10. public List onTabComplete(CommandSender sender, Command command, String alias, String[] args)
11.1.11. public void reloadConfig()
11.1.12. public void saveConfig()
11.1.13. public void saveDefaultConfig()
11.1.14. public void saveResource(String resourcePath, boolean replace)
11.1.15. public List> getDatabaseClasses()
11.1.16. org.bukkit.entity
11.1.16.1. Player 인터페이스
11.1.16.1.1. setPlayerListName
11.1.16.2. HumanEntity 인터페이스
11.2. org.bukkit.event
12. Craftbukkit 구현부 레퍼런스
12.1. net.minecraft.network.protocol.game
12.1.1. Clientbound 패킷 사용법


1. 개요[편집]


본 문서는 마인크래프트 서버에 사용되는 플러그인 개발에 도움을 주고자 생성되었다.
또한, 내용은 영상 촬영일 및 문서 작성일[1] 기준인 1.8.0_91
craftbukkit-1.9.4
를 기반으로, 코드 및 전반 내용은 Bukkit WikiSpigotMC Wiki, Bukkit API, Spigot API를 기반으로 작성되었다.

만약 마인크래프트 모드 개발을 찾아왔다면 모드 개발 문서를 참고하라.

모드를 만드는 프로그램은 있지만 플러그인을 만드는 프로그램은 없다. 이 때문에 유저들 중 플러그인 개발을 시도하다 포기하는 경우가 많다.[2]


2. 편집 지침[편집]


플러그인 코딩에 사용되는 소스 코드는 Color Scripter의 Java 기능을 이용해 작성하시길 바랍니다.

만약 나무위키에서 HTML 지원이 종료될 경우, 테이블(표) 기능을 이용해 대체하면 됩니다.


3. 도입[편집]



3.1. 플러그인 이란?[편집]


플러그인(Plug-in; PIN)은 호스트 프로그램과 상호작용하는 컴퓨터 소프트웨어이다.

위에서 정의한 내용이 "플러그인"의 원래 정의이며, 마인크래프트에서 정의하는 플러그인은

서버에 부가 기능을 추가하여 커맨드, 이벤트, 내부 연산 등을 통해 게임 내부에 새로운 요소를 추가하는 것

을 의미한다.

플러그인을 활용한 예로는 게임 화폐 추가, 미니게임 개발, 새로운 커맨드 추가 등이 있다.

게임 클라이언트와 서버에 범용적으로 적용되는 Universal 모드와는 다르게, 바닐라 서버의 동작을 조작하는 것이 플러그인이다. 즉, 서버 측 모드라고 볼 수 있다.
Universal로 분류된 모드와 비교하면, 서버 관리자가 플러그인을 추가해도 접속하는 유저들이 덩달아 같은 플러그인을 설치할 필요가 없는 이점이 있지만, 싱글 플레이나 LAN 서버, Realms 서버에서 사용할 수 없다는 단점이 있다.


3.2. 기초적인 지식[편집]


  • 기본적인 마인크래프트 지식
  • Java[3]객체 지향 프로그래밍에 대한 지식
  • 영어 독해력 (구글링 할 때 원문 검색을 자주 하게 된다.)
  • 플러그인 API의 구조 이해 및 활용력


4. 준비[편집]



4.1. 통합 개발 환경(IDE) 설치[편집]


여긴 IntelliJ IDEA보다는 Eclipse IDE 위주의 설명이 많으니 Eclipse IDE를 설치 바란다.


4.1.1. 구버전 Eclipse (Mars 버전 이전; 미설치형)[편집]



자동 설치기가 있고 구버전을 사용할 이유도 없기 때문에 이 방법은 권장하지 않는다.


4.1.2. 신버전 Eclipse (Mars.1 버전 이후; 설치형)[편집]



빠르게 이클립스를 설치하는 등의 이유가 있을 때는 최신버전도 미설치형으로 사용 가능하다.


4.1.3. 신버전 Eclipse (Mars.1 버전 이후; 미설치형)[편집]


이클립스 Mars 이후에도 미설치형으로 사용하는 것이 가능하다.
1. 우선 이클립스 다운로드 파일이 있는 페이지로 가야한다. #
2. 왼쪽에서 다운 받을 버전을 선택한다.
3. 다운로드 가능한 zip 파일이 뜬다. 필요한 것을 다운로드 하자. (플러그인 개발에는 Java와 Java EE중 하나를 하면 된다.)


4.1.4. IntelliJ IDEA[편집]


Intellij IDEA는 이클립스보다 무겁지만 훨씬 더 많은 편의 기능을 제공한다. #에서 다운로드할 수 있다.[4]


4.2. Java Development Kit (JDK) 설치[편집]




마인크래프트 1.16까지의 경우 JDK는 최소 8이여야 한다.
흔히 쓰는 JDK로는 JDK 8, JDK 11과 JDK 16이 있다.

주의할 점으로, 1.17부터는 JDK 16, 1.18부터는 JDK 17을 사용해야 한다.


5. 첫 프로젝트 만들기[편집]



5.1. Eclipse[편집]



5.1.1. 이클립스 실행[편집]


파일:플러그인 개발 - 이클립스 폴더.png
위의 사진처럼
eclipse.exe
를 더블 클릭하여 실행한다.


5.1.2. 작업공간(Workspace) 설정[편집]


파일:플러그인 개발 - 이클립스 Workspace 설정.png
후에 생성할 프로젝트의 저장 공간을 설정하면 된다.


5.1.3. 프로젝트 만들기[편집]


이 문단에서는 Java EE 개발 환경을 Java SE 개발 환경으로 변경하는 과정을 생략했다. 이는 우측 상단 Open Perspective 버튼을 눌러 Java를 선택한 다음 OK를 눌러주면 된다. 이 과정은 제일 중요하고 제일 기초적인 부분이며, 공통적으로 사용되기 때문에 각 과정에서 생략한다.

파일:플러그인 개발 - 새 프로젝트 만들기.png
프로젝트는 File - New - Java Project 또는 New (추가 아이콘) - Java Project를 통해 생성할 수 있다.

파일:플러그인 개발 - 프로젝트 선택.png
이는 Java EE 환경에서 일반 프로젝트를 생성했을 때 또는 Java SE 환경에서 New 아이콘만 클릭했을 때 설정한다.

파일:플러그인 개발 - 프로젝트 설정.png
Project Name은 한글로 해도 상관은 없으나, 패키지명에 프로젝트 명을 포함시킬 생각[5]이라면 띄어쓰기를 하지 않는 것이 좋다.


6. Bukkit API 외부 라이브러리 다운로드[편집]


서버를 실행할 때 사용되는 "Craftbukkit-1.8.9-R0.2.jar"와 같은 파일을 외부 라이브러리라고 한다. 이 파일을 이클립스를 통해 플러그인에 적용시켜야 정상적인 코딩이 가능하고, 서버에 적용시킬 수 있다.

다운로드 방법은 크게 2가지로 나뉜다. 첫번째로, 권장되는 방법은 Gradle을 사용하여 Paper API를 다운로드하는 것이다. 두번째로는 SpigotMC의 BuildTools를 이용하여 Spigot과 Craftbukkit을 동시에 다운로드하는 방법[6]이 있다.

각 방법은 하위 문단에서 자세히 설명한다.


6.1. Gradle을 사용한 Paper API 다운로드[편집]




6.2. SpigotMC의 BuildTools를 이용한 다운로드[편집]


본 문서의 내용 일부는 SpigotMC Wiki의 BuildTools 항목에서 가져왔음을 알립니다.


과거의 CraftBukkit DMCA Takedown 사건 이후로 CraftBukkit 기반의 프로그램을 직접 배포하는 것은 불법이 되었다. SpigotMC에서는 이를 우회하기 위해 BuildTools라는 프로그램을 만들었다. BuildTools를 이용해 파일을 다운로드하기 위해 다음의 파일들을 다운로드하자.

  • BuildTools.jar: SpigotMC에서 제공하는 DMCA 우회 프로그램 BuildTools 다운로드 (자동 다운로드)
  • Java Development Kit 17: Java 코드 컴파일러 및 Jar 생성[7] JDK 17 다운로드
  • Git: Git 및 Linux 환경 에뮬레이션 용도[8] Git 다운로드

준비물의 준비가 모두 끝났으면 아래와 같은 순서를 통해 진행하자.

  1. BuildTools를 다운로드하여 폴더 경로에 띄어쓰기나 특수문자가 없는 폴더[9]에 저장 또는 옮긴다.
  2. 해당 폴더로 이동하여 빈 공간에 커서를 옮기고 Shift + 우클릭을 이용해 팝업 메뉴를 소환합니다. 그리고 Git Bash Here를 클릭하여 Git Bash를 실행한다.
  3. 콘솔에
    java -jar BuildTools.jar --rev <원하는 마인크래프트 버전>
    를 입력하고 엔터를 누른다.[10]
  4. 컴파일이 완료될 때까지 콘솔을 종료하지 말고 기다린다.
  5. 빌드가 끝나면[11] target 폴더에 CraftbukkitSpigot이 컴파일된 것을 확인할 수 있다.

예시로,
java -jar BuildTools.jar --rev 1.12.2
를 입력하여 1.12.2 버전의 Craftbukkit과 Spigot을 다운로드할 수 있다.


7. Bukkit API 외부 라이브러리 적용하기[편집]


마인크래프트 플러그인은 외부 라이브러리가 없으면 적용되지 않습니다. 무조건 등록해 주셔야 합니다.

파일:플러그인 개발 - Properties 메뉴.png

파일:플러그인 개발 - Properties.png

파일:플러그인 개발 - Jar 파일 선택.png

프로젝트 우클릭 - Build Path... - Configure Build Path... - Libraries 탭으로 이동 - Add External JARs...를 사용하면 빠르게 등록 및 제거하실 수 있습니다.


7.1. 패키지와 클래스 생성[편집]


패키지(Package)의 역할은 클래스(Class)를 단위 또는 그룹별로 모으는 역할과 클래스의 위치를 알려주는 역할을 합니다.

파일:플러그인 개발 - 패키지 메뉴.png
패키지는 (프로젝트가 선택된 상태에서) File - New - Package 방법, 프로젝트 우클릭 - New - Package 방법, 패키지 추가 아이콘 방법의 세 가지 방법을 사용할 수 있습니다.

파일:플러그인 개발 - 패키지.png
패키지 이름은 프로젝트와 다르게 무조건 영어로 입력하여야 합니다. 후에 입력할
plugin.yml
파일에서 메인 클래스를 찾지 못하는 상황이 발생할 수 있습니다. 또한, 프로젝트 이름과 달리 절대 띄어쓰기를 하면 안 됩니다.

또한 통상적으로 Java 개발 시 패키지는 다음과 같은 규칙을 이용합니다.

최상위 클래스명(대부분 com, org, net 등).제작자명.프로젝트 이름


굳이 위의 규칙을 지키지 않아도 프로그래밍 및 컴파일 시에는 문제되지 않습니다.

클래스(Class)는 Java에서 컴파일 후 실행할 명령들이 코드로 담긴 문서라고 생각하시면 됩니다.

파일:플러그인 개발 - 클래스 메뉴.png
클래스는 패키지와 비슷하게 (프로젝트가 선택된 상태에서) File - New - Class 방법, 프로젝트 우클릭 - New - Class 방법, 클래스 추가 아이콘 방법의 세 가지 방법을 사용할 수 있습니다.

파일:플러그인 개발 - 클래스.png
클래스 이름을 작성할 때에도 무조건 영어로 작성하여야 하며, 굳이 대문자를 사용하지 않아도 됩니다.
또한, 메인 클래스의 이름은 Main이 아닌 자신의 플러그인의 이름으로 사용해도 됩니다. (예: MyPlugin.java, YourPlugin.java 등)
클래스도 패키지와 마찬가지로 절대 띄어쓰기를 하면 안 됩니다.


7.2. 코드 작성[편집]


파일:플러그인 개발 - 메인 클래스 코드 작성.png
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 + "플러그인이 비활성화 되었습니다.");
 }
}




파일:플러그인 개발 - 파일 추가 메뉴.png
파일:플러그인 개발 - plugin.yml 파일.png
파일:플러그인 개발 - plugin.yml 에디터 선택.png
파일:플러그인 개발 - plugin.yml 에디터 선택2.png
파일:플러그인 개발 - plugin.yml 작성.png
코드
파일명
plugin.yml
종류
YAML
name: FirstMinecraftPluginversion: 1.0author: Devonnuridescription: My First Minecraft Pluginmain: main.Main


name
플러그인의 이름 (필수, 공백 없이)
version
플러그인의 버전 (필수)
main
플러그인의 메인 클래스 (필수)
author
플러그인의 저자
description
플러그인의 설명




8. 명령어 입력 받기[편집]


public class 클래스명 implements CommandExecutor
{
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args)
    {
   코드입력
     }
}

JavaPlugin을 상속받은 곳에서
getCommand("명령어이름").setExecutor(클래스);

프로젝트에 쓰고있는거 복붙

주의할 점은 반드시 plugin.yml에서 getCommand에 사용할 명령어를 정의해주어야 한다.
정의해주지 않을 시에는 NullPointerException 에러가 발생한다.


9. 제목 표시하기[편집]


파일:플러그인 개발 - Title 테스트.png
이런 걸 표시해봅시다.

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);
 }
}


주의: 패킷을 사용하면 nms 패키지를 참조하게 되고, 버전이 바뀔 때마다 패킷 구조가 바뀌므로 권장하지 않습니다. 아래는 spigot api에서 제공하는 타이틀 메소드입니다.

player.sendTitle ("제목 메시지", "부제목 메시지", 나타나는 시간, 화면에 머무는 시간, 사라지는 시간);
/*제목 메시지나 부제목 메시지를 없에려면 null을, 시간을 기본값으로 설정하려면 -1을 대입하면 됩니다. 시간 기본값은 왼쪽부터 10틱, 70틱, 20틱 입니다.*/



10. 팁[편집]


  • https://hub.spigotmc.org/javadocs/bukkit/에서 레퍼런스를 보실 수 있습니다. 레퍼런스를 볼 능력이 요구됩니다.
  • Java객체 지향 프로그래밍을 잘 모르셔도 간단한 플러그인의 경우 그렇게 문제가 되지는 않습니다. 그러나, 미리 Java의 기본을 익히고 오는 것이 매우 강력히 권장됩니다.
  • 이 문서에서 다루는 버킷 외에 Spigot에 대해 관심이 있다면 이 곳을 확인하세요.
  • 이클립스는 단축키가 지원됩니다. 대표적으로 많이 쓰이는 단축키들입니다.
Ctrl+Shift+F
자동 정렬
Ctrl+Space
자동 완성
Ctrl+Shift+O
자동 import문 추가


11. Bukkit API 레퍼런스[편집]


이 문단은 버킷의 패키지, 패키지 안에 있는 클래스와 인터페이스, 열거형 등을 통틀어 Bukkit API에 대하여 다룬다.


11.1. org.bukkit.plugin.java.JavaPlugin[편집]


모든 Bukkit 플러그인은 JavaPlugin을 상속해야 합니다.
아래의 메소드는 JavaPlugin에 있는 메소드입니다. (@Override가 있는 경우 오버라이드 가능)


11.1.1. 콜백 함수[편집]



11.1.1.1. public void onLoad()[편집]

플러그인 로딩시 onEnable보다 먼저 실행된다.
@Override
public void onLoad() {
    // 플러그인을 로드 하였을 때(활성화 이전) 발생하는 콜백 함수
    // 버킷을 실행하거나 /reload 명령어로 재시작하였을 때 발생합니다.
}



11.1.1.2. public void onEnable()[편집]

플러그인 활성화시 onLoad 이후에 실행된다.

@Override
public void onEnable() {
    // 플러그인을 활성화 하였을 때(로드 이후) 발생하는 콜백 함수
    // 버킷을 실행하거나 /reload 명령어로 재시작하였을 때 발생합니다.
}



11.1.1.3. public void onDisable()[편집]

플러그인 비활성화시 실행된다.[12]

@Override
public void onDisable() {
    // 플러그인을 비활성화 하였을 때 발생하는 콜백 함수
    // 버킷을 종료하거나 /reload 명령어로 재시작하였을 때 발생합니다.
}



11.1.2. protected File getFile()[편집]


    @Override
    protected File getFile()
    {
        return super.getFile();
    }



11.1.3. public ChunkGenerator getDefaultWorldGenerator(String worldName, String id)[편집]


    @Override
    public ChunkGenerator getDefaultWorldGenerator(String worldName, String id)
    {
        return super.getDefaultWorldGenerator(worldName, id);
    }



11.1.4. public EbeanServer getDatabase()[편집]


    @Override
    public EbeanServer getDatabase()
    {
        return super.getDatabase();
    }



11.1.5. public FileConfiguration getConfig()[편집]


    @Override
    public FileConfiguration getConfig()
    {
        return super.getConfig();
    }



11.1.6. public InputStream getResource(String filename)[편집]


    @Override
    public InputStream getResource(String filename)
    {
        return super.getResource(filename);
    }



11.1.7. protected void installDDL()[편집]


    @Override
    protected void installDDL()
    {
        super.installDDL();
    }



11.1.8. protected void removeDDL()[편집]


    @Override
    protected void removeDDL()
    {
        super.removeDDL();
    }



11.1.9. public PluginCommand getCommand(String name)[편집]


    @Override
    public PluginCommand getCommand(String name)
    {
        return super.getCommand(name);
    }



11.1.10. public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args)[편집]


    @Override
    public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args)
    {
        return super.onTabComplete(sender, command, alias, args);
    }


주요 사용 예시:

    @Override
    public List<String> onTabComplete( CommandSender sender, Command command, String label, String[] args) {
        if ( args.length == 1) {
            List<String> list = new ArrayList<>( (int) list의 크기);
            list.add( string source );
            list.add( string source );
            list.add( string source );
            .
            .
            .
            return list;
        }
        else if ( args.length == 2) {
            양식은 비슷함
        }
        .
        .
        .
        else if ( args.length == n[ 자신이 원하는 수 ]){

        }
        return null;
    }





11.1.11. public void reloadConfig()[편집]


    @Override
    public void reloadConfig()
    {
        super.reloadConfig();
    }



11.1.12. public void saveConfig()[편집]


    @Override
    public void saveConfig()
    {
        super.saveConfig();
    }



11.1.13. public void saveDefaultConfig()[편집]


    @Override
    public void saveDefaultConfig()
    {
        super.saveDefaultConfig();
    }



11.1.14. public void saveResource(String resourcePath, boolean replace)[편집]


    @Override
    public void saveResource(String resourcePath, boolean replace)
    {
        super.saveResource(resourcePath, replace);
    }



11.1.15. public List<Class<?>> getDatabaseClasses()[편집]


    @Override
    public List<Class<?>> getDatabaseClasses()
    {
        return super.getDatabaseClasses();
    }



11.1.16. org.bukkit.entity[편집]



11.1.16.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에서 상속됨)


11.1.16.1.1. setPlayerListName[편집]

인지: String name
인게임 플레이어 리스트의 이름을 설정합니다.
16자까지 허용되며, 색깔이 지원됩니다.
일어날 수 있는 예외들:
  • IllegalArgumentException - 이름이 너무 길거나[13] 누군가가 이미 쓰고 있는 이름인 경우
(원문)
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


11.1.16.2. HumanEntity 인터페이스[편집]

분류
의미
v
void(리턴 안 함))
b
boolean(참, 거짓)
i
int(32비트 정수)
s
String(문자열)
d
Double (배정밀도 부동소수점 실수)
f
Float (단정밀도 부동소수점 실수)
<이름>
클래스

분류
메서드
기능
v
closeInventory()
보관함을 닫는다.
i
getCooldown(Material material)
특정한 아이템의 쿨타운을 구한다.(아마도)
Inventory
getEnderChest()
엔더 상자를 인벤토리 형태로 가져온다.
i
getExpToLevel()
다음 레벨까지 남은 경험치를 가져온다.
GameMode
getGameMode()
게임 모드를 가져온다.
PlayerInventory[14]
getInventory()
플레이어의 인벤토리를 가져온다.
ItemStack
getItemOnCursor()
마우스 커서 아래의 아이템을 구한다. 비어있을 수 있다.
MainHand
getMainHand()
주 손(설정에서 변경)을 가져온다.
s
getName()
플레이어의 이름을 반환한다.


Player 인터페이스에서도 상속받는 인터페이스로 마인크래프트에서 사람(플레이어)의 메소드를 대량 포함한다.
게임에서 NPC[15]나 플레이어에 반영되는 내용을 그대로 포함한다.

항목
내용
선언
public interface HumanEntity
상속
LivingEntity, AnimalTamer, Permissible, InventoryHolder


11.2. org.bukkit.event[편집]




12. Craftbukkit 구현부 레퍼런스[편집]


주의! Craftbukkit의 구현부는 버전에 따라 언제든지 예고 없이 바뀔 수 있으며, 사용이 권장되지 않습니다. Bukkit API 내부에서 해결할 수 있는 경우 Bukkit API를 사용해야 합니다.[16]

플러그인을 개발하다 보면 Bukkit API에서 직접 지원하지 않는 기능이 필요할 때가 있는데, 이 경우 직접 서버의 구현부에 접근해서 데이터를 조작하는 상당히 까다로운 작업이 요구된다.

파일:버킷_구조도.png\
org.craftbukkit
패키지와
net.minecraft.server
[17] 패키지는 Craftbukkit 기반 서버의 실제 구현 부분이다. NMS는 마인크래프트 자체의 코드로, 난독화되어 있기 때문에 이를 사용하기 위해서는 난독화를 해제할 수 있는 매핑을 사용해야 한다. NMS Mapper에서 NMS 매핑 표를 확인할 수 있으나, 이도 상당히 번거롭기에 PaperWeight, SpecialSource와 같은 역난독화 프로그램을 사용하는 게 편리하다.

아래의 문단은 모장 매핑 기준으로 서술한다.


12.1. net.minecraft.network.protocol.game[편집]


마인크래프트의 패킷 클래스들이 들어있는 패키지이다.
wiki.vg에서 패킷의 이름, 하는 역할, 사용법 등을 볼 수 있다. wiki.vg에 나와 있는 패킷과 NMS 패킷 클래스는 일대일 대응되지만 이름이 조금씩 다르므로 주의.


12.1.1. Clientbound 패킷 사용법[편집]


클라이언트로 패킷을 보내기 위해선 우선 패킷 객체를 생성해야 한다.[18]
    Clientbound<패킷이름>Packet packet =  new Clientbound<패킷이름>Packet(<...>);

패킷 객체를 생성했다면, 플레이어 객체와 연결 상태를 NMS 형태로 불러오자.[19]
    ServerPlayer nmsPlayer = ((CraftPlayer) player).getHandle();
    ServerGamePacketListenerImpl connection = nmsPlayer.connection;

이제 connection을 통해 패킷을 전송하면 된다.
    connection.send(packet);


[1] 처음 작성하신 분이 튜토리얼을 위해 유튜브 영상을 촬영하여 업로드하였다.[2] 모드 제작 프로그램인 MCreator에 Spigot Generator 유저 플러그인을 설치하면 스피곳용 플러그인 제작이 가능하다. 단, 개발 중인 프로젝트이므로 지원하는 기능이 불완전하다.[3] 물론 Java에 대해 아무것도 몰라도 만들 수는 있다. 그러나 결과가 영 좋지 않을 것이다...[4] Ultimate는 유료이므로 Community Edition을 선택하자.[5] 기본적으로 패키지는 상위 클래스명.상속 클래스명(기본적으로 com.<제작자명>.프로젝트 명)을 사용하는 것이 관례이다.[6] 이 방법은 Git으로부터 코드를 컴파일하여 내려받는 방법을 사용하기 때문에 다운로드 속도가 느릴 수 있다.[7] 자바 개발자용 도구; 이하 "jdk"[8] 윈도우 환경에만 해당. 리눅스 환경에서는 터미널에서 바로 실행시킬 수 있다.[9] 예를 들어 C:\BuildTools 또는 D:\BuildTools 등[10]
-jar
에는 하이픈이 1개,
--rev
에는 하이픈이 2개임에 주의한다. 지원하는 마인크래프트 버전의 목록은 #에서 확인할 수 있다. 또한
--rev <버전>
을 생략하면 가장 최근에 출시된 안정화된 버전을 다운로드하는데, 이는 최신 버전과는 다르므로 이에 유의하자.
[11] 빌드 종료 시 Build success! 메시지와 함께 BuildTools가 종료된다.[12] 서버가 강제 종료되는 등의 예외적인 상황의 경우 onDisable이 호출되지 않고 꺼질 수 있다.[13] 16글자 정도[14] Inventory를 상속받는 인터페이스로 보관함과 더불어 갑옷 슬롯과 방패(왼손)의 내용도 포함한다. [15] 시티즌 등의 사람 추가 플러그인[16] 또한 NMS를 사용하는 가장 큰 이유중 하나인 패킷 조작 역시 상당수 ProtocolLib에서 처리 할 수 있기 때문에 사용이 더더욱 권장되지 않는다.[17] 일반적으로 앞의 글자를 따서 NMS라고 칭한다.[18] 패킷마다 생성자가 다르다. 인자로 정보를 넘겨주는 형태의 생성자를 사용할 수도 있고, FriendlyByteBuf를 사용해 직접 정보를 바이트 단위에서 입력할 수도 있다. 특별한 경우가 아니라면 인자로 넘겨주는 형태가 가장 깔끔하다.[19] player는 패킷을 보내고자 하는 플레이어이다.


파일:크리에이티브 커먼즈 라이선스__CC.png 이 문서의 내용 중 전체 또는 일부는 2023-11-27 02:54:08에 나무위키 마인크래프트/플러그인/개발 문서에서 가져왔습니다.