mir.pe (일반/어두운 화면)
최근 수정 시각 : 2024-09-03 05:56:15

마인크래프트/개발

MCP에서 넘어옴
파일:상위 문서 아이콘.svg   상위 문서: 마인크래프트

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

1. 개요2. 플러그인과 모드의 차이점3. 기술적 요소
3.1. NBT (Named Binary Tag)3.2. 블록 (Block)3.3. 아이템 (Item)3.4. 개체 (Entity)3.5. 블록 엔티티 (Block Entity)3.6. 청크 (Chunk)3.7. 틱 (Tick)3.8. UUID (범용 고유 식별자, Universally unique identifier)
4. 모드
4.1. Minecraft Coder Pack
4.1.1. 허용 및 제한 사항
4.2. Yarn4.3. 모드 개발
5. 플러그인
5.1. ProtocolLib5.2. NMS (net.minecraft.server)5.3. CB5.4. JavaDoc5.5. 플러그인 개발
6. 관련 커뮤니티

1. 개요

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

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

2. 플러그인과 모드의 차이점

마인크래프트의 멀티플레이 아키텍처는 크게 서버와 클라이언트로 나뉜다. 플러그인의 경우 서버만 변조하지만, 모드는 클라이언트와 서버 모두를 변조할 수 있다. 여기서 변조한다 함은, 새 아이템을 추가한다거나 기존 기능을 비활성화 하는 등, 바닐라와 다른 동작을 구현하는 것을 의미한다.

서버에서는 대부분의 로직 처리를 하고, 클라이언트에서는 주로 그래픽 처리를 한다고 생각하면 좋다. 예시를 들자면, 엔티티 상호작용 연산은 서버에서 하고, 그 결과를 클라이언트에 보내 클라이언트는 해당 정보를 바탕으로 렌더링을 수행한다. 플러그인이 할 수 있는 것의 예시로 서버의 기능 변경, 블럭/엔티티/플레이어 정보 변경, 파티클 생성, 외부 연결 등이 있고, 모드의 경우 플러그인이 할 수 있는 모든 것 외에 추가적으로, 클라이언트의 기능 변경, 새 아이템/엔티티 추가, 서드파티 셰이딩 레이어 추가, 리소스 추가 등이 있다.

플러그인의 경우, 바닐라 프로토콜의 리소스만을 가지고 서버측에서 패킷, 이벤트 처리 등의 로직만 조작함으로써 바닐라에 없는 새로운 '동작'을 추가한다. 예를 들어 화살을 쏘았는데 번개가 친다던가 하는 식이다. 표준 프로토콜 위에서 동작함에 따라 클라이언트 사이드에 별도의 변조가 필요하지 않으므로 접속자가 클라이언트에 무언가 설치할 필요가 없다는 장점이 있다. 또한 모드와는 달리 마인크래프트 내부 코드를 수정하는 것이 아니라서 모드에 비해 오류, 충돌 가능성도 적다.

하지만 동전의 양면과 같이, 클라이언트의 게임 코드를 수정할 수 없다는 점은 단점으로도 작용한다. 서버측에서 처리하는 부분만 수정이 가능하다는 것이다. 앞선 예시를 이어서 들면 화살이 아니라 바닐라 프로토콜에 존재하지 않는 총 등을 추가하거나 할 수는 없다는 뜻이다.

이러한 단점을 극복하기 위해 모드를 사용하며, 모드의 경우 클라이언트 측의 코드까지 수정해 플러그인에서 구현할 수 없던 다양한 리소스와 모델 등을 추가할 수 있게 해준다. 때문에 기존의 마인크래프트 안에서 못봤던 모델을 새롭게 봤다 하면 대부분은 모드다.

하지만 모딩된 서버에 접속하기 위해 유저 역시 동일한 모드를 설치해 둔 클라이언트를 따로 구비해야 한다는 단점이 있고, 이러한 단점 때문에 대부분의 대규모 퍼블릭 서버에서는 접근성을 위해 플러그인만 사용하기도 한다. 또한 일반적인 경우 모드가 플러그인보다 훨씬 무겁다.[1] 그렇기 때문에 모드의 작업 난이도가 훨씬 어렵고 이에 따른 최적화 문제도 뒤따른다.

3. 기술적 요소

3.1. NBT (Named Binary Tag)

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

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

3.2. 블록 (Block)

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

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

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

3.3. 아이템 (Item)

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

3.4. 개체 (Entity)

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

3.5. 블록 엔티티 (Block Entity)

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

3.6. 청크 (Chunk)

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

3.7. 틱 (Tick)

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

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

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

플레이어도 각각의 UUID를 가지고 있으며, 계정을 만들 때 주어지고 닉네임을 변경해도 UUID는 바뀌지 않는다. 1.7.2 이전에는 닉네임을 플레이어 식별자로 사용했으며 플러그인도 닉네임을 식별자로 사용하여 플레이어의 데이터를 저장했기에 닉네임을 변경하면 새로운 플레이어로 인식하게 된다.[4] 이 때문에 1.7.2 이후부터 UUID를 플레이어 식별자로 사용하도록 변경되어 닉네임을 변경해도 데이터가 그대로 유지된다.

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

4. 모드

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

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

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

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

4.1. Minecraft Coder Pack

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

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

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

4.1.1. 허용 및 제한 사항

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

4.2. Yarn

Github

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

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

4.3. 모드 개발

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

5. 플러그인

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

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

5.1. ProtocolLib

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

5.2. NMS (net.minecraft.server)

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

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

5.3. CB

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

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

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

5.4. JavaDoc

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

5.5. 플러그인 개발

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

6. 관련 커뮤니티

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


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