마인크래프트/개발

< 마인크래프트(MCP에서 넘어옴)

마인크래프트 주요 문서
게임 진행
관련 문서
명령어마법부여
아이템회로업적
바이옴구조물차원
진행 외
주요 문서
모드리소스팩
멀티플레이플러그인서버 구동
출시된
에디션
포켓에디션콘솔에디션
스토리 모드에듀케이션 에디션
관련 문서튜토리얼여담
커뮤니티닉네임 스킨
개발 관련기초모드
플러그인ModPE
업데이트PC 업데이트 내역PE 업데이트 내역

1 개요

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

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

2 기술적 요소

이 문단에서는 마인크래프트 관련 개발 시 알아야 하는 게임의 기술적 요소에 대해 설명한다.

2.1 NBT (Named Binary Tag)

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

2.2 블럭 (Block)

가장 기본적인 요소로, 게임 내에 설치하고 박살내는 블럭이 있다. 돌이나 기반암, 흑요석과 같은 것들이 대표적인 블럭 계열이다.

다만 블럭이 아닌 것처럼 보이지만 블럭인 것과 반대로 블럭인 것 같지만 블럭이 아닌 것들이 있다. 물이나 용암 같은 경우 블럭이 아닌 것 같지만 사실은 블럭이다. 아이템 액자나 갑옷 거치대의 경우 블럭처럼 보이지만 블럭이 아닌 엔티티에 속한다. 엔티티는 아래에서 서술한다.

블럭은 반드시 월드(world) 상의 좌표를 같이 가지고 있으며 따라서 공기(air)도 블럭의 일종으로 간주된다. 블럭은 레드스톤 파워나 간단한 메타 값을 가지고 있을 수 있지만 복잡한 정보를 포함할 수는 없다.

2.3 아이템 (Item)

인벤토리에 들어갈 수 있는 것을 아이템이라고 한다. 일반적으로 아이템과 블럭은 1:1로 매치되지만 반드시 그런 것은 아니다. 마인크래프트/모드/개발 문서에 있는 표현을 빌려오자면 나뭇잎 블럭을 부수면 묘목이 떨어지는 것과 같은 경우가 존재한다.

2.4 엔티티 (Entity)

블럭과 달리 움직일 수 있고 유동적인 게임 상 오브젝트를 의미한다. 플레이어(Player)나 동물(Creature), 몬스터(Mob) 등이 이 엔티티에 속한다. 다만 별로 엔티티라고 생각하지 못한 것들도 있는데 아이템 액자나 갑옷 거치대, 상자, 신호기 같은 것들도 엔티티이다.

화살이나 화염구 같이 날라가는 것들도 엔티티에 속한다. 이들 엔티티는 Projectile이라고 따로 분류된다.

3 모드

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

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

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

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

3.1 Minecraft Coder Pack

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

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

3.1.1 제한 사항

아래는 주요 제한 사항이다.

  • MCP를 이용해서 모장의 EULA에 반하는 행위를 할 수 없다.
  • 모장으로부터 마인크래프트 구매 없이 게임을 이용할 수 있도록 하는 클라이언트 변조는 금지된다. 이미 돈없는 사람들은 복돌쓰고 있지만
  • MCP를 재배포하거나 수정하는 행위는 금지된다.
  • 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를 통해서 수정한다. 마인크래프트는 멀티플레이 시 게임의 동작을 클라이언트와 서버로 나누어서 처리하는데, 이 동작 중 서버 사이드에서 처리되는 동작들은 플러그인을 통해서 변경을 가할 수 있다. 서버 코드 만을 수정하기 때문에 클라이언트에서 이뤄지는 작업[4]은 수정이 불가능하다.

일반적으로 마인크래프트의 버전 업데이트 시 호환성을 유지하기 위해 NMS 클래스를 래핑하는 추상화 API라는 것을 두고 있다. 버킷(Bukkit)은 이러한 추상화 API 중 가장 널리 사용된다. 추상화 API는 버전 호환성을 유지하기 때문에 마인크래프트가 업데이트되도 추상화 API 구현체(CraftBukkit, Spigot 등)만 수정되면 플러그인은 업데이트를 하지 않아도 문제없이 작동된다. 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 - [1]

4.5 플러그인 개발

마인크래프트 플러그인 개발에 대해서는 마인크래프트/플러그인/개발 문서를 참조하십시오.

5 관련 커뮤니티

대부분은 해외 커뮤니티이기 때문에 간단한 영어를 할 수 있어야 한다. 스레드 형태의 게시판을 사용해본 경험이 있으면 더욱 좋다.

  • [2] - 말 그대로 마인크래프트를 플레이하는 사용자들의 포럼이다. 해외 사이트이며 마인크래프트 커뮤니티 중 가장 규모가 크다. MCP 같은 모딩 시스템이나 다양한 모드들이 이곳에서 시작되었다.
  • [3] - 마인크래프트의 주요 모딩 플랫폼 중 하나인 Forge의 공식 사이트 및 포럼. 상당히 활성화되어 있지만 말이 거칠다. FU.. 같은 말도 어렵지 않게 찾아볼 수 있다.
  • [4] - 마인크래프트 비-바닐라 계열 서버의 주요 추상화 API인 버킷의 공식 웹 사이트이다. 플러그인 개발자들은 반드시 북마크할 것을 권장한다.
  • [5] - 버킷 프로젝트가 중단된 이후 버킷 API를 관리하고 있는 버킷-호환 서버 소프트웨어인 Spigot의 공식 웹 사이트. 1.5.2같은 구 버전을 타겟으로 개발할 것이 아니라면 버킷 북마크는 이곳으로 바꾸는 것이 좋다.
  • [6] - 마인크래프트에 대해 하드코어한 개발을 시작하고자 하는 사람에게 반드시 필요한 사이트. 마인크래프트 프로토콜이나 Mojang API 등에 대해 깔끔하게 정리되어 있다.
  • [7] - 제온이라는 사람이 개설한 국내 마인크래프트 개발자 모임 카페. 국내 마인크래프트 이용자들의 주 연령층이 낮은 만큼 씨가 마른 마인크래프트 개발자들은 거의 이 곳에서 다 찾을 수 있다고 봐도 무방하다. 개설자인 제온을 포함, 칠각별 등 실력있는 개발자들이 포진해있다. 다만 아무 생각 없이 질문했다가는 면박을 맞을 수 있으니 주의. 참고로 여기와 제휴한 서버가 EULA 반대 서명에 참여한 서버이다.
  • [8] - 김태룡이라는 사람이 운영하는 개인 마인크래프트 카페이다. 플러그인 개발 문서도 있긴 하지만 주로 Skript나 CommandHelper, VariableTrigger와 같은 트리거 계열 플러그인의 사용법이 잘 나와있다. 다만 카페에 가입하기 위해서는 승인절차가 필요하다.
  • [9] - 마인크래프트 초창기 시절 만들어진 마인크래프트 카페이다. 이 곳에서는 사람들이 올리는 플러그인과 모드 그리고 맵이 많은 편이다. 자료 파일이 필요한 사람이면 카페를 들러보는게 좋다.
  1. deobfuscate
  2. 현재 Mojang AB의 직원
  3. 클래스나 메소드의 이름 등을 ab, ax 등의 의미없는 것으로 바꿔 사람이 이해하기 힘들게 만들고, 코드의 흐름을 바꿔 디컴파일 시 오류를 유발하게 하는 작업.
  4. 렌더링이나 마나 바 같은 것들