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
| Properti | Spesifikasi |
|---|---|
| Nama Sistem | Pembagi Inventaris Batch Cerdas |
| Kelas Target | net.minecraft.world.entity.item.ItemEntity |
| Batas Inventaris | Kepatuhan ketat standar vanilla (64 untuk item normal, 16 untuk mutiara/telur) |
| Kebersihan Data | 100% ItemStack Vanilla Murni (Nol NBT, tag, atau komponen kustom) |
| Animasi Pengambilan | Animasi entitas & efek suara asli player.take(this, added) |
| Pelacakan Statistik | Memicu statistik vanilla Stats.ITEM_PICKED_UP.get(item) |
| Pengambilan Parsial | Didukung 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:
- Name Tag Dihapus: Name tag kustom hanya melekat pada
ItemEntity, bukan padaItemStackdi dalamnya. - Penumpukan Vanilla: Karena
ItemStackyang masuk ke inventaris tidak memiliki komponen kustom, ia dapat ditumpuk secara mulus dengan item yang ada di peti, kotak shulker, dan meja pembuatan. - 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
}
}