본문 바로가기
Minecraft Forge/팁

MCP? FML? Forge? Bukkit?

by 정우 :P 2016. 3. 17.

 저도 사실 마인크래프트 모드 제작에 관련된 정보를 찾으면서 제일 궁금하면서도 헷갈렸던 부분이 바로 이 부분이었습니다.

따라서 다른 분들은 좀 더 쾌적한 정보를 얻으 실 수 있도록 여러 용어들을 여기서 설명해볼까 합니다.

 

 

1. MCP?

 - MCP란 Mod Coder Pack 의 약자로써, 마인크래프트 모드 제작에 도움을 주는 툴이라고 보시면 되겠습니다.

  정확한 설명은 아래와 같습니다 (출처: http://minecraft.gamepedia.com/Programs_and_editors/Mod_Coder_Pack) :

-----------------------------------------------------------------------------------------------------------------------------------------------------

  The package was created to help mod creators to decompile, change and recompile the Minecraft classes. Instructions are included in the readme files which come with the package. The package contains scripts to decompile, recompile, and reobfuscate the game and the server.

  (MCP는 모드 제작자들이 마인크래프트 클래스들을 디컴파일, 수정, 그리고 재컴파일 하는 것을 도와주기 위해 만들어졌습니다. 설명은 MCP에 있는 readme 파일에 포함되어 있습니다. MCP는 클라이언트와 서버를 디컴파일, 재컴파일, 그리고 재난독화 하기 위한 스크립트들을 포함하고 있습니다)

-----------------------------------------------------------------------------------------------------------------------------------------------------

 

 자 그러면 위에 나온 용어들 중 디컴파일? 재컴파일? 재난독화? 이게 무슨 뜻일까요?

 

 - 컴파일 : 현재까지 작성된 프로그램들은 대부분 이 과정을 거칩니다. 

               컴파일은 간단히 말해 프로그래밍 언어(사람에게 친숙하게 작성된)를 해당 기계가 알아 들을 수 있는 기계어로 변환하는 작업을 의미합니다.

 - 디컴파일 : 컴파일에 반대되는 작업입니다.

                  기계어 또는 중간 언어로 작성된 것을 사람에게 친숙한 프로그래밍 언어로 변환하지만, 컴파일보다 상당히 복잡하고 어려운 경우가 많습니다.

 - 재컴파일 : 말그대로 다시 컴파일 하는 것을 의미합니다. (즉, 컴파일된 형태의 소스 -- 디컴파일 --> 프로그래밍 언어 -- 재컴파일 --> 결과물  이런 거라고 보시면됩니다.)

  - 난독화 : 읽이 어렵게 만든다는 뜻으로, 주로 중간 언어(대표적으로 자바 바이트 코드, 닷넷의 IL 등)로 컴파일 되는 언어들에 적용하는 방식입니다. 특정 변수나 함수, 클래스 등 구성 요소이름을 aaa, cc, fd 이런식으로 바꿈으로써 기계는 충분히 해석하지만 (사실상 기계 입장에서는 이름이 a이건 hi 이건 다 똑같이 취급되기 떄문에) 사람들이 소스를 해석하기엔 힘들게 만드는거죠.

 

 그런데 왜 굳이 난독화를 할까요? 과정도 복잡하게 말이죠.

 - 그건 자바의 동작 원리와 관련이 있습니다. JAVA로 작성된 소스파일(.java)들은 자바 컴파일러에 의해 일련의 명령어들로 구성된(정확히는 opcode와 피연산자 등 좀 더 복잡합니다) 자바 바이트 코드파일(.class)로 컴파일되고 이 바이트 코드들이 해당 프로그램이 실행될 때 JVM(자바 가상 머신)에 로드되어 실행됩니다.

 그런데, 이 바이트 코드의 경우에는 프로그래밍 언어와 기계어의 중간 정도의 단계가 되는데요, 따라서 자바 바이트 코드파일에는 클래스, 함수 등 여러 요소들이 이름이 대부분 다 그대로 남아있어 디컴파일을 할 경우 쉽게 원본 소스로 바꿀 수 있습니다. (그냥 단순히 jar을 디컴파일러에 넣고 돌려도 소스 다나옵니다..)

 자 그럼 여기서 마인크래프트는 누가 만들었죠? Mojang 이죠. Mojang 도 하나의 영리를 추구하는 기업이기 때문에 본인들의 소스가 함부로 누출되는 걸 바라진 않죠.

따라서 난독화라는 작업을 통해서 디컴파일시에도 소스 코드를 알아보기 힘들게 만들어 본인들의 저작물을 보호하려는 거라 보시면 되겠습니다.

 

 이제 본론으로 넘어와서, MCP가 필요한 이유를 아시겠죠? 근본적으로 마인크래프트 소스들은 다 난독화 되어 있기 떄문에 (그냥 깔려있는 마인크래프트 jar 파일만 여서도 클래스 이름들이 다 a aa bb 이런식으로 되어 있는걸 보실 수 있습니다.) 소스 수정을 해서 적용하려면 이걸 풀어주고 (디컴파일) 다시 컴파일하고 난독화 하는 과정이 필요한거죠.

 

 

2. Forge?

 - Forge란 Lex Manos라는 분이 만든 마인크래프트 모드 제작/동작 환경이라 보시면 되겠습니다. (정확히는 API)

 마인크래프트 초기에는 MCP를 이용해 모드 제작자들이 디컴파일해서 소스를 수정하고 재컴파일 하는 식으로 모드를 만들었습니다.

 그런데 이런 방식의 가장 큰 문제점은 '호환성' 이었죠. 마인크래프트 소스 자체에 손을 대는 것이기 때문에 여러 모드를 사용하려 하더라도 모드간의 충돌 때문에 이게거의 불가능했었습니다. (또한 불편한 점도 있었구요)

 그래서 여러 개발자들이 모드간의 호환 및 여러 기능을 제공해주는 API를 만들게 되는데, 그 중 하나가 (제일 유명한 두개 중 하나) 바로 Minecraft Forge 입니다.

 

 - Forge 의 장점:

  - 마인크래프트 원본 소스를 이용할 수 있다. (포지 개발 환경은 원래 마인크래프트(바닐라 마인크래프트) + Forge API + FML 로 구성이 되는데, 이 중 원본 소스가 포함되어 있기 때문에 원래 소스를 분석하거나 사용할 수 있다는 점이 가장 큰 장점이라 볼 수 있겠죠.)

  - 확장성에 제한이 없다. (위의 이유로 원하는대로 확장이 가능합니다.)

  - 클라이언트 / 서버 둘다 지원 (CraftBukkit 과는 다르게 클라이언트 및 서버 양쪽에서 돌아가는 모드 제작을 할 수 있습니다.)

  - 통합 모드 제작에 용이하다. (포지에서 Proxy 패턴을 이용해 구현을 해놨기 때문에 프로젝트를 클라이언트 따로 서버 따로 만들지 않아도 좀 더 쉽게 통합 모드를 제작할 수 있습니다.)

  - 참고 자료가 많다. (이건 영문의 경우에만 해당됩니다. 한국어로 된 자료는 거의 없어요..)

 

 - Forge 의 단점:

  - 크기가 너무 크다(?) (버전이 계속 업그레이드 되오면서 소스도 방대해졌기 때문에 아무래도 알아야 하는 부분이 많다는 점이 조금 힘든 부분일 수 있죠)

  - 개인이 운영하는 프로젝트다. (오픈 소스이고, 많은 사람들의 피드백을 받으면서 수정되고 있긴 해도 개인이 진행하다 보니 아무래도 팀에서 하는 것 보단 조금 불안한 부분이 있을 수 있겠죠..?)

 

  (사실 전 Forge 를 이용해서만 제작을 하고 또 그걸 선호하기 때문에 눈에 꼽을만한 단점은 없는 것 같습니다. 그렇지만 장점만 나열하면 너무 객관성이 떨어져 보일까봐 단점아닌 단점들도 적어봤습니다.)

 

 

3. FML?

  - FML이란 Forge Mod Loader 의 약자로, 영어 그대로 Forge API 로 제작된 모드들을 실제 게임이 시작되면 로드하고 실행될 수 있게 해주는 일종의 매개체라 보시면 되겠습니다. FML 을 따로 작성한 이유는 FML 은 다른 분이 제작하셨기 때문이죠. (cpw라 되어 있는데 풀네임은 모르겠네요)

  모드 로딩 외에도 FML 에서 제공해주는 기능들이 더 있긴한데 이 부분은 제작하면서 직접 보는게 빠를 듯 합니다.

 

 

4. Bukkit?

  - Bukkit 이란 Forge와 같이 마인크래프트 모딩 API 중 하나로써, 주로 추상화되어 있습니다.

※ 여기서 부턴 다음에 이어서 작성하겠습니다.

'Minecraft Forge > ' 카테고리의 다른 글

Forge API 의 구조  (0) 2016.04.21

댓글