Skip to content

Intégration des Entonnoirs & Automatisation (MC 26.2) ​

Ce document détaille les mécaniques d'extraction des entonnoirs, parité de taux de transfert, stabilité des trieurs redstone et intégration avec les conteneurs dans Item Clumps pour Minecraft 26.2.


📊 Fiche Technique de Fonctionnalité ​

PropriétéSpécification
Nom du SystèmeMoteur d'Extraction au Goutte-à-Goutte des Entonnoirs
Classe Ciblenet.minecraft.world.level.block.entity.HopperBlockEntity
Méthode d'ExtractionHopperBlockEntity.addItem(Container, ItemEntity)
Taux d'Extraction$1\text{ item tous les } 8\text{ ticks}$ ($2.5\text{ items/seconde}$)
Stratégie de RéductionoriginalStack.shrink(1) avec rafraîchissement des métadonnées via entity.setItem()
Compatibilité d'Automatisation100 % compatible avec les trieurs et filtres redstone vanilla

⚙️ Architecture d'Extraction au Goutte-à-Goutte ​

En vanilla, les entonnoirs absorbent l'entité ItemEntity entière si sa taille est $\le 64$ et qu'il y a de la place. Si un entonnoir absorbait un amas de $5,000$ items d'un coup, il déborderait instantanément ou supprimerait des milliers d'items.

Item Clumps intercepte HopperBlockEntity.addItem pour appliquer l'Extraction au Goutte-à-Goutte :

                       ┌────────────────────────────┐
                       │     Hopper Tick Cycle      │
                       │     (Every 8 Game Ticks)   │
                       └─────────────┬──────────────┘
                                     │
                                     ▼
                       ┌────────────────────────────┐
                       │  Is Item Entity Count > 1? │
                       └─────────────┬──────────────┘
                                     │
                    ┌────────────────┴────────────────┐
                    │ (Yes)                           │ (No)
                    ▼                                 ▼
      ┌───────────────────────────┐     ┌───────────────────────────┐
      │ Clone Single Item Slice   │     │ Native Vanilla Extraction │
      │  baseItem = stack.copy(1) │     │ (Standard 1-item / stack) │
      └─────────────┬─────────────┘     └───────────────────────────┘
                    │
                    ▼
      ┌───────────────────────────┐
      │  Try Insert Into Hopper   │
      │ HopperBlockEntity.addItem │
      └─────────────┬─────────────┘
                    │
           ┌────────┴────────┐
           │                 │
      (Success)           (Failed / Full)
           │                 │
           ▼                 ▼
 ┌───────────────────┐ ┌───────────────┐
 │ Shrink Ground     │ │ Abort Transfer│
 │ Clump by 1;       │ │ Entity Retains│
 │ Refresh Name Tag. │ │ Full Count.   │
 └───────────────────┘ └───────────────┘

⏱️ Taux de Transfert & Parité avec les Trieurs Redstone ​

Les entonnoirs dans Minecraft Vanilla fonctionnent avec un temps de recharge de 8 ticks ($0.4\text{ seconde}$) :

$$\text{Hopper Transfer Rate} = \frac{1\text{ item}{8\text{ ticks} = \frac{20\text{ ticks/s}{8\text{ ticks} = 2.5\text{ items/second}$$

Parce qu'Item Clumps extrait précisément $1\text{ item}$ par cycle :

  • Trieurs d'Items Standards : Les entonnoirs de filtrage (configurés en 41-1-1-1-1) vident les amas à la cadence exacte prévue sans perturber les comparateurs ni les fils redstone voisins.
  • Trieurs à Courant d'Eau : Les gros amas flottant au-dessus d'entonnoirs sont progressivement vidés sans bloquer le flux d'eau ni multiplier les collisions.
  • Wagonnet avec Entonnoir : Récupère les items deux fois plus vite qu'un entonnoir classique ($1\text{ item par } 1\text{ tick} = 20\text{ items/s}$), en totale conformité avec le comportement vanilla.

💻 Implémentation du Code Source Java Réel ​

Depuis HopperBlockEntityMixin.java dans Minecraft 26.2 :

java
@Inject(method = "addItem(Lnet/minecraft/world/Container;Lnet/minecraft/world/entity/item/ItemEntity;)Z", at = @At("HEAD"), cancellable = true)
private static void item_clumps$customHopperExtract(Container container, ItemEntity entity, CallbackInfoReturnable<Boolean> cir) {
    ItemStack itemStack = entity.getItem();
    int count = itemStack.getCount();
    if (count > 1) {
        // Entity is a clump. Extract exactly 1 item slice.
        ItemStack baseItem = itemStack.copyWithCount(1);
        
        ItemStack result = HopperBlockEntity.addItem(null, container, baseItem, null);
        if (result.isEmpty()) {
            // Hopper successfully absorbed the 1 item. Shrink entity stack.
            ItemStack originalStack = entity.getItem().copy();
            originalStack.shrink(1);
            entity.setItem(originalStack); // Updates standard item tracker and custom name
            cir.setReturnValue(true);
        } else {
            // Hopper was full or couldn't accept item
            cir.setReturnValue(false);
        }
    }
}

🔗 Documentation Associée (MC 26.2) ​

Official documentation & web portal for Dasik Igaijinn mods.