---
title: Système d'Interactions
type: docs
weight: 8
---

Le système d'Interactions est le puissant framework de comportements piloté par les données de Hytale. Il définit comment les objets, blocs et entités se comportent lorsqu'ils sont utilisés ou activés.

## Vue d'Ensemble

Les interactions sont principalement configurées via des fichiers d'assets plutôt que du code Java. Elles forment des chaînes d'opérations qui s'exécutent lorsqu'un joueur effectue des actions comme cliquer, attaquer ou utiliser des objets.

{{< cards cols="2" >}}
  {{< card link="interaction-types" title="Types d'Interactions" subtitle="100+ types d'interactions intégrés" icon="lightning-bolt" >}}
  {{< card link="selectors" title="Sélecteurs" subtitle="Cibler entités et blocs" icon="cursor-click" >}}
  {{< card link="combat" title="Combat" subtitle="Calcul de dégâts et knockback" icon="fire" >}}
{{< /cards >}}

## Concepts Clés

### Assets d'Interaction

Les interactions sont des assets chargés depuis les data packs. Les assets sont stockés dans une map indexée - vous devez d'abord obtenir l'index, puis récupérer l'asset :

```java
import com.hypixel.hytale.server.core.modules.interaction.interaction.config.Interaction;
import com.hypixel.hytale.assetstore.map.IndexedLookupTableAssetMap;

// Obtenir la map d'assets
IndexedLookupTableAssetMap<String, Interaction> assetMap = Interaction.getAssetMap();

// Obtenir l'index depuis l'ID string
int index = assetMap.getIndex("my_interaction");

// Obtenir l'interaction par index
Interaction interaction = assetMap.getAsset(index);

// Ou combiné (mais vérifiez null !)
if (index != Integer.MIN_VALUE) {
    Interaction myInteraction = assetMap.getAsset(index);
}
```

{{< callout type="warning" >}}
**Important :** `getAsset()` prend un `int` index, pas un String. Utilisez `getIndex()` d'abord pour convertir l'ID string en index. Retourne `Integer.MIN_VALUE` si non trouvé.
{{< /callout >}}

### Contexte d'Interaction

Quand les interactions s'exécutent, elles reçoivent un `InteractionContext` avec :

- **Référence d'entité** - L'entité effectuant l'interaction
- **Objet tenu** - L'objet utilisé
- **Bloc/entité cible** - Ce qui est ciblé
- **Suivi d'état** - Informations de progression et timing

### États d'Interaction

**Package :** `com.hypixel.hytale.protocol`

```java
public enum InteractionState {
    Finished(0),     // Terminé avec succès
    Skip(1),         // Ignoré par l'utilisateur
    ItemChanged(2),  // Annulé suite à changement d'objet
    Failed(3),       // Échec d'exécution
    NotFinished(4);  // Toujours en cours
}
```

| État | Valeur | Description |
|------|--------|-------------|
| `Finished` | 0 | Interaction terminée avec succès |
| `Skip` | 1 | L'utilisateur a demandé d'ignorer |
| `ItemChanged` | 2 | Annulé car l'objet tenu a changé |
| `Failed` | 3 | L'interaction a échoué |
| `NotFinished` | 4 | Toujours en cours, pas encore terminé |

## Catégories d'Interactions

### Interactions de Blocs

Opérations sur les blocs :

| Interaction | Description |
|-------------|-------------|
| `PlaceBlockInteraction` | Placer un bloc |
| `BreakBlockInteraction` | Casser un bloc |
| `DestroyBlockInteraction` | Détruire sans drops |
| `ChangeBlockInteraction` | Changer le type de bloc |
| `UseBlockInteraction` | Interagir avec un bloc |
| `PlaceFluidInteraction` | Placer un fluide |

### Interactions d'Objets

Opérations avec les objets :

| Interaction | Description |
|-------------|-------------|
| `AddItemInteraction` | Ajouter un objet à l'inventaire |
| `EquipItemInteraction` | Équiper un objet |
| `ModifyInventoryInteraction` | Modifier le contenu de l'inventaire |

### Interactions d'Entités

Opérations sur les entités :

| Interaction | Description |
|-------------|-------------|
| `UseEntityInteraction` | Interagir avec une entité |
| `RemoveEntityInteraction` | Supprimer une entité |
| `ApplyEffectInteraction` | Appliquer un effet de statut |
| `ClearEntityEffectInteraction` | Supprimer les effets |

### Interactions de Combat

Dégâts et combat :

| Interaction | Description |
|-------------|-------------|
| `DamageCalculator` | Calculer les dégâts |
| `DamageEffects` | Appliquer les effets de dégâts |
| `Knockback` | Appliquer le knockback |
| `DirectionalKnockback` | Knockback directionnel |
| `ForceKnockback` | Knockback basé sur la force |

### Interactions UI

Interface utilisateur :

| Interaction | Description |
|-------------|-------------|
| `OpenContainerInteraction` | Ouvrir l'UI de conteneur |
| `OpenPageInteraction` | Ouvrir une page |
| `OpenCustomUIInteraction` | Ouvrir une UI personnalisée |
| `SendMessageInteraction` | Envoyer un message au joueur |

### Interactions de Structures

Modification du monde :

| Interaction | Description |
|-------------|-------------|
| `SpawnPrefabInteraction` | Faire apparaître un prefab/structure |
| `LaunchProjectileInteraction` | Lancer un projectile |

### Flux de Contrôle

Interactions de chaînage et conditions :

| Interaction | Description |
|-------------|-------------|
| `SerialInteraction` | Exécuter les interactions en séquence |
| `ParallelInteraction` | Exécuter les interactions simultanément |
| `SelectInteraction` | Choisir entre les interactions |
| `ConditionInteraction` | Exécution conditionnelle |
| `RepeatInteraction` | Répéter une interaction |
| `CancelChainInteraction` | Annuler la chaîne |

### Interactions de Stats

Statistiques d'entités :

| Interaction | Description |
|-------------|-------------|
| `ChangeStatInteraction` | Modifier une stat |
| `StatsConditionInteraction` | Vérifier les conditions de stats |

## Propriétés d'Interaction

Propriétés communes à toutes les interactions :

```yaml
# Exemple de configuration d'interaction
MyInteraction:
  Type: PlaceBlock
  RunTime: 0.5               # Durée en secondes
  ViewDistance: 96.0          # Distance de visibilité
  HorizontalSpeedMultiplier: 1.0
  CancelOnItemChange: true
  Effects:
    WaitForAnimationToFinish: true
    ItemAnimationId: "swing"
  Rules:
    # Règles d'activation
```

### InteractionEffects

Effets visuels et audio :

- `ItemAnimationId` - Animation à jouer
- `WaitForAnimationToFinish` - Attendre l'animation
- Effets sonores
- Effets de particules

### InteractionRules

Contrôle quand les interactions peuvent s'exécuter :

- Restrictions de mode de jeu
- Exigences d'état
- Vérifications de cooldown

## Sélecteurs

Les sélecteurs déterminent quelles entités ou blocs sont ciblés :

| Sélecteur | Description |
|-----------|-------------|
| `RaycastSelector` | Lancer un rayon depuis la caméra |
| `AOECircleSelector` | Zone d'effet circulaire |
| `AOECylinderSelector` | Zone d'effet cylindrique |
| `StabSelector` | Estoc à courte portée |
| `HorizontalSelector` | Balayage horizontal |

## Accéder aux Interactions

### Depuis les Objets

Les objets définissent leurs interactions dans les fichiers d'assets. À l'exécution :

```java
ItemStack item = player.getInventory().getActiveItem();
Item itemAsset = item.getItem();
// L'objet définit ses interactions primaires/secondaires
```

### Depuis les Blocs

Les blocs définissent les interactions d'utilisation :

```java
BlockType blockType = world.getBlockType(position);
// Le bloc définit son interaction d'utilisation
```

## Bonnes Pratiques

{{< callout type="info" >}}
**Directives d'Interaction :**
- Les interactions sont principalement pilotées par les données via les assets
- Utilisez les types d'interaction existants quand possible
- Chaînez les interactions pour des comportements complexes
- Utilisez les sélecteurs pour cibler de manière appropriée
- Considérez le mode de jeu dans les règles
{{< /callout >}}

{{< callout type="warning" >}}
**Note de Performance :** Les chaînes d'interaction complexes avec de nombreuses opérations parallèles peuvent impacter les performances. Gardez les chaînes efficaces.
{{< /callout >}}

## Lectures Complémentaires

Pour des informations détaillées sur les types d'interaction spécifiques, consultez les sous-pages.
