305 lines
6.3 KiB
Markdown
305 lines
6.3 KiB
Markdown
---
|
|
title: Spawner Assets
|
|
type: docs
|
|
weight: 4
|
|
---
|
|
|
|
Spawner assets define how and where NPCs spawn, including markers for static spawn points and beacons for dynamic spawning.
|
|
|
|
**Package:** `com.hypixel.hytale.server.spawning.assets`
|
|
|
|
## Spawn Markers
|
|
|
|
### SpawnMarker Asset
|
|
|
|
Markers are static spawn points that spawn NPCs with configurable respawn timing.
|
|
|
|
**Asset Location:** `NPC/Spawn/Markers/`
|
|
|
|
```yaml
|
|
# NPC/Spawn/Markers/village_guard.json
|
|
{
|
|
"Id": "village_guard",
|
|
"Model": "spawn_marker_hostile",
|
|
"ExclusionRadius": 15.0,
|
|
"MaxDropHeight": 2.0,
|
|
"RealtimeRespawn": true,
|
|
"ManualTrigger": false,
|
|
"DeactivationDistance": 40.0,
|
|
"DeactivationTime": 5.0,
|
|
"NPCs": [
|
|
{
|
|
"Name": "guard_soldier",
|
|
"Weight": 70.0,
|
|
"RealtimeRespawnTime": 120.0
|
|
},
|
|
{
|
|
"Name": "guard_captain",
|
|
"Weight": 30.0,
|
|
"RealtimeRespawnTime": 300.0
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
### SpawnMarker Fields
|
|
|
|
| Field | Type | Default | Description |
|
|
|-------|------|---------|-------------|
|
|
| `Id` | String | Required | Unique marker identifier |
|
|
| `Model` | String | Config default | Visual model in creative mode |
|
|
| `NPCs` | SpawnConfiguration[] | Required | Weighted NPC list |
|
|
| `ExclusionRadius` | Double | 0 | Player exclusion radius |
|
|
| `MaxDropHeight` | Double | 2.0 | Max spawn height offset |
|
|
| `RealtimeRespawn` | Boolean | false | Use real vs game time |
|
|
| `ManualTrigger` | Boolean | false | Require manual activation |
|
|
| `DeactivationDistance` | Double | 40.0 | Distance to deactivate |
|
|
| `DeactivationTime` | Double | 5.0 | Seconds before deactivation |
|
|
|
|
### SpawnConfiguration
|
|
|
|
Individual NPC spawn entry in weighted pool:
|
|
|
|
```java
|
|
public class SpawnConfiguration implements IWeightedElement {
|
|
protected String npc; // NPC role name
|
|
protected double weight; // Spawn weight
|
|
protected double realtimeRespawnTime; // Seconds (realtime)
|
|
protected Duration spawnAfterGameTime; // Duration (game time)
|
|
protected String flockDefinitionId; // Optional flock
|
|
}
|
|
```
|
|
|
|
```yaml
|
|
{
|
|
"Name": "forest_deer",
|
|
"Weight": 50.0,
|
|
"RealtimeRespawnTime": 60.0,
|
|
"SpawnAfterGameTime": "PT1H",
|
|
"Flock": "deer_herd"
|
|
}
|
|
```
|
|
|
|
### Respawn Timing
|
|
|
|
Choose between realtime or game time respawning:
|
|
|
|
**Realtime:** Uses `RealtimeRespawnTime` (seconds)
|
|
```yaml
|
|
{
|
|
"RealtimeRespawn": true,
|
|
"NPCs": [{ "RealtimeRespawnTime": 120.0 }]
|
|
}
|
|
```
|
|
|
|
**Game Time:** Uses `SpawnAfterGameTime` (ISO 8601 duration)
|
|
```yaml
|
|
{
|
|
"RealtimeRespawn": false,
|
|
"NPCs": [{ "SpawnAfterGameTime": "P1DT6H" }]
|
|
}
|
|
```
|
|
|
|
Duration format: `P[days]DT[hours]H[minutes]M[seconds]S`
|
|
|
|
### Flock Spawning
|
|
|
|
Spawn a group of NPCs around the main spawn:
|
|
|
|
```yaml
|
|
{
|
|
"Name": "wolf_alpha",
|
|
"Flock": "wolf_pack"
|
|
}
|
|
```
|
|
|
|
The flock definition specifies additional NPCs to spawn around the main one.
|
|
|
|
## Spawn Beacons
|
|
|
|
### BeaconNPCSpawn
|
|
|
|
Dynamic spawn points that spawn NPCs within a radius.
|
|
|
|
**Asset Location:** `NPC/Spawn/Beacons/`
|
|
|
|
```yaml
|
|
# NPC/Spawn/Beacons/dungeon_spawner.json
|
|
{
|
|
"Id": "dungeon_spawner",
|
|
"NPCRole": "skeleton_warrior",
|
|
"SpawnWeight": 10,
|
|
"MinGroupSize": 2,
|
|
"MaxGroupSize": 5,
|
|
"Environments": ["dungeon_dark"]
|
|
}
|
|
```
|
|
|
|
### SpawnBeacon Component
|
|
|
|
Entities with spawn beacon behavior:
|
|
|
|
```java
|
|
public class SpawnBeacon {
|
|
// Configuration for beacon spawning
|
|
// Triggers spawning within radius
|
|
}
|
|
```
|
|
|
|
### Beacon Systems
|
|
|
|
```java
|
|
// SpawnBeaconSystems processes active beacons
|
|
getEntityStoreRegistry().registerSystem(new SpawnBeaconSystems());
|
|
|
|
// BeaconSpatialSystem handles spatial queries
|
|
getEntityStoreRegistry().registerSystem(new BeaconSpatialSystem());
|
|
```
|
|
|
|
## World Spawn Configuration
|
|
|
|
### WorldNPCSpawn
|
|
|
|
Environment-based ambient spawning.
|
|
|
|
**Asset Location:** `NPC/Spawn/World/`
|
|
|
|
```yaml
|
|
# NPC/Spawn/World/forest_fauna.json
|
|
{
|
|
"Id": "forest_fauna",
|
|
"NPCRole": "rabbit",
|
|
"SpawnWeight": 20,
|
|
"MinGroupSize": 1,
|
|
"MaxGroupSize": 3,
|
|
"Environments": ["forest", "grassland"],
|
|
"LightType": "Day",
|
|
"MinLightLevel": 8
|
|
}
|
|
```
|
|
|
|
### NPCSpawn Base Fields
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `NPCRole` | String | NPC role to spawn |
|
|
| `SpawnWeight` | Integer | Spawn probability weight |
|
|
| `MinGroupSize` | Integer | Minimum NPCs to spawn |
|
|
| `MaxGroupSize` | Integer | Maximum NPCs to spawn |
|
|
|
|
### Environment Filtering
|
|
|
|
Restrict spawning to specific environments:
|
|
|
|
```yaml
|
|
{
|
|
"Environments": ["cave_dark", "dungeon"]
|
|
}
|
|
```
|
|
|
|
### Light Level Filtering
|
|
|
|
```yaml
|
|
{
|
|
"LightType": "Night",
|
|
"MinLightLevel": 0,
|
|
"MaxLightLevel": 7
|
|
}
|
|
```
|
|
|
|
Light types: `Any`, `Day`, `Night`
|
|
|
|
## Spawn Marker Entity
|
|
|
|
### SpawnMarkerEntity Component
|
|
|
|
Entity representing a spawn marker in the world:
|
|
|
|
```java
|
|
ComponentType<EntityStore, SpawnMarkerEntity> type =
|
|
SpawningPlugin.get().getSpawnMarkerEntityComponentType();
|
|
```
|
|
|
|
### Marker Block State
|
|
|
|
Spawn markers can be placed as blocks:
|
|
|
|
```java
|
|
public class SpawnMarkerBlockState {
|
|
// Block-based spawn marker
|
|
}
|
|
|
|
public class SpawnMarkerBlockReference {
|
|
// Reference to marker block
|
|
}
|
|
```
|
|
|
|
## Interactions
|
|
|
|
### TriggerSpawnMarkersInteraction
|
|
|
|
Manually trigger spawn markers via interaction:
|
|
|
|
```yaml
|
|
# Item or block interaction
|
|
{
|
|
"Type": "TriggerSpawnMarkers",
|
|
"MarkerIds": ["ambush_1", "ambush_2"],
|
|
"Radius": 50.0
|
|
}
|
|
```
|
|
|
|
Registered as:
|
|
```java
|
|
getCodecRegistry(Interaction.CODEC).register(
|
|
"TriggerSpawnMarkers",
|
|
TriggerSpawnMarkersInteraction.class,
|
|
TriggerSpawnMarkersInteraction.CODEC
|
|
);
|
|
```
|
|
|
|
## API Usage
|
|
|
|
### Access Spawn Marker Assets
|
|
|
|
```java
|
|
// Get marker asset
|
|
SpawnMarker marker = SpawnMarker.getAssetMap().getAsset("village_guard");
|
|
|
|
// Get weighted configurations
|
|
IWeightedMap<SpawnConfiguration> npcs = marker.getWeightedConfigurations();
|
|
|
|
// Get random NPC from pool
|
|
SpawnConfiguration selected = npcs.getRandom(random);
|
|
String npcRole = selected.getNpc();
|
|
```
|
|
|
|
### Access Spawn Suppression
|
|
|
|
```java
|
|
SpawnSuppression suppression = SpawnSuppression.getAssetMap().getAsset("safe_zone");
|
|
double radius = suppression.getRadius();
|
|
```
|
|
|
|
### Validate Marker Asset
|
|
|
|
```java
|
|
// Validation happens on plugin start
|
|
// Warns about:
|
|
// - Missing respawn times
|
|
// - Conflicting realtime/game time settings
|
|
// - Invalid NPC roles
|
|
```
|
|
|
|
## Asset Loading Order
|
|
|
|
Spawn assets have dependencies:
|
|
|
|
```java
|
|
// Markers load after models and NPC roles
|
|
HytaleAssetStore.builder(...)
|
|
.loadsAfter(ModelAsset.class)
|
|
.loadsAfter(NPCRole.class)
|
|
.build();
|
|
```
|