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

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

댓글