ItemLocker #001
# 목표 기능
: 아이템을 일종의 비밀번호화하여 잠금 설정 혹은 해금 시도할 수 있는 메뉴
# 구현 방식
- 리소스: 포토샵 제작(Hopper 재활용)
- Menu, 커스텀 슬롯: 최대 스택이 1, 올릴 수 없는 기타 아이템(인챈트 된 아이템 등)을 구별.
# 해결한 문제
- BlockEntityRender 문제
> 문제 상황: Block이 BlockEntity를 가지면서 Render가 안되었던 상태.
> 조건: 기존 BlockEntity의 외형을 가져올 것, 추가적인 커스텀 Renderer는 구현하지 않음
> 해결
@Mod.EventBusSubscriber(modid = MODID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT)
public static class ClientModEvents{
// @SubscribeEvent
// public static void onClientSetup(FMLClientSetupEvent event){
// event.enqueueWork(() -> MenuScreens.register(ITEMLOCK_SET_MENU.get(), ItemLockSetScreen::new));
// LOGGER.debug("ITEMLOCKER, ClientSetUp Complete");
// }
@SubscribeEvent
public static void RegisterRenderers(RegisterRenderers event){
event.registerBlockEntityRenderer(ItemLocker.ITMELOCK_CHEST_BLOCKENTITY.get(), ChestRenderer::new);
LOGGER.debug("ITEMLOCKER, RegisterRenderers Complete");
}
// 이 이벤트를 통해 기존의 BlockEntity의 외형을 그대로 가져올 수 있었음.
}
- Menu의 Container 문제
> 문제 상황: ProccupationWar#002의 영상에서 메뉴를 열 때마다 슬롯의 내용이 없어짐.
> 조건: 창을 닫았을 때와 같은 Container의 내용을 가져올 것
> 해결
1. BlockEntity에서 Container를 saveAddtional & loadAdditional을 통해 CompoundTag에 저장 및 로드
// BlockEntity를 상속 받은 클래스에서
@Override
protected void loadAdditional(CompoundTag p_331054_, Provider p_334909_) {
super.loadAdditional(p_331054_, p_334909_);
this.passwords = NonNullList.withSize(5, ItemStack.EMPTY);
PasswordHelper.loadAllPasswords(p_331054_, passwords, p_334909_);
}
@Override
protected void saveAdditional(CompoundTag p_187489_, Provider p_328166_) {
super.saveAdditional(p_187489_, p_328166_);
PasswordHelper.saveAllPasswords(p_187489_,passwords,p_328166_);
}
2. Menu를 생성할 때, Container 전달
ItemLockSetMenu(p_59082_, p_59083_,this);
// 여기서 this는 BlockEntity를 상속한 클래스
* 주의, Menu에서는 매 순간 새로 생성하는 것과 다를바가 없으니, 저장할 내용이 있다면 BlockEntity 클래스를 상속받은 클래스에 CompoundTag로 저장.
# 추가 구현 연계
- Entity or Menu, 주인에 따른 다른 기능 구현
- Menu, 잠금 상태를 확인할 수 있는 DataSlot 추가
- Screen, DataSlot 표기, 다양한 기능을 하는 확인 버튼 추가
- 큰 상자로 변모했을 때, BlockEntity 동기화