Files
Documentation/content/world/entities/npc/npc-components.en.md
2026-01-20 20:33:59 +01:00

349 lines
7.2 KiB
Markdown

---
title: NPC Components
type: docs
weight: 2
---
NPC components are ECS components that store data and state for NPCs. The system includes over 300 core components for various NPC functionalities.
**Package:** `com.hypixel.hytale.server.npc.corecomponents`
## Core Components Overview
NPC components follow the ECS pattern where components are pure data containers attached to entity stores.
```java
// Access NPC components
EntityStore store = npc.getEntityStore();
NPCBrainComponent brain = store.getComponent(NPCBrainComponent.class);
```
## Brain Components
### NPCBrainComponent
The main AI processing component:
```java
public class NPCBrainComponent {
private DecisionMaker decisionMaker;
private float thinkInterval;
private float lastThinkTime;
public void setDecisionMaker(DecisionMaker maker);
public DecisionMaker getDecisionMaker();
public boolean shouldThink(float currentTime);
}
```
### NPCMemoryComponent
Stores NPC memories and knowledge:
```java
public class NPCMemoryComponent {
private Map<String, Memory> memories;
private float memoryDuration;
public void remember(String key, Object value, float duration);
public <T> T recall(String key, Class<T> type);
public boolean hasMemory(String key);
public void forget(String key);
}
```
## State Components
### NPCStateComponent
Current behavioral state:
```java
public class NPCStateComponent {
private NPCState currentState;
private NPCState previousState;
private float stateEnterTime;
public enum NPCState {
IDLE,
WALKING,
RUNNING,
ATTACKING,
FLEEING,
INTERACTING,
SLEEPING,
DEAD
}
}
```
### NPCAlertComponent
Alertness and awareness level:
```java
public class NPCAlertComponent {
private AlertLevel alertLevel;
private float alertDecayRate;
private Entity alertSource;
public enum AlertLevel {
RELAXED, // Normal state
CURIOUS, // Something caught attention
ALERT, // Actively investigating
ALARMED, // Threat detected
COMBAT // In combat
}
}
```
## Target Components
### NPCTargetComponent
Current target tracking:
```java
public class NPCTargetComponent {
private Ref<EntityStore> currentTarget;
private TargetType targetType;
private float targetAcquiredTime;
private Vector3d lastKnownPosition;
public enum TargetType {
HOSTILE,
FRIENDLY,
NEUTRAL,
OBJECT
}
}
```
### NPCFocusComponent
Visual focus point:
```java
public class NPCFocusComponent {
private Vector3d focusPoint;
private Ref<EntityStore> focusEntity;
private float focusStrength;
private boolean shouldLookAt;
}
```
## Movement Components
### NPCMovementComponent
Movement configuration:
```java
public class NPCMovementComponent {
private float walkSpeed;
private float runSpeed;
private float turnSpeed;
private boolean canJump;
private boolean canSwim;
private boolean canClimb;
}
```
### NPCPathComponent
Path following data:
```java
public class NPCPathComponent {
private List<Vector3d> currentPath;
private int currentWaypointIndex;
private float pathRecalculateInterval;
private float lastPathTime;
public Vector3d getCurrentWaypoint();
public Vector3d getNextWaypoint();
public boolean hasReachedWaypoint(Vector3d position, float threshold);
}
```
### NPCNavigationComponent
Navigation settings:
```java
public class NPCNavigationComponent {
private float avoidanceRadius;
private float pathfindingRange;
private int maxPathLength;
private NavigationFlags flags;
public static class NavigationFlags {
public boolean avoidWater;
public boolean avoidFire;
public boolean canUseDoors;
public boolean canBreakBlocks;
}
}
```
## Combat Components
### NPCCombatComponent
Combat capabilities:
```java
public class NPCCombatComponent {
private float attackRange;
private float attackCooldown;
private float lastAttackTime;
private DamageType preferredDamageType;
private List<String> availableAttacks;
}
```
### NPCAggroComponent
Aggression management:
```java
public class NPCAggroComponent {
private Map<Ref<EntityStore>, Float> aggroTable;
private float aggroDecayRate;
private float aggroRange;
public void addAggro(Ref<EntityStore> entity, float amount);
public void removeAggro(Ref<EntityStore> entity);
public Ref<EntityStore> getHighestAggroTarget();
}
```
## Social Components
### NPCFactionComponent
Faction affiliation:
```java
public class NPCFactionComponent {
private String factionId;
private Map<String, FactionRelation> relations;
public enum FactionRelation {
ALLIED,
FRIENDLY,
NEUTRAL,
UNFRIENDLY,
HOSTILE
}
public FactionRelation getRelation(String otherFaction);
}
```
### NPCDialogueComponent
Dialogue capabilities:
```java
public class NPCDialogueComponent {
private String dialogueTreeId;
private Map<String, Boolean> dialogueFlags;
private Ref<EntityStore> currentSpeaker;
public boolean hasDialogue();
public void startDialogue(Player player);
}
```
## Utility Components
### NPCScheduleComponent
Daily schedule:
```java
public class NPCScheduleComponent {
private Map<Integer, ScheduleEntry> schedule;
public static class ScheduleEntry {
public int startHour;
public int endHour;
public String activity;
public Vector3d location;
}
public ScheduleEntry getCurrentActivity(int worldHour);
}
```
### NPCInventoryComponent
NPC inventory:
```java
public class NPCInventoryComponent {
private ItemContainer inventory;
private ItemStack equippedWeapon;
private ItemStack equippedArmor;
public ItemStack getEquippedWeapon();
public void equipItem(ItemStack item);
}
```
## Registering Custom Components
```java
public class MyPlugin extends JavaPlugin {
@Override
public void start() {
// Register custom NPC component
getEntityStoreRegistry().registerComponent(
"custom_npc_data",
CustomNPCComponent.class,
CustomNPCComponent::new
);
}
}
public class CustomNPCComponent {
private String customData;
private int customValue;
// Component data fields
}
```
## Component Access Patterns
```java
// Safe component access
public void processNPC(NPCEntity npc) {
EntityStore store = npc.getEntityStore();
// Check if component exists
if (store.hasComponent(NPCCombatComponent.class)) {
NPCCombatComponent combat = store.getComponent(NPCCombatComponent.class);
// Process combat logic
}
// Get or create component
NPCStateComponent state = store.getOrCreateComponent(
NPCStateComponent.class,
NPCStateComponent::new
);
}
```
## Best Practices
{{< callout type="info" >}}
**Component Guidelines:**
- Components should be pure data - no complex logic
- Use components for state that needs to persist
- Access components through EntityStore, not directly
- Check component existence before access
- Use appropriate component for each type of data
{{< /callout >}}