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è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 Fractionnement | baseItem.setCount(1) |
| 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() │ │ (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);
}
}
}