205 lines
5.0 KiB
Markdown
205 lines
5.0 KiB
Markdown
---
|
|
title: Objectives
|
|
type: docs
|
|
weight: 1
|
|
---
|
|
|
|
The objectives system provides quest mechanics with tasks, completions, and progress tracking.
|
|
|
|
**Package:** `com.hypixel.hytale.builtin.adventure.objectives`
|
|
|
|
## Core Concepts
|
|
|
|
### ObjectiveAsset
|
|
|
|
Objectives are defined as JSON assets loaded from `Objectives/`:
|
|
|
|
```java
|
|
public class ObjectiveAsset {
|
|
protected String id; // Unique identifier
|
|
protected String category; // Quest category
|
|
protected TaskSet[] taskSets; // Sequential task groups
|
|
protected ObjectiveCompletionAsset[] completionHandlers; // Rewards
|
|
protected String objectiveTitleKey; // Localization key for title
|
|
protected String objectiveDescriptionKey; // Localization key for description
|
|
protected boolean removeOnItemDrop; // Remove objective items on drop
|
|
}
|
|
```
|
|
|
|
### TaskSet
|
|
|
|
Each objective contains one or more TaskSets that must be completed sequentially:
|
|
|
|
```java
|
|
public class TaskSet {
|
|
protected String descriptionId; // Optional description key
|
|
protected ObjectiveTaskAsset[] tasks; // Tasks to complete in parallel
|
|
}
|
|
```
|
|
|
|
### Objective Instance
|
|
|
|
When started, an `Objective` instance tracks state:
|
|
|
|
```java
|
|
public class Objective {
|
|
private final UUID uuid; // Unique instance ID
|
|
private final String objectiveId; // Asset ID reference
|
|
private final Set<UUID> playerUUIDs; // Participating players
|
|
private ObjectiveTask[] currentTasks; // Active tasks
|
|
private int taskSetIndex; // Current TaskSet index
|
|
}
|
|
```
|
|
|
|
## Task Types
|
|
|
|
The system provides built-in task types registered by `ObjectivePlugin`:
|
|
|
|
| Type | Class | Description |
|
|
|------|-------|-------------|
|
|
| `Craft` | `CraftObjectiveTask` | Craft specific items |
|
|
| `Gather` | `GatherObjectiveTask` | Collect items in inventory |
|
|
| `UseBlock` | `UseBlockObjectiveTask` | Interact with blocks |
|
|
| `UseEntity` | `UseEntityObjectiveTask` | Interact with entities |
|
|
| `TreasureMap` | `TreasureMapObjectiveTask` | Find treasure locations |
|
|
| `ReachLocation` | `ReachLocationTask` | Reach specific coordinates |
|
|
|
|
### Task Asset Example
|
|
|
|
```yaml
|
|
# Objectives/collect_wood.json
|
|
{
|
|
"Id": "collect_wood",
|
|
"Category": "tutorial",
|
|
"TaskSets": [
|
|
{
|
|
"Tasks": [
|
|
{
|
|
"Type": "Gather",
|
|
"Item": "oak_log",
|
|
"Amount": 10
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"Completions": [
|
|
{
|
|
"Type": "GiveItems",
|
|
"Items": [
|
|
{ "Item": "gold_coin", "Amount": 5 }
|
|
]
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
## Completion Handlers
|
|
|
|
When all TaskSets complete, completion handlers execute:
|
|
|
|
| Type | Class | Description |
|
|
|------|-------|-------------|
|
|
| `GiveItems` | `GiveItemsCompletion` | Give items to player |
|
|
| `ClearObjectiveItems` | `ClearObjectiveItemsCompletion` | Remove objective-related items |
|
|
|
|
## API Usage
|
|
|
|
### Starting Objectives
|
|
|
|
```java
|
|
ObjectivePlugin plugin = ObjectivePlugin.get();
|
|
|
|
// Start objective for player
|
|
plugin.startObjective(player, "collect_wood");
|
|
|
|
// With custom data
|
|
Objective objective = plugin.startObjective(player, "collect_wood", customData);
|
|
```
|
|
|
|
### Tracking Progress
|
|
|
|
```java
|
|
// Get player's active objectives
|
|
ObjectiveHistoryComponent history = store.getComponent(
|
|
playerRef,
|
|
ObjectiveHistoryComponent.getComponentType()
|
|
);
|
|
|
|
// Check objective status
|
|
ObjectiveHistoryData data = history.getObjectiveData("collect_wood");
|
|
if (data != null && data.isCompleted()) {
|
|
// Already completed
|
|
}
|
|
```
|
|
|
|
### Completing Objectives
|
|
|
|
```java
|
|
// Mark objective as complete (triggers completions)
|
|
objective.complete(objectivePlugin);
|
|
|
|
// Cancel objective without rewards
|
|
objective.cancel(objectivePlugin);
|
|
```
|
|
|
|
## Trigger Conditions
|
|
|
|
Objectives can have trigger conditions for activation:
|
|
|
|
```java
|
|
// Weather-based trigger
|
|
public class WeatherTriggerCondition { /* ... */ }
|
|
|
|
// Location-based trigger
|
|
public class ObjectiveLocationTriggerCondition { /* ... */ }
|
|
|
|
// Time-based trigger
|
|
public class HourRangeTriggerCondition { /* ... */ }
|
|
```
|
|
|
|
## Location Markers
|
|
|
|
Use markers to create spatial objectives:
|
|
|
|
```java
|
|
// Define marker area
|
|
public interface ObjectiveLocationMarkerArea {
|
|
boolean isInArea(Vector3d position);
|
|
}
|
|
|
|
// Built-in area types
|
|
public class ObjectiveLocationAreaRadius { /* Spherical area */ }
|
|
public class ObjectiveLocationAreaBox { /* Box area */ }
|
|
```
|
|
|
|
## Commands
|
|
|
|
| Command | Description |
|
|
|---------|-------------|
|
|
| `/objective start <id> [player]` | Start an objective |
|
|
| `/objective complete <id> [player]` | Force complete |
|
|
| `/objective history [player]` | View history |
|
|
| `/objective panel` | Open admin panel |
|
|
|
|
## Events
|
|
|
|
```java
|
|
// Treasure chest opened during objective
|
|
public class TreasureChestOpeningEvent implements IEvent<UUID> {
|
|
public TreasureChestState getChestState();
|
|
public Player getPlayer();
|
|
}
|
|
```
|
|
|
|
## Configuration
|
|
|
|
Assets are loaded from `Objectives/` directory with inheritance support:
|
|
|
|
```yaml
|
|
# Objectives/config.yaml
|
|
ObjectiveGameplayConfig:
|
|
DefaultObjectives:
|
|
- tutorial_quest
|
|
- welcome_message
|
|
```
|