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.