Skip to content

Forge 1.20.1 - L'Encyclopédie Maîtresse des Blocs Normaux

Référence technique absolue : BlockBehaviour.Properties, États de blocs (BlockStates) et Surcharges de Classes

Ce guide rassemble l'intégralité des configurations, propriétés et méthodes disponibles pour concevoir un Bloc (sans entité technique complexe) de A à Z sous Forge 1.20.1.


1. Méthodes Logiques et Comportements (Surcharges de la Classe Block)

Ces fonctions se déclarent directement dans votre classe personnalisée étendant Block pour régir ses interactions avec les joueurs, les entités et l'environnement:

A. Clics, Placement et Cycle de Vie

  • public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) Déclenché lors d'un clic droit sur le bloc. C'est ici que l'on code l'ouverture d'une interface, l'activation manuelle d'une mécanique ou le changement d'état visuel (ex : un levier).

  • public BlockState getStateForPlacement(BlockPlaceContext context) Appelé juste avant la pose du bloc dans le monde. Permet de stocker des états d'orientation (Face, Axe ou Direction) dans le BlockState selon l'angle de regard du joueur (ex : l'orientation d'un piston ou d'un tronc).

  • public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) S'exécute immédiatement après le placement effectif du bloc. Idéal pour déclencher des actions logiques immédiates liées au poseur (comme lier des coordonnées).

  • public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) S'exécute lorsque le bloc est brisé ou remplacé. Attention : Vérifiez toujours que !state.is(newState.getBlock()) pour éviter de déclencher cette logique lors d'un simple changement d'état visuel du même bloc.

B. Redstone et Flux d'Énergie

  • public boolean isSignalSource(BlockState state) Retournez true pour indiquer au moteur que ce bloc est capable d'émettre de la puissance Redstone le long d'un circuit (ex : un bloc de redstone ou un bouton).

  • public int getSignal(BlockState state, BlockGetter level, BlockPos pos, Direction side) Retourne la puissance du signal Redstone faible (valeur de 0 à 15) émise par le bloc sur la face indiquée par le paramètre side.

  • public int getDirectSignal(BlockState state, BlockGetter level, BlockPos pos, Direction side) Retourne la puissance du signal Redstone fort (courant direct traversant les blocs opaques adjacents).

  • public void neighborChanged(BlockState state, Level level, BlockPos pos, Block block, BlockPos fromPos, boolean isMoving) Méthode appelée dès qu'un bloc voisin change d'état ou est brisé. Crucial pour détecter si un fil de redstone vient de s'allumer à côté du bloc afin de mettre à jour son propre état.

C. Physique, Entités et Dommages

  • public void stepOn(Level level, BlockPos pos, BlockState state, Entity entity) S'exécute continuellement lorsqu'une entité marche physiquement sur le bloc (ex : dégâts du bloc de magma, application d'un effet de vitesse ou de poison).

  • public void entityInside(BlockState state, Level level, BlockPos pos, Entity entity) Appelé si une entité intersecte ou pénètre à l'intérieur du bloc. Fonctionne uniquement sur les blocs sans collision ou partiellement transparents (ex : ralentissement dans les toiles d'araignées ou brûlure dans un bloc de feu).

  • public void fallOn(Level level, BlockState state, BlockPos pos, Entity entity, float fallDistance) Intercepte l'atterrissage d'une entité suite à une chute. Permet d'amortir les dégâts (ex : bloc de foin) ou d'augmenter l'impact destructeur sur le terrain.

D. Évolutions Temporelles (Ticks) et Particules

  • public void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) Appelé de manière aléatoire selon le tickrate du serveur (nécessite l'activation de .randomTicks() dans les propriétés). Idéal pour la détérioration, l'oxydation, ou la pousse naturelle.

  • public void animateTick(BlockState state, Level level, BlockPos pos, RandomSource random) Méthode purement client. S'exécute à intervalles réguliers pour faire pop des effets visuels cosmétiques autour du bloc (ex : les étincelles de fumée d'une torche ou les bulles d'un bloc sous l'eau).

⚠️ La Règle d'or des BlockStates : > Un bloc normal est un Singleton (il n'existe qu'une seule instance de votre classe pour tout le jeu). Pour stocker des variations (comme l'orientation d'un bloc ou si une lampe est allumée/éteinte), vous devez déclarer des propriétés (Property) et surcharger la méthode createBlockStateDefinition. N'y stockez jamais de variables de classe !


2. Template de Code : Bloc Directionnel Interactif

Squelette complet d'un bloc possédant une orientation horizontale (façon four/coffre) changeant d'état au clic droit:

java
package com.monmod.common.block;

import net.minecraft.core.Direction;
import net.minecraft.core.BlockPos;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.HorizontalDirectionalBlock;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.BooleanProperty;
import net.minecraft.world.level.block.state.properties.DirectionProperty;
import net.minecraft.world.phys.BlockHitResult;

public class CustomInteractiveBlock extends Block {
    // 1. Déclaration des propriétés d'état
    public static final DirectionProperty FACING = HorizontalDirectionalBlock.FACING;
    public static final BooleanProperty ACTIVATED = BooleanProperty.create("activated");

    public CustomInteractiveBlock(Properties properties) {
        super(properties);
        // État initial par défaut
        this.registerDefaultState(this.stateDefinition.any().setValue(FACING, Direction.NORTH).setValue(ACTIVATED, false));
    }

    // 2. Gestion de l'orientation lors de la pose
    @Override
    public BlockState getStateForPlacement(BlockPlaceContext context) {
        return this.defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite());
    }

    // 3. Action au Clic Droit (Inversion de l'état activé)
    @Override
    public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) {
        if (level.isClientSide) {
            return InteractionResult.sidedSuccess(level.isClientSide());
        }
        
        boolean currentState = state.getValue(ACTIVATED);
        // On applique le nouvel état dans le monde
        level.setBlock(pos, state.setValue(ACTIVATED, !currentState), 3);
        return InteractionResult.CONSUME;
    }

    // 4. Enregistrement obligatoire des propriétés dans le système du bloc
    @Override
    protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
        builder.add(FACING, ACTIVATED);
    }
}