Files
Documentation/content/gameplay-systems/npc-objectives.fr.md
2026-01-20 20:33:59 +01:00

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);