--- 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 instructions; private List sensors; private List 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 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 >}}