강의 환경 : forge-1.7.10-10.13.4.1517-1.7.10

 

배경 지식

  1. 무형 조합법(Shapeless Recipe) 및 화로 조합법(Smelting Recipe) 추가하기
  2. 유형 조합법(Shaped Recipe) 추가하기
  3. 광물 사전

 

강의목표

  1. 광물 사전을 이용한 조합법을 추가한다.
  2. 아이템의 내구도(damage)에 영향을 받지 않는 조합법을 추가한다.

 

1. 광물 사전을 이용한 조합법

마인크래프트 포지에는 광물 사전이라는 개념이 있어서, 비슷하거나 완전히 동일한 아이템을 하나의 이름으로 묶습니다. 원목의 경우에는 참나무, 가문비나무 등 여러 종류가 있지만 모두 "logWood"라는 이름으로 대표되고, 구리 주괴도 IC2에서, 포레스트리(Forestry)에서 각각 아이템을 추가하지만 "ingotCopper"라는 이름으로 연결되어 있습니다. 자주 사용되는 목록여기에서 찾아보실 수 있습니다. 다만 최신 버전은 아닙니다.

조합법을 추가할 때, 광물 사전을 이용하지 않으면 원치 않은 결과가 발생할 수 있습니다. 나무를 이용한 조합법이 등록할 때 사용한 한 종류의 나무만 지원하고, 광물을 사용하는 조합법이 다른 모드의 광물은 인식하지 않는다면, 사용자 입자에서 굉장히 불편할 것입니다. 광물 사전은 이와 같이 조합법을 추가할 때, 사실상 반드시 이용해야하는 기능입니다.

광물 사전 조합법은 IRecipe를 구현하고 있으며 유형 조합법, 무형 조합법이 각각 따로 작성되어 있습니다. 다만, 유형 조합법/무형 조합법과 같이 GameRegistry에서 따로 추가하는 함수가 정의되어 있지 않아 addRecipe라는 일반적인 등록 함수에 IRecipe 객체를 전달하는 방식으로 조합법을 추가하게 됩니다.

void GameRegistry.addRecipe(IRecipe recipe)

IRecipe recipe

등록될 조합법

 

광물 사전 조합법은 IRecipe를 상속하고 있기 때문에 위 함수의 인자로서 적합합니다. 즉, 우리가 원하는 조합에 대한 광물 사전 조합법의 객체를 만든 뒤 인자로 전달하기만 하면 등록이 끝나는 것입니다.

new ShapedOreRecipe(ItemStack result, Object... recipe)

ItemStack result

조합법 결과

Object... recipe

조합법 배치 및 재료들

 

new ShapelessOreRecipe(ItemStack result, Object... recipe)

ItemStack result

조합법 결과

Object... recipe

조합법 재료들

 

위 두 생성자는 지난 강의에서 살펴본 GameRegistry.addShapelessRecipe/GameRegistry.addShapedRecipe와 거의 같습니다. 다만 아이템 스택(Item Stack)뿐만 아니라 광물 사전 이름도 주어 줄 수 있습니다. 서로 거의 적용 방법이 비슷하니 유형 조합법만 예시를 살펴보겠습니다.

GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(Blocks.chest,8), "aaa","a a","aaa", 'a', "logWood"));

 



그림 1추가된 광물 사전 조합

위의 코드가 아래와 같은 조합법을 추가합니다. 상자 1개를 만드는 조합은 기본 조합이고, 포지(Forge)에서 자체적으로 광물 사전 조합으로 변경한 것을 알 수 있습니다. 아래가 추가된 조합법입니다. NEI를 사용해 보신 분들은 아시겠지만 광물 사전 조합법은 해당 광물 사전의 모든 아이템들이 무작위로 표시되며 바뀝니다.

 

 

2. 내구도에 영향을 받지 않는 조합법

아이템 스택(Item Stack)을 생성할 때, 인자로 내구도(damage) 값을 줄 수 있는 것은 이미 알고 계실 겁니다. 내구도 값에 따라 서로 다른 염료가 결정되고, 실제 도구의 손상 정도를 나타내기도 합니다. 조합법을 등록할 때도 적절한 내구도 값을 전달해서 명확한 조합법이 만들어 질 수 있습니다. 하지만 무기나 곡괭이를 이용한 조합의 경우에는 내구도 값이 조합법에서 문제가 되는 경우도 있습니다.

그림 2발사기 조합법(1)

한 번도 사용하지 않은 활이라면 위의 조합은 발사기(Dispenser)를 만들어야 합니다. 하지만 한 번 이상 사용한 활은 내구도 값이 다르기 때문에 조합법에서 다른 재료로 인식됩니다. 하지만 여기서 활의 가능한 모든 내구도(0, 1, 2, …)에 대해서 조합법을 추가하는 것은 성능을 저하시키는 요인이 됩니다. 결코 올바른 방법이 아니죠.

이런 상황에서는 아이템 스택(Item Stack)의 생성자에 일반적인 상수를 내구도 값으로 전달하는 것이 아닌 OreDictionary.WILDCARD_VALUE (=32767)라는 특수한 값을 전달하면 모든 내구도에 대해서 조합법이 재료를 인식합니다.

방법은 간단하기 때문에 바로 예시를 보며 강의를 마치겠습니다.

GameRegistry.addShapedRecipe(new ItemStack(Blocks.dispenser),

"aaa", "aba", "aca",

'a' , Blocks.cobblestone, 'b', new ItemStack(Items.bow, 1, OreDictionary.WILDCARD_VALUE), 'c', Items.redstone);

 

그림 3발사기 조합법(2)

 

 

참고 자료

http://greyminecraftcoder.blogspot.com.au/2015/02/recipes.html

+ Recent posts