Ramassage Intelligent & Distribution d'Inventaire (MC 26.2)
Ce document détaille l'insertion en lot unique dans l'inventaire, simulation de capacité, création de piles vanilla et architecture sans pollution NBT dans Item Clumps pour Minecraft 26.2.
📊 Fiche Technique de Fonctionnalité
| Propriété | Spécification |
|---|---|
| Nom du Système | Distributeur Intelligent d'Inventaire en Lot |
| Classe Cible | net.minecraft.world.entity.item.ItemEntity |
| Limites d'Inventaire | Conformité stricte à Vanilla ($64\text{ pour items normaux}$, $16\text{ pour perles/œufs}$) |
| Pureté des Données | $100%\text{ ItemStacks Vanilla Purs}$ (Zéro NBT, tags ou composants custom) |
| Animation de Ramassage | Animation native player.take(this, added) & effets sonores |
| Suivi Statistique | Déclenche l'événement vanilla Stats.ITEM_PICKED_UP.get(item) |
| Ramassage Partiel | Entièrement supporté (laisse les items restants au sol) |
🎒 Cycle de Vie du Ramassage Intelligent
Une exigence de conception clé d'Item Clumps est la Zéro Pollution d'Inventaire. Même si une entité au sol peut contenir $9,999$ items, les limites de pile d'inventaire du joueur ne sont jamais modifiées ni augmentées.
┌──────────────────────────────────────────────┐
│ 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 │
└─────────────────────────┘ └─────────────────────────┘🛡️ Garantie Zéro Pollution NBT
Les items au sol affichent une étiquette personnalisée (ex. Pierre x500) pour indiquer la quantité. Cependant, dès qu'ils entrent dans l'inventaire :
- Étiquettes Supprimées : L'étiquette de nom appartient exclusivement à l'
ItemEntity, jamais à l'ItemStackinterne. - Empilement Vanilla : Comme l'
ItemStackne possède aucun composant personnalisé, il s'empile naturellement dans les coffres, boîtes de shulker et établis. - Aucune Donnée Fantôme : Les sauvegardes du monde restent 100 % propres et exemptes de corruption, même si le mod est désinstallé plus tard.
💻 Implémentation du Code Source Java Réel
Depuis ItemEntityMixin.java dans 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
}
}