This commit is contained in:
2026-01-20 20:33:59 +01:00
commit b16a40e431
583 changed files with 87339 additions and 0 deletions

View File

@@ -0,0 +1,217 @@
---
title: Bases NPC
type: docs
weight: 1
---
Ce guide couvre les fondamentaux de la création et de la configuration des NPCs dans Hytale.
**Package:** `com.hypixel.hytale.server.npc`
## Classe NPCEntity
`NPCEntity` est la classe de base pour tous les personnages non-joueurs. Elle étend la hiérarchie d'entités et fournit des fonctionnalités spécifiques aux NPCs.
```java
public class NPCEntity extends LivingEntity {
// Fonctionnalités NPC de base
private Blackboard blackboard;
private Role role;
private DecisionMaker decisionMaker;
private MotionController motionController;
}
```
### Créer un NPC
Les NPCs sont généralement créés via le système d'assets ou générés programmatiquement :
```java
// Générer un NPC depuis un asset
NPCEntity npc = world.spawnNPC("villager", position);
// Configurer le NPC après génération
npc.setRole(customRole);
npc.getBlackboard().setHomePosition(position);
```
## Assets NPC
Les définitions NPC sont configurées via des fichiers d'assets YAML :
```yaml
# npc/villager.yaml
Type: NPC
Id: villager
DisplayName: "Villageois"
Model: models/characters/villager
Role: roles/villager_role
Stats:
Health: 100
Speed: 3.0
Components:
- Type: NPCBrain
- Type: Interactable
- Type: DialogueCapable
```
### Structure d'Asset
| Propriété | Type | Description |
|-----------|------|-------------|
| `Type` | String | Doit être "NPC" |
| `Id` | String | Identifiant unique |
| `DisplayName` | String | Nom d'affichage |
| `Model` | String | Référence asset modèle |
| `Role` | String | Référence rôle par défaut |
| `Stats` | Object | Statistiques de base |
| `Components` | Array | Configurations de composants |
## Rôles NPC
Les rôles définissent le template comportemental d'un NPC. Ils spécifient quelles instructions, capteurs et actions le NPC peut utiliser.
```yaml
# roles/villager_role.yaml
Type: Role
Id: villager_role
Instructions:
- Wander
- ReactToThreats
- Interact
Sensors:
- Type: VisualSensor
Range: 15.0
- Type: AudioSensor
Range: 10.0
Actions:
- Walk
- Run
- Talk
- Trade
```
### Composants de Rôle
```java
public class Role {
private List<Instruction> instructions;
private List<Sensor> sensors;
private List<Action> availableActions;
// Obtenir l'instruction active
public Instruction getCurrentInstruction();
// Vérifier si une action est disponible
public boolean hasAction(String actionId);
}
```
## Systèmes NPC
Le module NPC enregistre plusieurs systèmes ECS pour traiter le comportement des NPCs :
| Système | Description |
|---------|-------------|
| `NPCBrainSystem` | Traite les décisions IA |
| `NPCMovementSystem` | Gère les mises à jour de mouvement |
| `NPCSensorSystem` | Traite les entrées des capteurs |
| `NPCAnimationSystem` | Met à jour les animations |
| `NPCInteractionSystem` | Gère les interactions |
### Enregistrement des Systèmes
```java
public class NPCPlugin extends JavaPlugin {
@Override
public void start() {
// Les systèmes sont auto-enregistrés par NPCPlugin
// Des systèmes personnalisés peuvent être ajoutés :
getEntityStoreRegistry().registerSystem(
new CustomNPCSystem()
);
}
}
```
## Utilitaires NPC
Le package `util/` fournit des classes d'aide :
### NPCUtils
```java
// Trouver le NPC le plus proche
NPCEntity nearest = NPCUtils.findNearest(position, world, 50.0);
// Obtenir tous les NPCs dans une zone
List<NPCEntity> npcsInArea = NPCUtils.getNPCsInRadius(
position, world, 25.0
);
// Vérifier la ligne de vue
boolean canSee = NPCUtils.hasLineOfSight(npc, target);
```
### NPCSpawner
```java
// Générer avec configuration
NPCEntity npc = NPCSpawner.spawn(
world,
"villager",
position,
config -> {
config.setRole("merchant");
config.setFaction("town");
}
);
```
## Patterns Courants
### Configurer une Boutique NPC
```java
NPCEntity merchant = world.spawnNPC("merchant", shopPosition);
merchant.getBlackboard().set("shop_inventory", inventory);
merchant.getBlackboard().set("is_merchant", true);
merchant.setRole(merchantRole);
```
### Créer un NPC Garde
```java
NPCEntity guard = world.spawnNPC("guard", guardPosition);
Blackboard bb = guard.getBlackboard();
bb.setPatrolPath(patrolWaypoints);
bb.setHostileToFactions(List.of("bandits", "monsters"));
guard.setRole(guardRole);
```
### NPC avec Comportement Personnalisé
```java
NPCEntity custom = world.spawnNPC("custom_npc", position);
// Ajouter un composant personnalisé
custom.getEntityStore().addComponent(new CustomBehaviorComponent());
// Définir un decision maker personnalisé
custom.setDecisionMaker(new CustomDecisionMaker());
```
## Bonnes Pratiques
{{< callout type="info" >}}
**Directives NPC :**
- Définissez toujours un Rôle pour les NPCs pour définir leur comportement
- Utilisez le Blackboard pour tout stockage d'état NPC
- Configurez les capteurs appropriés pour les besoins de perception du NPC
- Utilisez le système d'assets pour les définitions NPC quand possible
- Considérez les performances avec un grand nombre de NPCs
{{< /callout >}}
{{< callout type="warning" >}}
**Thread Safety :** Les opérations NPC doivent être effectuées sur le thread de tick du monde. Utilisez `world.isInThread()` pour vérifier avant de faire des changements.
{{< /callout >}}