회사 그만두고 싶다.


이렇게 Registry 클래스에 가서 preInit부분에 추가해주시면 됩니다.



이렇게 이제 key.categories.ragnarok라는 부분에 key.keyBackpack이라는 키가 생겼습니다. 기본키는 B키 이구요.


언어파일에서 저거 그대로 써주시면 저 부분이 바뀝니다.


다음에는 가방을 착용한 상태에서 B키를 누르면 가방을 볼 수 있게 한번 짜 보도록 하겠습니다.



안녕못하네 럽홀


오늘은 모델을 가지는 방어구를 만들어보도록 하겠습니다.

일반적인 렌더링을 쓰지 않고 이번에도 Techne를 이용해서 만들어보도록 하겠습니다.




Techne를 실행하고

모델 이름엔 만들고 싶은 방어구를 만드시면 됩니다.

풀세트로 만들어도 되고, 적당히 만드셔도 괜찮습니다.

Base 클래스는 어떤걸 하셔도 상관 없지만 ModelBiped를 써야 만들기가 쉽습니다.



이렇게 열면 스티브 모양으로 틀이 잡혀 있습니다.



오른쪽 하단에 보면 이렇게 머리 몸 오른쪽, 왼쪽, 손 다리 등등이 있습니다.

나중에 모델을 다 만들고 지우셔도 상관 없습니다.



정성을 갈아 넣고 Java로 저장해줍시다.



ModelBiped를 상속해줍시다. 기본적으로 캐릭터를 렌더링해주는 부분입니다.




이렇게 빨간 부분을 수정해줍시다.


그리고 아까 Techne로 모델을 만들때 Head나 Body를 지우지 않으셨으면 지워주도록 합시다.



이렇게 아이템 아머를 하나 추가해줍시다.

모델을 렌더링 하는 부분은 getArmorModel 부분인데 저기서

머리, 머리쓰는곳, 몸, 오른쪽 팔, 왼쪽 팔, 오른쪽 다리, 왼쪽 다리의 렌더링을 보이지 않게 하는 부분입니다.

보이면 좀 이상하게 될 수도 있어요. 그래서 False로 해줍시다.


그리고 예전에 item을 등록시키는 것처럼 해주시면 됩니다.

따로 프록시에 등록해주어야 하는 부분은 없습니다.



안녕 하세요 럽홀


이렇게 크리탭 추가 클래스를 하나 생성합니다.


모드 클래스에서 저 부분을 추가합니다.

아이템이나 블록 부분에서 저렇게 설정해줍니다.


추가 되었소.


탭 이름은 언어파일에서 itemGroup.<TabNameHere> 로 하시면 됩니다.



안녕하세요. 럽홀입니다.


우\연히 옛날 남자친구 ㄴㄴ구글플러스를 봤는데

ㄴㅇㅁ러ㅏㄴ어람너함나히ㅓㅁ니ㅏㅇ하ㅣㄴ머히ㅏㅓㅁ너ㅏㅣㅎㄹ

ㄹㅇㄴ호렇농러ㅏ혼ㅇ러ㅏ혼ㅇ러ㅏ호ㅓ랑놓ㅇ



두개의...패키지...와...두개의...클래스를....만듭니다.

위에 있는 RegistryHandmill은 레시피들을 관리하고

밑에 있는 RecipeHandmill은 말 그대로 레시피입니다.


자바의 클래스는 쉽게 말해서 사용자가 선언할 수 있는 변수형 타입입니다.

저는 Recipe라는 변수를 선언한 것이지요.

어차피 다 0과 1쪼가리들 뿐입니다.



대충 이렇게 만들어줍시다. 

뭐 특별하게 아이템에서 어떤 능력을 사용하거나 그러진 않았고 온니 Java로만 짠 부분입니다. 마크 모딩을 모르셔도 이해하는 부분이에요.




사실 위에꺼 하기 전에 이걸 먼저 설계해야 합니다 뿌잉뿌잉



그리고 기계로 갈아서 나오는 더스트가 있어야겠졈.

새로운 아이템을 하나 만들어줍니다.



구리 가루를 추가하였습니다.


이렇게 레지스트리를 하나 더 만들었습니다. 

아 참 Items와 Blocks를 다 Item과 Block으로 바꿨습니다. 하지 않으셔도 되지만 전 이런거 꼭 고쳐야 하는 성격이라

고치는거 좀 귀찮으니 안하실분들은 안하셔도 됩니다.



LoveHolyTech 클래스에서 초기화하는 부분에도 추가를 시켰습니다.



이번 기계를 만들면서 아이템을 받을 공간이 하나 필요하다고 생각했습니다.

그래서 아이템 슬롯이 있다는것을 알려주는 ISideedInventory를 받아서 넣어줬습니다.

그리고 인벤토리 내용을 저장하는 배열을 하나 선언을 했구요.

volume값은 진행도입니다. 얼마나 갈아졌는지 진행바를 기록해주는 부분이죠.

그리고 이제 인벤토리에 아이템이 있으면 그 아이템을 엔티티화 해서 월드에 뿌려준 다음에 (그러니까 땅바닥에 톡 튀어 나옵니다 ㄲㄲ)

인벤토리에 있던걸 하나 깎습니다. 레시피대로 나오게 되죠.


그 밑에 NBT 부분은 이제 아이템과 volume, rotation값을 저장해줍니다.

NBT를 저장하지 않으면 게임을 저장하고 나갔다가 들어오면 아이템이 사라지는 극현상이 일어날수 있으니까 꼭 추가해줘야합니다.

나머지 밑 부분은 ISideedInventory를 가져오면 따라오는 메소드들인데 적당히 보면 뭐가 뭔지 알수 있습니다. 알수 없으면... 포기하세요 모딩;



BlockHandmill 부분에도 마찬가지로 좀 바꿨습니다.

그냥 블록을 누르는게 아니고 쉬프트 + 블록을 오른쪽 클릭 하였을때 돌아가도록 해놨습니다. (나중에 GUI를 열땐 그냥 오른쪽 클릭으로 하기 위해서)

Volume값을 1씩 증가시켜주고 Rotation값을 0.4씩 증가시킵니다.

위에 import 부분은 Keyboard를 입력받기 위해서 사용되었습니다.


이렇게하면?



WTF?


제가 잘못짰습니다. TileEntityHandmill 55번째 줄을 봅시다.



이런 젠장... 생각해보니까 inventory를 초기화를 안해줘서 Nullpointer exception이 뜬거 같습니다. 헤헿




생성자를 하나 만들어서 냅다 초기화하는 부분을 넣었습니다.



0아이템을 넣기 위해서 호퍼를 달아줬습니다.



제가 구리광물 2스택을 넣었는데 벌써 한스택은 다 들어갔습니다.

이제 더 이상 들어가지 않아요. 한번 갈아봅시당




오오 튀어나왔습니다.




이렇게 안에 인벤이 갈아졌으니까 아이템이 더 들어갔습니다. 

(처음에 튀어나온 구리 가루가 호퍼로 바로 들어가버려서 스샷을 못찍어서 두번째 간걸 스샷을 찍었습니다 -_-;;)



오늘 따라 참 우울한 날이네요.



이거 왜 쓰고 있냐 럽홀


직관적이고 판타스틱한 GUI를 만드십쇼.




안녕 럽홀




에고고 극혐 텍스쳐!




BlockHandmill 부분에 이렇게 넣어줍니다.



그림을 준비합니다.




오오..



안녕하세요 로페카 최강 귀염둥이 럽홀입니다.


이번에는 클래스를 추가하거나 패키지를 만드는 부분은 안보여드리고 텍스트로만 적겠습니다.

제가 너무 힘들고.. 이번엔 제가 먼저 짜고 따로 강의를 드리는거라서 어쩔수가 없습니다.


이전 강의때 만든 정성을 갈아 만든 모델 텍스쳐는 여기다 넣어둡시다.

src/main/resources/assets/loveholytech/textures/blocks 입니다.




패키지와 클래스입니다. 이대로 만들어주시면 됩니다.

여기다가 저번에 JAVA로 저장한 내용을 넣고 약간만 변경시켜주시면 됩니다.



빨간색 체크되어 있는 부분은 원본 소스가 원래 에러를 뿜뿜하기 때문에 이렇게 수정을 해주셔야 합니다.

그리고 네모 부분은 우리가 렌더를 사용하기 위해서 필요한 부분인데 새로 짠 부분입니다.

setRotation은 저번에 썼던 techne 프로그램에서 파란색 구를 중심으로 돌아가는 부분입니다.

Shape2와 Shape3이 어처구니 부분이였으니 이 부분은 돌려줘야 하겠죠?


이제 TileEntityHandmill 부분입니다. 뭔가 추가된게 많죠?

틱 처리 부분(updateEntity)에는 rotation이 6.4를 넘으면 0으로 가게 합니다.

rotation는 회전을 관리해주는 변수이고 6.4를 넘었다는것은 한바퀴를 돌았다라는 뜻이기 때문입니다.

그리고 setRotation과 getRotation은 외부에서 rotation의 값에 접근하기 위해서 사용되는 메소드입니다.

그 아래 readFromNBT와 writeToNBT는 블록의 NBT에 내용을 기록하기 위해 사용됩니다.

그 밑에 두개의 메소드는 서버와 클라이언트 사이에 있는 데이터를 통합시키기 위해서 사용되는 부분입니다. 꼭 추가하셔야 합니다.



렌더링을 위한 패키지 loveholy.loveholytech.render 를 만들어줍시다.

그리고 밑에 있는 아이템 렌더링을 맡는 ItemRenderHandmill 과 RenderHandmill 부분을 생성합니다.

이제 렌더링을 맡는 RenderHandmill을 편집합시다.

ResourceLocation texture를 선언하여 아까 저장해놨던 경로를 입력해주시면 됩니다.


나머지 부분은 공간을 확보하고 텍스쳐를 입힌 다음에

타일엔티티에서 회전값을 받아서 모델을 렌더링하는 부분입니다.


ItemRenderHandmill 부분입니다.

아이템을 렌더링할때에는 좀 더 작게 렌더링해야 하기 떄문에 특수한 처리가 필요합니다.

이렇게 적어두시면 됩니다.


BlockHandmill 부분도 꽤 손을 봤습니다.

onBlockActivated는 오른쪽 클릭을 했을때 인데

이 부분에서 클릭했을때 회전값을 올려주기로 했습니다.

그리고 getRenderType은 따로 렌더링 하고 있다고 하기 위해서 -1을 리턴하였고

이게 완전히 네모 모양인가를 알려주는 메소드에도 마찬가지로 false

이게 일반 블록 렌더링을 쓸건지 물어보는 부분도 마찬가지로 false를 하게 해놨습니다.



렌더링을 위해서 이게 클라이언트인지, 서버인지 가려주는 부분이 필요합니다.

그 역할이 proxy라는 놈들이 해주는데요. 이 패키지를 추가하고

두개의 클래스를 추가해줍시다.


CommonProxy 부분입니다. 

여긴 메소드가 있다~ 라는 것만 알려주면 되기 떄문에 내용은 텅텅 비워도 괜찮습니다.



ClientProxy 부분입니다. Client만 사용하는 것들을 여기다가 구현을 하시면 되는데요.

일딴 렌더러를 만들고 그걸 레지스트리에 등록을 합니다.

그리고 마찬가지로 아이템도 등록을 해주어야겠죠.



LoveHolyTech 클래스 부분으로 넘어와서 이 빨간색 상자 세개를 꼭 추가시켜줍니다.

맨 위에 부분은 별 상관이 없는데(나중에 쓰게 될거 같아서 넣었는데 쓰게 되면 설명해드리겠습니다.)

두번째 상자 부분은 이제 등록된 부분을 어딜 참고를 할지 선택하는 부분입니다.

그리고 세번째는 렌더러를 호출하는 부분이죠.


자 이제 완성. 실행해볼까염? ㅎㅎ



돌아라 낙오자여



안녕하냐해. 럽홀이다헤.


Techne라는 프로그램을 이용해서 모델을 만들어보도록 하겠습니다.


Techne는 


Techne.zip


를 눌러서 다운받으시면 됩니다.



적당하게 만듭니다. 저기는 width랑 height이 64/32로 나와있는데 128 / 64로 만듭시다.



적당하게 큐브를 만듭니다.



두부를 만듭니다(일본에는 stone을 두부라고 부릅니다. 우리가 말도 안되는 꾸븐돌이라고 부르듯)

왼쪽에 보시면 여러가지 값을 입력해두는 부분이 있는데 하나 하나씩 설명 드리곘습니다.

Dimensions

크기 입니다. 순서대로 x y z의 크기입니다. 저는 지상에서 높이 y 10정도 그리고 가로 세로가 16으로 꽉 차는 두부를 만들었습니다.

Position

저기 보이는 파란색 공의 위치입니다. 저는 14로 두었습니다.

Offset

두부와 공과의 위치입니다. 저는 저 파란색 공이 중앙에 위치하게 설정해놨습니다.

Offset

오른쪽 상단에 보면 텍스쳐가 있습니다.이걸 옮겨주는겁니다. 저는 일단 이 두부를 만드는건 기본값으로 설정해놨습니다.


맷돌을 만들려면 어처구니가 필요하겠졈. 어처구니를 만들어봅시다.



이미지 재탕 ><




짜잔. 이렇게 Cube를 2개 더 만들어서 어처구니를 만들었습니다.

일딴 어처구니의 텍스쳐 오프셋을 조금 이동시키겠습니다.


Shape2의 offset 위치입니다.

Shape3의 offset 위치입니다.


이제 텍스쳐를 뒤집어 씌워봅시다.



지금 있는 텍스쳐 맵을 저장을 합니다.




T윗부분

B아랫부분

L왼쪽

F앞쪽

R오른쪽

B뒤쪽



정성을 갈아 넣어라



텍스쳐를 불러들여와봅시다.




예상 외로 그렇게 극혐이진 않습니다.



이제 자바로 저장해서 다음 강좌때 써먹으면 됩니다.



잇힝 ㅇ럽홀



저번에 말씀드렸다시피 레지스트리 부분을 싹 다 넘겨버렸습니다.


넘겨진 부분의 소스입니다. 참 보기 좋아졌졈.



클래스를 하나 만듭시다. 이게 나중에 기계가 될거에요.



블록 이름은 핸드밀... 맷돌이라는 뜻이졈



소스에 주석을 대충 떡칠해봤습니다. 아직 타일 엔티티를 추가 안시켰으니 보통 블럭이랑 소스가 거진 다를게 없는데

icon 부분이 배열로 선언되어 있습니다. 이건 왜냐? 나중에 보심 알게 됩니다.



패키지를 하나 만듭니다.



패키지 이름은 타일엔티티. 타일엔티티를 모아둘 패키지입니다.



타일엔티티에 클래스를 하나 만듭시다.



핸드밀이 가지는 타일엔티티입니다.


간단하게 틱이 연산되는 부분에 volume값을 계속 올려주다가 5000이 넘으면 다시 볼륨값을 0으로 셋하는 부분을 짰습니다.

밑에 부분은 볼륨에 접근하는 부분이구요. 간단하죠?




다시 블록으로 돌아와서.. 아까 오타난 protected를 public으로 고쳐줍니다 (ㅠㅠ)

그리고 생성자의 안쪽 4번째 줄을 보면 타일엔티티를 등록하는 부분이 있습니다. 중요하니 꼭 넣으세염!

그리고 타일 엔티티를 생성하는 부분입니다. 이렇게 리턴을 해주시면 됩니다.

다음에는 onBlockActivated라는 메소드인데요. 

이 메소드는 블록이 활성화되었을때(즉 오른쪽 클릭을 하였을 때) 작동하는 메소드입니다.

저는 그 작동된 곳에 타일엔티티(당연히 그 블록은 죽었다 깨어나도 핸드밀이라는 타일 엔티티를 가지겠졈)를 생성하고

volum값을 받아와서 플레이어에게 출력시켜주는 코드를 짰습니다.



핸드밀의 텍스쳐부분은 이렇게 만들었습니다. 나중에 보시면 이해하실거에염.




이것도 역시 Blocks에 등록시켜주어야 합니다.



짜잔!

정면에서 찍은 부분입니다.



오른쪽에서 쳐다봤습니다.



뒷면에서 쳐다봤습니다.



아랫면입니다.


즉 아이콘을 등록시키는 부분과 getIcon을 보면

이게 면 마다 다른 텍스쳐를 입힐수 있다는 겁니다(!!!!!!!)

우왕 짱이다.




오른쪽 클릭을 하니 Volume값을 계속 출력을 해줍니다.


오옹. 다음엔 커스텀 텍스쳐를 한번 입혀보죵.



럽홀하세요. 안녕입니다.



클래스를 하나 추가해줍시다.


Registry를 관리하는 클래스를 하나 추가해봅시다. 나중에 여유나면 Registry 여기로 다 옮겨야겠군요.



요런 정적 메소드를 하나 만듭니다. 설명은 주석으로 되어있죠?



메인에서 init 이벤트일때 Furnace 레시피를 추가하도록 합시다.


구워진다



구워졌다.




안녕하세요 럽홀입니다.


괴를 만들어봤으니 광물을 추가시켜봐야겠졈.



패키지를 만듭니다.



블록을 관리하는 패키지를 만듭니다.



그 패키지 안에 클래스를 생성합니다.



광물 블럭을 생산하는 클래스를 만듭니다.



생성자는(오타가 났는데 protected가 아니라 public입니다.) 이 광물의 속성과 여러가지를 설정합니다. 읽어 보시면 알아요.

맨 밑에 아이콘을 등록하는 부분 두개가 있습니다. 

아이콘은 서버에 필요 없기 때문에 Side.CLIENT를 박아서 클라이언트에만 동작하게 설정해둡니다. (안그럼 서버 동작시 에러남)



클래스를 하나 더 생성을 합니다.



블록들을 관리해주는 클래스입니다.



여기서 구리 광물을 추가시켜줍니다.



당연히 아이템 처럼 이벤트도 등록시켜주어야 합니다.



당연하게도 언어 파일도 수정을 해 줍시다.



아이콘을 등록시켰으니 저 경로에 아이콘을 나두시면 됩니다.




광물이 생성되었습니다.

하지만 이걸로 끝이 아닙니다. 

광물은 크리탭에서 꺼내오는게 아니라 땅에 박혀 있어야 하기 때문이죠.



패키지를 생성해줍시다.



세계를 관리하는 패키지를 생성해줍시다.



클래스를 생성합니다.



클래스 이름은 광물을 젠시키는 역할이다 라고 해서 OreGenerator로 하였습니다.



월드가 생성될때 generate가 발생을 하고 이 월드가 무슨 월드인지 확인하는 부분을 넣었습니다.

그리고 확인이 끝나면 for문을 통해서 광물을 젠 시켰습니다.

chunkY의 nextInt를 잘 조절하면 광물 높이를 변경할 수 있습니다.



이벤트를 만들었으니 등록시켜야겠죠.



오오 오지게 많이 나오는구만 -ㅅ-;;



안녕하세요. 럽홀입니다.


간단하게 서버 명령어를 추가하는걸 짜볼려고 합니다.




우리는 배운 사람이니 파일을 나눌줄 알아야 합니다.

패키지를 하나 생성합시다.



패키지 이름은 cmd로 두구요.



이제 클래스를 하나 생성을 합니다.



저는 역시.. 다른 모더들이 쓰는 방법대로 이름을 지었습니다.




생성자는 생성되어서 명령어들을 생성을 합니다.

CompareTo는 별로 중요하지 않으니 넘어가고

getCommandName은 말 그대로 명령어 이름을 가져오는 부분입니다.

Usage는 사용법을 출력하는 부분이구요.

Aliases는 명령어 목록을 불러오는 부분입니다.


가장 중요한 부분인 processCommand 부분입니다.

이 부분을 이용해서 커맨드를 이용한 마법의 구현... 이런것도 하시는 분들이 있던데, 뭐 그런것도 구현이 가능하긴 합니다만 간단하게

일딴 커맨드를 보낸 놈이 플레이어인지 확인합니다(서버가 커맨드를 보낼수도 있으니)

그리고 사람이 맞다면(EntityPlayer라는 상속하거나 그 클래스라면) 객체를 따로 생성 한 다음에

명령어의 길이값(그러니까 /loveholytech <샬라샬라>인데 샬라샬라 부분을 띄워쓰기로 나눠서 나온 길이값)이 0이면

Hello, Useername 을 출력하고

아니고 입력한게 있다면 그 입력값중 맨 처음값 (띄워쓰기 된 부분중 맨 처음)을 Input과 함께 출력하는 부분입니다.


나머지 부분은 별로 그렇게 중요한 부분이지 않아서 저렇게 나두고 써도 상관이 없어요.


LoveHolyTech.java로 돌아와서 이 부분을 추가시켜줍니다.

이 부분은 서버가 불러와졌을때 실행되는 이벤트인데

그때 이벤트에서 서버 명령어를 추가시킵니다. 그 명령어는 우리가 짰던 CommandCommon()입니다.



잘 되네요.



안녕하세요. 럽홀입니다.


이전 포스팅을 보면 여러 광물을 추가하기 위해선 그 클래스를 여러개 복사, 붙여넣기식으로 만들었어야 하죠.

그런건 프로그래머들에게 비효율적이라고 욕을 쳐먹는 행동입니다.


그래서 약간 능독적인 ItemIngot클래스를 재구성하면서

Ore Dictionary에도 자동으로 등록되고 Infomation부분도 추가시키는걸 구현해보았습니다.


따로 메타태그는 사용하지 않았습니다. 1.8버전부터 메타태그가 사라진다고 해서요. 이렇게 하는게 쉽기도 합니다.



한줄식 자세하게 설명드리겠습니다.


13번째 줄

Item을 상속받은 ItemIngot 클래스를 설계합니다.


15에서 16번째 줄

능동적인 아이템 추가를 위해서 UnlocalizedName과 Infomation에 출력할 내용들을 저장하는 변수를 선언합니다.


17에서 24번째 줄

super를 사용해 Item클래스의 생성자를 호출하고

메터리얼 탭 부분에 이 아이템을 추가시킵니다.

그리고 argument(인자)로 받은 값을 선언한 변수에 대입시키고

광물 사전에도 등록을 시킵니다.


26에서 42번째 줄

저번에 설명드렸으니 이 부분은 생략합니다. 이전 강좌를 보시길 바랍니다.

바뀐 부분은 능동적인 아이템 생성을 위해서 받아온 값으로 설계하였습니다.


44에서 47번째 줄

이 부분이 새로 추가된 부분인데 마우스로 아이템 위에 올렸을 때 추가적으로 표시되는 정보를 추가할 수 있는 메소드입니다.

list 부분에 add로 String을 넣으면 내용이 추가됩니다.



이렇게 적으면 Infomation 부분에 색상을 입히는것도 가능합니다.



LoveHolyTechItems.java 의 registerItems라는 메소드입니다.

argument를 수정했으니 이 부분도 마찬가지로 수정을 해 줍시다.



en_US.lang 부분도 마찬가지로 수정해줍시다.


짜잔~



이걸 응용해서 광물들 마구 추가해보도록 합시다.


Q. 강좌 언제까지 쓰실껀가요 존나 영양가 ㅇ벗네;


A. 세렌이 모딩 가능할때까지



안녕하세요. 럽홀입니다.


사실 이 강의를 보면서 여러분이 써멀이나... 그런류의 대단한 모드는 만들진 못할겁니다. 저도 못하구요.

하지만 그렇다고 완전히 도움이 안되는것도 아닙니다. 그리고 이런것들을 하는게 절대로 정석이지도 않구요.


그럼 구리 주괴를 추가해보도록 하겠습니다.


1. Item을 관리하는 클래스 만들기




Item 객체들을 모아둘 클래스를 만듭니다. 저는 LoveHolyTechItems라고 했습니다.



소스를 대충 이런 모양으로 짭니다.

1번째 줄

패키지의 이름입니다. 지금 이 파일은 loveholy.loveholytech 패키지에 속해져 있습니다.

3번째 줄

아이템을 게임에 등록시키기 위한 클래스를 불러옵니다.

4번째 줄

Item 객체를 생성하기 위해서 필요한 클래스를 불러옵니다.


7번째 줄

IngotCopper를 생성합니다. 이제 게임레지스트리가 진행되면 이 아이템으로 레시피나 속성에 접근이 가능합니다.

11번째 줄

Item을 상속받은 ItemIngotCopper(밑에서 설계할것입니다)를 IngotCopper에 넣습니다.

12번째 줄

게임에 아이템을 등록시킵니다.



ItemIngotCopper는 아직 만들어지지 않은 클래스입니다.

마우스를 위에다 올리면 quick fixes available 창이 뜨는데요.

빨간색 테두리 부분을 누릅니다.



취향에 따라서 패키지 부분을 수정하시면 됩니다. 전 items 패키지를 새로 만들어서 아이템들을 다 저기로 몰아 넣기로 했습니다.



요렇게 써줍니다. 대충 Item을 상속 받아서 이름을 바꾸고 아이콘을 바꾸게 설정하였습니다.

12번째 줄

상속을 한 Item클래스의 생성자를 호출하는 super클래스입니다.

13번째 줄

이 아이템을 Materials 탭에 넣습니다.


16번째 줄에서 26번째 줄

아이템이 가지는 고유 이름을 지정하는 부분입니다.

28번째에서 32번째 줄

아이템의 이미지 경로를 지정해줍니다.



모드의 메인이 되는 부분에 이 이벤트를 추가를 합니다. 그래야 아이템을 등록을 합니다.

이 이벤트에서는 블록, 아이템 등록 등등을 맡는 역할을 합니다.



이 경로에다 아이템 텍스쳐를 잘 쑤셔 박습니다.



잘 추가 되었습니다. 하지만 이름이 이상하죠.



리소스 위에서 폴더를 하나 만듭니다.



폴더 이름은 lang입니다.



lang에 파일을 하나 만듭니다.



파일 이름은 en_US.lang입니다.



요렇게 적어주시면 됩니다.

이렇게 언어파일을 만들 수 있습니다.

ko_KR.lang을 쓰면 한글도 지정할 수 있습니다.



그럼 이렇게 바뀝니다.


아 강좌 쓰기 너무 힘들다



0. 들어가기 전에


이 강좌는 님들이 Java에 대한 기본적인 것을 알고 있다는 전제하에 쓰여진 강좌이기 때문에

어떤어떤거 이렇게 응용하고 싶은데 어떻게 하나요? 라는 질문은 받고 따로 강좌를 쓰거나 답변을 드리겠지만

Syntax 에러에 대해서는 절대로 질문을 받지 않습니다.


괜히 사람 암걸리게 하지 마세요.


1. 환경 구축하기


포지 모드 개발 환경을 조성하기 위해서는 포지 다운로드 페이지에서 src를 받아주어야 합니다.



저 같은 경우엔 항상 Recommended(추천된, 추천하는) 버전을 사용합니다. 지금 1230버전으로 강좌를 진행하겠습니다.

Java에 대한 기본적인 것을 알고 있다는 전제가 깔려 있기 때문에 eclipse와 JDK가 설치되어 있다고 믿겠습니다.


2. 압축풀기



적당한 곳에 압축을 풉니다. 저는 D:\LoveHolyTech\ 폴더에 풀겠습니다.


3. 작업공간과 eclipse 프로젝트 파일 생성하기



쉬프트를 누른채로 오른쪽 클릭을 하면 여기서 명령어창 열기라는게 보일껍니다. (한글로 비슷한게 있을거에요.)

이걸 눌러줍시다.



gradlew setupDecompWorkspace


이렇게 하시면 gradle가 자동으로 작업공간을 만들어줍니다.

시간이 걸리는 작업이니 기다려주시고

10분 이상이 걸린다 싶을때 아래의 문제점을 확인해보세요.


1. JDK가 설치가 되지 않았다 -> JDK 설치

2. JDK가 설치가 되었으나 버전이 1.8이다. -> 1.7 JDK설치




gradlew eclipse


저는 작업공간 만드는데에 4분 정도가 걸렸습니다.

이제 eclipse 프로젝트를 생성하면 됩니다.


4. Eclipse 실행



이클립스를 실행하면 이런 창이 뜹니다. 압축을 풀어둔 폴더에 eclipse 폴더를 선택하여 OK를 눌러주시면 됩니다.



이클립스를 실행하였을때 이런 과정이 뜨지 않고 바로 예전 프로젝트가 열린다면 파일(File)->작업공간 변경(Switch Workspace)->기타(Other)를 눌러서 열어주시면 됩니다.


5. 소스 편집



원래 있던 소스를 삭제합니다. 기본적으로 적혀 있는 더미 파일입니다.



그 다음에 패키지를 만들어 줍니다.



보통 패키지 이름은 알아서 정하시면 됩니다. 보통 모더들이 선호하는 방식은 Author.ModName 이니 그 방법을 따르도록 하겠습니다.



클래스를 추가시켜줍니다.



클래스 이름을 지정을 합니다.

저희가 만드는건 Init이벤트를 담당하고 모드의 중요한 필드와 메소드를 만드는 부분입니다.

보통 모더들이 이 클래스를 만들 때 모드의 이름을 적으니 저도 그렇게 쓰도록 하겠습니다.



패키지 탐색기(Pakage Explorer)를 통해서 생성한 class를 연 다음에 이렇게 소스를 짰습니다.

간단하게 FMLInit 이벤트가 발생할때 Hello World를 출력하는 소스를 짰습니다.

아무 에러가 없이 위와 비슷하게 만들어졌다면 성공하신 겁니다.


이제 src/main/resources 에 들어가서 기본정보들을 수정해줍니다.


6. 빌드하기



build.gradle 이라는 파일을 텍스트 편집기를 통해 엽니다.



21번째 줄과 22번째 줄을 수정을 팝니다.

group에는 아까 만들었던 패키지를 적어주시면 되고

archivesBaseName은 아무거나 적어주셔도 상관 없지만 저는 모드 이름을 적었습니다.

그리고 저장을 합니다.



gradlew build


이제 아까의 명령어 창으로 돌아와서 위의 명령어를 입력합니다.

이렇게 하시면 5분 이내외로 빌드가 완성이 됩니다.



빌드가 성공적으로 완료가 되었습니다.



빌드가 성공한 파일은 압축을 푼 위치\build\libs에 위치하고 있습니다.

이제 이걸 복사하여 mods 폴더로 옮겨서 마인크래프트를 실행하시면 됩니다.


7. 완성



자신이 원하는대로 코딩이 되었는가를 확인합니다.


이제 이렇게 하시면 모딩을 하실 환경이 조성된겁니다.

사실 이클립스의 Run버튼을 눌러서 바로 마인크래프트 실행이 가능합니다만 그렇게 하면 매우 불안정하기 때문에 빌드를 해서 직접 확인하시는 것을 추천해드립니다.


다음 강좌에는 여기서 좀 더 살을 붙여서 아이템을 하나 생성해보도록 하겠습니다.

+ Recent posts