반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 마인크래프트모딩
- 사회초년생
- 마인크래프트스크립트
- 마인크래프트
- 1.14.4
- 러시안룰렛게임
- GoogleCloudPlatfor
- 마인크래프트서버
- Vue.js
- Google Analytics api
- 스크립트
- 마크여성서버
- 면접을위한CS전공지식노트
- NativeScript
- 플러그인
- 여성서버
- 자동트윗봇
- CrashReports
- app-release
- 마크모딩
- TickingENtities
- 마크에러
- 마크플러그인
- 청년
- 마크서버
- 닉네임변환
- 공용창고
- 앱 어플리케이션
- 마인크래프트서버설치
- 구글 애널리틱스 api
Archives
- Today
- Total
일상일지
[마인크래프트 모딩] 1. 아이템, 블럭 만들기 본문
반응형
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"
}
결과
반응형
'개발 > 마인크래프트' 카테고리의 다른 글
[마인크래프트 플러그인] 아이템 커스텀 조합 및 화로 플러그인 제작하기 (0) | 2020.09.06 |
---|---|
[마인크래프트] Spigot서버(1.14.4) 설치 및 스크립트 적용 (0) | 2020.09.04 |
[마인크래프트 모딩] 3. 도구 만들기 (2) | 2020.08.21 |
[마인크래프트 모딩] 0. 모드 생성하기, 크리탭 만들기 (0) | 2020.08.21 |
[마인크래프트 모딩] 2. 아이템 커스텀 조합, 음식 만들기 (0) | 2020.08.19 |
Comments