최근 수정 시각 : 2024-03-20 21:53:52

마인크래프트/개발

파일:상위 문서 아이콘.svg   상위 문서: 마인크래프트

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

1. 개요2. 기술적 요소
2.1. NBT (Named Binary Tag)2.2. 블록 (Block)2.3. 아이템 (Item)2.4. 개체 (Entity)2.5. 블록 엔티티 (Block Entity)2.6. 청크 (Chunk)2.7. 틱 (Tick)2.8. UUID (범용 고유 식별자, Universally unique identifier)
3. 모드
3.1. Minecraft Coder Pack
3.1.1. 허용 및 제한 사항
3.2. Yarn3.3. 모드 개발
4. 플러그인
4.1. ProtocolLib4.2. NMS (net.minecraft.server) ?4.3. CB?4.4. 레퍼런스? JavaDoc?4.5. 플러그인 개발
5. 관련 커뮤니티

1. 개요

마인크래프트는 유명 게임들 중 모드나 플러그인 등 게임의 동작을 수정하기 쉬운 축에 속한다. 코딩에 대한 이러한 낮은 진입 장벽은 마인크래프트라는 게임을 현재까지도 인기 있게 만드는 주요 요인 중 하나라고 볼 수 있다. 본 문서에서는 마인크래프트 관련 개발에 처음 입문하는 사람들을 위한 기초 지식을 제공한다.

기본적으로 C#, Java, C++ 등의 객체지향 패러다임을 지원하는 프로그래밍 언어에 대해 어느 정도 알고 있다는 가정하에 작성되었다. 게임 프로그래밍은 프로그래밍 중에서도 상당히 난이도가 높은 축에 속하고, 특히 완성된 형태의 게임을 수정하는 일은 더욱 어려우므로 각오하는 것이 좋다.

2. 기술적 요소

2.1. NBT (Named Binary Tag)

파일:관련 문서 아이콘.svg   관련 문서: 마인크래프트/NBT
,
,
,
,
,

마인크래프트는 어떤 구조의 데이터를 네트워크로 송수신하거나 저장하기 위해 JSON이나 XML과 같은 자체적인 자료구조를 가지고 있는데 그 이름을 NBT(Named Binary Tag)라고 한다. 플러그인이나 모드 개발뿐만 아니라 명령어를 잘 다루기 위해서라도 NBT는 잘 알아두는 것이 좋다.

2.2. 블록 (Block)

가장 기본적인 요소이다. 돌이나 기반암, 흑요석과 같은 것들이 대표적인 블록 계열이다.

그리고 물이나 용암, 실, 공기(air)와 같이 블록이 아닌 것 같으나 블럭인 것이 있으며, 반대로 아이템 액자나 갑옷 거치대와 같이 블록처럼 보이지만 실제로는 엔티티인 것이 있다.

모든 블록은 월드 상의 좌표를 가지고 있다. 블록은 레드스톤 파워, 방향 같은 간단한 메타 값이나 상자와 같은 경우 블록 엔티티를 이용해 GUI와 아이템 정보를 포함하기도 한다.

2.3. 아이템 (Item)

여러 인벤토리[1]에 들어갈 수 있는 모든 것을 아이템이라고 한다. 일반적으로 아이템은 블록이나 엔티티와 상호작용을 하는 경우 얻을 수 있다. 아이템을 얻기 전이나 던졌을 때 바닥에 떨어져 있는 아이템은 엔티티로 취급한다.

2.4. 개체 (Entity)

엔티티라고도 불리며, 블록과는 달리 유동적인 오브젝트를 의미한다. 플레이어(Player)나 동물(Creature), 몬스터(Monster) 등이 이 개체에 속한다. 그리고 화살, 화염구, 삼지창과 같은 투사체는 Projectile이라고 따로 분류된다. 또한 블록으로 오해되는 경우가 흔하지만 그림 액자, 아이템 액자, 갑옷 거치대 또한 개체에 속한다. F3 + B를 눌러 히트박스를 볼 수 있다. 개체들은 정수값으로 된 고유 번호를 가진다.

2.5. 블록 엔티티 (Block Entity)

블록에 블록 아이디와 상태를 넘어선 부가적인 데이터를 부여하는 별도의 데이터. 표지판의 텍스트, 상자의 인벤토리 등은 블록 엔티티 데이터를 통해 저장되며, 화로와 같은 일부 블록 엔티티는 하나의 틱당 업데이트를 수행할 수 있다. 이전에는 타일 엔티티(Tile Entity)라 불리었으며, 현재도 모드 개발 시에는 타일엔티티라고 부르는 경우가 흔하다.

2.6. 청크 (Chunk)

마인크래프트 월드를 구성하는 가로*높이*세로, 즉 16*384*16의 구역. 월드 세이브 파일의 기본 단위이기도 하며, 맵을 로딩하거나 언로딩 할 때도 청크 단위로 이루어진다. F3 + G를 눌러 청크의 경계선을 볼 수 있다.

2.7. 틱 (Tick)

마인크래프트 세계의 업데이트가 일어나는 시간 단위이다. 이상적으로 1틱은 1/20초(0.05초)이나 엔티티/블록 엔티티의 지나친 사용 등으로 인해 MSPT[2] 값이 50 이상이라면 1틱의 길이가 늘어나는 현상이 발생할 수 있다.

2.8. UUID (범용 고유 식별자, Universally unique identifier)

마인크래프트에서 개체를 식별하기 위해 사용하는 128비트 숫자로 개체가 생성되면 랜덤한 UUID가 주어지고 다시 변경할 수 없다. 원칙적으로 2개 이상의 개체가 같은 UUID를 가질 수 없다. 명령어로 임의의 UUID를 가진 개체를 소환시킬 수 있는데, 만약 사용하려는 UUID가 이미 다른 개체가 사용하고 있다면 UUID가 겹친다는 메시지가 뜨고 명령어가 작동하지 않는다.

플레이어도 각각의 UUID를 가지고 있으며, 계정을 만들 때 주어지고 닉네임을 변경해도 UUID는 바뀌지 않는다. 1.7.2 이전에는 밴, 오피, 화이트리스트에서 닉네임을 플레이어 식별자로 사용했으며 플러그인도 닉네임을 식별자로 사용하여 플레이어의 데이터를 저장했기에 함부로 닉네임을 변경하면 데이터가 모조리 날아갔었다.[3] 이 때문에 1.7.2 이후부터 UUID를 플레이어 식별자로 사용하도록 변경되어 닉네임을 변경해도 데이터가 그대로 유지된다.

닉네임으로 특정 플레이어의 UUID를 보려면 MCUUID 사이트를 이용하면 된다. 반대로 UUID로 플레이어 정보를 조회하는 것도 가능하다.

3. 모드

모드는 Modification(수정)을 짧게 부른 것이다. 일반적으로 마인크래프트의 컴파일된 바이너리를 디컴파일, 난독화 해제(deobfuscate)와 같은 과정을 거쳐 사람이 이해할 수 있는 자바 코드 형태로 변환하고, 자바 코드에 수정을 거쳐 단순히 게임에 기능을 추가하거나 최적화하는 등 마인크래프트라는 게임에 대한 전반적인 수정 작업을 뜻한다.

마인크래프트의 기반 언어인 Java는 바이트코드 형태로 컴파일되어 디컴파일이 쉽다는 특징을 가지고 있다. 이러한 특징은 마인크래프트가 자유도가 굉장히 높은 샌드박스 게임이라는 특징과 합쳐져 여타 다른 게임에서는 유래를 찾아볼 수 없었던 모드 커뮤니티를 만들어냈다. 심지어는 마인크래프트가 단순히 사용자 인터페이스(UI)라는 말도 돌고 있다.

기본적으로 마인크래프트의 바닐라 코드를 직접 수정하는 형태로 개발되기 때문에 마인크래프트 게임 자체에 대한 이해도, 객체지향 패러다임, 마인크래프트의 아키텍처 등에 대해 높은 이해가 요구된다.

하단에서 후술할 플러그인과는 달리 서버와 클라이언트 양쪽에 수정이 가능하기 때문에 마인크래프트라는 게임을 환골탈태시킬 수도 있다. 컴퓨터 상에서 이뤄지는 모든 것이 가능한 것이다. 이런 이유로 보통 모드 개발자가 플러그인 개발자보다 난이도가 높다.

3.1. Minecraft Coder Pack

흔히 MCP라고 불리는 것으로 Searge[4]가 만든 마인크래프트 모딩 시스템이다. 마인크래프트의 코드는 무단 도용을 막기 위해 디컴파일이 최대한 어렵도록 난독화[5]라는 것이 되어 있기 때문에, 일반적인 방법으로는 쉽사리 디컴파일을 할 수 없다.

MCP는 커뮤니티 공동체를 이용해서 이러한 마인크래프트 난독화를 풀어내고, 쉽게 모딩을 할 수 있도록 관련 도구를 제공한다. 모드 간의 충돌 문제 때문에 바닐라의 코드를 직접 수정하기보다는 Forge 같은 모딩 플랫폼을 사용하는 것이 권장된다. 포지도 MCP을 사용한다.

1.15부터는 Mojang에서 자바 에디션의 모딩을 돕기 위해 난독화 맵을 공개하였으며, 난독화를 푸는 데 드는 시간이 단축되게 되었다.

3.1.1. 허용 및 제한 사항

허용 사항은 다음과 같다:
  • MCP를 이용하여 마인크래프트 클라이언트와 서버 jar 파일을 디컴파일 할 수 있다.
  • 디컴파일된 소스 코드를 이용하여 마인크래프트 모드를 만들 수 있다.
  • 수정된 버전의 마인크래프트를 리컴파일 할 수 있다.
  • 완성된 모드의 클래스 파일들을 마인크래프트에서 돌아갈 수 있도록 난독화 할 수 있다.

제한 사항은 다음과 같다:
  • MCP를 이용해서 모장의 EULA에 반하는 행위를 할 수 없다.
  • 모장으로부터 마인크래프트 구매 없이 게임을 이용할 수 있도록 하는 클라이언트 변조는 금지된다.
  • MCP를 있는 그대로 또는 수정하여 재배포하는 행위는 금지된다.
  • 명시적인 허가 없이 MCP의 스크립트, 도구, 데이터 파일을 사용하는 행위는 금지된다.
  • MCP에 기반한 그 어느것으로도 돈을 벌 수 없다. (MCP를 이용하여 제작된 모드는 이에 해당하지 않는다.)[주의사항]
  • MCP를 이용하여 그리핑[7]이나 서버 취약점을 공격하기 위한 핵 클라이언트 개발은 금지된다. 하지만 핵 개발자는 지켜질리가...
  • 어떤 방법으로든 디컴파일된 마인크래프트 소스파일의 공개는 금지된다.

원문:
You are allowed to:
- Use MCP to decompile the Minecraft client and server jar files.
- Use the decompiled source code to create mods for Minecraft.
- Recompile modified versions of Minecraft.
- Reobfuscate the classes of your mod for Minecraft.

You are NOT allowed to:
- Use MCP to do anything that violated Mojangs terms of use for Minecraft.
- Release Minecraft versions or modifications that allow you to play without having bought Minecraft from Mojang.
- Release modified or unmodified versions of MCP anywhere.
- Use any of MCPs scripts, tools or data files without explicit written permission.
- Make money with anything based on MCP (excluding Minecraft mods created by using MCP).
- Use MCP to create clients that are used for griefing or exploiting server bugs.
- Release the decompiled source code of Minecraft in any way.

MCP의 명시적인 제한 사항은 아니지만 주의해야 할 사항이 더 있는데, 타 모드의 소스 코드나 에셋(텍스처, 모델, 사운드 등)을 라이선스 확인이나 원작자의 허락 없이 무단으로 이용하지 말아야 한다. 저작권 문제가 발생할 수 있기 때문이다.

3.2. Yarn

Github

새롭게 등장한 마인크래프트 모딩 시스템으로 패브릭에서 MCP 대신 이걸 사용한다. 깃허브를 보면 알겠지만 패브릭에서 직접 개발한 모딩 시스템이다.

MCP와 달리 Creative Commons Zero(CC0 즉 퍼블릭 도메인) 라이선스를 사용하며 모든 사람들에게 개방되어 누구나 자유롭게 마인크래프트를 수정할 수 있다. 다만 제한사항은 MCP와 동일하므로 유의하자. 당연하지만 Yarn로 디컴파일한 마인크래프트 소스 코드를 공개할 수 없다.

3.3. 모드 개발

파일:상세 내용 아이콘.svg   자세한 내용은 마인크래프트/모드/개발 문서
번 문단을
부분을
참고하십시오.

4. 플러그인

모드가 마인크래프트라는 게임을 직접적으로 수정한다면, 플러그인은 서버의 동작을 추상화 API를 통해서 수정한다. 마인크래프트는 멀티플레이 시 게임의 동작을 클라이언트와 서버로 나누어서 처리하는데, 이 동작 중 서버 사이드에서 처리되는 동작들은 플러그인을 통해서 변경을 가할 수 있다. 서버 코드 만을 수정하기 때문에 클라이언트와 서버 양쪽에서[8] 또는 클라이언트에서만 이뤄지는 작업[9]은 수정이 불가능하다.

일반적으로 마인크래프트의 버전 업데이트 시 호환성을 유지하기 위해 업데이트마다 바뀌는 마인크래프트 코드를 래핑하는 추상화 API라는 것을 두고 있다. 버킷(Bukkit)은 이러한 추상화 API 중 가장 널리 사용된다. 추상화 API는 버전 호환성을 유지하기 때문에 마인크래프트가 업데이트되도 추상화 API 구현체(CraftBukkit, Spigot, Paper 등)만 수정되면 플러그인은 업데이트를 하지 않아도 문제없이 작동된다. 1.2.5 플러그인이 1.5.2에서 작동하는 것이 이런 이유 때문.

4.1. ProtocolLib

일반적인 NMS 조작으로 건드릴 수 없거나 조작을 통한 방법이 어려울 때, 마인크래프트의 패킷 송수신을 후킹하여 직접 손을 댈 수 있게 도와주는 라이브러리 플러그인이다. 이 라이브러리를 사용할 경우 플러그인과 함께 ProtocolLib 플러그인이 같이 있어야 작동한다. 많은 플러그인에서 사용하는 라이브러리 플러그인이기에 사실상 플러그인을 제대로 사용하기 위해서 기본적으로 설치해야 한다.

4.2. NMS (net.minecraft.server) ?

플러그인을 개발하다 보면 NMS라는 것에 대해 들어본 적이 있을 것이다. NMS는 net.minecraft.server 패키지 내에 포함된 클래스 전반을 의미한다.[10] 플러그인 개발 시 추상화 API를 통해 NMS를 조작하게 되는데 추상화 API에서 제공하지 않는 기능을 사용하기 위해서는 내부에 존재하는 NMS 클래스를 직접 조작해야만 한다. 조작을 위해서는 Reflection에 대한 공부가 필요하다.

NMS 클래스는 마인크래프트 버전 업데이트 시마다 재난독화가 이뤄져 호환성이 없다. 따라서 보통 사용하는 것이 권장되지는 않는다. 버전 호환성이 깨지면 모드와 별 다를 것이 없기 때문.

4.3. CB?

버킷이나 스피갓의 플러그인 공식 리포지터리에서 플러그인을 다운로드하다 보면 버전 앞에 CB나 Spigot 같은 글귀가 붙어있는 플러그인들이 있고, 1.5.2와 같이 단순히 버전만 붙어있는 플러그인이 있다. 이는 플러그인이 표준 추상화 API의 범주를 넘어섰는냐를 나타낸다.

앞서 언급한 NMS 클래스들은 일반적으로 추상화 API에 가려져 있기 때문에 추상화 API 자체만으로는 내부에 존재하는 NMS 클래스에 접근할 수 없다. 따라서 추상화 API의 구현체인 CraftBukkit이나 Spigot의 클래스로 캐스팅하거나 Reflection으로 NMS 클래스를 얻어와야 하는데, 이렇게 구현체로 직접 캐스팅할 경우 해당 구현체에서 플러그인이 구동되지 않을 경우 플러그인이 제대로 작동하지 않는다.

이런 이유로 CraftBukkit 구현체 클래스에 접근하는 경우에는 버전 앞에 CB 표기를, Spigot 구현체 클래스에 접근하는 경우에는 버전 앞에 Spigot을 붙여준다. 이들 클래스에 접근하는 이유는 보통 NMS 클래스를 조작하기 위함이므로 버전이 달라지면 웬만해서 곱게 호환되는 일이 없다.

4.4. 레퍼런스? JavaDoc?

앞서 말했듯이 마인크래프트 서버의 플러그인은 추상화 API라는 것을 이용하여 작성된다. 당연히 플러그인 개발을 위해서는 이 추상화 API를 어떻게 써먹는지에 대해 잘 알아둬야 한다. 이런 각 추상화 API를 포함한 어떤 프레임워크나 클래스 등에 대해 설명한 것을 레퍼런스라고 한다. 이런 레퍼런스 문서 중에서도 자바를 기반 언어로 삼는 레퍼런스 문서들을 JavaDoc이라고 한다.

4.5. 플러그인 개발

파일:상세 내용 아이콘.svg   자세한 내용은 마인크래프트/플러그인/개발 문서
번 문단을
부분을
참고하십시오.

5. 관련 커뮤니티

대부분은 해외 커뮤니티이기 때문에 간단한 영어를 할 수 있어야 한다. 스레드 형태의 게시판을 사용해 본 경험이 있으면 더욱 좋다.
  • http://minecraftforum.net - 말 그대로 마인크래프트를 플레이하는 사용자들의 포럼이다. 해외 사이트이며 마인크래프트 커뮤니티 중 가장 규모가 크다. MCP 같은 모딩 시스템이나 다양한 모드들이 이곳에서 시작되었다.
  • http://minecraftforge.net - 마인크래프트의 주요 모딩 플랫폼 중 하나인 Forge의 공식 사이트 및 포럼. 상당히 활성화되어 있지만 말이 거칠다. FU.. 같은 말도 어렵지 않게 찾아볼 수 있다.
  • https://bukkit.org - 마인크래프트 비-바닐라 계열 서버의 주요 추상화 API인 버킷의 공식 웹 사이트이다. 플러그인 개발자들은 반드시 북마크할 것을 권장한다.
  • http://spigotmc.org - 버킷의 DMCA 사태 이후 버킷 API를 관리하고 있는 버킷-기반 서버 소프트웨어인 Spigot의 공식 웹 사이트. 1.5.2같은 구 버전을 타겟으로 개발할 것이 아니라면 버킷 북마크는 이곳으로 바꾸는 것이 좋다.
  • http://wiki.vg - 마인크래프트에 대해 하드코어한 개발을 시작하고자 하는 사람에게 반드시 필요한 사이트. 마인크래프트 프로토콜이나 Mojang API 등에 대해 깔끔하게 정리되어 있다.


[1] 예를 들어 상자, 화로, 발사기, 깔때기, 상자가 실린 광산 수레 등이 있다. 기존 마인크래프트의 인벤토리를 포함한 대부분의 인벤토리는 GUI를 통해 접근할 수 있으나, 일부 모드의 엔티티나 블럭 엔티티는 GUI 없이 인벤토리만을 가진 경우도 있다.[2] MilliSeconds Per Tick. 1틱을 계산하는데 걸리는 시간.(밀리초)[3] 이 때문에 서버 운영자 측에서 닉네임이 변경되었을 경우 신청을 통해 데이터 이전을 해주기도 했다.[4] 현재 Mojang AB의 직원[5] 클래스나 메소드의 이름 등을 ab, ax 등의 의미없는 것으로 바꿔 사람이 이해하기 힘들게 만들고, 코드의 흐름을 바꿔 디컴파일 시 오류를 유발하게 하는 작업.[주의사항] 2014년에 개정된 마인크래프트 EULA에서 모드의 유료화를 금했기 때문에 이제는 모드를 이용하여 돈을 버는 일은 불가능하게 되었다. (서버와 마찬가지로 후원 등을 통한 간접적인 방법은 허용되는 것으로 추정.)[7] 국내의 경우 그리핑 대신 테러라는 용어가 주로 사용된다.[8] 아이템/블록/몹 추가 등[9] 렌더링이나 마나 바 같은 것들[10] 1.17 이상일 경우 net.minecraft.server 패키지 내에 포함된 클래스가 아니라도 마인크래프트 코드 전체를 NMS라 지칭하기도 한다.