Skip to content

Pengambilan Cerdas & Distribusi Inventaris (MC 26.2)

Dokumen ini menjelaskan pengambilan inventaris sekaligus dalam satu batch, simulasi kapasitas, pembuatan tumpukan vanilla, dan arsitektur nol polusi NBT dari Item Clumps untuk Minecraft 26.2.


📊 Kotak Info Fitur

PropertiSpesifikasi
Nama SistemPembagi Inventaris Batch Cerdas
Kelas Targetnet.minecraft.world.entity.item.ItemEntity
Batas InventarisKepatuhan ketat standar vanilla (64 untuk item normal, 16 untuk mutiara/telur)
Kebersihan Data100% ItemStack Vanilla Murni (Nol NBT, tag, atau komponen kustom)
Animasi PengambilanAnimasi entitas & efek suara asli player.take(this, added)
Pelacakan StatistikMemicu statistik vanilla Stats.ITEM_PICKED_UP.get(item)
Pengambilan ParsialDidukung penuh (Menyisakan sisa item yang belum terambil di tanah)

🎒 Siklus Hidup Pengambilan Cerdas

Persyaratan desain krusial Item Clumps adalah Nol Polusi Inventaris. Meskipun sebuah entitas di tanah dapat menampung 9.999 item, batas tumpukan inventaris pemain tidak pernah diubah atau diperluas.

                ┌──────────────────────────────────────────────┐
                │ 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   │
        └─────────────────────────┘         └─────────────────────────┘

🛡️ Jaminan Nol Polusi NBT

Item di tanah menampilkan name tag kustom (misal: Batu x500) untuk menunjukkan jumlahnya kepada pemain. Namun saat item tersebut masuk ke inventaris pemain:

  1. Name Tag Dihapus: Name tag kustom hanya melekat pada ItemEntity, bukan pada ItemStack di dalamnya.
  2. Penumpukan Vanilla: Karena ItemStack yang masuk ke inventaris tidak memiliki komponen kustom, ia dapat ditumpuk secara mulus dengan item yang ada di peti, kotak shulker, dan meja pembuatan.
  3. Tidak Ada Data Hantu: Berkas penyimpanan dunia tetap 100% bersih dan tidak rusak, bahkan jika mod nantinya dihapus dari server.

💻 Implementasi Kode Sumber Java Asli

Dari ItemEntityMixin.java di Minecraft 26.2:

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
    }
}

🔗 Dokumentasi Terkait (MC 26.2)

Official documentation & web portal for Dasik Igaijinn mods.