---
title: Registres
type: docs
weight: 1
---

Les registres sont au cœur du développement de plugins Hytale. Ils fournissent un moyen d'enregistrer et gérer divers éléments du jeu comme les commandes, événements, entités, et plus.

**Packages:**
- `com.hypixel.hytale.server.core.command.system` (CommandRegistry)
- `com.hypixel.hytale.event` (EventRegistry)
- `com.hypixel.hytale.server.core.plugin.registry` (AssetRegistry, CodecRegistry)

## Registres Disponibles

Votre plugin a accès à ces registres via la classe `PluginBase` :

| Registre | Méthode | Utilité |
|----------|---------|---------|
| CommandRegistry | `getCommandRegistry()` | Enregistrer des commandes serveur |
| EventRegistry | `getEventRegistry()` | Enregistrer des écouteurs d'événements |
| EntityRegistry | `getEntityRegistry()` | Enregistrer des entités personnalisées |
| BlockStateRegistry | `getBlockStateRegistry()` | Enregistrer des états de blocs |
| TaskRegistry | `getTaskRegistry()` | Planifier et gérer des tâches |
| AssetRegistry | `getAssetRegistry()` | Enregistrer des assets personnalisés |
| ClientFeatureRegistry | `getClientFeatureRegistry()` | Enregistrer des fonctionnalités client |
| EntityStoreRegistry | `getEntityStoreRegistry()` | Composants de stockage d'entités |
| ChunkStoreRegistry | `getChunkStoreRegistry()` | Composants de stockage de chunks |

## CommandRegistry

Enregistrez des commandes que les joueurs peuvent exécuter :

```java
@Override
public void start() {
    getCommandRegistry().registerCommand(new MyCommand());
}
```

Voir [Commandes](../../commands) pour la documentation détaillée.

## EventRegistry

Abonnez-vous aux événements du jeu :

```java
import com.hypixel.hytale.event.EventPriority;
import com.hypixel.hytale.server.core.event.events.player.PlayerConnectEvent;
import java.util.logging.Level;

@Override
public void start() {
    // Enregistrement simple
    getEventRegistry().register(PlayerConnectEvent.class, event -> {
        getLogger().at(Level.INFO).log("Joueur connecté : " + event.getPlayerRef().getUsername());
    });

    // Avec priorité
    getEventRegistry().register(
        EventPriority.EARLY,
        PlayerConnectEvent.class,
        this::onPlayerJoin
    );
}
```

Voir [Événements](../../events) pour la documentation détaillée.

## EntityRegistry

Enregistrez des types d'entités personnalisées :

```java
@Override
public void start() {
    getEntityRegistry().register(MyCustomEntity.class, MyCustomEntity::new);
}
```

Voir [Entités](../../entities) pour la documentation détaillée.

## BlockStateRegistry

Enregistrez des états de blocs personnalisés :

```java
@Override
public void start() {
    getBlockStateRegistry().register(myBlockState);
}
```

## TaskRegistry

Suit les tâches async pour le nettoyage lors de l'arrêt du plugin :

{{< callout type="warning" >}}
TaskRegistry n'a PAS de méthodes `runAsync()`, `runSync()`, `runLater()`, ou `runRepeating()`. Utilisez les APIs de concurrence standard de Java.
{{< /callout >}}

```java
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

@Override
public void start() {
    // Opération async
    CompletableFuture<Void> task = CompletableFuture.runAsync(() -> {
        // Travail en arrière-plan
    });
    getTaskRegistry().registerTask(task);

    // Opération différée (3 secondes)
    CompletableFuture.delayedExecutor(3, TimeUnit.SECONDS)
        .execute(() -> {
            getLogger().at(Level.INFO).log("Tâche différée exécutée !");
        });

    // Opération répétitive (toutes les 5 minutes)
    ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
    ScheduledFuture<?> repeating = scheduler.scheduleAtFixedRate(() -> {
        getLogger().at(Level.INFO).log("Tâche répétitive !");
    }, 0, 5, TimeUnit.MINUTES);
    getTaskRegistry().registerTask((ScheduledFuture<Void>) repeating);
}
```

Voir [Tâches](../../tasks) pour la documentation détaillée.

## AssetRegistry

Enregistrez des assets de jeu personnalisés :

```java
@Override
public void start() {
    getAssetRegistry().register(myAsset);
}
```

## CodecRegistry

Pour enregistrer des codecs de sérialisation personnalisés :

```java
getCodecRegistry(MyType.CODEC_MAP).register("my_type", MyType.CODEC);
```

## Nettoyage Automatique

{{< callout type="info" >}}
Tous les enregistrements sont automatiquement nettoyés quand votre plugin est désactivé. Vous n'avez pas besoin de désinscrire manuellement quoi que ce soit dans votre méthode `shutdown()`.
{{< /callout >}}

## Timing des Enregistrements

Enregistrez vos composants dans la méthode `start()`, pas dans `setup()` :

```java
@Override
public void setup() {
    // Configuration uniquement - n'enregistrez pas ici
    withConfig(MyConfig.CODEC);
}

@Override
public void start() {
    // Enregistrez tout ici
    getCommandRegistry().registerCommand(new MyCommand());
    getEventRegistry().register(PlayerConnectEvent.class, this::onJoin);
}
```

Cela garantit que tous les plugins ont terminé leur phase de configuration avant que tout enregistrement ne se produise.
