5.6 KiB
5.6 KiB
title, type, weight
| title | type | weight |
|---|---|---|
| Objectifs NPC | docs | 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:
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:
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
# 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:
ResourceType<EntityStore, KillTrackerResource> type =
NPCObjectivesPlugin.get().getKillTrackerResourceType();
KillTrackerSystem
Systeme ECS qui surveille les morts de NPCs et notifie les taches:
// 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
// Complete une tache quand interaction NPC se produit
NPCPlugin.get().registerCoreComponentType("CompleteTask", BuilderActionCompleteTask::new);
Action StartObjective
// Demarre un objectif depuis dialogue/interaction NPC
NPCPlugin.get().registerCoreComponentType("StartObjective", BuilderActionStartObjective::new);
Sensor HasTask
// 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
boolean hasTask = NPCObjectivesPlugin.hasTask(playerUUID, npcId, "taskId");
Mettre a Jour Completion de Tache
String animationId = NPCObjectivesPlugin.updateTaskCompletion(
store, ref, playerRef, npcId, "taskId"
);
Demarrer Objectif depuis NPC
NPCObjectivesPlugin.startObjective(playerReference, "quest_id", store);
Ordre de Chargement des Assets
Le plugin assure un ordre de chargement correct:
AssetRegistry.getAssetStore(ObjectiveAsset.class).injectLoadsAfter(SpawnMarker.class);
AssetRegistry.getAssetStore(ObjectiveAsset.class).injectLoadsAfter(BeaconNPCSpawn.class);
AssetRegistry.getAssetStore(ObjectiveAsset.class).injectLoadsAfter(NPCGroup.class);