Skip to content

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èmeDistributeur Intelligent d'Inventaire en Lot
Classe Ciblenet.minecraft.world.entity.item.ItemEntity
Limites d'InventaireConformité 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 RamassageAnimation native player.take(this, added) & effets sonores
Suivi StatistiqueDéclenche l'événement vanilla Stats.ITEM_PICKED_UP.get(item)
Ramassage PartielEntiè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 :

  1. Étiquettes Supprimées : L'étiquette de nom appartient exclusivement à l'ItemEntity, jamais à l'ItemStack interne.
  2. Empilement Vanilla : Comme l'ItemStack ne possède aucun composant personnalisé, il s'empile naturellement dans les coffres, boîtes de shulker et établis.
  3. 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
    }
}

🔗 Documentation Associée (MC 26.2) ​

Official documentation & web portal for Dasik Igaijinn mods.