Skip to content

Intégration des Entonnoirs & Automatisation (MC 26.1.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.1.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 FractionnementbaseItem.setCount(1)
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()  │     │ (Standard 1-item / stack) │
      │  baseItem.setCount(1)     │     └───────────────────────────┘
      └─────────────┬─────────────┘


      ┌───────────────────────────┐
      │  Try Insert Into Hopper   │
      │ HopperBlockEntity.addItem │
      └─────────────┬─────────────┘

           ┌────────┴────────┐
           │                 │
      (Success)           (Failed / Full)
           │                 │
           ▼                 ▼
 ┌───────────────────┐ ┌───────────────┐
 │ Shrink Ground     │ │ Abort Transfer│
 │ Clump by 1;       │ │ Entity Retains│
 │ Refresh Name Tag. │ │ Full Count.   │
 └───────────────────┘ └───────────────┘

💻 Implémentation du Code Source Java Réel

Depuis HopperBlockEntityMixin.java dans Minecraft 26.1.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.
        ItemStack baseItem = itemStack.copy();
        baseItem.setCount(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();
            originalStack.shrink(1);
            entity.setItem(originalStack); // Updates standard item tracker and custom name
            cir.setReturnValue(true);
        } else {
            // Hopper was full or couldn't take it
            cir.setReturnValue(false);
        }
    }
}

🔗 Documentation Associée (MC 26.1.2)

Official documentation & web portal for Dasik Igaijinn mods.