일상일지

[마인크래프트 모딩] 1. 아이템, 블럭 만들기 본문

개발/마인크래프트

[마인크래프트 모딩] 1. 아이템, 블럭 만들기

서호Seoho 2020. 8. 19. 21:23
반응형

1. 아이템 만들기

 

아이템을 보관해둘 클래스 만들기.

package practice.practicemod;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import practice.practicemod.block.BlockSecond;
import practice.practicemod.items.ItemCoin;

public final class Contents {
//아이템을 보관할 클래스
	private Contents() {
		
	}
	
	public static final Item ITEM_FIRST = new Item().setRegistryName("item_first").setUnlocalizedName("item_first").setCreativeTab(CreativeTabs.MISC);
	public static final Item ITEM_COIN = new ItemCoin();
	
}


//setRegistryName : 필수. 소문자만으로 지정.
//setUnlocalizedName : item.***.name으로 표현됨. 아이템의 이름을 지정
//setCreativeTab : 크리모드 어느 탭에 보일지 지정.

 

 

만들어둔 모드 클래스에 아이템 등록(register)

package practice.practicemod;

@Mod(modid = PracticeMod.modId, name = PracticeMod.modName , version = PracticeMod.modVersion)
public class PracticeMod {
	
	public static final String modId = "practicemod";
	public static final String modName = "Practice Mod";
	public static final String modVersion = "1.0";
	public static final String clientProxy = "practice.practicemod.ClientProxy";
	public static final String serverProxy = "practice.practicemod.CommonProxy";
	
	@Instance(value=PracticeMod.modId)
	public static PracticeMod instance;
	public static final TMCreativeTab modtab = new TMCreativeTab();
	
	@SidedProxy(clientSide = PracticeMod.clientProxy, serverSide = PracticeMod.serverProxy)
	public static CommonProxy proxy;
	
	@EventHandler
	public static void preInit(FMLPreInitializationEvent event) {
    //블럭, 아이템 등록, 타일엔티티 등록 등
    
		GameRegistry.register(Contents.ITEM_FIRST);
		GameRegistry.register(Contents.ITEM_COIN);
		//GameRegistry : 아이템, 블럭 등을 게임에 등록 시키는 클래스
	}
	
	@EventHandler
	public static void init(FMLInitializationEvent event) {
		
	}

	@EventHandler
	public static void postInit(FMLPostInitializationEvent event) {
		
	}
	
}

 

 

기능이 들어간 아이템 클래스 만들기.

package practice.practicemod.items;

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.ActionResult;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumHand;
import net.minecraft.world.World;
import practice.practicemod.PracticeMod;

public class ItemCoin extends Item{
//아이템 클래스를 상속받아 아이템임을 지정
	
	public ItemCoin() {
		setUnlocalizedName("item_coin");
		setRegistryName("item_coin");
		setCreativeTab(CreativeTabs.MISC);
	}//생성자
	
	@Override
	public ActionResult<ItemStack> onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand){
    //우클릭 시 실행되는 메소드
    if(!world.isRemote) System.out.println("우우"); //콘솔 로그 출력
		
		return new ActionResult(EnumActionResult.SUCCESS,player.getHeldItem(hand));
	}
	
}

 

 

 

2. 블럭 만들기

 

Contents 클래스 내에 추가

public static final Block BLOCK_FIRST = new Block(Material.WOOD).setRegistryName("block_first").setUnlocalizedName("block_first").setCreativeTab(CreativeTabs.MISC);
public static final Block BLOCK_SECOND = new BlockSecond();

 

모드 클래스 preinit내에 선언하여 등록

GameRegistry.register(Contents.BLOCK_FIRST);
//GameRegistry로 블럭 등록 가능
		
Item itemBlockFirst = new ItemBlock(Contents.BLOCK_FIRST).setRegistryName(Contents.BLOCK_FIRST.getRegistryName());
//우클릭시 블럭을 설치 및 여러 기능 구현 가능. 인스턴스
GameRegistry.register(itemBlockFirst);
//인스턴스도 등록해야 아이템 형태의 블럭 얻기 가능

GameRegistry.register(Contents.BLOCK_SECOND);

Item itemBlockSecond = new ItemBlock(Contents.BLOCK_SECOND).setRegistryName(Contents.BLOCK_SECOND.getRegistryName());
		GameRegistry.register(itemBlockSecond);

 

package practice.practicemod.block;

import javax.annotation.Nullable;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;

public class BlockSecond extends Block {
//블럭 클래스 상속

	public BlockSecond() {
		super(Material.WOOD);
		setRegistryName("block_second");
		setUnlocalizedName("block_second");
		setCreativeTab(CreativeTabs.MISC);
	} //생성자에 블럭의 초기화 과정 입력
	
	@Override
	public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, @Nullable ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ)
    {
    //world : 블럭이 존재하는 월드
    //BlockPos : 클릭된 블럭의 위치
    //IBlockState : 블럭 정보 인스턴스
    //EntityPlayer : 블럭을 클릭한 플레이어의 엔티티
    //EnumHand : 블럭 우클릭한 손의 정보
    //EnumFacing : 클릭된 블럭의 면
    //float : x,y,z좌표
    
        if(!worldIn.isRemote) System.out.println("우우~"); //블럭 클랙 시, 콘솔 로그 출력
        return true; //true를 반환하여 블럭클릭에 관련된 상호작용 처리 중단
    }
}

 

 

3. 모델 등록하기

 

서버 프록시 생성

package practice.practicemod;

import net.minecraft.item.Item;

public class CommonProxy {

	public void registerModel(Item item) {
		
	}
}

 

실제 작동할 클라이언트 프록시

package practice.practicemod;

import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraftforge.client.model.ModelLoader;

public class ClientProxy extends CommonProxy{
	
	@Override
	public void registerModel(Item item) {
		ModelLoader.setCustomModelResourceLocation(item, 0, new ModelResourceLocation(item.getRegistryName(),"inventory"));
        //아이템과 블럭의 모델을 로드하고 관리
        //item : 지정할 아이템
        //int : 아이템의 대미지값
        //ModelResourceLocation : 마인크래프트 json 모델의 위치
	}
}

 

preInit에 프록시의 메소드를 사용하여 모델 지정

proxy.registerModel(Contents.ITEM_FIRST);
proxy.registerModel(Contents.ITEM_COIN);
proxy.registerModel(itemBlockFirst);
proxy.registerModel(itemBlockSecond);

 

 

[MDK 폴더 이름] -> src -> main -> resources -> assets -> [모드 ID] -> models -> item 에 json 파일 생성

{
	"parent":"item/generated", //json모델의 서식 베껴오기
	"textures":{ //무슨 텍스쳐들을 렌더링할 것인가?
		"layer0":"practicemod:items/item_first" //한 개의 텍스처를 그리도록
		}
}

 

 

(도메인):(패스)  =  assets -> (도메인) -> textures -> (패스).png 저장

 

 

assets -> [모드 ID] -> blockstates 에 json파일 생성

{
	"variants":{
	   "normal" : {
	       "model" : "practicemod:block_first"
	   }
	}
}

 

assets -> [모드 ID] -> models -> block 에 json파일 생성

assets -> (도메인) -> textures -> blocks/(패스).png 저장

{
    "parent":"block/cube_all", //모든 면이 한 텍스처로 감싸져 있는 블럭
    "textures":{
        "all":"practicemod:blocks/block_first" //참조할 모델 경로
    }
}

 

블럭의 모델만으로는 아이템 렌더링x. 아이템 버전의 블럭에도 모델을 만들어줌.

인벤토리 안의 블럭과 월드에 설치될 블럭이 다를 필요 없으니 블럭의 모델을 parent로 지정.

아이템과 블럭이 다르게 보이길 원하면 parent를 item/generated로 설정 후, 텍스쳐 넣기

{
    "parent":"practicemod:block/block_first"
}

 

 

 

 

 

결과

 

 

반응형
Comments