조립형 드릴은 산업 모드(IndustrialCraft) 애드온(Addon)으로서 만든 모드입니다. 산업 모드에서도 3종의 드릴을 추가하고, 그 외 다른 애드온들도 드릴을 추가하지만 서로 기능이 충돌하고 밸런스도 잘 맞지 않아서 산업 모드에서 사용될 드릴만 다루는 모드를 만들어 보았습니다. 이 모드 자체의 아이디어는 그레그 테크(GregTech)에서 가져왔으며 아직 산업 모드 팀에게 허가 받지 않은 애드온이기 때문에 공개 배포가 되지 않는다는 점 이해해주시길 바랍니다.

 

1. 기본 드릴 만들기

조립형 드릴의 가장 기본 형태는 위의 조합법으로 만들어집니다. 간략하게 설명하면 드릴 날, 배터리, 모터로 구성되어 있습니다. 드릴은 전력 소모 효율 증가, 채광 레벨, 그리고 채광 범위에 영향을 끼칩니다. 배터리는 충전 용량과 충전에 요구되는 티어를 결정하고 모터는 전력 소모 효율 감소, 채광 속도와 관련됩니다.

조립형 드릴에 마우스를 올리면 현재 부품의 단계와 스펙을 확인할 수 있습니다. 블록 하나를 파괴할 때 사용되는 EU, 최대로 저장할 수 있는 EU, 채광 속도와 채광 범위가 위에 먼저 표기되고, 각 부품의 단계가 아래에 표시됩니다.

 

 

2. 부품과 조립

조립형 드릴을 더욱 더 유용하게 만들기 위해서는 추가적인 부품이 필요합니다. 위와 같이 드릴 날은 6단계로, 모터와 배터리는 각 8단계로 구분되어 있습니다. 당연히 상위 단계일수록 요구하는 자원이 많아지고, 성능이 좋아집니다.

 

부품 조립은 위와 같이 간단한 조합으로 이루어집니다. 다만, 각 부품을 조립하기 위해서는 바로 아래 단계의 부품이 조립되어 있어야합니다. 위 사진의 경우에는 청동 드릴 날이 기본 드릴 날인 철 드릴 날의 바로 다음 단계이기 때문에 조립할 수 있는 것입니다. 서로 다른 부품의 단계는 영향 받지 않습니다. 즉 한 부품만 강화시켜 가는 것도 가능합니다, 다만 배터리 소모와 용량, 속도 등의 밸런스가 맞지 않아 모든 부품을 단계적으로 강화하는 것이 가장 좋을 것입니다.

 

최고 단계의 드릴 날은 다음과 같이 7*7의 범위를 팝니다. 상당히 강력한 성능을 자랑하는 드릴을 만들 수 있습니다.

 

 

 

곧 산업 모드 팀에 모드 배포와 관련해서 문의를 할 예정이지만 그 내용이 확정되기 전에 모드가 필요하신 분은 따로 연락해주시길 바랍니다.

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

 

배경지식 :

1. 아이템스택(Item Stack)

 

선행과정 :

1. 기본 모드 파일

 

강의 목표 :

1. 무형 조합법(Shapeless Recipe)를 추가한다

2. 화로 조합법(Smelting Recipe)를 추가한다

 

1. 조합법

조합법은 자신이 추가한 요소를 플레이어에게 제공하는 유용한 수단입니다. 모드 제작자는 자신이 만든 블록과 아이템을 어떠한 방식으로든 플레이어가 사용할 수 있도록 경로를 만들어야 하는데, 조합법을 추가하지 않는다면 엔티티(Entity)를 통한 드롭이나 명령어, 혹은 정말 특수한 방법을 이용해서라도 추가된 아이템 얻을 수 있게 해야 합니다. 조합법은 플레이어 입장에서도 직관적이고 제작자 입장에서도 추가가 용이합니다.

코드를 살펴보기 전에 유형 조합법(Shaped Recipe)과 무형 조합법(Shapeless Recipe)의 차이점을 먼저 알아보겠습니다. 유형 조합법은 조합의 결과가 재료들의 위치에 종속적인 조합법입니다. 즉, 재료들의 위치가 달라지면 결과가 달라지거나 혹은 사라지는 조합법이죠. 대부분의 조합법이 여기에 포함됩니다. 무형 조합법은 반대로 재료들의 위치가 결과에 영향을 끼치지 않는 조합법입니다. 염색 조합과 같은 "섞는" 조합법들이 여기에 속합니다.

그림 1 무형 조합법(Shapeless Recipe)의 예

그림 2 유형 조합법(Shaped Recipe)의 예

그림 3 화로 조합법(Smelting Recipe)의 예

 

2. Shapeless 조합법 추가하기

Shapeless 조합법을 추가해보도록 하겠습니다. 먼저, 기본 모드 파일이 다음과 같이 설정되어 있다고 가정합니다.

@Mod(modid = "basictutorial", name = "Basic Tutorial", version = "1.0.0")

public class BasicTutorial {

    @SidedProxy(clientSide = "oortcloud.basictutorial.ClientProxy", serverSide = "oortcloud.basictutorial.CommonProxy")

    public static CommonProxy proxy;

    

    @Mod.EventHandler

    public static void preInit(FMLPreInitializationEvent event) {

    }

 

    @Mod.EventHandler

    public static void Init(FMLInitializationEvent event) {

    }

 

    @Mod.EventHandler

    public static void postInit(FMLPostInitializationEvent event) {

    }

}

조합법은 일반적으로 Pre-Initialization 상태에서 추가합니다. 만약 다른 모드로부터 조합법이 영향을 받는다면 Initialization이나 Post-Initialization에서 추가할 수도 있으나, 가능하면 Pre-Initialization에서 추가하는 것이 바람직합니다. 다른 모드에서 여러분이 추가할 조합법을 참조할 수도 있기 때문입니다.

Shapeless 조합법은 다음의 함수를 통해서 추가합니다.

GameRegistry.addShapelessRecipe(ItemStack output, Object... params)

ItemStack output : 조합법의 결과인 ItemStack입니다.

Object... params : 조합법의 재료인 다수의 ItemStack입니다.

output의 아이템 스택은 개수가 반영됩니다. 하지만 params의 아이템 스택은 개수가 반영되지 않습니다. 결과는 코드를 통해 살펴보겠습니다.

    @Mod.EventHandler

    public static void preInit(FMLPreInitializationEvent event) {

        GameRegistry.addShapelessRecipe(new ItemStack(Items.bread, 2), new ItemStack(Items.wheat), new ItemStack(Items.wheat), new ItemStack(Items.sugar));

    }

위의 코드는 다음과 같은 조합법을 추가합니다.

그림 4 추가된 무형 조합법(Shapeless Recipe)

3. 화로 조합법(Smelting Recipe) 추가하기

화로 조합법의 구성요소는 재료 1개와 결과 1개입니다. 따라서 무형 조합법보다 추가가 간단합니다. 사실 무형 조합법에 없는 요소도 있는데, 바로 아이템을 구웠을 때 지급되는 경험치입니다. 즉, 화로 조합법에는 재료, 결과와 함께 경험치 양을 지정해야 합니다.

화로 조합법 또한 무형 조합법과 동일하게 Pre-Initialization에서 추가하는 것이 좋습니다.

화로 조합법은 다음 함수를 통해 추가합니다.

GameRegistry.addSmelting(ItemStack input, ItemStack output, float xp)

ItemStack input : 조합법의 재료가 되는 ItemStack입니다. Item과 Block이 직접 사용될 수도 있습니다.

ItemStack output : 조합법의 결과가 되는 ItemStack입니다.

float xp : 지급되는 경험치 양입니다.

예시를 통해 코드가 어떻게 적용되는지 확인해보도록 하겠습니다.

    @Mod.EventHandler

    public static void preInit(FMLPreInitializationEvent event) {

        GameRegistry.addSmelting(Items.wheat, new ItemStack(Items.bread), 1.0F);

    }

그림 5 추가된 화로 조합법

이로서 화로 조합법도 추가해보았습니다.

1. 게임 내에서 아이템 스택

아이템 스택은 모드를 개발함에 있어 아주 중요한 기본 개념입니다. 쉽게 말하면 가방의 한 칸을 차지하는 대상이 모두 아이템 스택입니다. 같은 아이템(Item)이라고 할 지라도 서로 개수가 다를 수 있고, 도구처럼 내구도나 부여된 마법이 다를 수도 있습니다. 이런 요소들이 모여 하나의 아이템 스택을 정의합니다.

그림 1 서로 다른 아이템 스택

위의 그림에서 첫 번째 줄은 내구도가 다른 도구와 부여된 마법(Enchantment)이 다른 도구를 보여줍니다. 내구도는 damage라는 변수에 값이 저장이 되고 마법 부여의 경우는 NBT라는 특수한 형태로 값이 저장됩니다. 두 번째 줄에서 블록도 아이템 스택이 될 수 있음을 확인할 수 있습니다. 세 번째 줄에서처럼 아이템 스택에는 stacksize라는 개수 정보를 가지고 있는 변수도 있습니다. 마지막 줄의 염료들은 서로 같은 아이템(Item) 종류입니다. 다만 이들 모두 damage 값이 달라서 그에 따라 완전히 다른 아이템으로 분류됩니다. 이런 아이템들은 하위 아이템(sub item)이라고 부릅니다.

2. 프로그램 내에서 아이템 스택

프로그램 내에서 이러한 아이템 스택을 생성하는 법을 간략하게 소개하겠습니다. 위에서 살펴본 아이템 스택의 요소 중에 가장 중요한 것은 "아이템(Item) 종류", "개수(stack size)", "내구도(damage)"입니다. ItemStack의 생성자도 위의 세 변수를 기본적으로 받아들입니다.

public ItemStack(Item item, int stacksize, int damage)

public ItemStack(Item item, int stacksize) : damage=0으로 설정

public ItemStack(Item item) : stacksize=1, damage=0으로 설정

생성자는 크게 3가지가 이용됩니다. 세 성분 모두 받는 생성자부터 아이템 종류만 받는 생성자까지 모두 사용할 수 있습니다. 인자를 1개나 2개만 받는 생성자는 개수(stacksize)나 내구도(damage)를 정해진 기본값으로 이용하기 때문에 정확히 어떤 값으로 설정되는지 상기하시기 바랍니다. 마인크래프트에서 미리 정의된 아이템 종류는 Items 클래스 내부에서 찾을 수 있습니다.

+ Recent posts