Coleta Inteligente e Distribuição no Inventário (MC 26.2)
Este documento detalha a entrada no inventário em lote único, simulação de capacidade, criação de pilhas vanilla e arquitetura com zero poluição de NBT do Item Clumps para Minecraft 26.2.
📊 Ficha Técnica do Recurso
| Propriedade | Especificação |
|---|---|
| Nome do Sistema | Despachante Inteligente de Inventário em Lote |
| Classe Alvo | net.minecraft.world.entity.item.ItemEntity |
| Limites de Inventário | Conformidade rígida com vanilla ($64\text{ para itens comuns}$, $16\text{ para pérolas/ovos}$) |
| Limpeza de Dados | $100%\text{ ItemStacks Vanilla Puros}$ (Zero tags, componentes ou NBT personalizados) |
| Animação de Coleta | Animação de entidade e efeitos sonoros nativos player.take(this, added) |
| Rastreamento de Estatísticas | Dispara o Stats.ITEM_PICKED_UP.get(item) vanilla |
| Coleta Parcial | Totalmente suportada (deixa o restante não coletado no chão) |
🎒 O Ciclo de Vida da Coleta Inteligente
Um requisito essencial de design do Item Clumps é Zero Poluição de Inventário. Mesmo que uma entidade no chão possa conter $9.999$ itens, os limites de pilha do inventário do jogador nunca são alterados ou expandidos.
┌──────────────────────────────────────────────┐
│ 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 │
└─────────────────────────┘ └─────────────────────────┘🛡️ Garantia de Zero Poluição de NBT
Itens no chão exibem uma etiqueta personalizada (ex.: Pedra x500) para comunicar sua quantidade aos jogadores. No entanto, quando esses itens entram no inventário do jogador:
- Etiquetas Removidas: A etiqueta de nome personalizada pertence estritamente ao
ItemEntity, não aoItemStacksubjacente. - Empilhamento Vanilla: Como o
ItemStackque entra no inventário não possui componentes personalizados, ele se empilha normalmente com itens em baús, caixas de shulker e bancadas de trabalho. - Sem Dados Fantasmas: Os salvamentos de mundos permanecem 100% limpos e intactos, mesmo que o mod seja desinstalado posteriormente do servidor.
💻 Implementação do Código-Fonte Java Real
De ItemEntityMixin.java no 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
}
}