마인크래프트/개발
1. 개요
마인크래프트는 유명 게임들 중 모드나 플러그인 등 게임의 동작을 수정하기 쉬운 축에 속한다. 모딩에 대한 이러한 낮은 진입 장벽은 마인크래프트라는 게임을 현재까지도 인기있게 만드는 주요 요인 중 하나라고 볼 수 있다. 본 문서에서는 마인크래프트 관련 개발에 처음 입문하는 사람들을 위한 기초 지식을 제공한다.
기본적으로 C#, Java, C++ 등의 객체지향 패러다임을 지원하는 프로그래밍 언어에 대해 어느 정도 알고 있다고 가정하고 작성되었다. 게임 프로그래밍은 프로그래밍 중에서도 상당히 난이도가 높은 축에 속하고, 특히 완성된 형태의 게임을 수정하는 일은 '''더 더욱 어려우므로''' 각오하는 것이 좋다.
2. 기술적 요소
2.1. NBT (Named Binary Tag)
마인크래프트는 어떤 구조의 데이터를 네트워크로 송수신하거나 저장하기 위해 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*256*16의 구역. 월드 세이브 파일의 기본 단위이기도 하며, 맵을 로딩하거나 언로딩 할 때도 청크 단위로 이루어진다. F3 + G를 눌러 청크의 경계선을 볼 수 있다.
2.7. 틱 (Tick)
마인크래프트 월드의 업데이트가 일어나는 시간 단위이다. 이상적으로 1틱은 1/20초(0.05초)이나 엔티티/블록 엔티티의 지나친 사용 등으로 인해 서버의 처리 속도가 낮아지면 1틱의 길이가 늘어나는 현상이 발생할 수 있다.
3. 모드
모드는 Modification(수정)을 짧게 부른 것이다. 일반적으로 마인크래프트의 컴파일된 바이너리를 디컴파일, 난독화 해제(deobfuscate)와 같은 과정을 거쳐 사람이 이해할 수 있는 자바 코드 형태로 변환하고, 자바 코드에 수정을 거쳐 단순히 게임에 기능을 추가하거나 최적화하는 등 마인크래프트라는 게임에 대한 전반적인 수정 작업을 뜻한다.
마인크래프트의 기반 언어인 Java는 바이트코드 형태로 컴파일되어 디컴파일이 쉽다는 특징을 가지고 있다. 이러한 특징은 마인크래프트가 자유도가 굉장히 높은 샌드박스 게임이라는 특징과 합쳐져 여타 다른 게임에서는 유래를 찾아볼 수 없었던 모드 커뮤니티를 만들어냈다. 심지어는 마인크래프트가 단순히 사용자 인터페이스(UI)라는 말도 돌고 있다.
기본적으로 마인크래프트 코드를 직접 수정하는 형태로 개발되기 때문에 마인크래프트 게임 자체에 대한 이해도, 객체지향 패러다임, 마인크래프트의 아키텍처 등에 대해 높은 이해가 요구된다.
하단에서 후술할 플러그인과는 달리 서버와 클라이언트 양쪽에 수정이 가능하기 때문에 마인크래프트라는 게임을 환골탈태시킬 수도 있다. 컴퓨터 상에서 이뤄지는 모든 것이 가능한 것이다. 이런 이유로 보통 모드 개발자가 플러그인 개발자보다 난이도가 높다.
3.1. Minecraft Coder Pack
흔히 MCP라고 불리는 것으로 Searge[2] 가 만든 마인크래프트 모딩 시스템이다. 마인크래프트의 코드는 무단 도용을 막기위해 디컴파일이 최대한 어렵도록 난독화[3] 라는 것이 되어 있기 때문에, 일반적인 방법으로는 쉽사리 디컴파일을 할 수 없다.
MCP는 커뮤니티 공동체를 이용해서 이러한 마인크래프트 난독화를 풀어내고, 쉽게 모딩을 할 수 있도록 관련 도구를 제공한다. 현재는 모드간의 충돌 문제 때문에 Forge 같은 모딩 플랫폼을 사용하는 것이 권장된다.
3.1.1. 허용 및 제한 사항
허용 사항은 다음과 같다:
- MCP를 이용하여 마인크래프트 클라이언트와 서버 jar 파일을 디컴파일 할 수 있다.
- 디컴파일된 소스 코드를 이용하여 마인크래프트 모드를 만들 수 있다.
- 수정된 버전의 마인크래프트를 리컴파일 할 수 있다.
- 완성된 모드의 클래스 파일들을 마인크래프트에서 돌아갈 수 있도록 난독화 할 수 있다.
- MCP를 이용해서 모장의 EULA에 반하는 행위를 할 수 없다.
- 모장으로부터 마인크래프트 구매 없이 게임을 이용할 수 있도록 하는 클라이언트 변조는 금지된다.
- MCP를 있는 그대로 또는 수정하여 재배포하는 행위는 금지된다.
- 명시적인 허가 없이 MCP의 스크립트, 도구, 데이터 파일을 사용하는 행위는 금지된다.
- MCP에 기반한 그 어느것으로도 돈을 벌 수 없다. (MCP를 이용하여 제작된 모드는 이에 해당하지 않는다.)[주의사항]
- MCP를 이용하여 그리핑[4] 이나 서버 취약점을 공격하기 위한 핵 클라이언트 개발은 금지된다.
- 어떤 방법으로든 디컴파일된 마인크래프트 소스파일의 공개는 금지된다.
MCP의 명시적인 제한 사항은 아니지만 주의해야 할 사항이 더 있는데, 타 모드의 소스 코드나 에셋(텍스처, 모델, 사운드 등)을 라이선스 확인이나 원작자의 허락 없이 무단으로 이용하지 말아야 한다. 저작권 문제가 발생할 수 있기 때문이다.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.
3.2. 모드 개발
4. 플러그인
모드가 마인크래프트라는 게임을 직접적으로 수정한다면, 플러그인은 서버의 동작을 추상화 API를 통해서 수정한다. 마인크래프트는 멀티플레이 시 게임의 동작을 클라이언트와 서버로 나누어서 처리하는데, 이 동작 중 서버 사이드에서 처리되는 동작들은 플러그인을 통해서 변경을 가할 수 있다. 서버 코드 만을 수정하기 때문에 클라이언트에서 이뤄지는 작업[5] 은 수정이 불가능하다.
일반적으로 마인크래프트의 버전 업데이트 시 호환성을 유지하기 위해 NMS 클래스를 래핑하는 추상화 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 패키지 내에 포함된 클래스 전반을 의미한다. 플러그인 개발 시 추상화 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이라고 한다.
- Spigot 최신 버전의 JavaDocs - https://hub.spigotmc.org/javadocs/bukkit/
4.5. 플러그인 개발
5. 관련 커뮤니티
대부분은 해외 커뮤니티이기 때문에 간단한 영어를 할 수 있어야 한다. 스레드 형태의 게시판을 사용해본 경험이 있으면 더욱 좋다.
- http://minecraftforum.net - 말 그대로 마인크래프트를 플레이하는 사용자들의 포럼이다. 해외 사이트이며 마인크래프트 커뮤니티 중 가장 규모가 크다. MCP 같은 모딩 시스템이나 다양한 모드들이 이곳에서 시작되었다.
- http://minecraftforge.net - 마인크래프트의 주요 모딩 플랫폼 중 하나인 Forge의 공식 사이트 및 포럼. 상당히 활성화되어 있지만 말이 거칠다. FU.. 같은 말도 어렵지 않게 찾아볼 수 있다.
- http://bukkit.org - 마인크래프트 비-바닐라 계열 서버의 주요 추상화 API인 버킷의 공식 웹 사이트이다. 플러그인 개발자들은 반드시 북마크할 것을 권장한다.
- http://spigotmc.org - 버킷 프로젝트가 중단된 이후 버킷 API를 관리하고 있는 버킷-호환 서버 소프트웨어인 Spigot의 공식 웹 사이트. 1.5.2같은 구 버전을 타겟으로 개발할 것이 아니라면 버킷 북마크는 이곳으로 바꾸는 것이 좋다.
- http://wiki.vg - 마인크래프트에 대해 하드코어한 개발을 시작하고자 하는 사람에게 반드시 필요한 사이트. 마인크래프트 프로토콜이나 Mojang API 등에 대해 깔끔하게 정리되어 있다.
- http://cafe.naver.com/craftproducer - 제온이라는 사람이 개설한 국내 마인크래프트 개발자 모임 카페. 국내 마인크래프트 이용자들의 주 연령층이 낮은 만큼 씨가 마른 마인크래프트 개발자들은 거의 이 곳에서 다 찾을 수 있다고 봐도 무방하다. 개설자인 제온을 포함, 칠각별 등 실력있는 개발자들이 포진해있다. 다만 아무 생각 없이 질문했다가는 면박을 맞을 수 있으니 주의.
- http://cafe.naver.com/goldbigdragon - 김태룡이라는 사람이 운영하는 개인 마인크래프트 카페이다. 플러그인 개발 문서도 있긴 하지만 주로 Skript나 CommandHelper, VariableTrigger와 같은 트리거 계열 플러그인의 사용법이 잘 나와있다. 다만 카페에 가입하기 위해서는 승인절차가 필요하다.