Skip to content

Proteção contra transbordamento de baús grandes

O problema do estouro de inteiros

Em Java e no Minecraft, cálculos de inventário utilizam inteiros com sinal de 32 bits (int). O valor máximo que pode ser representado é: $$I_{\max} = 2^{31} - 1 = 2.147.483.647$$

Quando um baú duplo (54 slots) fica repleto de pilhas máximas, a contagem total soma todos os 54 slots.


🧮 Cálculo do limiar de segurança

Se cada um dos 54 slots contiver uma pilha de tamanho $L$: $$\text{Total no baú} = 54 \times L$$

Para garantir que o total não ultrapasse $I_{\max}$: $$54 \times L \le 2.147.483.647$$ $$L \le \frac{2.147.483.647}{54} \approx 39.768.215,68$$

Portanto, o limiar de segurança absoluta é: $$L_{\text{safe}} = 39.768.215$$

Tabela de impacto do transbordamento

Limite de pilha ($L$)Total no baú de 54 slotsEstado do inteiroRisco
128 (Padrão)$6.912$Seguro ($< 2,14\text{B}$)Sem risco
1.000.000$54.000.000$Seguro ($< 2,14\text{B}$)Sem risco
39.768.215$2.147.483.610$Seguro ($< 2,14\text{B}$)Teto máximo recomendado
40.000.000$2.160.000.000$Transbordou! (Muda para $-2.134.967.296$)Itens sumindo / Corrupção

🛠️ Criação rápida em ponto flutuante de dupla precisão

No AbstractContainerMenuMixin, o cálculo de divisão da criação rápida foi reescrito em precisão de 64 bits (double) para evitar valores negativos:

java
@Mixin(AbstractContainerMenu.class)
public class AbstractContainerMenuMixin {
    @Overwrite
    public static int getQuickCraftPlaceCount(int quickCraftSlotsSize, int quickCraftingType, ItemStack itemStack) {
        return switch (quickCraftingType) {
            case 0 -> (int) ((double) itemStack.getCount() / (double) quickCraftSlotsSize);
            case 1 -> 1;
            case 2 -> itemStack.getMaxStackSize();
            default -> itemStack.getCount();
        };
    }
}

Official documentation & web portal for Dasik Igaijinn mods.