개발자로/MinecraftMod

ItemLocker #001

ReasonyB 2024. 7. 7. 04:54

 

# 목표 기능

: 아이템을 일종의 비밀번호화하여 잠금 설정 혹은 해금 시도할 수 있는 메뉴

 

# 구현 방식

- 리소스: 포토샵 제작(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 동기화