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,202 @@
---
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<EntityStore> store,
Ref<EntityStore> 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<EntityStore> store) {
// Obtenir la position de spawn depuis la configuration
Vector3i spawnPosition = getAsset().getWorldLocationProvider()
.runCondition(world, objectivePosition);
// Faire apparaitre le NPC bounty
Pair<Ref<EntityStore>, 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<EntityStore> store, Ref<EntityStore> 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<EntityStore, KillTrackerResource> 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);
```