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