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

 

배경 지식

  1. 기본 모드 파일

 

강의목표

  1. 아이템 객체를 생성한다.
  2. 생성된 객체를 등록한다.
  3. 등록된 아이템에 텍스처(Texture)를 부여한다.

 

1. ModItems 클래스 만들기

아이템을 만들기에 앞서, 먼저 우리가 추가할 아이템들을 관리할 수 있는 클래스를 준비해야 합니다. 클래스의 이름이나 패키지는 기능과는 크게 관련 없지만 훗날 능률을 높이기 위해서 정해진 약속대로 정의하는 것이 좋습니다. 본 강의에서는 이름은 ModItems, 패키지는 oortcloud.basictutorial.item으로 설정하겠습니다.

그림 1패키지 탐색기

이제 ModItems 클래스의 뼈대를 구성해보도록 하겠습니다. 먼저, ModItems 클래스가 다른 클래스로부터 상속되지 않도록 final로 선언을 합니다. 그리고 아이템 객체를 생성하고 등록할 init() 메소드를 만듭니다. 이때 init() 메소드는 1) 외부에서 메소드를 실행할 수 있도록 public으로, 2) ModItems는 객체가 생성되지 않으므로 static으로, 3) 클래스와 마찬가지로 오버라이드 될 수 없도록 final로 선언해줍니다.

ModItems.java

package oortcloud.basictutorial.item;

 

public final class ModItems {

    

    public static final void init() {

        

    }

    

}

 

 

2. 아이템 객체 생성 및 성질 부여

뼈대가 완성되었기 때문에 간단히 Item 객체를 만들어 보도록 하겠습니다. 위에서와 같이 public static으로 선언해줍니다. 처음 아이템 변수를 선언할 때는 임포트와 관련된 에러가 발생할 수 있습니다. Ctrl + Shift + O를 누르면 이클립스에서 필요한 클래스를 자동으로 임포트 해줍니다.

ModItems.java

package oortcloud.basictutorial.item;

 

import net.minecraft.item.Item;

 

public final class ModItems {

    

    public static Item tutItem;

    

    public static final void init() {

        

    }

    

}

 

이제 tutItem 에 적용될 아이템 객체를 만들겠습니다. Item 객체는 하나 또는 여럿의 아이템 종류를 대표하여 생성되는 아이템 스택(Item Stack)의 이름, 텍스쳐, 성질을 결정합니다. 오늘 우리가 다룰 아이템은 단순히 Item 클래스의 생성자를 사용하면 됩니다.

ModItems.java

package oortcloud.basictutorial.item;

 

import net.minecraft.item.Item;

 

public final class ModItems {

    

    public static Item tutItem;

    

    public static final void init() {

        tutItem = new Item();

    }

    

}

 

이렇게 만든 객체는 당연히 아무런 기능이나 성질을 가지고 있지 않습니다. 심지어 이름조차 없기 때문에 등록할 수도 없습니다. 성질을 부여할 때는 다음과 같은 메소드를 사용합니다. 이들은 모두 조작한 객체를 다시 반환합니다. (이 부분은 예시를 보면서 추가로 설명하겠습니다)

setUnlocalizedName(String name)

아이템의 이름을 name으로 설정합니다.

setCreativeTab(CreativeTabs tab)

크리에이티브 모드의 tab에서 이 아이템을 찾을 수 있습니다.

setTextureName(String name)

텍스쳐의 이름을 name으로 설정합니다.

setMaxStackSize(int size)

중첩될 수 있는 최대 개수를 size로 설정합니다.

 

각 메소드가 다시 아이템 객체를 반환하기 때문에 예시와 같이 한 줄에 나열해서 호출할 수 있습니다. 아래의 아이템은 tutItem이라는 이름을 가지게 되고 크리에이티브 모드에서 기타 항목에 들어가게 됩니다.

tutItem = new item().setUnlocalizedName("tutItem").setCreativeTab(CreativeTabs.tabMisc);

 

 

3. 아이템 등록

이렇게 객체를 생성하더라도 마인크래프트 내부에 이식된 것이 아니라서 실제로는 게임에 아무런 영향도 주지 않습니다. 따라서 등록(registration)이라는 과정을 통해 아이템을 내부에 이식해야 합니다.

public static void GameRegistry.registerItem(Item item, String name)

Item item

등록할 아이템 객체입니다.

String name

setUnlocalizedName()에서 사용한 이름과 같은 이름입니다.

 

ModItems.java

package oortcloud.basictutorial.item;

 

public final class ModItems {

    

    public static Item tutItem;

    

    public static final void init() {

        tutItem = new Item().setUnlocalizedName("tutItem").setCreativeTab(CreativeTabs.tabMisc);

        GameRegistry.registerItem(tutItem, "tutItem");

    }

    

}

 

마지막으로 init()을 호출하기만 하면 등록이 완료 됩니다. 아이템의 등록은 다른 모드와 호환을 위해 최대한 빨리 진행해야 하기 때문에 Pre-Initialization 단계가 적합합니다. 다음과 같이 기본 모드 파일의 해당 이벤트에서 호출하면 됩니다.

BasicTutorial.java

( … )

    @Mod.EventHandler

    public static void preInit(FMLPreInitializationEvent event) {

        ModItems.init();

    }

( … )

 

그림 2추가된 아이템(1)

아이템이 추가되어 크리에이티브 탭에서 찾아볼 수 있습니다. 하지만 이름은 item.tutItem.name이고 텍스쳐는 검정/분홍 체스판입니다. 등록은 완료되었으나 아직 (현지화 된)이름과 텍스쳐가 올바로 지정되지 않았기 때문입니다. 이 중 텍스쳐는 곧 바로 추가할 것이고 현지화는 아바스트로님의 강의를 확인하시면 됩니다.

 

 

4. 텍스처 등록

먼저 등록할 텍스처를 준비해 보겠습니다. 크기는 기본적으로 16*16에 png 형식입니다. 아래의 텍스처는 제 모드인 토지 중개사(Estate Agent)에 사용된 파일입니다.

일단 이 텍스쳐를 "(WorkspaceRoot)/src/main/resources/assets/(modid)/textures/items/(texture_name).png"에 저장해야 합니다. 괄호로 표시된 값은 변수라고 생각하시면 됩니다. 본 강의에서 다루는 예제라면 다음의 경로에 저장해야 합니다.

그림 3텍스처 경로

 

이제 아이템 객체와 텍스처 파일을 연결해야 합니다. ModItems 클래스에 선언된 객체에 .setTextureName("(modid):(file_name)") 메소드를 호출합니다. 이 역시 괄호로 표시된 부분은 변수입니다. ":" 기호로 구분되어 앞은 모드 ID, 뒤는 연결할 PNG 파일 이름입니다.

.setTextureName("basictutorial:tutItem")

본 강의에서는 위와 같이 호출해야 합니다.

 

ModItems.java

package oortcloud.basictutorial.item;

 

public final class ModItems {

    

    public static Item tutItem;

    

    public static final void init() {

        tutItem = new Item().setUnlocalizedName("tutItem").setCreativeTab(CreativeTabs.tabMisc).setTextureName("basictutorial:tutItem");

        GameRegistry.registerItem(tutItem, "tutItem");

    }

    

}

 

 

 

참고 자료

http://bedrockminer.jimdo.com/modding-tutorials/basic-modding-1-7/first-item/

+ Recent posts