Skip to content

Protection contre le débordement des grands coffres

Le problème du débordement d'entier

En Java et Minecraft, le calcul des quantités utilise des entiers signés de 32 bits (int). La valeur maximale possible est : $$I_{\max} = 2^{31} - 1 = 2,147,483,647$$

Dans un grand coffre (54 emplacements) rempli de piles massives, calculer la somme totale des objets additionne les 54 cases.


🧮 Calcul du seuil de sécurité

Si chaque case du grand coffre contient une pile de taille $L$ : $$\text{Total dans le coffre} = 54 \times L$$

Pour éviter d'excéder $I_{\max}$ : $$54 \times L \le 2,147,483,647$$ $$L \le \frac{2,147,483,647}{54} \approx 39,768,215,68$$

Le seuil de sécurité absolue est donc : $$L_{\text{safe}} = 39,768,215$$

Tableau d'impact des débordements

Limite de pile ($L$)Total coffre 54 slotsStatut de l'entierRisque encouru
128 (Défaut)$6,912$Sécurisé ($< 2,14\text{ Md}$)Aucun risque
1 000 000$54,000,000$Sécurisé ($< 2,14\text{ Md}$)Aucun risque
39 768 215$2,147,483,610$Sécurisé ($< 2,14\text{ Md}$)Plafond maximal recommandé
40 000 000$2,160,000,000$Débordement ! (Devient $-2,134,967,296$)Perte d'objets / Conteneur corrompu

🛠️ Craft rapide en double précision

Dans AbstractContainerMenuMixin, le calcul de division lors du glisser-déposer rapide est converti en calcul flottant 64 bits (double) pour prévenir les nombres négatifs :

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.