본문 바로가기
Game Dev/MineCraft - Mod

종합 아이템 생성 클래스 생성하기

by [방울] 2014. 12. 14.

 

 

말머리

 

대상 : 포지모드 개발환경 설정이 다 되어있고, 자바 프로그래밍을 어느정도 아시는분들

 

중간중간 패키지명이나 클래스명이 달라지거나, 패키지 구조, 클래스 위치가 달라질 수 있습니다.

구조가 달라서 적용에 문제가 있는부분은 방울크래프트 모드는 오픈소스상태이니 깃헙에서 구조를 확인해보시기 바랍니다.

또, 패키지 생성이나 클래스 생성에 대한 부분은 본인이 판단하여 센스있게 생성해주시기 바랍니다.

설명시 클래스위치는 패키지경로.클래스명 순으로 알려드립니다.

강좌시 몇몇 부분에서는 해당 클래스 소스 전체를 올려드리지만, 대부분의 상황에서는 해당 클래스의 일부 메소드 소스만 예시로 보여드립니다.

 

소스 작성시 일부 료형등에서 빨간 밑줄이 쳐질경우 해당 클래스를 직접 임포트해주시기 바랍니다.

일부 경우에는 임포트문을 알려드리지만, 대부분의 임포트문은 마인크래프트관련 클래스 또는 포지관련 클래스를 임포트하시면 정상작동합니다.

 

궁금한점이 있을경우 궁금한점이 생긴 포스트의 덧글로 질문해주시면 확인 후 바로 답변해드리도록 하겠습니다.

 

 

 

 

 

이번에는 짜잘한 아이템을 편하게 생성하기 위해 종합 아이템 생성 클래스를 만들어볼텐데요~~

먼저 bellcraft.items.ItemSynthesis 를 열어줍니다.

 

ItemSynthesis

 

package bellcraft.items;

import java.util.List;

import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumChatFormatting;
import net.minecraftforge.oredict.OreDictionary;
import bellcraft.core.BellCraft;

public class ItemSynthesis extends Item {
	private final String customUnlocalizedName;
	private final String customName;
	private String itemcategory;
	
	public ItemSynthesis(String itemname, String itemdata, String itemcategory, int stacksize, boolean registerore, CreativeTabs tab)
	{
		super();
		setCreativeTab(BellCraft.tab); // 방울크래프트 탭에 아이템 추가
		customUnlocalizedName = itemname; // 아이템명 받아옴
		customName = itemdata; // 아이템 정보 받아옴
		setMaxStackSize(stacksize); // 최대 스택 사이즈 설정
		this.itemcategory = itemcategory; // 카테고리 저장
		if (registerore) // 오어 딕셔너리 등록이 필요할때
			OreDictionary.registerOre(itemcategory + customUnlocalizedName, this); // 오어 딕셔너리 등록
	}
	
	public ItemSynthesis(String itemname, String itemdata, String itemcategory, int stacksize, boolean registerore) // 메소드 오버로딩
	{
		this(itemname, itemdata, itemcategory, stacksize, registerore, BellCraft.tab);
	}
	
	public ItemSynthesis(String itemname, String itemdata, String itemcategory, int stacksize) // 메소드 오버로딩
	{
		this(itemname, itemdata, itemcategory, stacksize, false, BellCraft.tab);
	}
	
	public ItemSynthesis(String itemname, String itemdata, String itemcategory, boolean registerore) // 메소드 오버로딩
	{
		this(itemname, itemdata, itemcategory, 64, registerore, BellCraft.tab);
	}
	
	public ItemSynthesis(String itemname, String itemdata, String itemcategory) // 메소드 오버로딩
	{
		this(itemname, itemdata, itemcategory, 64, false, BellCraft.tab);
	}
	
	public ItemSynthesis(String itemname, String itemdata) // 메소드 오버로딩
	{
		this(itemname, itemdata, "item", 64, false, BellCraft.tab);
	}
	
	public ItemSynthesis(String itemname) // 메소드 오버로딩
	{
		this(itemname, null, "item", 64, false, BellCraft.tab);
	}
	
	@Override
	public String getUnlocalizedName()
	{
		return BellCraft.MODID + "." + itemcategory + customUnlocalizedName; // 카테고리에 맞게 아이템명 등록
	}
	
	@Override
	public String getUnlocalizedName(ItemStack item) // 메소드 오버로딩
	{
		return BellCraft.MODID + "." + itemcategory + customUnlocalizedName; // 카테고리에 맞게 아이템명 등록
	}
	
	@Override
	public void registerIcons(IIconRegister register)
	{
		this.itemIcon = register.registerIcon(BellCraft.MODID + ":" + itemcategory + customUnlocalizedName); // 카테고리에 맞게 텍스쳐 등록
	}
	
	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Override
	public void addInformation(ItemStack itemStack, EntityPlayer player, List list, boolean par4)
	{
		if (customName != null) // 아이템 정보가 있을경우
			list.add(EnumChatFormatting.AQUA + customName); // 아이템 정보 등록, 앞은 글씨 색
	}
}

 

 

그리고 이제 아이템을 등록시켜줘야겠죠??

 

bellcraft.items.Items 에 들어가서 아래와 같이 아이템을 등록해주시면 됩니다.

 

	public static Item ingotRandom = new ItemSynthesis("Random", "You can get a Random Box.", "ingot", true);
	public static Item dustRandom = new ItemSynthesis("Random", "This random dust.", "dust", true);
	public static Item nuggetRandom = new ItemSynthesis("Random", "This random nugget.", "nugget", true);

		GameRegistry.registerItem(Items.ingotRandom, "ingotRandom");
		GameRegistry.registerItem(Items.dustRandom, "dustRandom");
		GameRegistry.registerItem(Items.nuggetRandom, "nuggetRandom");

 

 

 

등록방식은 기본 방식이 new ItemSynthesis(아이템명, 아이템데이타, 아이템카테고리, 최대스택크기, 오어딕셔너리등록, 크리에이티브탭) 이며, 추가할때마다 전부 하나하나 지정하기 귀찮으므로 메소드 오버로딩을 이용하여 자주쓰이는 기본값을 지정해줬습니다.

아래과 같이 파라메터를 보내주셔도 됩니다.

new ItemSynthesis(아이템명, 아이템데이타, 아이템카테고리, 최대스택크기, 오어딕셔너리등록)

new ItemSynthesis(아이템명, 아이템데이타, 아이템카테고리, 최대스택크기)

new ItemSynthesis(아이템명, 아이템데이타, 아이템카테고리, 오어딕셔너리등록)

new ItemSynthesis(아이템명, 아이템데이타, 아이템카테고리)

new ItemSynthesis(아이템명, 아이템데이타)

new ItemSynthesis(아이템명)

 

기본값은 아이템카테고리는 "item", 최대 스택크기는 64개, 오어딕셔너리등록은 false, 아이템데이타는 null로 지정되어있습니다.

본인이 자주 쓰이는 값에 맞게 메소드 오버로딩된 부분을 수정하시면 됩니다.

 

ItemSynthesis 클래스는 아이템이 특별한 기능을 하지않고(우클릭하면 터진다던지의 행동)그냥 조합에 필요하거나, 광석에서 드롭되는 등, 그냥 아이템 기능이 아닌 아이템 자체가 필요할때 편리하게 사용하실 수 있습니다.

필요할경우, 위 클래스에 간단한 기능을 추가할 수 있으나, 기능이 많은 아이템을 추가하실경우 새로운 클래스를 이용해서 아이템을 등록하시는것을 추천합니다. (유지보수의 편리성)

댓글15

  • 톡톡 2014.12.20 20:48

    이거 텍스쳐팩을 크게 만들수 있나요?
    답글

    • Favicon of https://blog.softbell.net BlogIcon [방울] 2014.12.20 20:51 신고

      텍스쳐를 크게만든다는게 무슨 뜻인가요?
      화질을 좋게하는거라면 텍스쳐의 크기를 크게 그리시면됩니다.
      16*16 & 32*32 & 64*64 형식으로 등록가능합니다.

  • 톡톡 2014.12.20 23:28

    그러니까 손으로 둘때 아이템이 커지는거요
    답글

    • Favicon of https://blog.softbell.net BlogIcon [방울] 2014.12.20 23:33 신고

      3인칭 상태에서 해당 아이템을 들었을때 외부에서 해당 아이템이 커지는걸 말하시는것같은데,
      그건 테크네등의 프로그램을 이용해서 모델링을 하셔야할겁니다.

  • 톡톡 2014.12.20 23:45

    도구를 만들려면 어떻게 해야하나요?
    답글

    • Favicon of https://blog.softbell.net BlogIcon [방울] 2014.12.21 00:08 신고

      Initialization 메서드에

      ToolMaterial material = EnumHelper.addToolMaterial("Test", 100, 100, 100.F, 100.0F, 100);
      ItemSword sword = new ItemSword(material);
      GameRegistry.registerItem(sword,"Sword";);

      위와 같은 방식으로 추가해주시면 됩니다.
      도구매터리얼에 파라메터는 수확레벨, 내구도, 효율, 공격력, 인챈트 능력 순입니다.

      언제가 될지는 모르겠는데 나중에 도구 추가 강좌도 올려볼게요.

  • 톡톡 2014.12.21 00:17

    내구도를 무한으로 설정하려면 어떻게 해야하나요? 자꾸 질문드려 죄송합니다.ㅠ.ㅠ
    답글

    • Favicon of https://blog.softbell.net BlogIcon [방울] 2014.12.21 00:21 신고

      그 부분은 잘 모르겠는데 0으로 설정하면 안되던가요??
      0으로 설정해서 안되면 해당 도구로 공격할때 내구도 소모량을 0으로 변경하면 될듯합니다.
      Forge Javadoc에서 해당 클래스를 확인해보시면 관련 부분이 나와있을것같네요.

  • 톡톡 2014.12.21 00:29

    Initialization메서드가 뭔가요?
    답글

  • 톡톡 2014.12.21 00:37

    public static CreativeTabs tab;
    17 @EventHandler
    18 public void Initialize(FMLInitializationEvent event) //초기화
    19 {
    20 AddLog("Initialize";);
    21 if (Config.enableBellCraft)
    22 {
    23 tab = new CreativeTab();
    24 Registry.register(event);
    25 } else {
    26 AddLog("Bell Craft is disabled";);
    27 }
    28 }
    이중 어디에?ㅠ.ㅠ

    답글

    • Favicon of https://blog.softbell.net BlogIcon [방울] 2014.12.21 00:39 신고

      아아
      Initialize 메서드 순서관계없이 아무데나 추가하시면 됩니다.
      근데 가능하면 레지스트리 클래스에 분류해서 넣어주시는게 유지관리가 편합니다.

  • .윤지만 2017.03.15 12:23

    글을 쭉 봐왔는데 ,

    메소드 관련 api를 어디서 볼 수 있을까요 ?

    답글

    • Favicon of https://blog.softbell.net BlogIcon [방울] 2017.03.15 17:40 신고

      https://mcforge.readthedocs.io/en/latest/

      Minecraft Forge Documentation 페이지에 가시면 확인하실 수 있습니다.

  • .윤지만 2017.03.17 10:04

    아직도 이 모드로 많은 모드들이 만들어지는건가요 ?
    대부분의 모드가 forge 로 만들어진다고 보면 되는건가요 ??

    링크걸어주신 사이트는 API가 상당히 부족해 보이는데 ... 인챈트 관련 기능 메소드도 안보이는거같고 .. 더 정확한 api사이트는 없는건가요 ?
    답글