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ème | Moteur d'Extraction au Goutte-à-Goutte des Entonnoirs |
| Classe Cible | net.minecraft.world.level.block.entity.HopperBlockEntity |
| Méthode d'Extraction | HopperBlockEntity.addItem(Container, ItemEntity) |
| Taux d'Extraction | $1\text{ item tous les } 8\text{ ticks}$ ($2.5\text{ items/seconde}$) |
| Stratégie de Réduction | originalStack.shrink(1) avec rafraîchissement des métadonnées via entity.setItem() |
| Compatibilité d'Automatisation | 100 % 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 :
@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);
}
}
}