---
title: Priorités d'Événements
type: docs
weight: 2
---

Les priorités d'événements contrôlent l'ordre dans lequel les écouteurs sont appelés. C'est important quand plusieurs plugins ou gestionnaires doivent réagir au même événement.

## Valeurs de Priorité

Hytale fournit cinq niveaux de priorité :

| Priorité | Valeur | Description |
|----------|--------|-------------|
| `FIRST` | -21844 | S'exécute en premier, avant tous les autres |
| `EARLY` | -10922 | S'exécute tôt, après FIRST |
| `NORMAL` | 0 | Priorité par défaut |
| `LATE` | 10922 | S'exécute tard, après NORMAL |
| `LAST` | 21844 | S'exécute en dernier, après tous les autres |

{{< callout type="info" >}}
Les valeurs plus basses s'exécutent en premier. Les valeurs sont réparties sur la plage `short` pour permettre des priorités personnalisées entre les niveaux standards.
{{< /callout >}}

## Utiliser EventPriority

### Avec Enum

```java
getEventRegistry().register(
    EventPriority.EARLY,
    PlayerConnectEvent.class,
    event -> {
        // Ceci s'exécute avant les gestionnaires NORMAL
    }
);

getEventRegistry().register(
    EventPriority.LATE,
    PlayerConnectEvent.class,
    event -> {
        // Ceci s'exécute après les gestionnaires NORMAL
    }
);
```

### Avec Valeur Personnalisée

```java
// Utiliser une valeur de priorité personnalisée (entre -32768 et 32767)
short customPriority = -5000;  // Entre EARLY et NORMAL

getEventRegistry().register(
    customPriority,
    PlayerConnectEvent.class,
    event -> {
        // Gestionnaire priorité personnalisée
    }
);
```

## Ordre d'Exécution

Quand un événement est déclenché, les gestionnaires sont appelés dans l'ordre de priorité :

```
FIRST (-21844)
   ↓
EARLY (-10922)
   ↓
NORMAL (0)      ← Par défaut
   ↓
LATE (10922)
   ↓
LAST (21844)
```

### Exemple

```java
@Override
public void start() {
    getEventRegistry().register(EventPriority.LAST, PlayerConnectEvent.class, event -> {
        getLogger().at(Level.INFO).log("3. Gestionnaire LAST");
    });

    getEventRegistry().register(EventPriority.FIRST, PlayerConnectEvent.class, event -> {
        getLogger().at(Level.INFO).log("1. Gestionnaire FIRST");
    });

    getEventRegistry().register(PlayerConnectEvent.class, event -> {
        getLogger().at(Level.INFO).log("2. Gestionnaire NORMAL (défaut)");
    });
}

// Sortie quand un joueur rejoint :
// 1. Gestionnaire FIRST
// 2. Gestionnaire NORMAL (défaut)
// 3. Gestionnaire LAST
```

## Quand Utiliser Chaque Priorité

### FIRST

Utiliser pour :
- Configurer les données de l'événement avant les autres gestionnaires
- Logging/débogage qui doit voir l'événement original
- Validation critique qui doit s'exécuter avant tout le reste

```java
getEventRegistry().register(EventPriority.FIRST, PlayerChatEvent.class, event -> {
    // Logger le message original avant tout filtrage
    logChat(event.getSender(), event.getContent());
});
```

### EARLY

Utiliser pour :
- Modifications que les autres plugins devraient voir
- Vérifications de permissions avant les gestionnaires normaux
- Prétraitement des données

```java
getEventRegistry().register(EventPriority.EARLY, PlayerChatEvent.class, event -> {
    // Filtrer les grossièretés avant que les autres plugins traitent le message
    event.setContent(filterProfanity(event.getContent()));
});
```

### NORMAL

Utiliser pour :
- Gestion standard des événements
- La plupart des fonctionnalités de plugin
- Par défaut quand la priorité n'importe pas

```java
getEventRegistry().register(PlayerChatEvent.class, event -> {
    // Traitement standard du chat
    processMessage(event.getSender(), event.getContent());
});
```

### LATE

Utiliser pour :
- Réactions aux modifications faites par d'autres gestionnaires
- Collecte d'analytics/statistiques
- Effets secondaires

```java
getEventRegistry().register(EventPriority.LATE, PlayerChatEvent.class, event -> {
    // Enregistrer le message final après toutes les modifications
    recordChatHistory(event.getSender(), event.getContent());
});
```

### LAST

Utiliser pour :
- Nettoyage final ou overrides
- Surveillance du statut d'annulation
- Logging de l'état final de l'événement

```java
getEventRegistry().register(EventPriority.LAST, PlayerChatEvent.class, event -> {
    if (event.isCancelled()) {
        getLogger().at(Level.INFO).log("Le chat a été annulé par un autre plugin");
    }
});
```

## Avec les Événements Annulables

La priorité est particulièrement importante avec les événements annulables :

```java
// Le gestionnaire FIRST peut annuler
getEventRegistry().register(EventPriority.FIRST, BreakBlockEvent.class, event -> {
    if (isProtectedArea(event.getTargetBlock())) {
        event.setCancelled(true);
    }
});

// Le gestionnaire NORMAL devrait vérifier l'annulation
getEventRegistry().register(BreakBlockEvent.class, event -> {
    if (!event.isCancelled()) {
        // Traiter la destruction du bloc
        trackBlockBreak(event.getTargetBlock(), event.getBlockType());
    }
});

// Le gestionnaire LAST pour la surveillance
getEventRegistry().register(EventPriority.LAST, BreakBlockEvent.class, event -> {
    if (event.isCancelled()) {
        logProtectedBlockAttempt(event.getTargetBlock());
    }
});
```
