Skip to content

스마트 줍기 및 인벤토리 분배 (MC 26.2)

이 문서는 Minecraft 26.2 버전의 Item Clumps에 대한 단일 배치 인벤토리 흡수, 용량 시뮬레이션, 바닐라 스택 생성 및 NBT 무오염 아키텍처에 대해 다룹니다.


📊 기능 정보 상자

속성세부 정보
시스템 이름스마트 일괄 인벤토리 분배기
대상 클래스net.minecraft.world.entity.item.ItemEntity
인벤토리 제한바닐라 기준 완벽 준수 (일반 아이템: $64$, 진주/달걀: $16$)
데이터 순수성$100%$ 순수 바닐라 ItemStack (커스텀 NBT, 태그, 컴포넌트 제로)
줍기 애니메이션바닐라 player.take(this, added) 엔티티 애니메이션 및 사운드 효과
통계 추적바닐라 Stats.ITEM_PICKED_UP.get(item) 정상 작동
부분 줍기완벽 지원 (인벤토리 부족 시 남은 수량은 바닥에 유지)

🎒 스마트 줍기 수명주기

Item Clumps의 핵심 설계 원칙은 인벤토리 오염 제로입니다. 바닥의 엔티티가 9,999개의 아이템을 가질 수 있더라도 플레이어의 인벤토리 스택 한도는 절대 수정되거나 확장되지 않습니다.

                ┌──────────────────────────────────────────────┐
                │ Player Collides with Ground Clump (e.g. 500x)│
                └──────────────────────┬───────────────────────┘


                ┌──────────────────────────────────────────────┐
                │        Pickup Validity & Target Check        │
                │     - pickupDelay == 0?                      │
                │     - target == null || target == player?    │
                └──────────────────────┬───────────────────────┘
                                       │ (Pass)

                ┌──────────────────────────────────────────────┐
                │  Single-Batch Native Inventory Dispatch      │
                │       player.getInventory().add(stack)       │
                └──────────────────────┬───────────────────────┘

                     ┌─────────────────┴─────────────────┐
                     │                                   │
              Inventory Has Space                Inventory Becomes Full
                     │                                   │
                     ▼                                   ▼
        ┌─────────────────────────┐         ┌─────────────────────────┐
        │  Entire Clump Absorbed  │         │     Partial Pickup      │
        │ - 500 items transferred │         │ - e.g. 192 items added  │
        │ - Clump entity removed  │         │ - 308 items remain in   │
        │ - Sound & particles play│         │   ground clump entity   │
        └─────────────────────────┘         └─────────────────────────┘

🛡️ NBT 오염 제로 보장

바닥의 아이템은 수량을 알리기 위해 사용자 정의 이름표(예: 돌 x500)를 표시하지만, 플레이어 인벤토리에 들어갈 때는:

  1. 이름표 자동 제거: 사용자 정의 이름표는 ItemEntity에만 속하며 내부의 ItemStack에는 부착되지 않습니다.
  2. 바닐라 스택 호환: 인벤토리에 들어오는 아이템에 커스텀 컴포넌트가 없으므로 상자, 셜커 상자, 제작대에서 기존 아이템과 완벽하게 겹쳐집니다.
  3. 유령 데이터 없음: 나중에 서버에서 모드를 제거하더라도 월드 저장 파일에 이상 데이터가 남지 않고 100% 깨끗하게 보존됩니다.

💻 실제 Java 소스 코드 구현

Minecraft 26.2의 ItemEntityMixin.java 출처:

java
@Inject(method = "playerTouch", at = @At("HEAD"), cancellable = true)
private void item_clumps$smartPickup(Player player, CallbackInfo ci) {
    if (!DynamicGameRuleManager.getBoolean(this.level(), ItemClumpsFabric.ENABLE_CLUMPING) || 
        this.level().isClientSide()) return;

    int count = this.getItem().getCount();
    if (count <= 1) return; // Allow vanilla to handle normal 1-count items

    if (this.pickupDelay == 0 && (this.target == null || this.target.equals(player.getUUID()))) {
        ItemStack pickupStack = this.getItem().copy();
        int originalCount = count;

        // Native batch addition into player inventory
        player.getInventory().add(pickupStack);
        int added = originalCount - pickupStack.getCount();

        if (added > 0) {
            player.take(this, added);
            player.awardStat(net.minecraft.stats.Stats.ITEM_PICKED_UP.get(pickupStack.getItem()), added);

            ItemStack remainingStack = this.getItem().copyWithCount(pickupStack.getCount());
            this.setItem(remainingStack);

            if (pickupStack.getCount() <= 0) {
                player.onItemPickup((ItemEntity) (Object) this);
            }
        }
        ci.cancel(); // Prevent vanilla pickup interference
    }
}

🔗 관련 문서 (MC 26.2)

Official documentation & web portal for Dasik Igaijinn mods.