강좌/Minecraft Mod 제작2015. 10. 6. 11:09

이번 포스팅에서는 모드 제작에 흔히 쓰이는 Forge 관해 소개해 보려 합니다.

모드 제작 강좌에 앞서, 혹시 MCP 모드로더를 이용한 모드 제작에 관해 질문하시는 분이 있을 같기도 하고

이들을 이해하는 것이 Minecraft Forge 대해 이해하는데 도움이 되기에,

우선 이들의 역사를 살펴보기로 하겠습니다.

 

1. MCP(Minecraft Coder Pack)

 

   

 

 먼저, 최초로 만들어진 모드 제작용 도구는 MCP였습니다.

 

MCP '마인크래프트 모드'라는 것을 가능하게 해준, 아주 혁신적인 도구였었죠.

 

도구는 난독화되어 있는 마인크래프트 소스를 해석하고, 주석을 달아 마인크래프트 소스를 수정할 있도록 해주었습니다.

 

MCP 출범함으로서, 마인크래프트의 자유도를 더욱 높이는 많은 모드들이 쏟아져나오기 시작하기도 했지요.

 

그런데 여기에는 문제가 하나 있었습니다.

 

MCP 이용해 만든 모드들은 마인크래프트 코드를 직접 고쳐 만들어졌기 때문에 대부분 서로 호환되지 않았고,

 

따라서 여러 모드들을 다운받아서 같이 수가 없었다는 것입니다. 다양한 컨텐츠를 한꺼번에 즐길 수가 없었죠.

 

그래서 문제를 해결하기 위해, MCP 기반 위에 2가지 플랫폼이 등장하게 되었는데,

 

그것이 바로 (리수가미의) 모드로더 마인크래프트 포지였습니다.

 

 

2. (리수가미의) 모드로더 (Risugami's Modloader)

 

 

( 사진은 리수가미의 모드로더와 상관이 없음을 알려드립니다)

 

MCP 이러한 결점으로 인하여, '모드 호환을 위한 모드' 만들어지기 시작했습니다.

 

그렇게 등장한 것이 Minecraft beta 1.2에서 등장한 리수가미의 모드로더입니다.

 

Risugami라는 모드 제작자 사람이 제작하였죠.

 

모드로더는, 설치된 모드들을 '로딩'함으로서 변경 사항들을 마인크래프트에 적용하는 방식으로 작동하는데,

 

따라서 그러한 모드들이 마인크래프트 기본 코드를 고칠 필요가 없게 되었습니다.

 

과정에서 '모드' 라는 프로그램의 개념이 완전히 달라지게 되는데, 이전에는 마인크래프트 코드를 수정하는 형식이었으나

 

이제는 간단히 BaseMod 상속하는 객체 하나가 여러가지에 접근할 있는 형태로 바뀐 것입니다.

 

 

3. 마인크래프트 포지 (Minecraft Forge)

 

 

마인크래프트 포지는 리수가미의 모드로더와 유사한 모드 제작 플랫폼으로서,

 

Minecraft beta 1.7.3 버전에서 처음 등장하였습니다.

 

어쩌면 리수가미의 모드로더에서 영감을 받아 제작되었을 가능성도 있지만 자세한 내막은 알려져 있지 않습니다.

 

마인크래프트 포지는 Minecraft Forge Forge ModLoader 2가지 모드로 구성되는데,

 

Forge ModLoader 리수가미의 모드로더처럼 모드를 로딩해 주는 역할을 하며,

 

Minecraft Forge 모드 제작 API로서, 모드 제작을 용이하게 줍니다.

 

사실 Forge ModLoader(FML)만으로 모드 제작은 가능합니다. 간단히 포지 모드를 로딩해 주는 모드로더만 있더라도 실행되기 때문입니다.

 

하지만, 이것만으로는 모드 제작 자체가 불가능할 정도로 Minecraft Forge라는 API 모드 제작에서 중요한 역할을 맡고 있습니다.

 

예를 들어보자면, 가장 최근 정식 1.8 버전에서 일어났던 일이 있습니다.

 

사실 1.8 버전에서는 우선 FML 먼저 출시되었었지요. 이것만으로도 일부 모드들은 1.8 업데이트되었었습니다.

 

하지만 포지 API 없는 이런 업데이트는 너무도 어려운 일이었고, 사실상 대부분의 모드들은 1.8 포지 API 나올 때까지

 

기다릴 수밖에 없었지요.

 

포지 API 대해 설명을 하자면,

 

원래 포지 API 레지스트리, 인터페이스 다양한 방식의 API 골고루 지원해 왔습니다.

 

중에서도 레지스트리가 미미하게나마 비중이 높았죠.

 

하지만 최근 들어서는 이벤트 쪽으로 움직이는 강한 경향이 나타나고 있으며,

 

따라서 모드 제작에서도 이벤트 처리가 점차 중요해지고 있는 추세입니다.

 

이외에, 세부 사항에 대해서는 다음 강좌들을 통해 차차 설명할 계획입니다.

 

4. 결과

 

모드로더와 포지가 나온 이후, 여러 모드들이 서로 호환되기 위하여 이들을 기반으로 하는 모드들을 만들기 시작했고,

 

얼마 MCP 자체만으로 모드를 만드는 사람들은 별로 남지 않게 되었습니다.

 

 

원래 베타 후기에서 정품 초기까지의 버전들에서는 모드로더와 포지가 병존했기 때문에,

 

중에서 무엇을 선택할지에 대한 선택권이 있었습니다.

 

이때까지는 모드로더 전용 모드 제작자 계열과 포지 전용 모드 제작자 계열이 나뉘어 있었는데, 모드로더가 먼저 생겼으므로

많은 모드가 모드로더를 이용하여 작성되는 편이었습니다.

 

하지만 모드로더에는 중대한 문제가 하나 있습니다.

 

바로 '단일 제작자' 리수가미가 혼자서 창조하고 관리해 왔다는 것이지요. (아마 독단적으로 운영했던 같습니다.)

 

그러다 보니, 리수가미가 '그만두기만 하면' 모드로더는 모든 것이 끝인 되어 버린 겁니다.

 

게다가, 리수가미는 모드로더 뿐만 아니라 여러 모드를 함께 제작하고 있기 때문에, 모드로더 자체에 전념할 수가 없었습니다.

 

반면 다수의 서포터들이 존재했던 포지는 상황이 전혀 달랐지요.

 

처음부터 LexManos, cpw, Eloraam 등의 여러 제작자가 함께 제작하였으며,

 

현재 cpw 등이 그만두면서 결국 LexManos라는 단일 제작자가 이어나가게 되었지만,

 

여전히 주위에 많은 개발자들이 많은 측면에서 돕고 있었습니다.

 

게다가 LexManos 포지로 먹고 사는 처지가 되었으니 그쪽에 전념할 수밖에 없었죠.

(실제로 그가 제작하거나 기여한 모드는 Minecraft Forge Forge Mod Loader 뿐입니다...)

 

결과적으로 모드로더는 업데이트도 늦고, API 개선도 별로 없었기에,

 

시간이 가면서 나날이 발전해 갔던 포지에 비해 점점 뒤쳐지게 되었고,

 

제작자인 리수가미가 이상 모드로더를 이어 나가기 힘들게 되면서, 사실상 작별을 고하게 됩니다.

 

특히 1.6, 1.7, 1.8에서 이어지는 강력한 모장의 마크 기반 코드 변경을 단일 코더인 리수가미가 버텨내기는 어려웠을 것이며,

그래서 1.6.2 버전까지만 업데이트 것으로 보입니다.

 

결과적으로 이러한 이유들로 인하여, 포지 중심으로 모드 제작이 옮겨가게 되었습니다.

 

(현재는 MCP 팀도 Minecraft Forge 권장하더군요. 그러니 이제 마크 공인 모드 제작 플랫폼이 겁니다.)

 

 

* 5. 버킷과 포지의 차이

 

 vs.  

 

댓글 중에서 버킷과 포지를 질문한 분이 있었습니다. 차이에 대해 궁금하실 분들이 많다고 보기에,

 

이렇게 따로 설명해 드리고자 합니다.

 

우선, 근본적인 차이는 다음과 같습니다.

 

1. Minecraft Forge 마인크래프트 클라이언트와 서버를 모두 수정할 있습니다.

    반면 Bukkit API 서버에 대한 변경만을 지원합니다.

 

2. Minecraft Forge 모드로 하여금 서로 호환되면서도 마인크래프트 기본 코드를 많이 건드릴 있게 해줍니다.

   반면 Bukkit API Abstraction API 방식을 사용함으로서, 플러그인에게 간접적으로 접근할 있는 권한만 부여합니다.

 

 

아마 1번의 차이점은 많이 들어보셨을 텐데요, 세부 사항에 대해서는 아마 모르는 분이 계실지도 모릅니다.

 

차이점은, 기본적으로 버킷은 마인크래프트 서버 프로그램을 변경한 프로그램이라는 사실로부터 나옵니다.

 

버킷으로서는 마인크래프트 코드를 그대로 이용할 이유가 없으며,

 

단지 클라이언트와 제대로 통신만 있으면 전혀 문제가 없습니다.

 

사실, 버킷은 원래 C Python같은 다른 언어로 만들어질 수도 있었습니다. (그리고 실제로 그런 것이 있습니다..)

 

그러하니 버킷으로서는 서버 파일을 자의적으로, 마음대로 변경할 있었고,

 

결과적으로 코딩하기 쉬운 방법으로 바꾸었던 것으로 보입니다. 실제 많은 변경이 가해지지는 않은 것으로 보입니다만..

 

플러그인 제작자 분들께서 사용하시는 버킷 API '버킷'이라는 프로그램에 접근할 있도록 주는 API이며,

 

실제로 버킷에서 일부 이벤트만 받아 처리할 있도록 해주는 아주 일부의 변경만을 지원할 뿐임에도 불구하고

 

그러한 이점으로 인해 상당히 많은 부분에 접근하여 많은 변경을 가할 있는 구조를 가지고 있습니다.

 

 

반면, 포지는 MCP 딸린 모드입니다. 물론 마인크래프트 코드를 변경하지만, 아무래도 조심스러울 수밖에 없었습니다.

 

잘못하면 이로 인해 마인크래프트의 본질을 심각하게 훼손할 수도 있기 때문이죠.

 

그래서 처음부터 포지가 세운 원칙 중에 '마인크래프트 코드는 있으면 적게 고친다' 라는 것이 있습니다.

 

또한 최근에 MCP 코드 패치 파일을 만드는 제도로 바뀌면서,

 

원칙은 Minecraft Forge 개발버전 크기를 최소한으로 줄이기 위한 하나의 방법이 되기도 하였습니다.

 

이러한 제한으로 인해, 서버 부문에서는 버킷의 기능이 모두 구현 가능하지만, 그다지 이점이 없는 상태이기도 합니다.

 

  (그래도 기본 코드를 효율적으로 이용하고 변경할 있기 때문에,

         서버 모드는 실제적으로 버킷보다 많은 것을 있습니다)

 

 

2번의 차이점은 아마 들어보지 못하셨던 분들이 많을 것으로 생각됩니다. 부연 설명을 하자면,

 

예를 들어 마인크래프트의 블럭에 접근할 있도록 해주는 Block이라는 객체가 도구에 어떻게 구현되어 있는지를 살펴보면 좋을 것입니다.

 

 

 

마인크래프트 포지에서는, 그냥 마인크래프트 원래 코드에 있는 Block 사용하되,

 

일부를 고쳐 접근하게 쉽게 만드는 방법을 사용합니다.

 

블럭을 새로 만들고자 때에도 Block 상속받는 클래스를 하나 만들고,

 

접근하고자 때도 마찬가지로 Block 클래스를 통해 접근합니다. 마인크래프트 기본 코드를 적극 활용하는 것입니다.

 

또한 이를 통해 마인크래프트 기본 코드가 어떤 식으로 작동되는지도 수도 있고,

 

모드 제작시에도 이를 따라 하는 것이 하나의 좋은 모딩 방법으로 공인되어 있습니다.

 

 

 

반면, 버킷에서는 Block 인터페이스입니다. 외부에서 접근할 있는 일부 함수만이 주어져 있죠.

 

아마 버킷 내부에서 실제 Block 나타내는 객체와 연결이 되어있을 것으로 보이는데, 자세한 내막은 없어요.

 

마인크래프트의 기본 코드는 고사하고 버킷 내부에서 어떻게 작동하는지도 없다는 것입니다.

 

플러그인으로서는 'Bukkit API'라는 버킷의 외부 경계면만 있고 접근할 있는 것이죠.

 

 

이러한 차이는, 궁극적으로 1번의 차이점에서 유래한 것으로 보입니다.

 

위에서 서술하였듯이, 버킷과 달리 포지는 마인크래프트 코드를 수정하는 데에 제한이 있기 때문에,

 

그에 상당하는 API 구축하는 데에는 상당한 어려움이 있습니다.

 

대신 포지는 모드로 하여금 마인크래프트 코드 자체에 직접 접근할 있도록 함으로서,

 

상당히 많은 부분을 고치고 제어할 있는 권한을 모드 제작자에게 부여합니다.

 

그럼으로서, 모드의 가능성은 (서버에서만 돌아가는 '서버 모드' 대해서도) 플러그인을 능가하는 수준이 됩니다.

 

또한 마인크래프트 기본 코드를 봄으로서 코드를 어떻게 작성해야 자신이 원하는 효과를 얻을 있는지에 관해

많은 통찰력을 얻을 수도 있다는 사실도 얼마간 이에 작용한 것으로 보입니다.

 

이렇게 만들 경우 가지 단점이 있는데,

 

하나는 마인크래프트가 업데이트될 때마다 모드도 업데이트해 주어야 한다는 것입니다.

 

대개 마인크래프트 버전이 업데이트될 때마다 코드가 바뀌게 되는데,

 

아주 사소한 차이라고 할지라도 모드가 바뀐 부분을 사용하거나 언급이라도 한다면, 버전과 호환되지 않게 됩니다.

 

또한 마인크래프트의 '난독화' 버전마다 달라지기 때문에, 모드로서 여러 버전에 호환되는 것은 애초에 불가능한 일이 됩니다.

 

버킷의 경우 마인크래프트 자체 코드에 접근하지 않기 때문에 그러한 일이 생기지 않죠.

 

그렇기 때문에, 포지도 버킷처럼 Abstraction API 방식으로 바꾸어야 한다는 말도 많았지만

 

포지 제작자 LexManos 이러한 요구들을 모두 거부했습니다.

 

그러자, 일부 사람들은 Forge 위에 Abstraction API 올리는 일을 시도하기 시작했습니다. 물론 힘든 일입니다.

 

특히 포지 초기 버전에서는 Forge API 수준이 미흡했기 때문에 그러한 일이 거의 불가능하다시피 했습니다.

 

하지만 시간이 가면서 Forge API 발전을 거듭하였고,

 

근래에는 Abstraction API 포지 기반에 제작하는 것이 가능해지는 수준에 이르게 되었습니다.

 

때맞추어 버킷이 DCMA 소동에 휩싸이면서 모드 버킷(mcpc, Cauldron) 제작자들과 버킷 쪽에 종사하던 일부 주도적인 플러그인 제작자들이 포지를 기반으로 하는 '버킷 대용품' 제작에 나섰고,

 

 

결과 Sponge 탄생하게 되었습니다.

 

Sponge 제작자들은 Forge 위에 Abstraction API 올리는 것을 시도하고 있고, 현재까지는 성공적인 것으로 보입니다.

 

 

어쨌거나.. 지금까지 Minecraft Forge의 역사에 대해 알아보고, Bukkit 차이점을 알아보았습니다.

Posted by Abastro