Skip to content

Modifier les Collisions d'un Bloc (Non-Cubique)

Guide de développement Minecraft Forge 1.20.1 pour Débutants

Bienvenue dans ce guide ! Par défaut, dans Minecraft, lorsque vous créez un nouveau bloc, le jeu lui attribue une boîte de collision cubique standard de la taille d'un bloc complet (1x1x1). Si vous créez un bloc ayant une forme personnalisée (comme une dalle, un meuble, ou une fiole décorative), les joueurs vont flotter au-dessus ou buter contre du vide.

Nous allons voir pas à pas comment corriger cela.


1. Comprendre le concept de VoxelShape

Dans le code de Minecraft, la forme physique et visuelle d'un bloc est définie par un objet appelé VoxelShape (Forme de Voxel). Cet objet représente un volume dans un espace de $16\times16\times16$ unités (ce qui correspond aux pixels d'un bloc standard).

Règle d'or : Les coordonnées d'un bloc vont toujours de 0.0 à 16.0. Un bloc complet commence à (0,0,0) et se termine à (16,16,16).


2. Créer une classe personnalisée pour votre bloc

Pour modifier la forme et la collision, vous devez créer votre propre classe Java qui hérite (extends) de la classe Block de Minecraft. Cela vous permettra de redéfinir le comportement par défaut.

Voici un exemple concret pour un bloc ayant la forme d'une boîte basse (comme un tapis épais ou un socle décoratif qui mesure 16 pixels de large sur 16 pixels de long, mais seulement 6 pixels de haut):

java
package com.monmod.blocks;

import net.minecraft.core.BlockPos;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape;
import net.minecraft.world.phys.shapes.Shapes;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.BlockGetter;

public class MonBlocPersonnalise extends Block {
    
    // 1. On definit la forme géométrique ici (X_min, Y_min, Z_min, X_max, Y_max, Z_max)
    // Note : On divise par 16.0F car Minecraft attend une valeur entre 0.0 et 1.0
    private static final VoxelShape SHAPE = Block.box(0.0D, 0.0D, 0.0D, 16.0D, 6.0D, 16.0D);

    public MonBlocPersonnalise(Properties properties) {
        super(properties);
    }

    // 2. Cette méthode gère la forme visuelle et les lignes de sélection (le contour noir)
    @Override
    public VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) {
        return SHAPE;
    }

    // 3. Cette méthode gère la collision physique (l'endroit où le joueur s'arrête)
    @Override
    public VoxelShape getCollisionShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) {
        return SHAPE;
    }
}

(Tutoriel Minecraft Forge 1.20.1 Les Collisions - Page 1 & 2)


3. Explications du code

  • Block.box(X1, Y1, Z1, X2, Y2, Z2) : C'est la méthode magique. Elle prend les dimensions de votre boîte en pixels réels (0 à 16). Dans notre exemple, la boîte fait toute la largeur/longueur (0 à 16) mais s'arrête à 6 pixels de hauteur.

  • getShape() : Indique au jeu comment dessiner la boîte de sélection quand vous regardez le bloc.

  • getCollisionShape() : Indique au jeu où l'entité (joueur, monstre) va buter. Généralement, on y retourne la même forme que getShape().


4. Cas pratique : Créer une forme complexe (plusieurs boîtes)

Si votre bloc est plus complexe, par exemple une petite table de nuit avec des pieds, une seule boîte ne suffira pas. Vous pouvez combiner plusieurs boîtes à l'aide de Shapes.or():

java
private static final VoxelShape PIED_1 = Block.box(0.0D, 0.0D, 0.0D, 2.0D, 14.0D, 2.0D);
private static final VoxelShape PIED_2 = Block.box(14.0D, 0.0D, 0.0D, 16.0D, 14.0D, 2.0D);
private static final VoxelShape PLATEAU = Block.box(0.0D, 14.0D, 0.0D, 16.0D, 16.0D, 16.0D);

// On fusionne le tout dans une seule forme finale
private static final VoxelShape SHAPE_TABLE = Shapes.or(PIED_1, PIED_2, PLATEAU);

(Tutoriel Minecraft Forge 1.20.1 Les Collisions - Page 2 & 3)


5. Astuce indispensable pour les débutants

Calculer les coordonnées à la main peut rapidement devenir un casse-tête. Pour vous simplifier la vie, utilisez un logiciel communautaire gratuit comme Blockbench.

  1. Créez votre modèle 3D de bloc dans Blockbench.

  2. Utilisez un plugin gratuit intégré nommé Voxel Shape Exporter.

  3. Il vous générera automatiquement la ligne de code Java avec toutes les coordonnées Block.box() prêtes à être copiées-collées dans votre classe !

⚠️ Note concernant les blocs orientables : Si votre bloc peut être posé face au Nord, Sud, Est ou Ouest, il faudra faire pivoter votre VoxelShape en fonction de la propriété FACING du bloc. Pour débuter, commencez par un bloc fixe !