--- title: Objectifs NPC type: docs weight: 3 --- Le systeme d'objectifs NPC etend le systeme d'objectifs de base avec des taches liees au combat. **Package:** `com.hypixel.hytale.builtin.adventure.npcobjectives` ## Architecture ``` NPCObjectivesPlugin ├── Types de Taches │ ├── KillSpawnBeaconObjectiveTask - Tuer NPCs de spawn beacons │ ├── KillSpawnMarkerObjectiveTask - Tuer NPCs de spawn markers │ ├── BountyObjectiveTask - Chasser des cibles NPC specifiques │ └── KillNPCObjectiveTask - Tuer NPCs par type/groupe ├── Ressources │ └── KillTrackerResource - Suit les compteurs de kills ├── Systemes │ ├── KillTrackerSystem - Surveille les morts de NPCs │ └── SpawnBeaconCheckRemovalSystem - Nettoyage spawn beacons └── Actions NPC ├── BuilderActionCompleteTask - Completer tache sur NPC ├── BuilderActionStartObjective - Demarrer objectif depuis NPC └── BuilderSensorHasTask - Verifier si joueur a une tache ``` ## Types de Taches ### Interface KillTask Toutes les taches basees sur les kills implementent cette interface: ```java public interface KillTask { void checkKilledEntity( Store store, Ref npcRef, Objective objective, NPCEntity npc, Damage damageInfo ); } ``` ### Types de Taches Enregistres | Type | Classe Asset | Description | |------|--------------|-------------| | `KillSpawnBeacon` | `KillSpawnBeaconObjectiveTaskAsset` | Tuer NPCs de beacons | | `KillSpawnMarker` | `KillSpawnMarkerObjectiveTaskAsset` | Tuer NPCs de markers | | `Bounty` | `BountyObjectiveTaskAsset` | Chasser une cible specifique | | `KillNPC` | `KillObjectiveTaskAsset` | Tuer NPCs par groupe | ### Tache Bounty Fait apparaitre un NPC specifique et le marque comme cible de prime: ```java public class BountyObjectiveTask extends ObjectiveTask implements KillTask { boolean completed; UUID entityUuid; // UUID du NPC cible // Fait apparaitre le NPC a la position et ajoute un marqueur carte protected TransactionRecord[] setup0(Objective objective, World world, Store store) { // Obtenir la position de spawn depuis la configuration Vector3i spawnPosition = getAsset().getWorldLocationProvider() .runCondition(world, objectivePosition); // Faire apparaitre le NPC bounty Pair, INonPlayerCharacter> npcPair = NPCPlugin.get().spawnNPC(store, getAsset().getNpcId(), null, spawnPosition, Vector3f.ZERO); // Ajouter marqueur sur la carte addMarker(new MapMarker( getBountyMarkerIDFromUUID(npcUuid), "Bounty Target", "Home.png", transform )); // Enregistrer le tracker de kills store.getResource(KillTrackerResource.getResourceType()).watch(transaction); return transactionRecords; } @Override public void checkKilledEntity(Store store, Ref npcRef, Objective objective, NPCEntity npc, Damage damageInfo) { if (!this.entityUuid.equals(uuid)) return; this.completed = true; this.complete(objective, store); objective.checkTaskSetCompletion(store); this.removeMarker(getBountyMarkerIDFromUUID(uuid)); } } ``` ### Configuration d'Asset ```yaml # Objectives/bounty_quest.json { "Id": "bounty_quest", "TaskSets": [ { "Tasks": [ { "Type": "Bounty", "NpcId": "bandit_leader", "WorldLocationProvider": { "Type": "LocationRadius", "Radius": 50 } } ] } ] } ``` ## Tracker de Kills ### KillTrackerResource Ressource monde qui suit les kills de NPCs: ```java ResourceType type = NPCObjectivesPlugin.get().getKillTrackerResourceType(); ``` ### KillTrackerSystem Systeme ECS qui surveille les morts de NPCs et notifie les taches: ```java // Enregistrer une transaction pour surveiller les kills KillTaskTransaction transaction = new KillTaskTransaction(task, objective, store); store.getResource(KillTrackerResource.getResourceType()).watch(transaction); ``` ## Actions NPC Enregistrees comme types de composants core NPC pour l'integration IA: ### Action CompleteTask ```java // Complete une tache quand interaction NPC se produit NPCPlugin.get().registerCoreComponentType("CompleteTask", BuilderActionCompleteTask::new); ``` ### Action StartObjective ```java // Demarre un objectif depuis dialogue/interaction NPC NPCPlugin.get().registerCoreComponentType("StartObjective", BuilderActionStartObjective::new); ``` ### Sensor HasTask ```java // Sensor qui verifie si le joueur a une tache specifique NPCPlugin.get().registerCoreComponentType("HasTask", BuilderSensorHasTask::new); ``` ## Utilisation de l'API ### Verifier si Joueur a une Tache ```java boolean hasTask = NPCObjectivesPlugin.hasTask(playerUUID, npcId, "taskId"); ``` ### Mettre a Jour Completion de Tache ```java String animationId = NPCObjectivesPlugin.updateTaskCompletion( store, ref, playerRef, npcId, "taskId" ); ``` ### Demarrer Objectif depuis NPC ```java NPCObjectivesPlugin.startObjective(playerReference, "quest_id", store); ``` ## Ordre de Chargement des Assets Le plugin assure un ordre de chargement correct: ```java AssetRegistry.getAssetStore(ObjectiveAsset.class).injectLoadsAfter(SpawnMarker.class); AssetRegistry.getAssetStore(ObjectiveAsset.class).injectLoadsAfter(BeaconNPCSpawn.class); AssetRegistry.getAssetStore(ObjectiveAsset.class).injectLoadsAfter(NPCGroup.class); ```