Q. TTMP Lite 근황은 죽었나요?

A. 님들이 댓글을 안 써서 죽었음.


Tictim과 함께하는 마인크래프트 모딩 101

1. Forge Gradle과 기본 세팅


※ 이 강좌는 1.10 ~ 1.11버전을 기준으로 작성됩니다.


틱팀입니다. 다시 만나 반갑습니다. 처음 보신 분들은 처음 뵙겠습니다. 틱팀입니다.


정말 오랜 시간이 지나고 나서야 모딩 강좌를 쓰게 되었습니다. 사실 처음부터 모딩 강좌를 쓰고 싶었습니다. 멋지잖아요. 어그로도 잘 끌리고

아무튼, 이 모딩 강좌 시리즈로 어그로를 끌어 블로그를 되살ㄹ모딩을 배우고 싶은 많은 분들에게 여러 정보를 드리고 싶습니다.


시작하기 전에, 이 강좌에 관한 몇 가지 사항들을 말씀드리고 싶습니다. 숙지해 주세요.


1. 만약 Java를 배우지 않았다면, 먼저 Java를 배우십시오.

이 모딩 강좌 시리즈는 전반적으로 Java에 대한 이해를 필요로 합니다. 모드 메이커(웃음) 비슷한 것들은 거릅니다.

하지만 Java를 배워라! 해서 막막해하실 필요는 없습니다. 저는 Java는 제대로 된 입문서 한 권(정석이나 뭐 이런 것)과 꾸준히 책을 따라해보는 마음가짐만 있으면 못 배울 게 절대 아니라고 봅니다. 인터넷에 올라온 강좌들은.. 저는 뭔가 보기가 불편하더군요. 잘 찾아보면 좋은 것들도 있겠지만 저는 책 한 권으로 따라해보면서 배웠습니다. 책을 다 읽어도 모르겠으면 아예 책을 끼고 살면서 모르는 것을 그때그때 찾아서 따라 해보시면 될 겁니다.

인터넷 강좌를 보시던, 책을 보시던, 중요한 건 꾸준함입니다.


2. 댓글에 달린 질문은 답변해 드립니다. 하지만 소스코드는 Pastebin을 사용해서 보내 주셔야 합니다.

아무런 하이라이트도 없이 드르르륵 늘어진 코드만큼 보기 싫은 코드도 없습니다. Pastebin은 최소한의 예의라고 생각해 주세요.

또, 답변에 구문 오류입니다라는 말이 있으면, Java 자체의 문법을 잘못 지켰다는 소리입니다. 그리고 이는 곧 틱팀이 문제를 고쳐 주지 않으니 여러분이 찾아서 해결해야 한다는 뜻입니다.


3. 강좌에 사용된 소스코드의 Copy/Paste는 지원하지 않을 예정입니다.

Java를 배우는 제대로 된 방법은 직접 타이핑해 보고 빌드해 보고 실험해 보는 것입니다. 소스코드에 대한 이해와 경험도 없이 Ctrl+C Ctrl+V로 강좌를 마무리해 버리면 기억에도 안 남고 나중에 써먹지도 못합니다.


서문이 너무 길어졌습니다. 시작하죠.


0. Java 세팅


일단, Java를 배우셨다면 설치되었을 JDK환경 변수 세팅은 여기서도 사용합니다. 혹시나 모르시는 분들은 여기에서 설명하기엔 조금 긴 부분이니 구글 하시면 됩니다. 간단하게 말씀드리자면


http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

1. JDK 설치.


https://www.google.com/search?q=jdk+%ED%99%98%EA%B2%BD+%EB%B3%80%EC%88%98+%EC%84%A4%EC%A0%95&oq=jdk+%ED%99%98%EA%B2%BD+%EB%B3%80%EC%88%98+%EC%84%A4%EC%A0%95&aqs=chrome..69i57j0l5.5351j0j9&sourceid=chrome&ie=UTF-8

2. 환경 변수 세팅.


https://eclipse.org/home/index.php

3. 그리고 이클립스 설치.



1. Forge Gradle


포지팀에서는 마인크래프트 코드를 디컴파일해 주고, 그 와중에 버그도 고쳐주고(..), 유용한 클래스도 추가해 주고...해서 유저들이 더 쉽게 마인크래프트를 입맛대로 고칠 수 있게 해 줍니다. 또 마인크래프트 모드를 쉽게 빌드할 수 있는 툴을 배포하는데요, 우리는 이것을 받아서 개발 환경을 만들 겁니다.


http://www.minecraftforge.net/forum/

마인크래프트 포지의 공식 사이트입니다. 여기서 릴리즈된 마인크래프트 포지의 파일을 받거나, 여러 정보를 얻을 수도 있습니다. 영어를 할 줄 안다면 포럼에 질문도 할 수 있겠죠.


일단, 맨 위에 Home Files Docs의 3개 화면을 보실 수 있겠습니다. Home은 당신이 보고 계시는 바로 그 곳이며, Files는 포지 파일을 받을 수 있는 곳입니다. Docs는 포지 모드 개발에 매우 도움이 되는 기본적인 사항들이 영문으로 적혀 있습니다. 걱정 마세요, 제가 다 설명해 드릴 예정입니다.

여기서 우리는 Files로 가시면 됩니다.


개발하려는 마인크래프트 버전을 골라서 최신(혹은 추천하는) 버전의 Mdk라고 되어 있는 것을 내려받습니다. 1.7 이하에서는 Src가 그것입니다. 이 강좌는 1.11을 기준으로 작성될 예정이기에, 저는 1.11 버전의 Mdk를 받았습니다.


해당 파일을 받아서 압축을 해제하시면 됩니다. 보기 좋게 이름도 바꿔 주시구요.

안에는 빌드/라이브러리 관리 전용 툴인 Gradle의 구성요소들과 편리한 Github 연동을 위한 .gitignore 파일, IDK인 이클립스와의 빠른 연동을 위한 eclipse 폴더, 그리고 여러분의 모드에 들어갈 것들을 집어넣는 폴더인 src 폴더가 있습니다. 그 이외에는 크레딧과 라이센스 명시를 위한 텍스트 파일, 체인지로그, 간단한 사용설명서(..)가 있습니다.

먼저 우리는 지금 보고 있는 mdk 폴더에서 cmd를 호출할 겁니다. Shift를 누른 상태로 빈 곳을 클릭한 후 여기서 명령 창 열기를 선택하세요.


cmd 창입니다. gradlew setupDecompWorkspace eclipse를 입력하세요. 맨 앞의 gradlew는 gradlew.bat을 실행한다는 의미이고, setupDecompWorkspace는 포지 모드의 개발 환경을 구축하라는 소리고, eclipse는 eclipse 폴더를 해당 프로젝트의 설정에 맞게 초기화시키라는 소리입니다.

이 작업은 꽤 많은 시간을 잡아먹으니 켜 두시고 할 일 하고 계세요. 끝나면 완료되었다는 콘솔 창의 메시지와 함께 mdk 파일이 늘어나 있을 겁니다.


그리고 eclipse에 [mdk 폴더]/eclipse를 Workspace로 지정하여 프로젝트를 열어서 왼쪽 화면에 있는 패키지 익스플로러에 mdk 안의 파일이 보이면 환경 세팅은 끝난 겁니다.

아, src/main/java 항목 아래에 있는 패키지와 클래스는 지워 버려도 무방합니다. 포지에서 주는 예제 클래스이고, 별 다른 건 없습니다. 이 강좌 한 장 안에서 다 설명하는 내용입니다. 지금 지우지 않아도, 빌드할 때는 반드시 지우셔야 합니다.



2. 모드 클래스 작성


모든 포지 모드들은 모드 클래스를 가지고 있습니다. 모드 클래스는 모드 ID, 모드의 이름 등 모드에 관한 정보를 가지고 있으며 FML에서 터트려 주는 이벤트를 받아서 아이템과 블럭 등등을 게임에 등록하는 일을 맡습니다.


먼저 모드의 이름을 기반으로 패키지를 만들어 봅시다. 정리하는 일은 세상에서 가장 중요하니까요. src/main/java를 우클릭 -> New -> Package 클릭.

패키지 이름은 아무거나 붙여서 만들 수도 있지만, 제가 추천드리는 방법은 이 둘 중 하나입니다.


(도메인 이름) . (팀 혹은 제작자 이름) . (프로젝트 이름) . [세부 패키지]

혹은 (팀 혹은 제작자 이름) . (프로젝트 이름) . [세부 패키지]

여기서 프로젝트 이름은 여러분 모드의 ID를 붙이면 됩니다.

제 모드의 경우, 도메인은 아무거나 붙여서(...) com으로 지었고, 제작자는 tictim을 붙였습니다. 따라서

com.tictim.ttmpcore

com.tictim.hungerkeeper

com.tictim.mobcapabilities

등등의 패키지 이름이 됩니다.

+

참고할 만한 사항으로, 1999년에 Sun에서 패키지, 클래스, 함수 등등의 이름 제정에 관한 규칙에 대해 기술한 아티클이 있습니다.만, 영어입니다.

http://www.oracle.com/technetwork/java/codeconventions-135099.html


어쨌든, 저는 간단하게 com.tictim.example로 할게요. 여러분은 마음에 드시는 걸로 만드시면 됩니다.


패키지 다음엔.. 패키지 안에 모드 클래스를 만듭시다. 방금 만든 패키지를 우클릭 -> New -> Class 클릭.

보통 모드 클래스의 이름은 모드의 이름으로 짓습니다. 물론 클래스 작명의 일반적인 규칙대로 맨 첫 번째 글자를 대문자로 해서 말이죠. 가끔 뒤에 Mod를 붙이기도 합니다. 저만 쓰는 것 같습니다만. 흠흠.

아무튼 모드 이름이 Apple이라면 모드 클래스 이름은 Apple, 혹은 AppleMod. 모드 이름이 Ball이라면 모드 클래스 이름은 Ball, 혹은 BallMod. 이런 식으로 지으시면 됩니다.


그리고, 클래스에 @Mod [ net.minecraftforge.fml.common.Mod ] 어노테이션을 붙입니다. 이 어노테이션이 붙어 있는 클래스는 마인크래프트가 시작될 때 포지가 다 긁어모아서 모드로 인식해 주며, 자동으로 인스턴스를 만들어 주고 여러 일을 합니다.


이 어노테이션이 받는 인자는 이러합니다.

modid = 모드의 고유한 ID. 다른 모드와 겹치면 꽤나 안 좋은 일이 일어납니다. ResourceLocation같은 오만 가지 사항에 들어갈 일이 많으니, 호환성을 위해 소문자만으로 구성하시는 것이 좋습니다.

name = 모드의 이름. 좀 더 유저에게 친숙한 쪽이죠.

version = 모드의 버전입니다. 포지에서는 숫자 4개로 이루어진 버전 카운팅을 추천합니다. 0.0.0.0, 1.0.3.0 이런 식이죠. 우리는 아직 버전 카운팅을 안 했고 아직 개발 중이기에 초기값인 0.0.0.0으로 맞춰 주시면 됩니다.

+

포지도큐에서 버전 카운팅에 대한 페이지를 찾아볼 수 있습니다.만, 영어입니다.

https://mcforge.readthedocs.io/en/latest/conventions/versioning/


이 밖에도 많은 양의 추가 정보를 줄 수도 있지만 더 설명하면 아주 빠르게 복잡해지니 넘어갑시다.

저 3가지의 정보는 보통 모드 클래스 안에 public static final field의 형태로 선언해 둡니다. 특히 Modid는 말이죠.


그 다음에는 포지의 Loading Stages에 맞춰 메소드를 호출받도록 해 봅시다.

포지가 @Mod 어노테이션이 붙은 클래스를 모드 클래스로 인식을 하듯이, 모드 클래스 안의 메소드에 @EventHandler [ net.minecraftforge.fml.common.Mod.EventHandler ] 어노테이션을 붙임으로써 "내가 이 이벤트가 터질 때 메소드를 호출받고 싶다"라고 FML에게 알려 줄 수 있습니다.

하지만 아무 메소드에다 다 붙여서 효과를 보는 것은 아니고, FML Event 인스턴스 하나를 인자로 받는 메소드만 유효한 이벤트 핸들러로 등록이 가능합니다. 이름은 상관이 없습니다.


포지의 Loading Stages는 크게 3가지로 나뉩니다. 각각 단계별로 해야 하는 작업이 다르니 이 점 명심하세요.

이름

설명

역할(?)

Pre-Initialization

[ net.minecraftforge.fml.common.event.FMLPreInitializationEvent ]

마인크래프트가 블럭과 아이템을 등록하고 모델을 만들기 이전 단계입니다.

ItemColors와 같은 렌더링 관련 인스턴스는 이 단계에서는 생성되지 않았을 수도 있습니다.

블럭/ 아이템 등록

타일엔티티 등록

엔티티 등록

오어딕 등록

 Initialization

net.minecraftforge.fml.common.event.FMLInitializationEvent ]

Pre-Init 이후의 단계입니다. 아이템과 블럭의 등록이 끝나고, 렌더링 관련 인스턴스 또한 생성됩니다.

월드젠 등록

레시피 등록

이벤트 핸들러 등록

IMC 메시지

 Post-Initialization

[ net.minecraftforge.fml.common.event.FMLPostInitializationEvent ]

거의 모든 등록이 끝난 시점입니다. 주로 다른 모드와 관련된 일을 합니다.

모드 호환성 개선

기타 타 모드 관련

+

포지도큐에서 Loading Stages에 대한 페이지를 찾아볼 수 있습니다.만, 영어입니다.

https://mcforge.readthedocs.io/en/latest/conventions/loadstages/

또한 숙련된 모더 분께서는 RegistryEvent에 관한 페이지도 읽어 보시는 것을 추천드립니다.만, 영어입니다.

https://mcforge.readthedocs.io/en/latest/concepts/registries/#registering-things


이 강좌에서는 저 역할을 테스트해 보지는 않고, 간단하게 이벤트를 제대로 받았는지 테스트해 보기로 합시다.

이벤트가 터졌다면 stdout으로 해당 이벤트에 있는 메시지를 남기겠죠?


실행해서 결과를 보고 싶으시다면, 위쪽 칸에 있는 재생 버튼을 클릭하시면 됩니다. Server를 클릭하여 Dedicated Server를 실행하실 수도 있습니다. 하지만 로그인은 할 수 없으니, 온라인 모드는 끄셔야 합니다.


또한, java 코드 작성 창 아래에 있는 콘솔에 로그가 출력됩니다. stdout으로 세 개의 로그가 출력된 게 보이시나요?


다음 시간에는 아이템과 블럭을 만들어 보고, 모델을 간단하게 알아 보도록 하겠심미다. 깊은 내용은 아니니 간단할 거예요. 그럼 여러분 안녕




공지 목록


[TTMP에 관심이 있으신 분들께 드리는 말씀]


[코노조에 어서오세요]


Posted by Tictim indie.