cat [file]

마인크래프트 모드제작 #2: 아이템 제작

본격적으로 모드를 만들기 위한 자바 소스코드를 작성해보자. 이 글에서는 화폐시스템 모드를 만들면서 모드에 대해 자세히 공부해볼 것이다.

먼저 src 폴더에서 main/java/com/example/examplemod 폴더를 살펴보자. 이 폴더가 개발에 메인이 되는 소스들이 들어있는 디렉토리이다. 필자는 패키지명을 마음대로 바꾸었기떄문에 com.hisnty.lifegame 으로 변경하였다.

내가 만들 모드의 기능은

  1. 유저별로 돈을 저장하고 명령어를 통해 돈을 수표로 출금한다.
  2. 수표는 일정한 단위로 출력 가능하고 수표마다 저장된 돈이 다르다.
  3. 또한 수표를 들고 아무곳이나 우클릭하면 다시 내 계좌로 돈이 입금된다.

정리해 보자면 필요한 아이템은 지폐이고

기능은

지폐아이템 제작

먼저 나는 지폐아이템을 만들었는데 만들기가 너무 귀찮고 딱히 손재주도 없어서 그냥 마크에 있는 종이아이템에 그림판으로 그냥 무지개 색으로 칠해서 간단하게 만들었다. 아이템은 16픽셀의 정사각형 캔버스에 그렸다.

아이템 클래스 제작

com.example.examplemod 패키지 안에 item 패키지를 만들고 그 안에 ModItems패키지를 하나 만들어준다. 이 패키지 안에 여러 아이템들의 코드를 작성할 것이다.

등록

저번 글에서 모드의 핵심적으로 알아야 하는 기능 다섯가지를 알아보았는데 먼저 등록부터 해보자. 등록 방법은 여러가지가 있었는데 공식문서에서는 DeferredRegister을 권장하고 있다.

public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(MODID);

위와 같이 아이템 레지스터를 DeferredRegister로로 생성해준다. 여기에 내가 만든 지폐나 다른 아이템등을 등록할 것이다.

public static final DeferredItem<Item> BILL_ITEM = ITEMS.registerSimpleItem("bill", new Item.Properties());

아이템은 위와 같이 등록한다. 나는 지폐아이템을 만들것이기 떄문에 BILL_ITEM으로 변수이름을 지정해주었고 bill은 아이템의 아이디가 된다.

register 메서드를 만들어서 메인 클래스에서 이 아이템을 등록할수 있게 해주었다.

ModItems.java의 전체 코드는 다음과 같다

public class ModItems {
    public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(MODID);
    public static final DeferredItem<Item> BILL_ITEM = ITEMS.registerSimpleItem("bill", new Item.Properties());

    public static void register(IEventBus eventBus) {
        ITEMS.register(eventBus);
    }
}

지금까지 만든 것은 아이템을 등록하는 코드였고 등록 메서드를 메인 패키지에서 사용해야 등록이된다.

com.example.examplemod 안에 ExampleMod라는 클래스가 메인 클래스이다.

public ExampleMod(IEventBus modEventBus, ModContainer modContainer)
    {
        modEventBus.addListener(this::commonSetup);
        ModItems.register(modEventBus);

        NeoForge.EVENT_BUS.register(this);

        modEventBus.addListener(this::addCreative);

        modContainer.registerConfig(ModConfig.Type.COMMON, Config.SPEC);
    }

위 코드는 클래스 안에 작성하는 생성자로 클래스와 이름이 같다.

ModItems.register(modEventBus); 아 부분이 아이템을 레지스터에 등록한다.

private void addCreative(BuildCreativeModeTabContentsEvent event)
    {
        if(event.getTabKey() == CreativeModeTabs.INGREDIENTS){
            event.accept(ModItems.BILL_ITEM);
        }
    }

또한 위 코드는 크리에이티브 모드에서 아이템을 검색 가능하게 만들어준다. 이 코드가 없다면 검색이 되지 않고 give username lifegame:bill 을 입력해야만 아이템을 인벤토리에 추가할 수 있다.

아이템 이름설정

아이템 이름은 언어별로 설정할 수 있다. 만약 이름을 설정하지 않는다면 modid:itemname 이런식으로 나온다.

Image

위 사진처럼 resources 폴더 안에 assets/modid 폴더를 만들어 준 후 그 안에 lang 폴더를 만든다. 그리고 국가 코드.json파일을 생성해주면 언어 별로 아이템 이름을 지정할 수 있다.

en_us.json은 언어 설정을 영어로 했을 때, 아이템 이름을 설정할 수 있고, ko_kr.json은 언어 설정을 한글로 했을 때, 아이템 이름을 설정할 수 있다.

//en_us.json
{
  "item.lifegame.bill": "Bill"
}
//ko_kr.json
{
  "item.lifegame.bill": "수표"
}

키는 item.modid.itemid 형식으로 되어있다.

아이템 텍스쳐 설정

텍스처는 16*16픽셀의 png 이미지로 만들 수 있다.

위 사진처럼 resources/assets/modid 폴더 안에 textures/item 폴더를 만든 후 안에 png 이미지를 넣으면 된다.

그리고 items/bill.json, models/item/bill.json 를 생성해준다.

//items/bill.json
{
  "model": {
    "type": "minecraft:model",
    "model": "lifegame:item/bill"
  }
}
//models/item/bill.json
{
  "parent": "minecraft:item/generated",
  "textures": {
    "layer0": "lifegame:item/bill"
  }
}

내가 만드는 아이템과 모드 아이디는 bill과 lifegame이므로 다른 아이템을 만들 경우 적당히 수정하면 된다.

Image

Image

Image

이렇게 새로운 수표아이템이 생성되었다. 인벤토리를 보면 수표에 마우스를 갔다 대었을 떄 수표라고 뜨는 것을 볼 수 있다.

다음 글에서는 계좌를 만들어 플레이어의 돈을 저장하고 /돈 명령어를 입력했을 때, 잔액이 표시되고, 마우스 우클릭을 했을 때, 수표가 사용되어 유저의 통장으로 들어가는 기능을 만들어보겠습니다.