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

광물블럭 추가 및 월드에서 광물 자동생성하기

by [방울] 2014. 12. 1.

 

 

 

 

오늘은 광물 추가 및 월드젠을 해봅시다~_~

먼저 bellcraft.blocks 패키지에 BlockOre 클래스를 맹글어줍니다.

앞으로 왠만한 임포트는 직접 해주세요.

빨간 밑줄 쳐진곳 마우스 갖다대면 임포트 추천나오는데, 거기서 나열된 클래스중에 마인크래프트 관련 클래스를 임포트해주시면됩니다.

 

public class BlockOre extends Block {
	
	@SideOnly(Side.CLIENT) // 클라이언트에서만 작동
	private IIcon icon;
	private final String customUnlocalizedName;
	
	public BlockOre(String arg1)
	{
		super(Material.rock); // 돌 재질의 블럭으로 설정
		customUnlocalizedName = arg1; // 블럭 이름 받아옴
		setHardness(4.0F); // 아이템 강도
		setStepSound(Block.soundTypeAnvil); // 설치 및 그 위를 달렸을때 나는소리 설정
		setBlockName("ore" + customUnlocalizedName); // 블럭 이름 설정
		setCreativeTab(BellCraft.tab); // 크리에이티브탭 지정
	}
	
	@Override
	public String getUnlocalizedName()
	{
		return BellCraft.MODID + ".ore" + customUnlocalizedName; // 다들 아시는 아이템 이름 설정 메소드
	}
	
	@Override
	public void registerBlockIcons(IIconRegister register)
	{
		icon = register.registerIcon(BellCraft.MODID + ":ore" + customUnlocalizedName); // 블럭 아이콘 지정 ore[이름].png 형식
	}
	
	@Override
	@SideOnly(Side.CLIENT) // 클라에서만 작동함
	public IIcon getIcon(int side, int meta)
	{
		return icon;
	}
}

 

 

설명은 주석 참고

 

그리고 블럭들을 관리해주는 클래스를 추가해줍니다.

bellcraft.blocks 패키지에 Blocks 클래스

 

public class Blocks {
	public static Block oreRandom;
	
	public static void registerBlocks()
	{
		oreRandom = new BlockOre("Random");
		GameRegistry.registerBlock(oreRandom, "oreRandom");
	}
}

 

Items 클래스와 매우 비슷한 구성.

저런식으로 아이템을 등록시켜주시면 됩니다.

 

그다음 bellcraft.core 패키지에 BellCraft 클래스안에 PreInitialize 메소드에 다음과같은 명령줄을 추가해줍니다.

 

Blocks.registerBlocks(); //블럭 등록

 

 

언어파일은 수정하실 줄 아시죠??

마크실행하셔서 아이템에 마우스 대보시면 이상하게 나오는 글자=바꿀글자

형식으로 하시면 됩니다.

알아두세요!

BellCraft.oreRandom.name=랜덤 광물

이런식으로 하시면 됩니다.

 

텍스쳐는 assets.bellcraft.textures.blocksoreRandom.png로 광물의 한 면의 텍스쳐만 저장해주시면 됩니다.

어짜피 광물은 대부분 모든면이 다 똑같은 블럭인데 힘들게 6면 다 만드실 필요는 없지요.

(광물 외에 다른 의미있는? 블록을 만들기 위해 6면 텍스쳐를 지정해야하는 개발은 다음에 강좌하겠습니다.)

 

 

 

그 다음 광물 자동생성을 위해 광질시 만날 수 있게 해야죠!

bellcraft.world 패키지에 OreGeneration 클래스를 만들어줍니다.

 

public class OreGeneration implements IWorldGenerator {
	
	@Override
	public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider)
	{
		switch(world.provider.dimensionId) // 디멘션 ID 받아옴
		{
		case -1: // 지옥
			break;
		case 0: // 오버월드
			generateOverworld(world, random, chunkX * 16, chunkZ * 16); // 광물 생성
			break;
		case 1: // 엔더드래곤
			break;
		}
	}
	
	private void generateOverworld(World world, Random random, int x, int z)
	{
		for (int i = 0; i < 2; i++) // i 최대값은 광물 젠 확률
		{
			int chunkX = x + random.nextInt(16); // 광물옆에 똑같은 광물이 붙어있을 확률 x축
			int chunkZ = z + random.nextInt(16); // 위와 마찬가지 z축
			int chunkY = random.nextInt(150); // 광물 젠 높이 (Y 150 미만 무작위 자연수)
			
			new WorldGenMinable(Blocks.oreRandom, 50).generate(world, random, chunkX, chunkY, chunkZ);
		}
	}
}

 

 

주석 있으니 (..)

 

그 다음 모드 시작시 오어 제네레이션이 시작되도록 이벤트를 만들었으니 등록시켜줍니다.

bellcraft.core 패키지에 BellCraft 클래스의 Initialize 메소드에 다음 명령줄을 추가시켜줍니다.

 

GameRegistry.registerWorldGenerator(new OreGeneration(), 1); // 광물 제네레이션 이벤트 등록

 

 

음 잘 젠 되네요.

확률은 괜찮은걸지도.

 

 

다음엔 저 랜덤광물을 캐면 바로 랜덤주괴로 뿅! 하고 나오도록 해보겠습니다. (레드스톤처럼)

그 다음 랜덤주괴를 조합해서 랜덤상자를 만드는것도 추가해보도록 합시다.

댓글