Flock System
The Flock System manages group behaviors for NPCs, allowing them to move and act together as coordinated units. Flocks provide emergent group behaviors like alignment, cohesion, and separation.
Overview
Section titled “Overview”Located at com.hypixel.hytale.server.flock
The FlockPlugin manages all flock functionality and provides:
- Flock entities - Core flock management
- Flock membership - NPC membership in flocks
- Persistent flock data - Saved flock state
- Flock behaviors - Group movement and coordination
- Flock decision-making - Group-based AI decisions
FlockPlugin
Section titled “FlockPlugin”The FlockPlugin class (com.hypixel.hytale.server.flock.FlockPlugin) serves as the central management point:
public class FlockPlugin extends JavaPlugin { private ComponentType<EntityStore, Flock> flockComponentType; private ComponentType<EntityStore, FlockMembership> flockMembershipComponentType; private ComponentType<EntityStore, PersistentFlockData> persistentFlockDataComponentType;}Features:
- Registers flock components
- Manages flock lifecycle
- Coordinates with NPC and spawning systems
- Handles prefab flock remapping
Flock Entity
Section titled “Flock Entity”Located at com.hypixel.hytale.server.flock.Flock
Flock Component
Section titled “Flock Component”The Flock component represents a group of NPCs:
public class Flock implements Component<EntityStore> { private boolean trace; private PersistentFlockData flockData; private DamageData nextDamageData; private DamageData currentDamageData; private DamageData nextLeaderDamageData; private DamageData currentLeaderDamageData; private FlockRemovedStatus removedStatus;}Flock Properties
Section titled “Flock Properties”Trace Mode
Section titled “Trace Mode”Debug tracing for flock behavior:
flock.setTrace(true); // Enable debug loggingDamage Tracking
Section titled “Damage Tracking”Flocks track damage dealt by the group:
currentDamageData- Damage this ticknextDamageData- Damage next tick (double buffered)currentLeaderDamageData- Leader damage this ticknextLeaderDamageData- Leader damage next tick
Damage data is double-buffered for thread safety:
flock.swapDamageDataBuffers();Flock Status
Section titled “Flock Status”public enum FlockRemovedStatus { NOT_REMOVED, DISSOLVED, UNLOADED}NOT_REMOVED- Active flockDISSOLVED- Flock disbandedUNLOADED- Flock unloaded from world
Getting Flock Component
Section titled “Getting Flock Component”ComponentType<EntityStore, Flock> flockType = Flock.getComponentType();Flock flock = componentAccessor.getComponent(flockRef, flockType);Flock Membership
Section titled “Flock Membership”Located at com.hypixel.hytale.server.flock.FlockMembership
FlockMembership Component
Section titled “FlockMembership Component”NPCs have a FlockMembership component when part of a flock:
public class FlockMembership implements Component<EntityStore> { private Ref<EntityStore> flockRef; private boolean isLeader; private UUID flockId;}Membership Properties
Section titled “Membership Properties”flockRef- Reference to flock entityisLeader- Whether this NPC is the flock leaderflockId- Unique identifier for the flock
Joining a Flock
Section titled “Joining a Flock”NPCs join flocks through the join action:
// From core componentsBuilderActionFlockJoin joinAction = new BuilderActionFlockJoin();Leaving a Flock
Section titled “Leaving a Flock”NPCs leave flocks through:
// From core componentsBuilderActionFlockLeave leaveAction = new BuilderActionFlockLeave();Or automatically when:
- NPC dies (unless
corpseStaysInFlockis true) - NPC is removed
- Flock is dissolved
Getting Membership
Section titled “Getting Membership”ComponentType<EntityStore, FlockMembership> membershipType = FlockMembership.getComponentType();FlockMembership membership = componentAccessor.getComponent(npcRef, membershipType);Persistent Flock Data
Section titled “Persistent Flock Data”Located at com.hypixel.hytale.server.flock.PersistentFlockData
PersistentFlockData Component
Section titled “PersistentFlockData Component”Stores flock data that persists across saves:
public class PersistentFlockData implements Component<EntityStore> { private FlockAsset flockDefinition; private String[] allowedRoles; private int currentSize; private int maxSize;}Flock Configuration
Section titled “Flock Configuration”flockDefinition- Reference to flock assetallowedRoles- Roles allowed to joincurrentSize- Current member countmaxSize- Maximum member count
Stored Flock
Section titled “Stored Flock”Located at com.hypixel.hytale.server.flock.StoredFlock
Used for storing flock data in spawn markers:
public class StoredFlock { private String flockAssetId; private UUID flockId; private int memberCount;}Flock Assets
Section titled “Flock Assets”Located at com.hypixel.hytale.server.flock.config.FlockAsset
FlockAsset
Section titled “FlockAsset”Defines flock behavior configuration:
{ "id": "wolf_pack", "minSize": 3, "maxSize": 8, "alignment": 0.5, "cohesion": 0.3, "separation": 0.2, "influenceRange": 10.0}RangeSizeFlockAsset
Section titled “RangeSizeFlockAsset”Located at com.hypixel.hytale.server.flock.config.RangeSizeFlockAsset
Flock asset with size range configuration.
Flock Behaviors
Section titled “Flock Behaviors”Flocks exhibit three core behaviors (boids algorithm):
Alignment
Section titled “Alignment”Flocks align their velocity with nearby flock members:
class Role { protected double flockWeightAlignment;}Higher weight = stronger alignment tendency.
Cohesion
Section titled “Cohesion”Flocks move toward the center of nearby flock members:
class Role { protected double flockWeightCohesion;}Higher weight = tighter grouping.
Separation
Section titled “Separation”Flocks maintain distance from nearby flock members:
class Role { protected double flockWeightSeparation;}Higher weight = more personal space.
Influence Range
Section titled “Influence Range”How far flock members influence each other:
class Role { protected double flockInfluenceRange;}Members beyond this distance don’t affect flock behavior.
Flock Leadership
Section titled “Flock Leadership”Leader Selection
Section titled “Leader Selection”One flock member is designated as the leader:
class Role { protected boolean canLeadFlock;}Only NPCs with canLeadFlock = true can be leaders.
Leader Behavior
Section titled “Leader Behavior”The leader:
- Makes decisions for the flock
- Other members follow the leader
- Can have different AI instructions than followers
Leader Damage Tracking
Section titled “Leader Damage Tracking”Flock tracks damage dealt by the leader separately:
DamageData leaderDamage = flock.getLeaderDamageData();Flock Core Components
Section titled “Flock Core Components”Located at com.hypixel.hytale.server.flock.corecomponents.builders
Core components for flock behaviors:
Motion Components
Section titled “Motion Components”BuilderBodyMotionFlock
Section titled “BuilderBodyMotionFlock”Flock movement behavior:
BuilderBodyMotionFlock flockMotion = new BuilderBodyMotionFlock();Implements alignment, cohesion, and separation.
Action Components
Section titled “Action Components”BuilderActionFlockJoin
Section titled “BuilderActionFlockJoin”Join a flock:
{ "type": "JoinFlock", "flockId": "wolf_pack"}BuilderActionFlockLeave
Section titled “BuilderActionFlockLeave”Leave current flock:
{ "type": "LeaveFlock"}BuilderActionFlockState
Section titled “BuilderActionFlockState”Change flock state:
{ "type": "FlockState", "state": "aggressive"}BuilderActionFlockSetTarget
Section titled “BuilderActionFlockSetTarget”Set flock target:
{ "type": "FlockTarget", "target": "nearest_enemy"}BuilderActionFlockBeacon
Section titled “BuilderActionFlockBeacon”Create a flock beacon:
{ "type": "FlockBeacon", "duration": 30.0}Filter Components
Section titled “Filter Components”BuilderEntityFilterFlock
Section titled “BuilderEntityFilterFlock”Filter for flock members:
{ "type": "Flock", "sameFlock": true}Sensor Components
Section titled “Sensor Components”BuilderSensorFlockCombatDamage
Section titled “BuilderSensorFlockCombatDamage”Senses flock combat damage:
{ "type": "FlockCombatDamage", "threshold": 50.0}BuilderSensorInflictedDamage
Section titled “BuilderSensorInflictedDamage”Senses damage dealt by flock:
{ "type": "InflictedDamage", "threshold": 100.0}BuilderSensorFlockLeader
Section titled “BuilderSensorFlockLeader”Senses flock leader:
{ "type": "FlockLeader", "mustBeAlive": true}Flock Decision Making
Section titled “Flock Decision Making”Located at com.hypixel.hytale.server.flock.decisionmaker
Conditions
Section titled “Conditions”FlockSizeCondition
Section titled “FlockSizeCondition”Located at com.hypixel.hytale.server.flock.decisionmaker.conditions.FlockSizeCondition
Condition based on flock size:
{ "type": "FlockSize", "min": 3, "max": 8}Returns true if flock size is within range.
Flock Systems
Section titled “Flock Systems”Located at com.hypixel.hytale.server.flock
FlockSystems
Section titled “FlockSystems”Various systems that manage flock behavior:
FlockSystems.EntityRemoved
Section titled “FlockSystems.EntityRemoved”Handles entity removal from flocks.
FlockSystems.Ticking
Section titled “FlockSystems.Ticking”Updates flock state each tick:
- Swaps damage buffers
- Updates flock behavior
- Checks flock validity
FlockSystems.PlayerChangeGameModeEventSystem
Section titled “FlockSystems.PlayerChangeGameModeEventSystem”Handles player game mode changes affecting flocks.
FlockMembershipSystems
Section titled “FlockMembershipSystems”Systems managing flock membership:
FlockMembershipSystems.EntityRef
Section titled “FlockMembershipSystems.EntityRef”Manages entity references in flocks.
FlockMembershipSystems.RefChange
Section titled “FlockMembershipSystems.RefChange”Handles membership reference changes.
FlockDeathSystems
Section titled “FlockDeathSystems”Located at com.hypixel.hytale.server.flock.FlockDeathSystems
Handles NPC death in flocks:
class Role { protected boolean corpseStaysInFlock;}If false, dead NPCs leave the flock.
Spawning Integration
Section titled “Spawning Integration”Flock Spawning
Section titled “Flock Spawning”Spawn markers can spawn entire flocks:
class Role { protected String[] flockSpawnTypes; protected boolean flockSpawnTypesRandom; protected String[] flockAllowedRoles;}flockSpawnTypes- NPC types to spawn in flockflockSpawnTypesRandom- Random selection from typesflockAllowedRoles- Roles allowed in this flock
Spawn Sequence
Section titled “Spawn Sequence”- Create flock entity
- Spawn leader
- Spawn flock members
- Assign all to flock
- Initialize flock behavior
Prefab Integration
Section titled “Prefab Integration”Flocks in prefabs are handled specially:
class FlockPlugin { private Int2ObjectConcurrentHashMap<Map<UUID, UUID>> prefabFlockRemappings;}PrefabPasteEventSystem
Section titled “PrefabPasteEventSystem”Located in FlockPlugin
Handles flock remapping when prefabs are pasted:
class PrefabPasteEventSystem extends WorldEventSystem<PrefabPasteEvent>Ensures flock UUIDs are unique when prefabs are duplicated.
Flock Lifecycle
Section titled “Flock Lifecycle”Creation
Section titled “Creation”- Create flock entity
- Add Flock component
- Set flock data
- Add initial members
Update
Section titled “Update”Each tick:
- Swap damage buffers
- Update member positions
- Compute flock behaviors
- Update leader state
- Check for dissolution
Dissolution
Section titled “Dissolution”Flocks dissolve when:
- All members die/despawn
- Manually disbanded
- World unloads
flock.setRemovedStatus(FlockRemovedStatus.DISSOLVED);Examples
Section titled “Examples”Simple Flock
Section titled “Simple Flock”{ "id": "bird_flock", "minSize": 5, "maxSize": 15, "alignment": 0.6, "cohesion": 0.3, "separation": 0.1, "influenceRange": 8.0}Combat Flock
Section titled “Combat Flock”{ "id": "wolf_pack", "minSize": 3, "maxSize": 6, "alignment": 0.4, "cohesion": 0.5, "separation": 0.1, "influenceRange": 12.0}With NPC role:
{ "canLeadFlock": true, "flockWeightAlignment": 0.4, "flockWeightCohesion": 0.5, "flockWeightSeparation": 0.1, "corpseStaysInFlock": false}Best Practices
Section titled “Best Practices”- Balance flock weights - Sum of weights should be reasonable
- Set appropriate influence range - Based on flock spacing
- Limit flock size - Large flocks impact performance
- Use leader AI - Give leaders smarter behavior
- Handle death properly - Decide if corpses stay or leave
- Test coordination - Ensure flocks behave naturally
Performance Considerations
Section titled “Performance Considerations”- Flock updates are distributed across ticks
- Member queries use spatial indexing
- Influence range limits computation
- Smaller flocks perform better
- Cached position data reduces lookups
Debugging
Section titled “Debugging”Enable flock tracing:
flock.setTrace(true);This logs:
- Member additions/removals
- Leadership changes
- Damage events
- Behavior decisions
Related Systems
Section titled “Related Systems”- NPC & AI System - NPCs that join flocks
- Spawning System - Spawns flocks
- Navigation - Flock movement
- Instructions - Flock behaviors