ModernUO/Distribution/Data/Spawns/shared/felucca/Fire.json
Kamron Batman d8a64f3316
refactor(spawners): replace DynamicJson with typed SpawnerDto records (#2505)
## Summary

Removes the dated `DynamicJson` JSON helper and migrates spawner JSON (de)serialization to a polymorphic `record SpawnerDto` hierarchy. `DynamicJson` was the last remaining consumer (regions moved off it in #1400).

The key correctness improvement: **System.Text.Json deserializes plain DTO records, never a live `Item`.** Previously, deserializing directly into an `Item` meant STJ constructed world-registered objects *before* the data was validated — a malformed/hand-edited spawn file could leave orphaned spawner Items in the world save. Now a parse failure is GC-only; `dto.ToSpawner()` constructs the spawner only from a fully-validated DTO and self-cleans on failure.

## What changed

- **New:** `SpawnerDto` (abstract) + `SpawnerDataDto` / `RegionSpawnerDto` / `ProximitySpawnerDto`, each marked with a reusable `[JsonDiscoverableType]` opt-in attribute. Auto-discovered at the `Configure` phase — no manual registration list (avoids the regions `Register<T>()` footgun), open to custom spawner subtypes.
- **Symmetric mapping:** `BaseSpawner.ToDto()` (export) ⇄ `SpawnerDto.ToSpawner()` (import). `ToSpawner()` deletes-and-rethrows on any failure, so the importer can never orphan an Item.
- **`SpawnerJsonSerializer`** wires `$type` polymorphism on the `SpawnerDto` root with loud collision/constructibility validation.
- **Import/export commands** rewired to the typed DTO path (reflection `FindTypeByName`/`CreateInstance` removed).
- **Data migration:** the 109 `Distribution/Data/Spawns/**` files moved from `"type"`→`"$type"` and legacy `homeRange`→`spawnBounds`. The runtime still *reads* legacy `homeRange` for external files. The `homeRange→spawnBounds` formula is proven equivalent to the runtime conversion (`BoundsEquivalenceTests`, hr=0/1/3/7).
- **Deleted:** `Projects/Server/Json/DynamicJson.cs`.

Sparse export output matches the legacy `ToJson` (nullable DTO properties + `WhenWritingNull`). Binary world-save serialization is untouched.

## Tests

- DTO round-trip per spawner type; sparse-default omission; legacy `homeRange` read; export/import file round-trip.
- `Import_MalformedFile_LeaksNoWorldItems` — proves a mid-array parse failure constructs zero world Items.
- `AllSpawnFilesLoadTests` — every migrated spawn file deserializes and builds.
- Duplicate-discriminator validation.
- UOContent.Tests 485/485, Server.Tests 710/710, build clean.

## Follow-up (not in this PR)

`Rectangle3DConverter.Write` (in `Projects/Server/`) omits `z1/z2` when `Start.Z == -128`, so a future server-side export of a `homeRange`-style spawner round-trips depth 256→255. Pre-existing and out of scope here (Server change); the migrated data reads correctly. Worth a separate small converter PR.
2026-06-25 23:24:45 -07:00

839 lines
21 KiB
JSON

[
{
"$type": "Spawner",
"guid": "06b7ba24-826f-4130-b3fb-f367ac6e9a82",
"name": "Spawner (207)",
"location": [5835, 1304, 0],
"map": "Felucca",
"count": 6,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 15,
"walkingRange": 30,
"entries": [
{ "name": "FireElemental", "maxCount": 4, "probability": 100 },
{ "name": "Efreet", "maxCount": 1, "probability": 100 },
{ "name": "LavaSerpent", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "09685cb4-df4f-4bd2-98fd-4ca2f401d65b",
"name": "Spawner (207)",
"location": [5643, 1435, 0],
"map": "Felucca",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 3,
"walkingRange": 5,
"entries": [
{ "name": "EvilMage", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "11550ec6-9ce8-4c50-a310-38383b51f230",
"name": "Spawner (207)",
"location": [5679, 1438, 0],
"map": "Felucca",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 5,
"walkingRange": 5,
"entries": [
{ "name": "TreasureChestLevel2", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "1d357111-cd98-4c2d-ab92-ead67f9da0e9",
"name": "Spawner (207)",
"location": [5651, 1363, 0],
"map": "Felucca",
"count": 8,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"start": { "x": 5648, "y": 1360, "z": 0 },
"end": { "x": 5654, "y": 1366, "z": 15 }
},
"walkingRange": 3,
"entries": [
{ "name": "EvilMage", "maxCount": 1, "probability": 100 },
{ "name": "HellHound", "maxCount": 5, "probability": 100 },
{ "name": "LavaSnake", "maxCount": 1, "probability": 100 },
{ "name": "HellCat", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "1da36d4f-d8c9-4202-8ce0-b8456969fbe7",
"name": "Spawner (207)",
"location": [5733, 1433, 22],
"map": "Felucca",
"count": 3,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 10,
"walkingRange": 20,
"entries": [
{ "name": "GiantRat", "maxCount": 1, "probability": 100 },
{ "name": "LavaSnake", "maxCount": 1, "probability": 100 },
{ "name": "EvilMage", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "1e8b71e5-2c17-4c4d-b933-b887a9b830b4",
"name": "Spawner (207)",
"location": [5852, 1468, 1],
"map": "Felucca",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 25,
"walkingRange": 30,
"entries": [
{ "name": "LavaSnake", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "1f24afdd-09b5-406c-90d6-c714c1811f4e",
"name": "Spawner (207)",
"location": [5859, 1387, 0],
"map": "Felucca",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 10,
"walkingRange": 20,
"entries": [
{ "name": "LavaLizard", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "23349d09-37ca-4f61-ba48-b1a593d90c6a",
"name": "Spawner (207)",
"location": [5643, 1435, 0],
"map": "Felucca",
"count": 2,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 2,
"walkingRange": 2,
"entries": [
{ "name": "TreasureChestLevel4", "maxCount": 2, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "25415970-01ad-463e-b9f0-053c077a209f",
"name": "Spawner (207)",
"location": [5732, 1297, -1],
"map": "Felucca",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 5,
"walkingRange": 20,
"entries": [
{ "name": "HellHound", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "2834e29b-b0b5-4f09-80ea-c0cc6cbdb5a6",
"name": "Spawner (207)",
"location": [5638, 1439, 0],
"map": "Felucca",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 0,
"walkingRange": 40,
"entries": [
{ "name": "EvilMageLord", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "2e619be6-7384-415e-a23a-d7327b39a05e",
"name": "Spawner (207)",
"location": [5859, 1341, -1],
"map": "Felucca",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 10,
"walkingRange": 20,
"entries": [
{ "name": "FireElemental", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "3a206916-74e5-44ec-8c78-bf01a8916f53",
"name": "Spawner (207)",
"location": [5731, 1379, 0],
"map": "Felucca",
"count": 4,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 3,
"walkingRange": 7,
"entries": [
{ "name": "Lich", "maxCount": 3, "probability": 100 },
{ "name": "LichLord", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "3bac45c2-6a16-4892-b25c-f6c02788a5f4",
"name": "Spawner (207)",
"location": [5723, 1291, 0],
"map": "Felucca",
"count": 2,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 3,
"walkingRange": 3,
"entries": [
{ "name": "FireElemental", "maxCount": 2, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "436c4d7e-5dac-4f1f-a6bf-397e2e768683",
"name": "Spawner (207)",
"location": [5717, 1333, 6],
"map": "Felucca",
"count": 2,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 10,
"walkingRange": 20,
"entries": [
{ "name": "LavaLizard", "maxCount": 1, "probability": 100 },
{ "name": "FireElemental", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "4f164c53-9758-4970-91ab-c4de29e3bfc2",
"name": "Spawner (207)",
"location": [5836, 1364, 1],
"map": "Felucca",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 10,
"walkingRange": 20,
"entries": [
{ "name": "LavaSnake", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "55d34b4f-fbf6-43a0-b8bb-5215ae74c2a6",
"name": "Spawner (207)",
"location": [5678, 1340, -2],
"map": "Felucca",
"count": 2,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 10,
"walkingRange": 30,
"entries": [
{ "name": "HellHound", "maxCount": 1, "probability": 100 },
{ "name": "HellCat", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "5655a639-c25c-446b-9de9-30fb4d294143",
"name": "Spawner (207)",
"location": [5747, 1320, 0],
"map": "Felucca",
"count": 2,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 10,
"walkingRange": 20,
"entries": [
{ "name": "FireElemental", "maxCount": 1, "probability": 100 },
{ "name": "LavaSerpent", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "5bb1395f-d446-42de-bcdf-d257d7ed953a",
"name": "Spawner (207)",
"location": [5667, 1315, 5],
"map": "Felucca",
"count": 3,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"start": { "x": 5647, "y": 1295, "z": -128 },
"end": { "x": 5687, "y": 1335, "z": 20 }
},
"walkingRange": 20,
"entries": [
{ "name": "Efreet", "maxCount": 2, "probability": 100 },
{ "name": "LavaLizard", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "6569aa86-8a7e-4a7d-8b0b-f46badca59c2",
"name": "Spawner (207)",
"location": [5656, 1412, 0],
"map": "Felucca",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 0,
"walkingRange": 10,
"entries": [
{ "name": "EvilMageLord", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "7b6bd2f4-2d4f-4144-ac9a-e34b9d2f88b1",
"name": "Spawner (207)",
"location": [5717, 1465, -2],
"map": "Felucca",
"count": 3,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 10,
"walkingRange": 15,
"entries": [
{ "name": "FireElemental", "maxCount": 3, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "8524d599-a31d-4fb0-977e-0cff77d2d297",
"name": "Spawner (207)",
"location": [5790, 1451, 7],
"map": "Felucca",
"count": 4,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 5,
"walkingRange": 15,
"entries": [
{ "name": "Efreet", "maxCount": 1, "probability": 100 },
{ "name": "LavaSerpent", "maxCount": 1, "probability": 100 },
{ "name": "HellHound", "maxCount": 1, "probability": 100 },
{ "name": "FireElemental", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "88f058cc-ebdb-48bd-908a-cbb49142fd11",
"name": "Spawner (207)",
"location": [5709, 1364, -1],
"map": "Felucca",
"count": 6,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 10,
"walkingRange": 20,
"entries": [
{ "name": "HellHound", "maxCount": 6, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "8f08a4ce-78dd-48ca-81e4-1e6d4d35d15e",
"name": "Spawner (207)",
"location": [5714, 1465, 0],
"map": "Felucca",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 7,
"walkingRange": 7,
"entries": [
{ "name": "TreasureChestLevel2", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "90609dc2-cd78-4057-9b87-6023fc1fa263",
"name": "Spawner (207)",
"location": [5643, 1403, 0],
"map": "Felucca",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 3,
"walkingRange": 3,
"entries": [
{ "name": "EvilMage", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "9157324f-0d09-409e-8ace-f0c4dcb44683",
"name": "Spawner (207)",
"location": [5699, 1302, 1],
"map": "Felucca",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 15,
"walkingRange": 15,
"entries": [
{ "name": "FireElemental", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "934c223f-19e3-401c-aaf9-494c751d8c1c",
"name": "Spawner (207)",
"location": [5689, 1387, 1],
"map": "Felucca",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 5,
"walkingRange": 10,
"entries": [
{ "name": "EvilMageLord", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "93908c67-1ffd-4196-bceb-b2ca2ec98e5d",
"name": "Spawner (207)",
"location": [5787, 1427, 17],
"map": "Felucca",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 10,
"walkingRange": 20,
"entries": [
{ "name": "LavaLizard", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "9df65008-f599-43d4-b788-df7138e37320",
"name": "Spawner (207)",
"location": [5693, 1415, 38],
"map": "Felucca",
"count": 4,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 10,
"walkingRange": 20,
"entries": [
{ "name": "Slime", "maxCount": 1, "probability": 100 },
{ "name": "GiantRat", "maxCount": 2, "probability": 100 },
{ "name": "GiantSerpent", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "a08f5c78-d35f-4755-a0f9-009660acb8c9",
"name": "Spawner (207)",
"location": [5680, 1438, 0],
"map": "Felucca",
"count": 2,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 10,
"walkingRange": 20,
"entries": [
{ "name": "EvilMageLord", "maxCount": 2, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "a874fb64-451c-4f30-ab6f-e56a9eb71604",
"name": "Spawner (207)",
"location": [5787, 1386, -2],
"map": "Felucca",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 10,
"walkingRange": 20,
"entries": [
{ "name": "HellCat", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "b4c87574-6489-4e20-8642-61051697b2e1",
"name": "Spawner (207)",
"location": [5852, 1468, 1],
"map": "Felucca",
"count": 17,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 25,
"walkingRange": 30,
"entries": [
{ "name": "Lich", "maxCount": 4, "probability": 100 },
{ "name": "BoneMagi", "maxCount": 6, "probability": 100 },
{ "name": "SkeletalMage", "maxCount": 6, "probability": 100 },
{ "name": "HellCat", "maxCount": 1, "probability": 100 },
{ "name": "HellHound", "maxCount": 3, "probability": 100 },
{ "name": "FireElemental", "maxCount": 2, "probability": 100 },
{ "name": "LavaLizard", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "b8f9386a-456c-44ff-9baa-0b8234e0c0c4",
"name": "Spawner (207)",
"location": [5744, 1471, 2],
"map": "Felucca",
"count": 6,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 10,
"walkingRange": 15,
"entries": [
{ "name": "FireElemental", "maxCount": 3, "probability": 100 },
{ "name": "LavaSnake", "maxCount": 1, "probability": 100 },
{ "name": "HellCat", "maxCount": 1, "probability": 100 },
{ "name": "HellHound", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "bb0ec9be-567e-46d8-9045-c498fc51972d",
"name": "Spawner (207)",
"location": [5723, 1390, 2],
"map": "Felucca",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 7,
"walkingRange": 7,
"entries": [
{ "name": "TreasureChestLevel2", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "be64cf9e-3d3a-4e25-9162-50fa7a777f44",
"name": "Spawner (207)",
"location": [5722, 1390, 1],
"map": "Felucca",
"count": 2,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 7,
"walkingRange": 7,
"entries": [
{ "name": "TreasureChestLevel3", "maxCount": 2, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "c2f7684e-9246-4b09-b224-f993c15173b9",
"name": "Spawner (207)",
"location": [5650, 1434, 0],
"map": "Felucca",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 2,
"walkingRange": 2,
"entries": [
{ "name": "TreasureChestLevel3", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "c3250304-df94-4c9d-8a15-e9efa6845b65",
"name": "Spawner (207)",
"location": [5679, 1439, 0],
"map": "Felucca",
"count": 2,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 5,
"walkingRange": 5,
"entries": [
{ "name": "TreasureChestLevel3", "maxCount": 2, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "c60b60b7-79f5-4a77-b9af-c4a9b49d87f1",
"name": "Spawner (207)",
"location": [5651, 1408, 0],
"map": "Felucca",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 2,
"walkingRange": 3,
"entries": [
{ "name": "HellHound", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "c701efc3-54d7-40d9-b3d0-909ded6a74d6",
"name": "Spawner (207)",
"location": [5651, 1418, 0],
"map": "Felucca",
"count": 2,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 2,
"walkingRange": 3,
"entries": [
{ "name": "EvilMage", "maxCount": 1, "probability": 100 },
{ "name": "EvilMageLord", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "c729c34e-7162-442e-a0bc-0e8b1ca89720",
"name": "Spawner (207)",
"location": [5651, 1435, 0],
"map": "Felucca",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 3,
"walkingRange": 5,
"entries": [
{ "name": "EvilMage", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "ce7b5441-9c5e-4426-9ff8-09085c48f899",
"name": "Spawner (207)",
"location": [5818, 1379, 0],
"map": "Felucca",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 10,
"walkingRange": 20,
"entries": [
{ "name": "FireElemental", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "d009fa2f-ee2e-4adf-828d-917c991f5c8d",
"name": "Spawner (207)",
"location": [5809, 1332, 0],
"map": "Felucca",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 10,
"walkingRange": 20,
"entries": [
{ "name": "LavaSnake", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "d00cb0e2-efb1-47c3-a65f-079f2677219c",
"name": "Spawner (207)",
"location": [5654, 1380, 0],
"map": "Felucca",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 5,
"walkingRange": 5,
"entries": [
{ "name": "EvilMage", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "d114e342-f07c-46b9-9164-43bafbd74988",
"name": "Spawner (207)",
"location": [5651, 1402, 0],
"map": "Felucca",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 2,
"walkingRange": 3,
"entries": [
{ "name": "EvilMage", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "d11e7abf-7396-4fa4-a7a1-8dd69b700907",
"name": "Spawner (207)",
"location": [5691, 1347, 0],
"map": "Felucca",
"count": 2,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 3,
"walkingRange": 3,
"entries": [
{ "name": "Daemon", "maxCount": 2, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "d77719be-10a6-40f5-97a0-95dc2e3137b4",
"name": "Spawner (207)",
"location": [5695, 1434, -1],
"map": "Felucca",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 10,
"walkingRange": 20,
"entries": [
{ "name": "Slime", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "d7e70c50-8b14-4153-b44f-a9f6764762f0",
"name": "Spawner (207)",
"location": [5650, 1419, 22],
"map": "Felucca",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"start": { "x": 5648, "y": 1417, "z": 22 },
"end": { "x": 5652, "y": 1421, "z": 40 }
},
"walkingRange": 5,
"entries": [
{ "name": "EvilMage", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "dfe6b8e9-4b85-4f76-a60f-47ae91fd38fa",
"name": "Spawner (207)",
"location": [5867, 1309, 0],
"map": "Felucca",
"count": 2,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 10,
"walkingRange": 20,
"entries": [
{ "name": "HellCat", "maxCount": 1, "probability": 100 },
{ "name": "FireElemental", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "e6a0e881-cdbe-4fe2-98dd-1d63debf8e1b",
"name": "Spawner (207)",
"location": [5647, 1439, 22],
"map": "Felucca",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 1,
"walkingRange": 15,
"entries": [
{ "name": "EvilMage", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "f17e6176-bbdd-4861-bd51-8aa58d4de7f9",
"name": "Spawner (207)",
"location": [5651, 1443, 0],
"map": "Felucca",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 3,
"walkingRange": 5,
"entries": [
{ "name": "EvilMage", "maxCount": 1, "probability": 100 }
]
},
{
"$type": "Spawner",
"guid": "f3828caa-6ea3-40b5-86a0-21808b5eb4ea",
"name": "Spawner (207)",
"location": [5715, 1465, -1],
"map": "Felucca",
"count": 2,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 7,
"walkingRange": 7,
"entries": [
{ "name": "TreasureChestLevel3", "maxCount": 2, "probability": 100 }
]
}
]